Skip to content

Commit

Permalink
Suggested method for using ASCII sane names in naming places
Browse files Browse the repository at this point in the history
Places should be searchable from US/UK ascii only keyboards.
  • Loading branch information
impaktor committed Jan 23, 2022
1 parent 756d096 commit 4b4d981
Show file tree
Hide file tree
Showing 3 changed files with 73 additions and 12 deletions.
44 changes: 42 additions & 2 deletions data/culture/common.lua
Original file line number Diff line number Diff line change
Expand Up @@ -9,23 +9,63 @@ local CultureName = {
surname = {}, -- List of 100 most common last names
name = "Name", -- Name of language / culture
code = "xx", -- ISO ISO 639-1 language code
replace = {} -- Non-ascii char to replacement char -table
}

function CultureName:New (o)
o = o or {}
setmetatable(o, self)
self.__index = self

-- Populate self.surname_ascii:

-- if replacement talbe empty, lanugage already ascii, just copy
if next(self.replace) == nil then
self.surname_ascii = self.surname
else
-- else, loop over all names and replacement chars
self.surname_ascii = {}
for _, name in ipairs(self.surname) do
for char1, char2 in pairs(self.replace) do
name = name:gsub(char1, char2)
end
table.insert(self.surname_ascii, name)
end
end

return o
end


-- Make table with ascii-friendly surnames
function CultureName:asciify ()
-- if replacement talbe empty, lanugage already ascii, just copy
if next(self.replace) == nil then
self.surname_ascii = self.surname
return
end

-- else, loop over all names and replacement chars
self.surname_ascii = {}
for _, name in ipairs(self.surname) do
for char1, char2 in pairs(self.replace) do
name = name:gsub(char1, char2)
end
table.insert(self.surname_ascii, name)
end
return
end


function CultureName:FirstName (isFemale, rand)
local array = isFemale and self.female or self.male
return utils.chooseEqual(array, rand)
end

-- Some cultures have gender specific surnames
function CultureName:Surname (isFemale, rand)
return utils.chooseEqual(self.surname, rand)
function CultureName:Surname (isFemale, rand, ascii)
local surname = ascii and self.surname_ascii or self.surname
return utils.chooseEqual(surname, rand)
end

function CultureName:FullName (isFemale, rand)
Expand Down
31 changes: 25 additions & 6 deletions data/culture/sv.lua
Original file line number Diff line number Diff line change
Expand Up @@ -313,12 +313,31 @@ local surname={
}


local Swedish = CultureName:New()
-- local Swedish = CultureName:New()

Swedish.name = "Swedish"
Swedish.code = "sv"
Swedish.male = male
Swedish.female = female
Swedish.surname = surname
replace = {
["å"] = "a", ["Å"] = "A",
["ä"] = "a", ["Ä"] = "A",
["ö"] = "o", ["Ö"] = "O"}

-- local Swedish = CultureName:New(
-- male = male,
-- female = female,
-- surname = surname,
-- name = "Swedish",
-- code = "sv",
-- replace = replace,
-- )


local Swedish = CultureName:New({
male = male,
female = female,
surname = surname,
name = "Swedish",
code = "sv",
replace = replace})

-- Swedish:asciify()

return Swedish
10 changes: 6 additions & 4 deletions data/libs/NameGen.lua
Original file line number Diff line number Diff line change
Expand Up @@ -118,25 +118,27 @@ NameGen = {
-- experimental
--
BodyName = function (body, rand)
local ascii = true -- want only ascii compatible characers in name

if not rand then rand = Engine.rand end

if body.type == "STARPORT_ORBITAL" then
return string.interp(r(NameGen.orbitalStarportFormats, rand), { name = NameGen.Surname(rand) })
return string.interp(r(NameGen.orbitalStarportFormats, rand), { name = NameGen.Surname(rand, ascii) })
end

if body.type == "STARPORT_SURFACE" then
return string.interp(r(NameGen.surfaceStarportFormats, rand), { name = NameGen.Surname(rand) })
return string.interp(r(NameGen.surfaceStarportFormats, rand), { name = NameGen.Surname(rand, ascii) })
end

if body.superType == "ROCKY_PLANET" then

-- XXX -15-50C is "outdoor". once more planet composition
-- attributes are exposed we can do better here
if body.averageTemp >= 258 and body.averageTemp <= 323 then
return string.interp(r(NameGen.outdoorPlanetFormats, rand), { name = NameGen.Surname(rand) })
return string.interp(r(NameGen.outdoorPlanetFormats, rand), { name = NameGen.Surname(rand, ascii) })
end

return string.interp(r(NameGen.rockPlanetFormats, rand), { name = NameGen.Surname(rand) })
return string.interp(r(NameGen.rockPlanetFormats, rand), { name = NameGen.Surname(rand, ascii) })
end

error("No available namegen for body type '" .. body.type .. "'")
Expand Down

0 comments on commit 4b4d981

Please sign in to comment.