length of the connection strip in blocks: up/down: width of the connection strip left/right: height of the connection strip width: width of connected map in blocks y-position after map change: up: (height_of_connected_map * 2) - 1 down: 0 left/right: (y_displacement_of_connection_strip_in_blocks * -2) x-position after map change: left: (width_of_connected_map * 2) - 1 right: 0 up/down: (x_displacement_of_connection_strip_in_blocks * -2) window (ul block pos): up: C701h + height_of_connected_map * (width_of_connected_map + 6) left: C706h + 2 * width_of_connected_map down/right: C707h + width_of_connected_map 22:18 < comet> i do not have the formula for the remaining value. lin said johtomap calculates it so i could find it in the source 22:18 < comet> order is 22:20 < comet> strip length, connected map width, x pos, y pos, window [2 bytes] 22:20 < comet> the only notes i have on the other values are lin's 22:21 < comet> 1 byte - Map bank (Starts at 1) 22:21 < comet> 1 byte - Map number (Starts at 1) 22:21 < comet> 2 bytes (flipped) - X position of starting point for intermediate tiles (scrolls through connected map line-by-line. this way you can change Y position also) 22:21 < comet> 2 bytes (flipped) - X position of connection on map ============================= JohtoMap private void readConnections(ref Map m) { GBFile gb = Program.gb; //Up down left right switch (m.connectionType) { case 0: m.setConnections(null, null, null, null); break; case 1: m.setConnections(null, null, null, readConnection(gb)); break; case 2: m.setConnections(null, null, readConnection(gb), null); break; case 3: m.setConnections(null, null, readConnection(gb), readConnection(gb)); break; case 4: m.setConnections(null, readConnection(gb), null, null); break; case 5: m.setConnections(null, readConnection(gb), null, readConnection(gb)); break; case 6: m.setConnections(null, readConnection(gb), readConnection(gb), null); break; case 7: m.setConnections(null, readConnection(gb), readConnection(gb), readConnection(gb)); break; case 8: m.setConnections(readConnection(gb), null, null, null); break; case 9: m.setConnections(readConnection(gb), null, null, readConnection(gb)); break; case 10: m.setConnections(readConnection(gb), null, readConnection(gb), null); break; case 11: m.setConnections(readConnection(gb), null, readConnection(gb), readConnection(gb)); break; case 12: m.setConnections(readConnection(gb), readConnection(gb), null, null); break; case 13: m.setConnections(readConnection(gb), readConnection(gb), null, readConnection(gb)); break; case 14: m.setConnections(readConnection(gb), readConnection(gb), readConnection(gb), null); break; case 15: m.setConnections(readConnection(gb), readConnection(gb), readConnection(gb), readConnection(gb)); break; } } private Connection readConnection(GBFile gb) { Connection c = new Connection(); c.bank = gb.ReadByte(); c.number = gb.ReadByte(); c.tileDataPointer = gb.ReadBytes(2); c.memoryOtherPointer = gb.ReadBytes(2); c.height = gb.ReadByte(); c.width = gb.ReadByte(); c.yOffset = gb.ReadByte(); c.xOffset = gb.ReadByte(); c.memoryCurrentPointer = gb.ReadBytes(2); return c; } void setNewConnection(ref Connection c) { int first = 0xC700 + ((m.width + 6) * 3); if (rbLeft.Checked) { //first -= (); c.memoryOtherPointer = new byte[] { (byte)(first & 0xFF), (byte)(first >> 8) }; first += (m.width - 3); c.memoryCurrentPointer = new byte[] { (byte)(first & 0xFF), (byte)(first >> 8) }; } else if (rbRight.Checked) { first += m.width + 3; } Map otherMap = Program.form1.getMap(c.bank, c.number); if (otherMap == null) return; if (rbUp.Checked) { if (otherMap != null) { int p = otherMap.tileDataLocation; int h = otherMap.width - m.width; if (h > 0) p += (h * otherMap.height) + (otherMap.height * 3) + (otherMap.height + 3); else p += (otherMap.height * otherMap.width) - (otherMap.width * 3); c.tileDataPointer = gb.Get2BytePointer(p); } } else if (rbDown.Checked || rbRight.Checked) { c.tileDataPointer = gb.Get2BytePointer(otherMap.tileDataLocation); } else if (rbLeft.Checked) { int p = otherMap.tileDataLocation; int h = otherMap.height - m.height; if (h > 0) p += (h * otherMap.width) - (otherMap.width * 3) + (otherMap.width - 3); else p += otherMap.width - 3; c.tileDataPointer = gb.Get2BytePointer(p); } //start += m.width - 6; //c.memoryCurrentPointer = new byte[] {(byte)( } r20 width1=30 height1=9 r19 blockdata=19328 width2=10 height2=18 .. strip pointer is 19388 (+60) r15 width1=20 height1=9 r14 blockdata=16384 width2=10 height2=18 .. strip pointer is 16444 (+60) 60 = 30 * 2 15 * 4 10 * 6 5 * 12 5 * 4 * 3 5 * 6 * 2 5 * 3 * 2 * 2 10 * 3 * 2 15 * 2 * 2 30, 10, 18 30, 10 20, 10, 18 20, 10 30, 10