A Word or GraphemeCombo is declared by a user-artist (as opposed to generated from entropy like a Letter) and the web UI provides an interactive tool to build the Word visually.
A Word is one or more Letters with a position (row and column with 0,0 being at the top-left corner), with Letters coming later in the list rendered "overwriting" text from previously rendered Letters.
I think the contract function should take 3 arguments, (tokenIds, rows, cols). TokenIds is an array of tokenId, rows is an array of uint, and so is cols. All arrays the same length, as implied by the tokenIds length. The first token is tokenIds[0] and it's rendered from rows[0] and cols[0], and so on.
Empty rows and columns of the edges of the completed combo are discarded when rendering but empty rows or columns between letters is preserved.
There may need to be some max rows/columns rendered for practical purposes.
A Word or GraphemeCombo is declared by a user-artist (as opposed to generated from entropy like a Letter) and the web UI provides an interactive tool to build the Word visually.
A Word is one or more Letters with a position (row and column with 0,0 being at the top-left corner), with Letters coming later in the list rendered "overwriting" text from previously rendered Letters.
I think the contract function should take 3 arguments, (tokenIds, rows, cols). TokenIds is an array of tokenId, rows is an array of uint, and so is cols. All arrays the same length, as implied by the tokenIds length. The first token is tokenIds[0] and it's rendered from rows[0] and cols[0], and so on.
Empty rows and columns of the edges of the completed combo are discarded when rendering but empty rows or columns between letters is preserved.
There may need to be some max rows/columns rendered for practical purposes.