source: OniSplit/Objects/ObjcDatWriter.cs

Last change on this file was 1114, checked in by iritscen, 5 years ago

Adding OniSplit source code (v0.9.99.0). Many thanks to Neo for all his work over the years.

File size: 5.0 KB
Line 
1using System;
2using System.Collections.Generic;
3using Oni.Metadata;
4
5namespace Oni.Objects
6{
7 internal class ObjcDatWriter : Importer
8 {
9 private readonly TypeTag tag;
10 private readonly string name;
11 private readonly List<Objects.ObjectBase> objects;
12 private readonly Type type;
13
14 private ObjcDatWriter(TypeTag tag, string name, List<Objects.ObjectBase> objects)
15 {
16 this.tag = tag;
17 this.name = name;
18 this.objects = objects;
19
20 if (tag == TypeTag.CHAR)
21 type = typeof(Character);
22 else if (tag == TypeTag.WEAP)
23 type = typeof(Weapon);
24 else if (tag == TypeTag.PART)
25 type = typeof(Particle);
26 else if (tag == TypeTag.PWRU)
27 type = typeof(PowerUp);
28 else if (tag == TypeTag.FLAG)
29 type = typeof(Flag);
30 else if (tag == TypeTag.DOOR)
31 type = typeof(Door);
32 else if (tag == TypeTag.CONS)
33 type = typeof(Objects.Console);
34 else if (tag == TypeTag.FURN)
35 type = typeof(Furniture);
36 else if (tag == TypeTag.TRIG)
37 type = typeof(Trigger);
38 else if (tag == TypeTag.TRGV)
39 type = typeof(TriggerVolume);
40 else if (tag == TypeTag.SNDG)
41 type = typeof(Objects.Sound);
42 else if (tag == TypeTag.TURR)
43 type = typeof(Turret);
44 else if (tag == TypeTag.NEUT)
45 type = typeof(Neutral);
46 else if (tag == TypeTag.PATR)
47 type = typeof(PatrolPath);
48 }
49
50 private enum TypeTag
51 {
52 CHAR = 0x43484152,
53 CMBT = 0x434d4254,
54 CONS = 0x434f4e53,
55 DOOR = 0x444f4f52,
56 FLAG = 0x464c4147,
57 FURN = 0x4655524e,
58 MELE = 0x4d454c45,
59 NEUT = 0x4e455554,
60 PART = 0x50415254,
61 PATR = 0x50415452,
62 PWRU = 0x50575255,
63 SNDG = 0x534e4447,
64 TRGV = 0x54524756,
65 TRIG = 0x54524947,
66 TURR = 0x54555252,
67 WEAP = 0x57454150
68 }
69
70 public static void Write(List<Objects.ObjectBase> objects, string outputDirPath)
71 {
72 System.Console.Error.WriteLine("Writing {0} objects...", objects.Count);
73
74 Write(TypeTag.CHAR, "Character", objects, outputDirPath);
75 Write(TypeTag.CONS, "Console", objects, outputDirPath);
76 Write(TypeTag.DOOR, "Door", objects, outputDirPath);
77 Write(TypeTag.FLAG, "Flag", objects, outputDirPath);
78 Write(TypeTag.FURN, "Furniture", objects, outputDirPath);
79 Write(TypeTag.NEUT, "Neutral", objects, outputDirPath);
80 Write(TypeTag.PART, "Particle", objects, outputDirPath);
81 Write(TypeTag.PATR, "Patrol Path", objects, outputDirPath);
82 Write(TypeTag.PWRU, "PowerUp", objects, outputDirPath);
83 Write(TypeTag.SNDG, "Sound", objects, outputDirPath);
84 Write(TypeTag.TRIG, "Trigger", objects, outputDirPath);
85 Write(TypeTag.TRGV, "Trigger Volume", objects, outputDirPath);
86 Write(TypeTag.TURR, "Turret", objects, outputDirPath);
87 Write(TypeTag.WEAP, "Weapon", objects, outputDirPath);
88 }
89
90 private static void Write(TypeTag tag, string name, List<Objects.ObjectBase> objects, string outputDirPath)
91 {
92 var writer = new ObjcDatWriter(tag, name, objects);
93 writer.Import(null, outputDirPath);
94 }
95
96 public override void Import(string filePath, string outputDirPath)
97 {
98 BeginImport();
99
100 var bina = CreateInstance(TemplateTag.BINA, "CJBO" + name);
101
102 int offset = RawWriter.Align32();
103 int size = WriteCollection(RawWriter);
104
105 using (var writer = bina.OpenWrite())
106 {
107 writer.Write(size);
108 writer.Write(offset);
109 }
110
111 Write(outputDirPath);
112 }
113
114 private int WriteCollection(BinaryWriter raw)
115 {
116 int start = raw.Position;
117
118 raw.Write((int)BinaryTag.OBJC);
119 raw.Write(0);
120 raw.Write(39);
121
122 foreach (var obj in objects.Where(o => o.GetType() == type))
123 {
124 int objectStartPosition = raw.Position;
125 raw.Write(0);
126 raw.Write((int)tag);
127
128 obj.Write(raw);
129
130 raw.Position = Utils.Align4(raw.Position);
131 int objectSize = raw.Position - objectStartPosition - 4;
132 raw.WriteAt(objectStartPosition, objectSize);
133 }
134
135 raw.Write(0);
136 int size = raw.Position - start;
137 raw.WriteAt(start + 4, size - 8);
138 return size;
139 }
140 }
141}
Note: See TracBrowser for help on using the repository browser.