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_accentsis 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_accentsaccepts a string and returns the "encoded" version made up of plain ASCII characters.encode_tabletakes 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]




