int DrawObjectGroup(Graphics g, int index, ref int cursorX, ref int cursorY, ref int selectedX, ref int selectedY, ObjectGroup group, ObjectGroupEditor editor, ref List<int> objectIndices) { if (group == null) return index; List<int> localObjectIndices = new List<int>(objectIndices); bool foundHoveringMatch = false; for (int i=0; i<group.GetNumObjects(); i++) { ObjectData data = group.GetObjectData(i); if (data.GetObjectType() >= ObjectType.Pointer && data.GetObjectType() <= ObjectType.AntiBossPointer) { ObjectGroup nextGroup = data.GetPointedObjectGroup(); if (nextGroup != null) { List<int> pointerObjectIndices = new List<int>(objectIndices); pointerObjectIndices.Add(i); if (editor != null && i == editor.SelectedIndex) index = DrawObjectGroup(g, index, ref cursorX, ref cursorY, ref selectedX, ref selectedY, nextGroup, editor.SubEditor, ref pointerObjectIndices); else index = DrawObjectGroup(g, index, ref cursorX, ref cursorY, ref selectedX, ref selectedY, nextGroup, null, ref pointerObjectIndices); if (pointerObjectIndices.Count > objectIndices.Count+1) localObjectIndices = pointerObjectIndices; } } else { Color color = data.GetColor(); int x,y; int width; if (data.HasXY()) { x = data.GetX(); y = data.GetY(); width = 16; // Objects with specific positions get // transparency color = Color.FromArgb(0xd0,color.R,color.G,color.B); } else { // No X/Y values exist x = index; y = 0; while (x >= 0xf) { x -= 0xf; y++; } x *= 16; y *= 16; x += 8; y += 8; width = 8; index++; } if (editor != null && i == editor.SelectedIndex) { selectedX = x-8; selectedY = y-8; } if (mouseX >= x-8 && mouseX < x+8 && mouseY >= y-8 && mouseY < y+8) { if (localObjectIndices.Count == objectIndices.Count) { if (foundHoveringMatch) localObjectIndices[localObjectIndices.Count-1] = i; else localObjectIndices.Add(i); cursorX = x-8; cursorY = y-8; foundHoveringMatch = true; } } x -= width/2; y -= width/2; g.FillRectangle(new SolidBrush(color), x, y, width, width); } } objectIndices = localObjectIndices; return index; }