public static void ApplyResults(TextureReaderResults results) { foreach (MK64Image image in results.NewImages) { MarioKart64ElementHub.Instance.TextureHub.AddImage(image); } foreach (MK64Image image in results.NewKartImages) { MarioKart64ElementHub.Instance.TextureHub.AddKartImage(image); } }
public static void ReadRom(BackgroundWorker worker, byte[] rawData, MarioKart64ReaderResults finalResults) { TextureReaderResults results = new TextureReaderResults(); //Here, load in the texture stuff ProgressService.SetMessage("Loading Textures and Palettes"); foreach (MarioKartRomInfo.MK64ImageInfo imageInfo in MarioKartRomInfo.ImageLocations) { MK64Image image = new MK64Image(imageInfo, rawData); if (image.IsValidImage) { results.AddImage(image); } else { throw new Exception(); } } ProgressService.SetMessage("Loading Kart Images"); foreach (MarioKartRomInfo.MK64ImageInfo imageInfo in KartImageInfo.ImageLocations) { MK64Image image = new MK64Image(imageInfo, rawData); if (image.IsValidImage) { results.AddKartImage(image); } else { throw new Exception(); } } finalResults.TextureResults = results; }
private static void LoadKartInfo(KartGraphicsReferenceBlock block, KartPortraitTable portraits, BackgroundWorker worker, byte[] data, TextureReaderResults textureResults, KartReaderResults results) { for (int i = 0; i < KartGraphicsReferenceBlock.CHARACTER_COUNT; i++) { string kartName = Enum.GetName(typeof(MarioKartRomInfo.OriginalCharacters), i); KartInfo newKart = new KartInfo(kartName, (Palette)block.CharacterPaletteReferences[i].ReferenceElement, true); KartAnimationSeries[] turnAnims = new KartAnimationSeries[KartGraphicsReferenceBlock.ANIMATION_ANGLE_COUNT]; KartAnimationSeries[] spinAnims = new KartAnimationSeries[KartGraphicsReferenceBlock.ANIMATION_ANGLE_COUNT]; KartAnimationSeries crashAnim; MIO0Block[][] turnBlocks = new MIO0Block[KartGraphicsReferenceBlock.ANIMATION_ANGLE_COUNT][]; for (int k = 0; k < KartGraphicsReferenceBlock.ANIMATION_ANGLE_COUNT; k++) { turnBlocks[k] = new MIO0Block[KartGraphicsReferenceBlock.HALF_TURN_REF_COUNT]; } MIO0Block[][] spinBlocks = new MIO0Block[KartGraphicsReferenceBlock.ANIMATION_ANGLE_COUNT][]; for (int k = 0; k < KartGraphicsReferenceBlock.ANIMATION_ANGLE_COUNT; k++) { spinBlocks[k] = new MIO0Block[KartGraphicsReferenceBlock.FULL_SPIN_REF_COUNT]; } DmaAddress[] wheelPaletteReferences = block.WheelPaletteReferences[i]; turnAnims[0] = new KartAnimationSeries(kartName + " Turn Down 25"); turnAnims[0].KartAnimationType = (int)KartAnimationSeries.KartAnimationTypeFlag.RearTurnDown25; turnAnims[1] = new KartAnimationSeries(kartName + " Turn Down 19"); turnAnims[1].KartAnimationType = (int)KartAnimationSeries.KartAnimationTypeFlag.RearTurnDown19; turnAnims[2] = new KartAnimationSeries(kartName + " Turn Down 12"); turnAnims[2].KartAnimationType = (int)KartAnimationSeries.KartAnimationTypeFlag.RearTurnDown12; turnAnims[3] = new KartAnimationSeries(kartName + " Turn Down 6"); turnAnims[3].KartAnimationType = (int)KartAnimationSeries.KartAnimationTypeFlag.RearTurnDown6; turnAnims[4] = new KartAnimationSeries(kartName + " Turn 0"); turnAnims[4].KartAnimationType = (int)KartAnimationSeries.KartAnimationTypeFlag.RearTurn0; turnAnims[5] = new KartAnimationSeries(kartName + " Turn Up 6"); turnAnims[5].KartAnimationType = (int)KartAnimationSeries.KartAnimationTypeFlag.RearTurnUp6; turnAnims[6] = new KartAnimationSeries(kartName + " Turn Up 12"); turnAnims[6].KartAnimationType = (int)KartAnimationSeries.KartAnimationTypeFlag.RearTurnUp12; turnAnims[7] = new KartAnimationSeries(kartName + " Turn Up 19"); turnAnims[7].KartAnimationType = (int)KartAnimationSeries.KartAnimationTypeFlag.RearTurnUp19; turnAnims[8] = new KartAnimationSeries(kartName + " Turn Up 25"); turnAnims[8].KartAnimationType = (int)KartAnimationSeries.KartAnimationTypeFlag.RearTurnUp25; spinAnims[0] = new KartAnimationSeries(kartName + " Spin Down 25"); spinAnims[0].KartAnimationType = (int)(KartAnimationSeries.KartAnimationTypeFlag.FullSpinDown25 | KartAnimationSeries.KartAnimationTypeFlag.FullSpinDown19); spinAnims[1] = spinAnims[0]; spinAnims[2] = new KartAnimationSeries(kartName + " Spin Down 12"); spinAnims[2].KartAnimationType = (int)KartAnimationSeries.KartAnimationTypeFlag.FullSpinDown12; spinAnims[3] = new KartAnimationSeries(kartName + " Spin 0"); spinAnims[3].KartAnimationType = (int)(KartAnimationSeries.KartAnimationTypeFlag.FullSpinDown6 | KartAnimationSeries.KartAnimationTypeFlag.FullSpin0 | KartAnimationSeries.KartAnimationTypeFlag.FullSpinUp6); spinAnims[4] = spinAnims[3]; spinAnims[5] = spinAnims[3]; spinAnims[6] = new KartAnimationSeries(kartName + " Spin Up 12"); spinAnims[6].KartAnimationType = (int)KartAnimationSeries.KartAnimationTypeFlag.FullSpinUp12; spinAnims[7] = new KartAnimationSeries(kartName + " Spin Up 25"); spinAnims[7].KartAnimationType = (int)(KartAnimationSeries.KartAnimationTypeFlag.FullSpinUp19 | KartAnimationSeries.KartAnimationTypeFlag.FullSpinUp25); spinAnims[8] = spinAnims[7]; crashAnim = new KartAnimationSeries(kartName + " Crash"); crashAnim.KartAnimationType = (int)KartAnimationSeries.KartAnimationTypeFlag.Crash; //use to generate the ordered image names Dictionary <MIO0Block, string> MioToImageName = new Dictionary <MIO0Block, string>(); //Work backwards, to help with image naming for (short j = 0; j < KartGraphicsReferenceBlock.ANIMATION_ANGLE_COUNT * KartGraphicsReferenceBlock.FULL_TURN_REF_COUNT + KartGraphicsReferenceBlock.ANIMATION_ANGLE_COUNT * KartGraphicsReferenceBlock.FULL_SPIN_REF_COUNT; j++) { MIO0Block imageBlock = (MIO0Block)block.CharacterTurnReferences[i][j].ReferenceElement; Texture texture = (Texture)imageBlock.Element; List <MK64Image> images; if (textureResults.ImagesByTexture.ContainsKey(texture)) { images = new List <MK64Image>(textureResults.ImagesByTexture[texture]); } else if (MarioKart64ElementHub.Instance.TextureHub.HasImagesForTexture(texture)) { images = MarioKart64ElementHub.Instance.TextureHub.ImagesForTexture(texture); } else { throw new Exception(); } string imageName = images[0].ImageName; //Jump out if the image block has already been handled if (!string.IsNullOrWhiteSpace(imageName) && newKart.KartImages.Images.ContainsKey(imageName)) { continue; } int animIndex, frameIndex; bool isTurnAnim; GetAnimationFrameIndices(j, out animIndex, out frameIndex, out isTurnAnim); if (isTurnAnim) { if (turnBlocks[animIndex][frameIndex] == null) { turnBlocks[animIndex][frameIndex] = imageBlock; } } else { if (spinBlocks[animIndex][frameIndex] == null) { spinBlocks[animIndex][frameIndex] = imageBlock; } } if (!newKart.KartImages.Images.ContainsKey(imageName)) { newKart.KartImages.Images.Add(imageName, new KartImage(images)); } MioToImageName.Add(imageBlock, imageName); } for (int j = 0; j < spinBlocks.Length; j++) { //Don't deal with duplicate animations if (j != 0 && spinAnims[j] == spinAnims[j - 1]) { continue; } for (int k = 0; k < spinBlocks[j].Length; k++) { if (spinBlocks[j][k] != null) { spinAnims[j].OrderedImageNames.Add(MioToImageName[spinBlocks[j][k]]); } } } for (int j = 0; j < turnBlocks.Length; j++) { for (int k = 0; k < turnBlocks[j].Length; k++) { if (turnBlocks[j][k] != null) { turnAnims[j].OrderedImageNames.Add(MioToImageName[turnBlocks[j][k]]); } } } for (int j = 0; j < block.CharacterCrashReferences[i].Length; j++) { MIO0Block imageBlock = (MIO0Block)block.CharacterCrashReferences[i][j].ReferenceElement; Texture texture = (Texture)imageBlock.Element; List <MK64Image> images; if (textureResults.ImagesByTexture.ContainsKey(texture)) { images = new List <MK64Image>(textureResults.ImagesByTexture[texture]); } else if (MarioKart64ElementHub.Instance.TextureHub.HasImagesForTexture(texture)) { images = MarioKart64ElementHub.Instance.TextureHub.ImagesForTexture(texture); } else { throw new Exception(); } string imageName = images[0].ImageName; crashAnim.OrderedImageNames.Add(imageName); if (!newKart.KartImages.Images.ContainsKey(imageName)) { newKart.KartImages.Images.Add(imageName, new KartImage(images)); } } for (int j = 0; j < turnAnims.Length; j++) { newKart.KartAnimations.Add(turnAnims[j]); } for (int j = 0; j < spinAnims.Length; j++) { //Don't store duplicate animations if (j != 0 && spinAnims[j] == spinAnims[j - 1]) { continue; } newKart.KartAnimations.Add(spinAnims[j]); } newKart.KartAnimations.Add(crashAnim); for (int j = 0; j < portraits.Entries[i].Count; j++) { newKart.KartPortraits.Add(portraits.Entries[i][j].ImageReference); } //Find the tkmk block in either the new images or in the hub MK64Image img; if ((img = MarioKart64ElementHub.Instance.TextureHub.Images.SingleOrDefault(im => im.ImageName == TextureNames.PORTAIT_NAME_ARRAY[i])) != null) { newKart.KartNamePlate = img; } else if ((img = textureResults.NewImages.SingleOrDefault(im => im.ImageName == TextureNames.PORTAIT_NAME_ARRAY[i])) != null) { newKart.KartNamePlate = img; } else { throw new Exception(); } MarioKart64ElementHub.Instance.Karts.Add(newKart); MarioKart64ElementHub.Instance.SelectedKarts[i] = newKart; RomProject.Instance.AddRomItem(newKart); } }
private static void LoadKartPortraitDmaReferences(KartPortraitTable portraits, byte[] rawData, TextureReaderResults textureResults, KartReaderResults results, BackgroundWorker worker) { int mioOffset; for (int k = 0; k < portraits.Entries.Count; k++) { List <KartPortraitTableEntry> kartPortraits = portraits.Entries[k]; string kartName = Enum.GetName(typeof(MarioKartRomInfo.OriginalCharacters), k); for (int i = 0; i < kartPortraits.Count; i++) { if (kartPortraits[i].ImageReference == null) { mioOffset = kartPortraits[i].ImageOffset + MarioKartRomInfo.CharacterFaceMIO0Offset; N64DataElement existingMio; MIO0Block mio; if (RomProject.Instance.Files[0].HasElementExactlyAt(mioOffset, out existingMio) && existingMio is MIO0Block) { mio = (MIO0Block)existingMio; Texture texture = (Texture)mio.Element; if (texture == null) { throw new Exception(); //ERROR } //NOTE: DO WE NEED TO ADD ALL 4 POSSIBLE IMAGES?? if (textureResults.ImagesByTexture.ContainsKey(texture)) { kartPortraits[i].ImageReference = textureResults.ImagesByTexture[texture][0]; } else if (MarioKart64ElementHub.Instance.TextureHub.HasImagesForTexture(texture)) { kartPortraits[i].ImageReference = MarioKart64ElementHub.Instance.TextureHub.ImagesForTexture(texture)[0]; } else { throw new Exception(); } } else { //ERROR throw new Exception(); } } } } }