public long AddNode(ArcNode node) { long ptr = nodes.Count; nodes.Add(node); return(ptr); }
private static void DumpArcNode(Stream arcstr, ArcHeader head, ArcNode node, string destroot, string nameoverride = null) { string nodeName = nameoverride; arcstr.Seek(node.filenameOffset + head.stringOffset + 0x20, SeekOrigin.Begin); if (nodeName == null) { nodeName = Data.ReadString(arcstr); } destroot += "\\" + nodeName; Directory.CreateDirectory(destroot); for (int i = 0; i < node.entryCount; ++i) { ArcFileEntry curr = new ArcFileEntry(arcstr, head, (int)(node.entryOffset + i)); if (curr.id == 0xFFFF) //subdirectory { if (curr.filenameOffset != 0 && curr.filenameOffset != 2) //don't go to "." and ".." { ArcNode dirNode = new ArcNode(arcstr, (int)curr.dataOffset); //Some arc packing programs have a glitch arcstr.Seek(curr.filenameOffset + head.stringOffset + 0x20, SeekOrigin.Begin); //People use them so just work around it DumpArcNode(arcstr, head, dirNode, destroot, Data.ReadString(arcstr)); } } else //file { arcstr.Seek(curr.filenameOffset + head.stringOffset + 0x20, SeekOrigin.Begin); string currName = Data.ReadString(arcstr); FileStream dest = new FileStream(destroot + "\\" + currName, FileMode.Create); int read = 0; byte[] buff = new byte[1024]; arcstr.Seek(curr.dataOffset + head.dataStart + 0x20, SeekOrigin.Begin); while (read < curr.dataSize) { int r = arcstr.Read(buff, 0, (int)Math.Min(1024, curr.dataSize - read)); dest.Write(buff, 0, r); read += r; } dest.Close(); } } }
public static void ExtractArc(string arc, string dest) { FileStream arcstr = new FileStream(arc, FileMode.Open, FileAccess.Read); byte[] magic = Data.Read(arcstr, 4); if (Data.CompareBytes(magic, RARC) != 0) { Console.WriteLine(arc + " is not a valid arc file."); return; } ArcHeader head = new ArcHeader(arcstr); ArcNode root = new ArcNode(arcstr, 0); DumpArcNode(arcstr, head, root, dest); arcstr.Close(); }
public void ArcNode() { var tc = new TestCore(); tc.Init(); var arc1 = new ArcNode() { Color = new Color(255, 0, 0), Position = new Vector2F(100, 100), Radius = 50f, VertNum = 30, }; var arc2 = new ArcNode() { Color = new Color(0, 255, 0), Position = new Vector2F(400, 200), Radius = 30f, VertNum = 8, }; var arc3 = new ArcNode() { Color = new Color(0, 0, 255), Position = new Vector2F(50, 400), Radius = 40f, VertNum = 5, }; Engine.AddNode(arc1); Engine.AddNode(arc2); Engine.AddNode(arc3); tc.LoopBody(x => { arc1.StartDegree++; arc2.StartDegree++; arc3.StartDegree++; arc1.EndDegree--; arc2.EndDegree--; arc3.EndDegree--; }, null); tc.End(); }
static void Main(string[] args) { // Altseed2 を初期化します。 Engine.Initialize("ShapeNode", 640, 480); // 円を描画するノード var circle = new CircleNode() { Color = new Color(255, 100, 100), Radius = 30f, Position = new Vector2F(100f, 300f), VertNum = 30 }; // 円弧を描画するノード var arc = new ArcNode() { Color = new Color(100, 255, 100), Radius = 25f, Position = new Vector2F(300f, 100f), StartDegree = 30f, EndDegree = 150f, VertNum = 30 }; // 直線を描画するノード var line = new LineNode() { Color = new Color(100, 100, 255), Point1 = new Vector2F(200f, 150f), Point2 = new Vector2F(400f, 350f), Thickness = 5f }; // 短形を描画するノード var rectangle = new RectangleNode() { Color = new Color(255, 255, 100), Position = new Vector2F(300f, 400f), RectangleSize = new Vector2F(50f, 50f) }; // 三角形を描画するノード var triangle = new TriangleNode() { Color = new Color(255, 100, 255), Point1 = new Vector2F(50f, 50f), Point2 = new Vector2F(100f, 50f), Point3 = new Vector2F(50f, 100f), }; // エンジンにノードを追加します。 Engine.AddNode(circle); Engine.AddNode(arc); Engine.AddNode(line); Engine.AddNode(rectangle); Engine.AddNode(triangle); // メインループ。 // Altseed のウインドウが閉じられると終了します。 while (Engine.DoEvents()) { // Altseed を更新します。 Engine.Update(); } // Altseed の終了処理をします。 Engine.Terminate(); }
public CircleEvent(ArcNode disappearingArc, double lowestCircleY) : base(lowestCircleY) { DisappearingArc = disappearingArc; }
public void Apply(ArcNode arcNode) { }
private static ArcInfo BuildArcInfo(string dir, string arcdir, long parent, Dictionary <string, ushort> dirStrings, ArcInfo ai) { DirectoryInfo di = new DirectoryInfo(dir); string curdir; if (arcdir != "") { curdir = arcdir + "/" + di.Name; } else { curdir = di.Name; } ArcNode dirNode = new ArcNode(); if (!dirStrings.ContainsKey(dir)) { dirNode.filenameOffset = (uint)ai.AddString(di.Name); } else { dirNode.filenameOffset = dirStrings[dir]; } dirNode.unknown = GCN.CreateHash(di.Name); dirNode.entryOffset = (uint)(ai.files.Count); dirNode.entryCount = 0; dirNode.WritePath = curdir; if (ai.nodes.Count == 0) { dirNode.type = BitConverter.ToUInt32(new byte[4] { (byte)'T', (byte)'O', (byte)'O', (byte)'R' }, 0); } else { byte[] type = new byte[4]; for (int i = 0; i < 4; i++) { if (i < di.Name.Length) { type[3 - i] = (byte)(di.Name.ToUpper())[i]; } else { type[3 - i] = 0x20; } } dirNode.type = BitConverter.ToUInt32(type, 0); } long coffset = ai.AddNode(dirNode); string[] files = Directory.EnumerateFiles(dir, "*", SearchOption.TopDirectoryOnly).ToArray(); foreach (string file in files) { FileInfo fi = new FileInfo(file); ArcFileEntry fentry = new ArcFileEntry(); fentry.id = 0; if (dirStrings.ContainsKey(file)) { fentry.filenameOffset = dirStrings[file]; } else { fentry.filenameOffset = (ushort)ai.AddString(fi.Name); } fentry.dataOffset = (uint)ai.CountData(file, out fentry.dataSize); fentry.WritePath = curdir + "/" + fi.Name; fentry.unknown = GCN.CreateHash(fi.Name); fentry.unknown2 = 0x1100; ai.AddFile(fentry); dirNode.entryCount++; } long fileoff = coffset; string[] dirs = Directory.EnumerateDirectories(dir, "*", SearchOption.TopDirectoryOnly).ToArray(); foreach (string idir in dirs) { DirectoryInfo idi = new DirectoryInfo(idir); ArcFileEntry dentry = new ArcFileEntry(); dentry.id = 0xFFFF; dentry.filenameOffset = (ushort)ai.AddString(idi.Name); dirStrings.Add(idir, dentry.filenameOffset); dentry.dataOffset = (uint)(++fileoff); fileoff += Directory.EnumerateDirectories(idir, "*", SearchOption.AllDirectories).Count(); dentry.dataSize = 16; dentry.WritePath = curdir; dentry.unknown = GCN.CreateHash(idi.Name); dentry.unknown2 = 0x0200; ai.AddFile(dentry); dirNode.entryCount++; } ArcFileEntry cEntry = new ArcFileEntry(); cEntry.id = 0xFFFF; cEntry.filenameOffset = 0; cEntry.WritePath = curdir; cEntry.dataOffset = (uint)coffset; cEntry.dataSize = 16; cEntry.unknown = 0x2E; cEntry.unknown2 = 0x0200; ai.AddFile(cEntry); ArcFileEntry pEntry = new ArcFileEntry(); pEntry.filenameOffset = 2; pEntry.id = 0xFFFF; pEntry.WritePath = arcdir; pEntry.dataOffset = (uint)parent; pEntry.dataSize = 16; pEntry.unknown = 0xB8; pEntry.unknown2 = 0x0200; ai.AddFile(pEntry); dirNode.entryCount += 2; ai.nodes[ai.nodes.Count - 1] = dirNode; foreach (string idir in dirs) { ai = BuildArcInfo(idir, curdir, coffset, dirStrings, ai); } return(ai); }
public void Apply(ArcNode arcNode) { _canvas2DContext.ArcAsync(arcNode.Position.X, arcNode.Position.Y, arcNode.Radius, arcNode.StartAngle, arcNode.EndAngle, arcNode.IsCounterClockwise); }