If you port your PICO-8 game to any European languages other than English, you might want to include some character accents, which doesn't work by default since PICO-8 only supports ASCII characters (plus some special ones in the unused range between ASCII and ISO-8859-1).
My work here is based off of Zep's post from a couple weeks ago about Latin accent printing (by including special characters in front of plain ASCII characters to indicate accents). My code goes a step further by offering a way to save your strings with the real accent characters included, and then encode them so they can be printed properly. This way your text is a bit more readable in the source file.
I slightly modified Zep's original print function by changing the :
control character to @
since I needed :
in my printed text. The general rule, if you want to add new encoded characters to this system, is to pick a control character that won't be needed in the actual printed text.
FUNCTIONS:
print_with_accents
is the modified version of Zep's Latin accent string printing function. It does not print strings with Latin accent characters. It prints strings that have been processed already byencode_accents
.encode_accents
accepts a string and returns the "encoded" version made up of plain ASCII characters.encode_table
takes a table full of string values (can be nested in subtables) and converts all the strings usingencode_accents
. It does this in-place and doesn't return any value.
HANDLING ADDITIONAL ACCENT CHARACTERS:
A bunch of cases are included in encode_accents
to cover all the standard French accents, but if you need to handle another case (like the ñ
in Spanish) you can include it manually! For accents that haven't already been handled for any letters, you'll want to also include a new row in the dat table for print_with_accents
ACCOUNTING FOR SPECIAL PICO-8 CHARACTERS:
The printer generally assumes that printed characters will take up 4 pixels of horizontal space, but the special upper range PICO-8 characters (e.g. 🅾️, ❎) actually take up 8 pixels, so we have to account for this in print_with_accents
. If you need to include any of those characters in your printed text, make sure to add that check in the code.
HOW TO USE FEWER TOKENS:
If you're worried about the number of tokens you would need to include encode_accents
and encode_table
, you can use those functions in combination with a table serializer like pico8-table-string to encode your table at build time in a separate Lua script.
function print_with_accents(str,x,y,col) local dat={ ["#"] = {",", 0, 2}, ["^"] = {"^", 0,-3}, ["`"] = {"`", -1,-3}, ["|"] = {",", 1,-6}, ["@"] = {"\"", 0,-3} } local p = 1 while p <= #str do local c=sub(str,p,p) if dat[c] then print( dat[c][1], x + dat[c][2], y + dat[c][3], col ) p += 1 c = sub(str,p,p) end print(c, x, y, col) x += 4 p += 1 if ( c == '🅾️' or c == '❎' or c == '♪' ) then x += 4 end end end function encode_accents(str) local new_str = "" local i = 0 while i <= #str do -- two byte compare string local c = sub(str,i,i+1) -- one byte default local e = sub(str,i,i) -- cedille ¸ if c == "ç" then e="#c" -- aigu ˊ elseif c == "é" then e="|e" -- circonflexe ˆ elseif c == "â" then e="^a" elseif c == "ê" then e="^e" elseif c == "î" then e="^i" elseif c == "ô" then e="^o" elseif c == "û" then e="^u" -- grave ˋ elseif c == "à" then e="`a" elseif c == "è" then e="`e" elseif c == "ì" then e="`i" elseif c == "ò" then e="`o" elseif c == "ù" then e="`u" -- tréma ¨ elseif c == "ë" then e="@e" elseif c == "ï" then e="@i" elseif c == "ü" then e='@u' end new_str=new_str..e if e ~= sub(str,i,i) then i = i + 1 end i = i + 1 end return new_str end function encode_table(table) for k,v in pairs(table) do if type(v) == "table" then encode_table(v) else table[k]=encode_accents(v) end end end |
[Please log in to post a comment]