Indie game storeFree gamesFun gamesHorror games
Game developmentAssetsComics


A member registered May 04, 2016 · View creator page →

Creator of

Recent community posts

The patch was built off a specific iso rip. There appears to be some differences between all the rips circulating around, and this can cause issues with the patch. 2 things:

  • You'll want to look around and try a few rips of the USA version. the one I used should be the most common USA version rip.
  • additionally, you'll want to turn off checksum validation in the patcher settings. Sometimes, even with the correct rip, the validation step still fails due to Windows changing the metadata on the file when you download it. With checksum validation turned off the patcher will never fail, but if you still have the wrong base iso it will crash in dolphin almost instantly.

there could be similar xdelta tools on mac but i do not own one so i am unaware of them. but the patched iso should work fine on mac, you just may need to use a windows pc to build it

The build you sent works!

Cool! You can send it to Thanks!

(1 edit)


I believe a while back i posted here with this error while using a bunch of quads:

Mesh '' has more than the 8 submeshes.

The  fix was to point each quad at the same sprite sheet, rather than separate assets, which has worked great since.

On latest, it appears this has stopped working, as I am getting the error again. Hoping it's an easy fix? 

Thank you!

Just pulled in the change and it looks good! Thank you!

Awesome! My writer will be very happy to hear that. Hopefully it will be easy to cherry pick

awesome. i'll be on the lookout for it in the next update!

(2 edits)

I've noticed that the logic for playing audio for each letter read out does not function with the other draw orders. For random, it only plays audio if the letter that just appeared is further right than the others. For right-to-left, none of them play. It looks like it's because UpdateMesh implicitly assumes left-to-right when setting doPrintEventAfter. I'm a bit hesitant to mess around with this code because it's setting a lot of member variables unrelated to the audio. Is there a fix in the works for this?

Relevant code:

            //just to get timing info for events
            //these are used to that positional data is updated before events are called
            doPrintEventAfter = false;
            doEventAfter = false;
            if (reading)
                float divideAnimAmount = CurrentTextInfo.drawAnimData.animTime == 0f ? 0.0000001f : CurrentTextInfo.drawAnimData.animTime; //so it doesn't get NaN'd
                float myAnimPos = (myTime - CurrentTextInfo.readTime) / divideAnimAmount; // on a range between 0-1 on the curve, the position of the animation
                if(myAnimPos > 0f && i > latestNumber){ 
                    doEventAfter = true;
                    //    playedSoundThisFrame = true;
                    //ignore 0-width space, as it's used for tacked-on events
                    if(hyphenedText[i] != '\u200B')
                        doPrintEventAfter = true;
                        if(hyphenedText[i] != ' ' && hyphenedText[i] != '\n')
                            lowestDrawnPosition = Mathf.Min(lowestDrawnPosition, CurrentTextInfo.pos.y);
                            lowestDrawnPositionRaw = Mathf.Min(lowestDrawnPosition, CurrentTextInfo.pos.y + offset.y);
                            furthestDrawnPosition = Mathf.Max(furthestDrawnPosition, CurrentTextInfo.RelativeAdvance(characterSpacing).x + offset.x + TextBounds_rightOffset.x);
                    latestNumber = Mathf.Max(latestNumber, i); //find latest number to start from next frame
                    if(info[i].pos.y + info[i].size + lowestLineOffset.y < 0f && //this number is below the limit
                        info[i].pos.y + info[i].size + lowestLineOffset.y > highestVisiblePoint){ //is this number taller than the current tallest number?
                            highestVisiblePoint = info[i].pos.y + info[i].size + lowestLineOffset.y;
                            tallestVisibleIndex = i;
            }else if(!Application.isPlaying || VerticalLimitStored == 0f || !(verticalLimitMode == VerticalLimitMode.AutoPause ||
                                                                        verticalLimitMode == VerticalLimitMode.AutoPauseFull)){ //don't do this for autopauses
                latestNumber = hyphenedText.Length-1;
                lowestDrawnPosition = info[latestNumber].pos.y; //assume the final letter
                lowestDrawnPositionRaw = info[latestNumber].pos.y + offset.y;
                furthestDrawnPosition = rawBottomRightTextBounds.x; //this causes some sizes to be incorrect in-editor, but should be fine as text reads out
                DoEvent(i); //do every event up to this integer
                PlaySound(i); //only play one sound this frame, from the first letter drawn this frame
                if(onPrintEvent != null) onPrintEvent.Invoke();
                if(OnPrintEvent != null) OnPrintEvent();


Tried making a minimal scene with a repro but so far no luck. I can repro every time in the same way in one of my game's scenes but not in a smaller example, even when copying both UI's over. So I think you're right that it's some sort of timing issue. We are demoing at a con right now, so I'll keep trying when I have time but it may be a bit before I have it ready

I am on Unity 2018.4.14f1, and am on  latest STM (v1.9.2).

When toggling  the active state on some gameobjects using UI STMs that are set to the same font & not auto-read, I occasionally see something like this:

The second button is supposed to say "OPTIONS" here. I can repro it 100% of the time by opening this menu, closing it, opening a different menu with some similar STMs, closing that, and then opening the original menu again. The options text is always the one corrupted here, and in the other menu the text "-- Start --" is corrupted on opening that menu again a second time. Both menus are inactive on start. So, this seems related to OnEnable being called after the mesh has already been built once.

I have confirmed Rebuild() is being called on it when enabled. When I mouse over the button my code triggers a Rebuild that corrects the mesh.

Adding a call to WaitFrameThenRebuild in SuperTextMesh.OnEnable seems to fix the problem, but having to call Rebuild twice is not ideal for performance:

If I call WaitFrameThenRebuild instead of Rebuild, rather than calling both as in my paste, only the first character on the options string is corrupted, and the rest are fine.

Any idea on this? Worst case I can keep my workaround in place, but I would love to be able to remove a second Rebuild call as it can be pretty costly.


Thank you, atlasing the textures works great. Glad to know STM already handled that!

(1 edit)


I am on Unity 2018.4.14f1, and have some local (unrelated to this issue) shader and code changes to STM v1.8.11.

Seeing this warning from the Unity CanvasRenderer when rendering 8 quads in the same line:

Mesh '' has more than the 8 submeshes. Extra submeshes will be ignored.
SuperTextMesh:ApplyMesh() (at Assets/ThirdParty/Clavian/SuperTextMesh/Scripts/SuperTextMesh.cs:3661)
SuperTextMesh:SetMesh(Single, Boolean) (at Assets/ThirdParty/Clavian/SuperTextMesh/Scripts/SuperTextMesh.cs:3657)
SuperTextMesh:SetMesh(Single) (at Assets/ThirdParty/Clavian/SuperTextMesh/Scripts/SuperTextMesh.cs:3608)
<ReadOutText>d__232:MoveNext() (at Assets/ThirdParty/Clavian/SuperTextMesh/Scripts/SuperTextMesh.cs:1487)
MEC.Timing:RunCoroutineInternal(IEnumerator`1, Segment, Nullable`1, String, CoroutineHandle, Boolean) (at Assets/ThirdParty/Trinary Software/Timing.cs:2438)
MEC.Timing:RunCoroutine(IEnumerator`1, String) (at Assets/ThirdParty/Trinary Software/Timing.cs:1387)
SuperTextMesh:Read(Single) (at Assets/ThirdParty/Clavian/SuperTextMesh/Scripts/SuperTextMesh.cs:1311)
SuperTextMesh:Rebuild(Single, Boolean) (at Assets/ThirdParty/Clavian/SuperTextMesh/Scripts/SuperTextMesh.cs:1229)
SuperTextMesh:Rebuild() (at Assets/ThirdParty/Clavian/SuperTextMesh/Scripts/SuperTextMesh.cs:1195)
SuperTextMesh:set_text(String) (at Assets/ThirdParty/Clavian/SuperTextMesh/Scripts/SuperTextMesh.cs:606)
SuperTextMesh:set_Text(String) (at Assets/ThirdParty/Clavian/SuperTextMesh/Scripts/SuperTextMesh.cs:614)

I can't find information about that unity warning anywhere, but it is clearly ignoring the additional quads.

Since we have a modified version of the plugin, it is a bit difficult to grab latest. I didn't see anything in the latest update notes related to quads, so it seems unlikely this has been fixed? Is that correct?

Is there some setting I can configure to increase the submesh limit?

Is it possible to combine quad meshes as they are read out?