private void _LoadDummyEBG(BGSCENE_DEF sceneUS, String path, String newName, FieldMapLocalizeAreaTitleInfo info, String localizeSymbol) { this.name = newName; TextAsset textAsset = AssetManager.Load <TextAsset>(String.Concat(path, newName, "_", localizeSymbol, ".bgs"), false); if (textAsset == null) { return; } this.ebgBin = textAsset.bytes; using (BinaryReader binaryReader = new BinaryReader(new MemoryStream(this.ebgBin))) { this.ExtractHeaderData(binaryReader); this.ExtractOverlayData(binaryReader); Int32 atlasWidth = info.atlasWidth; Int32 startOvrIdx = info.startOvrIdx; Int32 endOvrIdx = info.endOvrIdx; Int32 spriteStartIndex = info.GetSpriteStartIndex(localizeSymbol); Int32 num = atlasWidth / 36; Int32 num2 = spriteStartIndex; for (Int32 i = startOvrIdx; i <= endOvrIdx; i++) { BGOVERLAY_DEF bGOVERLAY_DEF = this.overlayList[i]; binaryReader.BaseStream.Seek(bGOVERLAY_DEF.prmOffset, SeekOrigin.Begin); for (Int32 j = 0; j < (Int32)bGOVERLAY_DEF.spriteCount; j++) { BGSPRITE_LOC_DEF bGSPRITE_LOC_DEF = new BGSPRITE_LOC_DEF(); bGSPRITE_LOC_DEF.ReadData_BGSPRITE_DEF(binaryReader); bGOVERLAY_DEF.spriteList.Add(bGSPRITE_LOC_DEF); } binaryReader.BaseStream.Seek(bGOVERLAY_DEF.locOffset, SeekOrigin.Begin); for (Int32 k = 0; k < (Int32)bGOVERLAY_DEF.spriteCount; k++) { BGSPRITE_LOC_DEF bGSPRITE_LOC_DEF2 = bGOVERLAY_DEF.spriteList[k]; bGSPRITE_LOC_DEF2.ReadData_BGSPRITELOC_DEF(binaryReader); if (this.useUpscaleFM) { bGSPRITE_LOC_DEF2.atlasX = (UInt16)(2 + num2 % num * 36); bGSPRITE_LOC_DEF2.atlasY = (UInt16)(2 + num2 / num * 36); bGSPRITE_LOC_DEF2.w = 32; bGSPRITE_LOC_DEF2.h = 32; num2++; } } } for (Int32 l = startOvrIdx; l <= endOvrIdx; l++) { sceneUS.overlayList[l] = this.overlayList[l]; } } }
private void ExtractSpriteData(BinaryReader reader) { this.spriteCount = 0; for (Int32 i = 0; i < (Int32)this.overlayCount; i++) { BGOVERLAY_DEF bGOVERLAY_DEF = this.overlayList[i]; this.spriteCount += bGOVERLAY_DEF.spriteCount; } if (this.useUpscaleFM) { this.ATLAS_H = (UInt32)this.atlas.height; this.ATLAS_W = (UInt32)this.atlas.width; } Int32 num = this.atlas.width / 36; Int32 num2 = 0; for (Int32 j = 0; j < (Int32)this.overlayCount; j++) { BGOVERLAY_DEF bGOVERLAY_DEF2 = this.overlayList[j]; reader.BaseStream.Seek(bGOVERLAY_DEF2.prmOffset, SeekOrigin.Begin); for (Int32 k = 0; k < (Int32)bGOVERLAY_DEF2.spriteCount; k++) { BGSPRITE_LOC_DEF bGSPRITE_LOC_DEF = new BGSPRITE_LOC_DEF(); bGSPRITE_LOC_DEF.ReadData_BGSPRITE_DEF(reader); bGOVERLAY_DEF2.spriteList.Add(bGSPRITE_LOC_DEF); } reader.BaseStream.Seek(bGOVERLAY_DEF2.locOffset, SeekOrigin.Begin); for (Int32 l = 0; l < (Int32)bGOVERLAY_DEF2.spriteCount; l++) { BGSPRITE_LOC_DEF bGSPRITE_LOC_DEF2 = bGOVERLAY_DEF2.spriteList[l]; bGSPRITE_LOC_DEF2.ReadData_BGSPRITELOC_DEF(reader); if (this.useUpscaleFM) { bGSPRITE_LOC_DEF2.atlasX = (UInt16)(2 + num2 % num * 36); bGSPRITE_LOC_DEF2.atlasY = (UInt16)(2 + num2 / num * 36); bGSPRITE_LOC_DEF2.w = 32; bGSPRITE_LOC_DEF2.h = 32; num2++; } } } }
private static void GetBounds(List <BGOVERLAY_DEF> overlayList, int camIndex, out Int32 minX, out Int32 minY, out Int32 maxX, out Int32 maxY) { maxX = Int32.MinValue; minX = Int32.MaxValue; maxY = Int32.MinValue; minY = Int32.MaxValue; for (int i = 0; i < overlayList.Count; i++) { BGOVERLAY_DEF overlay = overlayList[i]; if (camIndex != overlay.camNdx) { continue; } for (int k = 0; k < overlay.spriteList.Count; k++) { BGSPRITE_LOC_DEF sprite = overlay.spriteList[k]; int offX = sprite.offX + overlay.curX; int offY = sprite.offY + overlay.curY; if (offX < minX) { minX = offX; } if (offX > maxX) { maxX = offX; } if (offY < minY) { minY = offY; } if (offY > maxY) { maxY = offY; } } } }
public Overlay(byte[] layerImageData, BGOVERLAY_DEF overlayInfo, int orderNumber, int sizeX, int sizeY, Int32 minX, Int32 minY, Int32 maxX, Int32 maxY, bool animationFlag) { info = overlayInfo; imageData = layerImageData; _orderNumber = orderNumber; _map = new Tile[sizeX, sizeY]; _sizeX = sizeX; _sizeY = sizeY; _animationFlag = animationFlag; _isAlpha = false; if (info.spriteList.Count > 0 && info.spriteList[0].alpha != 0) { _isAlpha = true; } for (var k = 0; k < info.spriteList.Count; k++) { Tile tileToPush = new Tile(); tileToPush.info = info.spriteList[k]; BGSPRITE_LOC_DEF spriteInfo = info.spriteList[k]; tileToPush.x = (info.orgX + spriteInfo.offX - minX) / 16; // get global x tileToPush.y = (info.orgY + spriteInfo.offY - minY) / 16; // get global y tileToPush.overlay = this; _map[tileToPush.x, tileToPush.y] = tileToPush; } // for debug //Log.Message($"Overlay {orderNumber} map"); //for(var j = 0; j < _sizeY; j++) //{ // String str = ""; // for(var i = 0; i < _sizeX; i++) // { // str += _map[i, j].info == null ? "0" : "1"; // } // Log.Message(str); //} }
private void CreateScene(FieldMap fieldMap, Boolean UseUpscalFM) { GameObject gameObject = new GameObject("Background"); gameObject.transform.parent = fieldMap.transform; gameObject.transform.localPosition = new Vector3(this.curX - 160f, -(this.curY - 112f), this.curZ); gameObject.transform.localScale = new Vector3(1f, -1f, 1f); for (Int32 i = 0; i < this.cameraList.Count; i++) { BGCAM_DEF bGCAM_DEF = this.cameraList[i]; GameObject gameObject2 = new GameObject(String.Concat("Camera_", i.ToString("D2"), " : ", bGCAM_DEF.vrpMaxX + 160f, " x ", bGCAM_DEF.vrpMaxY + 112f)); Transform transform = gameObject2.transform; transform.parent = gameObject.transform; bGCAM_DEF.transform = transform; bGCAM_DEF.transform.localPosition = Vector3.zero; bGCAM_DEF.transform.localScale = new Vector3(1f, 1f, 1f); } List <Vector3> list = new List <Vector3>(); List <Vector2> list2 = new List <Vector2>(); List <Int32> list3 = new List <Int32>(); for (Int32 j = 0; j < this.overlayList.Count; j++) { BGOVERLAY_DEF bGOVERLAY_DEF = this.overlayList[j]; String str = "Overlay_" + j.ToString("D2"); GameObject gameObject3 = new GameObject(str); Transform transform2 = gameObject3.transform; transform2.parent = this.cameraList[bGOVERLAY_DEF.camNdx].transform; transform2.localPosition = new Vector3(bGOVERLAY_DEF.curX * 1f, bGOVERLAY_DEF.curY * 1f, bGOVERLAY_DEF.curZ); transform2.localScale = new Vector3(1f, 1f, 1f); bGOVERLAY_DEF.transform = transform2; for (Int32 k = 0; k < bGOVERLAY_DEF.spriteList.Count; k++) { BGSPRITE_LOC_DEF bGSPRITE_LOC_DEF = bGOVERLAY_DEF.spriteList[k]; var num = bGSPRITE_LOC_DEF.depth; GameObject gameObject4 = new GameObject(str + "_Sprite_" + k.ToString("D3")); Transform transform3 = gameObject4.transform; transform3.parent = transform2; { transform3.localPosition = new Vector3(bGSPRITE_LOC_DEF.offX * 1f, (bGSPRITE_LOC_DEF.offY + 16) * 1f, num); } transform3.localScale = new Vector3(1f, 1f, 1f); bGSPRITE_LOC_DEF.transform = transform3; list.Clear(); list2.Clear(); list3.Clear(); list.Add(new Vector3(0f, -16f, 0f)); list.Add(new Vector3(16f, -16f, 0f)); list.Add(new Vector3(16f, 0f, 0f)); list.Add(new Vector3(0f, 0f, 0f)); Single num2 = this.ATLAS_W; Single num3 = this.ATLAS_H; Single x; Single y; Single x2; Single y2; if (UseUpscalFM) { Single num4 = 0.5f; x = (bGSPRITE_LOC_DEF.atlasX - num4) / num2; y = (this.ATLAS_H - bGSPRITE_LOC_DEF.atlasY + num4) / num3; x2 = (bGSPRITE_LOC_DEF.atlasX + this.SPRITE_W - num4) / num2; y2 = (this.ATLAS_H - (bGSPRITE_LOC_DEF.atlasY + this.SPRITE_H) + num4) / num3; } else { Single num5 = 0.5f; x = (bGSPRITE_LOC_DEF.atlasX + num5) / num2; y = (bGSPRITE_LOC_DEF.atlasY + num5) / num3; x2 = (bGSPRITE_LOC_DEF.atlasX + this.SPRITE_W - num5) / num2; y2 = (bGSPRITE_LOC_DEF.atlasY + this.SPRITE_H - num5) / num3; } list2.Add(new Vector2(x, y)); list2.Add(new Vector2(x2, y)); list2.Add(new Vector2(x2, y2)); list2.Add(new Vector2(x, y2)); list3.Add(2); list3.Add(1); list3.Add(0); list3.Add(3); list3.Add(2); list3.Add(0); Mesh mesh = new Mesh { vertices = list.ToArray(), uv = list2.ToArray(), triangles = list3.ToArray() }; MeshRenderer meshRenderer = gameObject4.AddComponent <MeshRenderer>(); MeshFilter meshFilter = gameObject4.AddComponent <MeshFilter>(); meshFilter.mesh = mesh; Int32 num6 = this.curZ + (Int16)bGOVERLAY_DEF.curZ + bGSPRITE_LOC_DEF.depth; GameObject expr_5B4 = gameObject4; expr_5B4.name = expr_5B4.name + "_Depth(" + num6.ToString("D5") + ")"; String text; if (bGSPRITE_LOC_DEF.trans != 0) { if (bGSPRITE_LOC_DEF.alpha == 0) { text = "abr_0"; } else if (bGSPRITE_LOC_DEF.alpha == 1) { text = "abr_1"; } else if (bGSPRITE_LOC_DEF.alpha == 2) { text = "abr_2"; } else { text = "abr_3"; } } else { text = "abr_none"; } if (fieldMap.mapName == "FBG_N39_UUVL_MAP671_UV_DEP_0" && j == 14) { text = "abr_none"; } GameObject expr_671 = gameObject4; expr_671.name = expr_671.name + "_[" + text + "]"; meshRenderer.material = this.materialList[text]; } bGOVERLAY_DEF.transform.gameObject.SetActive((bGOVERLAY_DEF.flags & 2) != 0); } for (Int32 l = 0; l < this.animList.Count; l++) { BGANIM_DEF bGANIM_DEF = this.animList[l]; for (Int32 m = 0; m < bGANIM_DEF.frameList.Count; m++) { GameObject gameObject5 = this.overlayList[bGANIM_DEF.frameList[m].target].transform.gameObject; GameObject expr_754 = gameObject5; expr_754.name = expr_754.name + "_[anim_" + l.ToString("D2") + "]"; GameObject expr_77C = gameObject5; String text2 = expr_77C.name; expr_77C.name = String.Concat(text2, "_[frame_", m.ToString("D2"), "_of_", bGANIM_DEF.frameList.Count.ToString("D2"), "]"); } } }
private void GenerateAtlasFromBinary() { UInt32 num = this.ATLAS_W * this.ATLAS_H; Color32[] array = new Color32[num]; UInt32 num2 = 0u; UInt32 num3 = 1u; for (Int32 i = 0; i < (Int32)this.overlayCount; i++) { BGOVERLAY_DEF bGOVERLAY_DEF = this.overlayList[i]; for (Int32 j = 0; j < (Int32)bGOVERLAY_DEF.spriteCount; j++) { BGSPRITE_LOC_DEF bGSPRITE_LOC_DEF = bGOVERLAY_DEF.spriteList[j]; bGSPRITE_LOC_DEF.atlasX = (UInt16)num2; bGSPRITE_LOC_DEF.atlasY = (UInt16)num3; if (bGSPRITE_LOC_DEF.res == 0) { Int32 index = ArrayUtil.GetIndex(bGSPRITE_LOC_DEF.clutX * 16, bGSPRITE_LOC_DEF.clutY, (Int32)this.vram.width, (Int32)this.vram.height); for (UInt32 num4 = 0u; num4 < (UInt32)bGSPRITE_LOC_DEF.h; num4 += 1u) { Int32 index2 = ArrayUtil.GetIndex(bGSPRITE_LOC_DEF.texX * 64 + bGSPRITE_LOC_DEF.u / 4, (Int32)(bGSPRITE_LOC_DEF.texY * 256u + bGSPRITE_LOC_DEF.v + num4), (Int32)this.vram.width, (Int32)this.vram.height); Int32 index3 = ArrayUtil.GetIndex((Int32)num2, (Int32)(num3 + num4), (Int32)this.ATLAS_W, (Int32)this.ATLAS_H); UInt32 num5 = 0u; while (num5 < (UInt64)(bGSPRITE_LOC_DEF.w / 2)) { Byte b = this.vram.rawData[index2 * 2 + (Int32)num5]; Byte b2 = (Byte)(b & 15); Byte b3 = (Byte)(b >> 4 & 15); Int32 num6 = (index + b2) * 2; UInt16 num7 = (UInt16)(this.vram.rawData[num6] | this.vram.rawData[num6 + 1] << 8); Int32 num8 = index3 + (Int32)(num5 * 2u); ConvertColor16toColor32(num7, out array[num8]); if (bGSPRITE_LOC_DEF.trans != 0 && num7 != 0) { if (bGSPRITE_LOC_DEF.alpha == 0) { array[num8].a = 127; } else if (bGSPRITE_LOC_DEF.alpha == 3) { array[num8].a = 63; } } num6 = (index + b3) * 2; num7 = (UInt16)(this.vram.rawData[num6] | this.vram.rawData[num6 + 1] << 8); num8 = index3 + (Int32)(num5 * 2u) + 1; ConvertColor16toColor32(num7, out array[num8]); if (bGSPRITE_LOC_DEF.trans != 0 && num7 != 0) { if (bGSPRITE_LOC_DEF.alpha == 0) { array[num8].a = 127; } else if (bGSPRITE_LOC_DEF.alpha == 3) { array[num8].a = 63; } } num5 += 1u; } } } else if (bGSPRITE_LOC_DEF.res == 1) { Int32 index4 = ArrayUtil.GetIndex(bGSPRITE_LOC_DEF.clutX * 16, bGSPRITE_LOC_DEF.clutY, (Int32)this.vram.width, (Int32)this.vram.height); for (UInt32 num9 = 0u; num9 < (UInt32)bGSPRITE_LOC_DEF.h; num9 += 1u) { Int32 index5 = ArrayUtil.GetIndex(bGSPRITE_LOC_DEF.texX * 64 + bGSPRITE_LOC_DEF.u / 2, (Int32)(bGSPRITE_LOC_DEF.texY * 256u + bGSPRITE_LOC_DEF.v + num9), (Int32)this.vram.width, (Int32)this.vram.height); Int32 index6 = ArrayUtil.GetIndex((Int32)num2, (Int32)(num3 + num9), (Int32)this.ATLAS_W, (Int32)this.ATLAS_H); for (UInt32 num10 = 0u; num10 < (UInt32)bGSPRITE_LOC_DEF.w; num10 += 1u) { Byte b4 = this.vram.rawData[index5 * 2 + (Int32)num10]; Int32 num11 = (index4 + b4) * 2; UInt16 num12 = (UInt16)(this.vram.rawData[num11] | this.vram.rawData[num11 + 1] << 8); Int32 num13 = index6 + (Int32)num10; ConvertColor16toColor32(num12, out array[num13]); if (bGSPRITE_LOC_DEF.trans != 0 && num12 != 0) { if (bGSPRITE_LOC_DEF.alpha == 0) { array[num13].a = 127; } else if (bGSPRITE_LOC_DEF.alpha == 3) { array[num13].a = 63; } } } } } for (UInt32 num14 = 0u; num14 < (UInt32)bGSPRITE_LOC_DEF.h; num14 += 1u) { Int32 index7 = ArrayUtil.GetIndex((Int32)(num2 + this.SPRITE_W), (Int32)(num3 + num14), (Int32)this.ATLAS_W, (Int32)this.ATLAS_H); array[index7] = array[index7 - 1]; } for (UInt32 num15 = 0u; num15 < (UInt32)bGSPRITE_LOC_DEF.w; num15 += 1u) { Int32 index8 = ArrayUtil.GetIndex((Int32)(num2 + num15), (Int32)num3, (Int32)this.ATLAS_W, (Int32)this.ATLAS_H); Int32 index9 = ArrayUtil.GetIndex((Int32)(num2 + num15), (Int32)(num3 - 1u), (Int32)this.ATLAS_W, (Int32)this.ATLAS_H); array[index9] = array[index8]; } Int32 index10 = ArrayUtil.GetIndex((Int32)(num2 + this.SPRITE_W - 1u), (Int32)num3, (Int32)this.ATLAS_W, (Int32)this.ATLAS_H); Int32 index11 = ArrayUtil.GetIndex((Int32)(num2 + this.SPRITE_W), (Int32)(num3 - 1u), (Int32)this.ATLAS_W, (Int32)this.ATLAS_H); array[index11] = array[index10]; num2 += this.SPRITE_W + 1u; if (num2 >= this.ATLAS_W || this.ATLAS_W - num2 < this.SPRITE_W + 1u) { num2 = 0u; num3 += this.SPRITE_H + 1u; } } } this.atlas.SetPixels32(array); this.atlas.Apply(); }