private void UpdateKartReferenceImage() { KartAnimationSeries refAnim = kartPreviewControl.ReferenceKart.KartAnimations.FirstOrDefault( f => (f.KartAnimationType & SelectedAnimation.KartAnimationType) != 0); if (refAnim == null) { kartPreviewControl.OverlayImage = null; return; } int refIndex; if (refAnim.IsTurnAnim) { refIndex = refAnim.GetImageIndexForTurnFrame(SelectedAnimation.GetTurnFrameForImageIndex(SelectedAnimation.OrderedImageNames.IndexOf(SelectedImage.Name))); } else if (refAnim.IsSpinAnim) { refIndex = refAnim.GetImageIndexForSpinFrame(SelectedAnimation.GetSpinFrameForImageIndex(SelectedAnimation.OrderedImageNames.IndexOf(SelectedImage.Name))); } else { refIndex = refAnim.GetImageIndexForCrashFrame(SelectedAnimation.GetCrashFrameForImageIndex(SelectedAnimation.OrderedImageNames.IndexOf(SelectedImage.Name))); } kartPreviewControl.OverlayImage = kartPreviewControl.ReferenceKart.KartImages.Images[refAnim.OrderedImageNames[refIndex]].Images[0].Image; }
private void btnAnimRename_Click(object sender, EventArgs e) { //Rename anim TextInputForm form = new TextInputForm("New Animation Name:", "Rename Animation"); if (form.ShowDialog() == System.Windows.Forms.DialogResult.OK) { KartAnimationSeries existingAnim = Kart.Kart.KartAnimations.SingleOrDefault(k => k.Name == form.TextOutput); if (existingAnim == SelectedAnimation) { return; } if (existingAnim != null) { MessageBox.Show("Animation with the given name already exists! Please use a unique name!", "Warning"); return; } Kart.RenameAnimation(SelectedAnimation, form.TextOutput); PopulateAnimations(); //PopulateAnimationImages(); //UpdateKartPreviewAnimation(); //UpdateAnimationEnableds(); } }
public void RenameAnimation(KartAnimationSeries animation, string newName) { animation.Name = newName; IsModified = true; //Event }
public void AddImagetoAnimation(KartAnimationSeries animation, int insertIndex, KartImage image) { animation.OrderedImageNames.Insert(insertIndex, image.Name); IsModified = true; //Event }
public void SetAnimationType(KartAnimationSeries anim, int newAnimType) { if (anim == null) { return; } anim.KartAnimationType = newAnimType; IsModified = true; //Event }
public void DuplicateImageInAnimation(KartAnimationSeries anim, int index) { if (anim == null || index < 0 || index >= anim.OrderedImageNames.Count) { return; } anim.OrderedImageNames.Insert(index, anim.OrderedImageNames[index]); IsModified = true; //Event }
public void RemoveImageFromAnimation(KartAnimationSeries anim, int index) { if (anim == null || index < 0 || index >= anim.OrderedImageNames.Count) { return; } anim.OrderedImageNames.RemoveAt(index); IsModified = true; //Event }
public void RemoveAnimation(KartAnimationSeries anim) { if (!Kart.KartAnimations.Contains(anim)) { return; } Kart.KartAnimations.Remove(anim); IsModified = true; //Events }
public void AddNewAnimation(string animName) { if (Kart.KartAnimations.SingleOrDefault(k => k.Name == animName) != null) { return; //Name already exists } KartAnimationSeries anim = new KartAnimationSeries(animName); Kart.KartAnimations.Add(anim); IsModified = true; //Events }
private void PopulateAnimations() { KartAnimationSeries selected = (KartAnimationSeries)lbAnimations.SelectedItem; lbAnimations.Items.Clear(); for (int i = 0; i < Kart.Kart.KartAnimations.Count; i++) { lbAnimations.Items.Add(Kart.Kart.KartAnimations[i]); } if (selected != null && Kart.Kart.KartAnimations.Contains(selected)) { lbAnimations.SelectedItem = selected; } }
public void MoveImageDownInAnimation(KartAnimationSeries anim, int index) { if (anim == null || index < 0 || index >= anim.OrderedImageNames.Count - 1) { return; } string indexName = anim.OrderedImageNames[index + 1]; anim.OrderedImageNames[index + 1] = anim.OrderedImageNames[index]; anim.OrderedImageNames[index] = indexName; IsModified = true; //Event }
public void SaveKartInfo() { if (KartGraphicsBlock == null) { return; } //These hold the palette blocks associated with each animation Dictionary <KartAnimationSeries, KartPaletteBlock> TurnPaletteBlocks = new Dictionary <KartAnimationSeries, KartPaletteBlock>(); Dictionary <KartAnimationSeries, KartPaletteBlock> SpinPaletteBlocks = new Dictionary <KartAnimationSeries, KartPaletteBlock>(); int turnPaletteBlockIndex = 0; int spinPaletteBlockIndex = 0; for (int i = 0; i < MarioKart64ElementHub.Instance.SelectedKarts.Length; i++) { KartInfo kart = MarioKart64ElementHub.Instance.SelectedKarts[i]; //Save the main palette if (kart.KartImages.ImagePalette.FileOffset == -1) { kart.KartImages.ImagePalette.FileOffset = NewElementOffset; AdvanceNewElementOffset(kart.KartImages.ImagePalette); RomProject.Instance.Files[0].AddElement(kart.KartImages.ImagePalette); } KartGraphicsBlock.CharacterPaletteReferences[i] = new DmaAddress(0x0F, kart.KartImages.ImagePalette.FileOffset - KartGraphicsReferenceBlock.DMA_SEGMENT_OFFSET); KartGraphicsBlock.CharacterPaletteReferences[i].ReferenceElement = kart.KartImages.ImagePalette; //Save the kart palettes in BLOCKS! //but first, assign each unique animation its own PaletteBlock, adding new ones as necessary //Backwards, so the order is preserved for (int h = kart.KartAnimations.Count - 1; h >= 0; h--) { KartAnimationSeries anim = kart.KartAnimations[h]; if (anim.IsTurnAnim) { if (!TurnPaletteBlocks.ContainsKey(anim)) { while (this.TurnKartPaletteBlocks.Count <= turnPaletteBlockIndex) { byte[] newPaletteBlockData = new byte[0x40 * 2 * 20 * 4]; KartPaletteBlock block = new KartPaletteBlock(this.NewElementOffset, newPaletteBlockData); foreach (Palette palette in block.Palettes) { RomProject.Instance.Files[0].AddElement(palette); } this.AdvanceNewElementOffset(block); this.TurnKartPaletteBlocks.Add(block); } TurnPaletteBlocks.Add(anim, this.TurnKartPaletteBlocks[turnPaletteBlockIndex]); turnPaletteBlockIndex++; byte[] testingBytes = anim.GenerateKartAnimationPaletteData( kart.KartImages, true); TurnPaletteBlocks[anim].RawData = testingBytes; } } if (anim.IsSpinAnim) { if (!SpinPaletteBlocks.ContainsKey(anim)) { while (this.SpinKartPaletteBlocks.Count <= spinPaletteBlockIndex) { byte[] newPaletteBlockData = new byte[0x40 * 2 * 20 * 4]; KartPaletteBlock block = new KartPaletteBlock(this.NewElementOffset, newPaletteBlockData); foreach (Palette palette in block.Palettes) { RomProject.Instance.Files[0].AddElement(palette); } this.AdvanceNewElementOffset(block); this.SpinKartPaletteBlocks.Add(block); } SpinPaletteBlocks.Add(anim, this.SpinKartPaletteBlocks[spinPaletteBlockIndex]); spinPaletteBlockIndex++; SpinPaletteBlocks[anim].RawData = anim.GenerateKartAnimationPaletteData( kart.KartImages, false); } } } List <int> setAnimPaletteBlock = new List <int>(); for (int j = 0; j < KartGraphicsBlock.CharacterTurnReferences[i].Length; j++) { int animFlag; int frameIndex; //Theres a function for this in KartReader? bool isTurnAnim = true; if (j < KartGraphicsReferenceBlock.ANIMATION_ANGLE_COUNT * KartGraphicsReferenceBlock.FULL_TURN_REF_COUNT) { animFlag = (int)Math.Round(Math.Pow(2, j / KartGraphicsReferenceBlock.FULL_TURN_REF_COUNT)); frameIndex = j - (j / KartGraphicsReferenceBlock.FULL_TURN_REF_COUNT) * KartGraphicsReferenceBlock.FULL_TURN_REF_COUNT; //The last 14 values of the turn animation are from the spin one, actually if (frameIndex >= KartGraphicsReferenceBlock.HALF_TURN_REF_COUNT) { animFlag <<= 9; //Make it spin anim, not turn anim frameIndex -= 15; isTurnAnim = false; //Don't do palette block stuff for this one } } else { animFlag = (int)Math.Round(Math.Pow(2, (j - KartGraphicsReferenceBlock.ANIMATION_ANGLE_COUNT * KartGraphicsReferenceBlock.FULL_TURN_REF_COUNT) / KartGraphicsReferenceBlock.FULL_SPIN_REF_COUNT + KartGraphicsReferenceBlock.ANIMATION_ANGLE_COUNT)); frameIndex = j - (KartGraphicsReferenceBlock.FULL_TURN_REF_COUNT * KartGraphicsReferenceBlock.ANIMATION_ANGLE_COUNT) - ((j - KartGraphicsReferenceBlock.ANIMATION_ANGLE_COUNT * KartGraphicsReferenceBlock.FULL_TURN_REF_COUNT) / KartGraphicsReferenceBlock.FULL_SPIN_REF_COUNT) * KartGraphicsReferenceBlock.FULL_SPIN_REF_COUNT; isTurnAnim = false; } KartAnimationSeries anim = kart.KartAnimations.FirstOrDefault(f => (f.KartAnimationType & animFlag) != 0); if (anim != null) { //Need to replace animIndex with GetIndexfor(animIndex), but we need a better spin/turn/crash test string imageName; if (anim.IsTurnAnim) { imageName = anim.OrderedImageNames[anim.GetImageIndexForTurnFrame(frameIndex)]; } else //if (anim.IsSpinAnim) { imageName = anim.OrderedImageNames[anim.GetImageIndexForSpinFrame(frameIndex)]; } MK64Image mkImage = kart.KartImages.Images[imageName].Images[0]; //Save the image if (mkImage.TextureOffset == -1) { //It has to be an MIO0 block foreach (MK64Image editThisImage in kart.KartImages.Images[imageName].Images) { editThisImage.TextureBlockOffset = 0; editThisImage.TextureOffset = NewElementOffset; } mkImage.ImageReference.Texture.FileOffset = 0; MIO0Block newBlock = new MIO0Block(NewElementOffset, mkImage.ImageReference.Texture.RawData); AdvanceNewElementOffset(newBlock); RomProject.Instance.Files[0].AddElement(newBlock); } DmaAddress address = new DmaAddress(0x0F, mkImage.TextureOffset - KartGraphicsReferenceBlock.DMA_SEGMENT_OFFSET); N64DataElement blockEl; if (!RomProject.Instance.Files[0].HasElementAt(mkImage.TextureOffset, out blockEl)) { throw new Exception(); } MIO0Block block = (MIO0Block)blockEl; address.ReferenceElement = block; KartGraphicsBlock.CharacterTurnReferences[i][j] = address; int animIndex; if (animFlag == 0) { animIndex = 0; } else { animIndex = (int)Math.Round(Math.Log(animFlag, 2)); } //inverse the animation index if (animIndex < 9) { animIndex = 8 - animIndex; } else { animIndex = (8 - (animIndex - 9)) + 9; } if (!setAnimPaletteBlock.Contains(animIndex)) { if (isTurnAnim) { KartGraphicsBlock.WheelPaletteReferences[i][animIndex] = new DmaAddress(0x0F, TurnPaletteBlocks[anim].FileOffset - KartGraphicsReferenceBlock.DMA_SEGMENT_OFFSET); } else { KartGraphicsBlock.WheelPaletteReferences[i][animIndex] = new DmaAddress(0x0F, SpinPaletteBlocks[anim].FileOffset - KartGraphicsReferenceBlock.DMA_SEGMENT_OFFSET); } setAnimPaletteBlock.Add(animIndex); } } } for (int j = 0; j < KartGraphicsBlock.CharacterCrashReferences[i].Length; j++) { KartAnimationSeries anim = kart.KartAnimations.FirstOrDefault(f => (f.KartAnimationType & (int)KartAnimationSeries.KartAnimationTypeFlag.Crash) != 0); if (anim != null) { MK64Image mkImage = kart.KartImages.Images[anim.OrderedImageNames[anim.GetImageIndexForCrashFrame(j)]].Images[0]; if (mkImage.TextureOffset == -1) { foreach (MK64Image editThisImage in kart.KartImages.Images[anim.OrderedImageNames[anim.GetImageIndexForCrashFrame(j)]].Images) { editThisImage.TextureBlockOffset = 0; editThisImage.TextureOffset = NewElementOffset; } mkImage.ImageReference.Texture.FileOffset = 0; MIO0Block newBlock = new MIO0Block(NewElementOffset, mkImage.ImageReference.Texture.RawData); AdvanceNewElementOffset(newBlock); RomProject.Instance.Files[0].AddElement(newBlock); } N64DataElement element; if (!RomProject.Instance.Files[0].HasElementExactlyAt(mkImage.TextureOffset, out element)) { throw new Exception(); } MIO0Block block = (MIO0Block)element; //Save the image if (block.FileOffset == -1) { block.FileOffset = NewElementOffset; AdvanceNewElementOffset(block); RomProject.Instance.Files[0].AddElement(block); } DmaAddress address = new DmaAddress(0x0F, block.FileOffset - KartGraphicsReferenceBlock.DMA_SEGMENT_OFFSET); address.ReferenceElement = block; KartGraphicsBlock.CharacterCrashReferences[i][j] = address; } } for (int j = 0; j < kart.KartPortraits.Count; j++) { if (kart.KartPortraits[j].TextureOffset == -1) { kart.KartPortraits[j].TextureBlockOffset = 0; kart.KartPortraits[j].TextureOffset = NewElementOffset; kart.KartPortraits[j].ImageReference.Texture.FileOffset = 0; MIO0Block newBlock = new MIO0Block(NewElementOffset, kart.KartPortraits[j].ImageReference.Texture.RawData); AdvanceNewElementOffset(newBlock); RomProject.Instance.Files[0].AddElement(newBlock); } KartPortraitTableEntry entry = new KartPortraitTableEntry(kart.KartPortraits[j].TextureOffset, kart.KartPortraits[j]); KartPortraitsTable.Entries[i][j] = entry; } N64DataElement tkmk; if (RomProject.Instance.Files[0].HasElementExactlyAt(MarioKartRomInfo.CharacterNameplateReference[i], out tkmk) && tkmk is TKMK00Block) { TKMK00Block oldTkmk = (TKMK00Block)tkmk; oldTkmk.ImageAlphaColor = kart.KartNamePlate.TKMKAlphaColor; oldTkmk.SetImage(kart.KartNamePlate.Image); } } }
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); } }