public CritterInfo(int critter_id, Palette paletteToUse, int AuxPalNo) { //string fileO = DecimalToOct(file.ToString()); string critterIDO = DecimalToOct(critter_id.ToString()); //FileNo=file; //AuxPalNo=palno; pal = paletteToUse; AnimInfo = new CritterAnimInfo(); int spriteIndex = 0; for (int pass = 0; pass < 2; pass++) { //load in both page files. if (pass == 0) {//CR{CRITTER file ID in octal}PAGE.N{Page} DataLoader.ReadStreamFile(BasePath + "CRIT" + sep + "CR" + critterIDO + "PAGE.N0" + pass, out FilePage0); bool LoadMod = Directory.Exists(BasePath + "CRIT" + sep + "CR" + critterIDO + "PAGE_N0" + pass); spriteIndex = ReadPageFile(FilePage0, critter_id, pass, spriteIndex, AuxPalNo, LoadMod, BasePath + "CRIT" + sep + "CR" + critterIDO + "PAGE_N0" + pass); } else { DataLoader.ReadStreamFile(BasePath + "CRIT" + sep + "CR" + critterIDO + "PAGE.N0" + pass, out FilePage1); bool LoadMod = Directory.Exists(BasePath + "CRIT" + sep + "CR" + critterIDO + "PAGE.N0" + pass); ReadPageFile(FilePage1, critter_id, pass, spriteIndex, AuxPalNo, LoadMod, BasePath + "CRIT" + sep + "CR" + critterIDO + "PAGE.N0" + pass); } } }
public CritterInfo(int critter_id, Palette paletteToUse, int palno) { //string fileO = DecimalToOct(file.ToString()); string critterIDO = DecimalToOct(critter_id.ToString()); //FileNo=file; AuxPalNo = palno; pal = paletteToUse; AnimInfo = new CritterAnimInfo(); int spriteIndex = 0; for (int pass = 0; pass < 2; pass++) { //load in both page files. if (pass == 0) { //CR{CRITTER file ID in octal}PAGE.N{Page} DataLoader.ReadStreamFile("c:\\games\\uw1\\crit\\CR" + critterIDO + "page.n0" + pass, out FilePage0); spriteIndex = ReadPageFile(FilePage0, critter_id, pass, spriteIndex); } else { DataLoader.ReadStreamFile("c:\\games\\uw1\\crit\\CR" + critterIDO + "page.n0" + pass, out FilePage1); ReadPageFile(FilePage1, critter_id, pass, spriteIndex); } } }
public CritterInfo(int critter_id, Palette paletteToUse, int palno, char[] assocData, char[] PGMP, char[] cran) { int ExtractPageNo = 0; string critterIDO = DecimalToOct(critter_id.ToString()); AnimInfo = new CritterAnimInfo(); int spriteIndex = 0; for (int i = 0; i < 8; i++) { if ((int)DataLoader.getValAtAddress(PGMP, critter_id * 8 + i, 8) != 255) //Checks if a critter exists at this index in the page file. { string ExtractPageNoO = DecimalToOct(ExtractPageNo.ToString()); //sprintf_s(fileCrit, 255, "%s\\CR%02o.%02d", CritPath, CritterID, ExtractPageNo);//Create a file name to extract from //sprintf_s(OutFileName, 255, "CR%02o_%02d_%d", CritterID, ExtractPageNo, auxPalNo);//Get a name to extract to //extractCrittersUW2(fileAssoc, fileCrit, PaletteFile, auxPalNo, 64, UW_GRAPHICS_GR, game, 0, OutFileName, useTGA, ACTUALLY_EXTRACT_FILES); string fileCrit = "c:\\games\\uw2\\crit\\CR" + critterIDO + "." + ExtractPageNoO; spriteIndex = ReadUW2PageFileData(assocData, palno, fileCrit, AnimInfo, spriteIndex, paletteToUse); ExtractPageNo++; } } int cranAdd = (critter_id * 512); for (int Animation = 0; Animation < 8; Animation++) //The the animation slot { bool NoAngle = isAnimUnAngled(Animation); int NoOfValid = 0; for (int Angle = 0; Angle < 8; Angle++) //Each animation has every possible angle. { if ((NoAngle == false) || (Angle == 4)) { int UW2animIndex = GetUW2Anim(Animation, Angle); int animIndex = TranslateAnimToIndex(UW2animIndex); AnimInfo.animName[animIndex] = PrintAnimName(UW2animIndex); int ValidEntries = (int)DataLoader.getValAtAddress(cran, cranAdd + (Animation * 64) + (Angle * 8) + (7), 8); //Get how many valid frames are in the animation for (int FrameNo = 0; FrameNo < 8; FrameNo++) { int currFrame = (int)DataLoader.getValAtAddress(cran, cranAdd + (Animation * 64) + (Angle * 8) + (FrameNo), 8); if (FrameNo < ValidEntries) { AnimInfo.animIndices[animIndex, FrameNo] = currFrame; } else { AnimInfo.animIndices[animIndex, FrameNo] = -1; } } } } } }
public CritterInfo(int critter_id, Palette paletteToUse, int palno, char[] assocData, char[] PGMP, char[] cran) { int ExtractPageNo = 0; string critterIDO = DecimalToOct(critter_id.ToString()); AnimInfo = new CritterAnimInfo(); int spriteIndex = 0; for (int i = 0; i < 8; i++) { if ((int)DataLoader.getValAtAddress(PGMP, critter_id * 8 + i, 8) != 255)//Checks if a critter exists at this index in the page file. { string ExtractPageNoO = DecimalToOct(ExtractPageNo.ToString()); string fileCrit = BasePath + sep + "CRIT" + sep + "CR" + critterIDO + "." + ExtractPageNoO; spriteIndex = ReadUW2PageFileData(assocData, palno, fileCrit, AnimInfo, spriteIndex, paletteToUse); ExtractPageNo++; } } int cranAdd = (critter_id * 512); for (int Animation = 0; Animation < 8; Animation++)//The the animation slot { bool NoAngle = isAnimUnAngled(Animation); //int NoOfValid=0; for (int Angle = 0; Angle < 8; Angle++)//Each animation has every possible angle. { if ((NoAngle == false) || (Angle == 4)) { int UW2animIndex = GetUW2Anim(Animation, Angle); int animIndex = TranslateAnimToIndex(UW2animIndex); AnimInfo.animName[animIndex] = PrintAnimName(UW2animIndex); int ValidEntries = (int)DataLoader.getValAtAddress(cran, cranAdd + (Animation * 64) + (Angle * 8) + (7), 8);//Get how many valid frames are in the animation for (int FrameNo = 0; FrameNo < 8; FrameNo++) { int currFrame = (int)DataLoader.getValAtAddress(cran, cranAdd + (Animation * 64) + (Angle * 8) + (FrameNo), 8); if (FrameNo < ValidEntries) { AnimInfo.animIndices[animIndex, FrameNo] = currFrame; } else { AnimInfo.animIndices[animIndex, FrameNo] = -1; } } } } } }
/* public static int TranslateAnimRangeToAnim(int animToTranslate) * { * //Animations are clasified by number * switch (animToTranslate) * { * case NPC.AI_ANIM_IDLE_FRONT: * return idle_front; * case NPC.AI_ANIM_IDLE_FRONT_RIGHT: * return idle_front_right; * case NPC.AI_ANIM_IDLE_RIGHT: * return idle_right; * case NPC.AI_ANIM_IDLE_REAR_RIGHT: * return idle_rear_right; * case NPC.AI_ANIM_IDLE_REAR: * return idle_rear; * case NPC.AI_ANIM_IDLE_REAR_LEFT: * return idle_rear_left; * case NPC.AI_ANIM_IDLE_LEFT : * return idle_left; * case NPC.AI_ANIM_IDLE_FRONT_LEFT: * return idle_front_left; * case NPC.AI_ANIM_WALKING_FRONT: * return walking_front; * case NPC.AI_ANIM_WALKING_FRONT_RIGHT: * return walking_front_right; * case NPC.AI_ANIM_WALKING_RIGHT: * return walking_right; * case NPC.AI_ANIM_WALKING_REAR_RIGHT: * return walking_rear_right; * case NPC.AI_ANIM_WALKING_REAR : * return walking_rear; * case NPC.AI_ANIM_WALKING_REAR_LEFT : * return walking_rear_left; * case NPC.AI_ANIM_WALKING_LEFT : * return walking_left; * case NPC.AI_ANIM_WALKING_FRONT_LEFT: * return walking_front_left; * case NPC.AI_ANIM_DEATH: * return death; * case NPC.AI_ANIM_ATTACK_BASH: * return attack_bash; * case NPC.AI_ANIM_ATTACK_SLASH : * return attack_slash; * case NPC.AI_ANIM_ATTACK_THRUST: * return attack_thrust; * case NPC.AI_ANIM_COMBAT_IDLE: * return idle_combat;//is this right?? * case NPC.AI_ANIM_ATTACK_SECONDARY: * return attack_secondary; * default: * return idle_front; * } * } */ int ReadUW2PageFileData(char[] assocFile, int AuxPalNo, string fileCrit, CritterAnimInfo critanim, int spriteIndex, Palette paletteToUse) { //Debug.Log(fileCrit + " starting at " + spriteIndex); Palette pal = paletteToUse; char[] critterFile; //char[] auxpalval=new char[32]; //Palette[] auxpal = new Palette[32]; //int auxPalNo = PaletteNo; int AddressPointer; //pal = new palette[256]; //getPalette(PaletteFile, pal, 0);//always palette 0? DataLoader.ReadStreamFile(fileCrit, out critterFile); //UW2 uses a different method //Starting at offset 0x80 //fprintf(LOGFILE, "\n\t//%s - palette = %d", fileCrit, auxPalNo); //auxPalNo=2; AddressPointer = 0;//auxPalNo * 32; char[] auxPalVal = new char[32]; for (int j = 0; j < 32; j++) { auxPalVal[j] = (char)DataLoader.getValAtAddress(critterFile, (AddressPointer) + (AuxPalNo * 32) + j, 8); } //int i = 0; int MaxWidth = 0; int MaxHeight = 0; int MaxHotSpotX = 0; int MaxHotSpotY = 0; for (int pass = 0; pass <= 1; pass++) { if (pass == 0) {//First pass is getting max image sizes for (int index = 128; index < 640; index = index + 2) { int frameOffset = (int)DataLoader.getValAtAddress(critterFile, index, 16); if (frameOffset != 0) { int BitMapWidth = (int)DataLoader.getValAtAddress(critterFile, frameOffset + 0, 8); int BitMapHeight = (int)DataLoader.getValAtAddress(critterFile, frameOffset + 1, 8); int hotspotx = (int)DataLoader.getValAtAddress(critterFile, frameOffset + 2, 8); int hotspoty = (int)DataLoader.getValAtAddress(critterFile, frameOffset + 3, 8); if (hotspotx > BitMapWidth) { hotspotx = BitMapWidth; } if (hotspoty > BitMapHeight) { hotspoty = BitMapHeight; } if (BitMapWidth > MaxWidth) { MaxWidth = BitMapWidth; } if (BitMapHeight > MaxHeight) { MaxHeight = BitMapHeight; } if (hotspotx > MaxHotSpotX) { MaxHotSpotX = hotspotx; } if (hotspoty > MaxHotSpotY) { MaxHotSpotY = hotspoty; } } //End frameoffsetr first pass } //End for loop first pass switch (fileCrit.Substring(fileCrit.Length - 7, 4).ToUpper()) { case "CR02": //Rat. max height is calculated incorrectly MaxHeight = 100; break; } }//End first pass else {//Extract images if (MaxHotSpotX * 2 > MaxWidth) {//Try and center the hot spot in the image. MaxWidth = MaxHotSpotX * 2; } char[] outputImg; outputImg = new char[MaxWidth * MaxHeight * 2]; for (int index = 128; index < 640; index = index + 2) { int frameOffset = (int)DataLoader.getValAtAddress(critterFile, index, 16); if (frameOffset != 0) { int BitMapWidth = (int)DataLoader.getValAtAddress(critterFile, frameOffset + 0, 8); int BitMapHeight = (int)DataLoader.getValAtAddress(critterFile, frameOffset + 1, 8); int hotspotx = (int)DataLoader.getValAtAddress(critterFile, frameOffset + 2, 8); int hotspoty = (int)DataLoader.getValAtAddress(critterFile, frameOffset + 3, 8); int compression = (int)DataLoader.getValAtAddress(critterFile, frameOffset + 4, 8); int datalen = (int)DataLoader.getValAtAddress(critterFile, frameOffset + 5, 16); //Adjust the hotspots from the biggest point back to the image corners int cornerX; int cornerY; cornerX = MaxHotSpotX - hotspotx; cornerY = MaxHotSpotY - hotspoty; if (cornerX <= 0) { cornerX = 0; } else { cornerX = cornerX - 1; } if (cornerY <= 0) { cornerY = 0; } if (true) { //Merge the image into a new big image at the hotspot coordinates.; char[] srcImg; srcImg = new char[BitMapWidth * BitMapHeight * 2]; ArtLoader.ua_image_decode_rle(critterFile, srcImg, compression == 6 ? 5 : 4, datalen, BitMapWidth * BitMapHeight, frameOffset + 7, auxPalVal); cornerY = MaxHeight - cornerY;//y is from the top left corner int ColCounter = 0; int RowCounter = 0; bool ImgStarted = false; for (int y = 0; y < MaxHeight; y++) { for (int x = 0; x < MaxWidth; x++) { if ((cornerX + ColCounter == x) && (MaxHeight - cornerY + RowCounter == y) && (ColCounter < BitMapWidth) && (RowCounter < BitMapHeight)) {//the pixel from the source image is here ImgStarted = true; outputImg[x + (y * MaxWidth)] = srcImg[ColCounter + (RowCounter * BitMapWidth)]; ColCounter++; } else { outputImg[x + (y * MaxWidth)] = (char)0;//alpha } } if (ImgStarted == true) {//New Row on the src image RowCounter++; ColCounter = 0; } } //Set the heights for output BitMapWidth = MaxWidth; BitMapHeight = MaxHeight; Texture2D imgData = ArtLoader.Image(outputImg, 0, BitMapWidth, BitMapHeight, "namehere", pal, true, true); CropImageData(ref imgData, pal); AnimInfo.animSprites[spriteIndex++] = Sprite.Create(imgData, new Rect(0f, 0f, imgData.width, imgData.height), new Vector2(0.5f, 0.0f)); } } //end extrac frameoffset } //End for loop extract } //End extract images } //Debug.Log(fileCrit + " returning " + spriteIndex); return(spriteIndex); }