id based public house categorization now fallback method, in preparation of better categorization
This commit is contained in:
parent
58d73f70f6
commit
e52ff856d6
|
@ -18,25 +18,20 @@ this.publicHouseTypes = {
|
||||||
inns = "Inns",
|
inns = "Inns",
|
||||||
guildhalls = "Guildhalls",
|
guildhalls = "Guildhalls",
|
||||||
temples = "Temples",
|
temples = "Temples",
|
||||||
houses = "Houses",
|
homes = "Homes",
|
||||||
cantonworks = "Cantonworks"
|
cantonworks = "Cantonworks"
|
||||||
}
|
}
|
||||||
|
|
||||||
-- Canton string matches
|
|
||||||
-- move NPCs into waistworks
|
|
||||||
this.waistworks = "[Ww]aistworks"
|
|
||||||
-- don't lock canalworks
|
|
||||||
this.canalworks = "[Cc]analworks"
|
|
||||||
-- doors to underworks should be ignored
|
|
||||||
-- but NPCs in underworks should not be disabled
|
|
||||||
this.underworks = "[Uu]nderworks"
|
|
||||||
|
|
||||||
-- }}}
|
-- }}}
|
||||||
|
|
||||||
-- {{{ Filled at runtime
|
-- {{{ Filled at runtime
|
||||||
this.runtimeData = {
|
this.runtimeData = {
|
||||||
-- cells marked as public
|
-- cells marked as public
|
||||||
publicHouses = {},
|
publicHouses = {
|
||||||
|
-- used for caching public houses to avoid reiterating NPCs
|
||||||
|
byName = {},
|
||||||
|
-- used for picking cells to move NPCs to
|
||||||
|
byType = {}
|
||||||
|
},
|
||||||
-- homes picked for NPCs
|
-- homes picked for NPCs
|
||||||
homes = {
|
homes = {
|
||||||
-- used for caching homes to avoid reiterating NPCs
|
-- used for caching homes to avoid reiterating NPCs
|
||||||
|
@ -94,14 +89,15 @@ end
|
||||||
|
|
||||||
-- todo: pick this better
|
-- todo: pick this better
|
||||||
this.pickPublicHouseType = function(cell)
|
this.pickPublicHouseType = function(cell)
|
||||||
if cell.id:match("Guild") then
|
local id = cell.id:lower()
|
||||||
|
if id:match("guild") then
|
||||||
return this.publicHouseTypes.guildhalls
|
return this.publicHouseTypes.guildhalls
|
||||||
elseif cell.id:match("Temple") then
|
elseif id:match("temple") then
|
||||||
return this.publicHouseTypes.temples
|
return this.publicHouseTypes.temples
|
||||||
elseif cell.id:match(this.canalworks) or cell.id:match(this.waistworks) then
|
elseif id:match("canalworks") or cell.id:match("waistworks") then
|
||||||
return this.publicHouseTypes.cantonworks
|
return this.publicHouseTypes.cantonworks
|
||||||
-- elseif cell.id:match("House") then
|
elseif id:match("house") or id:match("manor") or id:match("tower") then
|
||||||
-- return publicHouseTypes.houses
|
return this.publicHouseTypes.homes
|
||||||
else
|
else
|
||||||
return this.publicHouseTypes.inns
|
return this.publicHouseTypes.inns
|
||||||
end
|
end
|
||||||
|
@ -125,7 +121,8 @@ end
|
||||||
|
|
||||||
this.isCantonWorksCell = function(cell)
|
this.isCantonWorksCell = function(cell)
|
||||||
-- for _, str in pairs(waistworks) do if cell.id:match(str) then return true end end
|
-- for _, str in pairs(waistworks) do if cell.id:match(str) then return true end end
|
||||||
return cell.id:match(this.waistworks) or cell.id:match(this.canalworks) or cell.id:match(this.underworks)
|
local id = cell.id:lower()
|
||||||
|
return id:match("waistworks") or id:match("canalworks") or id:match("underworks")
|
||||||
end
|
end
|
||||||
|
|
||||||
this.isCantonCell = function(cell)
|
this.isCantonCell = function(cell)
|
||||||
|
|
|
@ -172,7 +172,6 @@ this.isPublicHouse = function(cell)
|
||||||
if not this.isInteriorCell(cell) then return false end
|
if not this.isInteriorCell(cell) then return false end
|
||||||
|
|
||||||
-- gather some data about the cell
|
-- gather some data about the cell
|
||||||
local typeOfPub = common.pickPublicHouseType(cell)
|
|
||||||
local city, publicHouseName
|
local city, publicHouseName
|
||||||
|
|
||||||
if cell.name and string.match(cell.name, ",") then
|
if cell.name and string.match(cell.name, ",") then
|
||||||
|
@ -184,16 +183,16 @@ this.isPublicHouse = function(cell)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- don't iterate NPCs in the cell if we've already marked it public
|
-- don't iterate NPCs in the cell if we've already marked it public
|
||||||
if common.runtimeData.publicHouses[city] and
|
if common.runtimeData.publicHouses.byName[city] and common.runtimeData.publicHouses.byName[city][cell.id] then
|
||||||
(common.runtimeData.publicHouses[city][typeOfPub] and common.runtimeData.publicHouses[city][typeOfPub][cell.id]) then
|
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
-- if it's a waistworks cell, it's public, with no proprietor
|
-- if it's a waistworks cell, it's public, with no proprietor
|
||||||
if config.waistWorks == common.waist.public and cell.id:match(common.waistworks) then
|
if config.waistWorks == common.waist.public and cell.id:match("waistworks") then
|
||||||
dataTables.createPublicHouseTableEntry(cell, nil, city, publicHouseName,
|
dataTables.createPublicHouseTableEntry(cell, nil, city, publicHouseName,
|
||||||
cellEvaluators.calculateCellWorth(cell),
|
cellEvaluators.calculateCellWorth(cell),
|
||||||
cellEvaluators.pickCellFaction(cell))
|
cellEvaluators.pickCellFaction(cell),
|
||||||
|
common.publicHouseTypes.cantonworks)
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -236,7 +235,8 @@ this.isPublicHouse = function(cell)
|
||||||
master.object.name, master.object.class)
|
master.object.name, master.object.class)
|
||||||
dataTables.createPublicHouseTableEntry(cell, master, city, publicHouseName,
|
dataTables.createPublicHouseTableEntry(cell, master, city, publicHouseName,
|
||||||
cellEvaluators.calculateCellWorth(cell),
|
cellEvaluators.calculateCellWorth(cell),
|
||||||
cellEvaluators.pickCellFaction(cell))
|
cellEvaluators.pickCellFaction(cell),
|
||||||
|
common.publicHouseTypes.temples)
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -254,12 +254,16 @@ this.isPublicHouse = function(cell)
|
||||||
if (config.ignored[faction:lower()] or info.playerJoined) and
|
if (config.ignored[faction:lower()] or info.playerJoined) and
|
||||||
(npcs.total >= config.minimumOccupancy or faction == "Blades") and
|
(npcs.total >= config.minimumOccupancy or faction == "Blades") and
|
||||||
(info.percentage >= config.factionIgnorePercentage) then
|
(info.percentage >= config.factionIgnorePercentage) then
|
||||||
log(common.logLevels.medium, "[CHECKS] %s is %s%% faction %s, marking public.", cell.name, info.percentage,
|
log(common.logLevels.medium, "[CHECKS] %s is %s%% faction %s, marking public.", cell.name, info.percentage, faction)
|
||||||
faction)
|
|
||||||
|
-- try id based categorization, but fallback on guildhall
|
||||||
|
local type = common.pickPublicHouseType(cell)
|
||||||
|
if type == common.publicHouseTypes.inns then type = common.publicHouseTypes.guildhalls end
|
||||||
|
|
||||||
dataTables.createPublicHouseTableEntry(cell, npcs.factions[faction].master, city, publicHouseName,
|
dataTables.createPublicHouseTableEntry(cell, npcs.factions[faction].master, city, publicHouseName,
|
||||||
cellEvaluators.calculateCellWorth(cell),
|
cellEvaluators.calculateCellWorth(cell),
|
||||||
cellEvaluators.pickCellFaction(cell))
|
cellEvaluators.pickCellFaction(cell),
|
||||||
|
common.publicHouseTypes.guildhalls)
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -75,22 +75,26 @@ this.createPublicHouseTableEntry = function(publicCell, proprietor, city, name,
|
||||||
|
|
||||||
local proprietorName = proprietor and proprietor.object.name or "no one"
|
local proprietorName = proprietor and proprietor.object.name or "no one"
|
||||||
|
|
||||||
if not common.runtimeData.publicHouses[city] then common.runtimeData.publicHouses[city] = {} end
|
local data = {
|
||||||
if not common.runtimeData.publicHouses[city][typeOfPub] then
|
|
||||||
common.runtimeData.publicHouses[city][typeOfPub] = {}
|
|
||||||
end
|
|
||||||
|
|
||||||
common.runtimeData.publicHouses[city][typeOfPub][publicCell.id] =
|
|
||||||
{
|
|
||||||
name = name,
|
name = name,
|
||||||
city = city,
|
city = city,
|
||||||
cell = publicCell,
|
cell = publicCell,
|
||||||
|
type = type,
|
||||||
proprietor = proprietor,
|
proprietor = proprietor,
|
||||||
proprietorName = proprietorName,
|
proprietorName = proprietorName,
|
||||||
worth = cellWorth,
|
worth = cellWorth,
|
||||||
faction = cellFaction
|
faction = cellFaction
|
||||||
}
|
}
|
||||||
|
|
||||||
|
-- create by type
|
||||||
|
if not common.runtimeData.publicHouses.byType[city] then common.runtimeData.publicHouses.byType[city] = {} end
|
||||||
|
if not common.runtimeData.publicHouses.byType[city][typeOfPub] then common.runtimeData.publicHouses.byType[city][typeOfPub] = {} end
|
||||||
|
common.runtimeData.publicHouses.byType[city][typeOfPub][publicCell.id] = data
|
||||||
|
|
||||||
|
-- create by name
|
||||||
|
if not common.runtimeData.publicHouses.byName[city] then common.runtimeData.publicHouses.byName[city] = {} end
|
||||||
|
common.runtimeData.publicHouses.byName[city][publicCell.id] = data
|
||||||
|
|
||||||
interop.setRuntimeData(common.runtimeData)
|
interop.setRuntimeData(common.runtimeData)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -33,8 +33,8 @@ this.pickInnForNPC = function(npc, city)
|
||||||
-- temple for commoners and the poorest people
|
-- temple for commoners and the poorest people
|
||||||
|
|
||||||
-- but for now pick one at random
|
-- but for now pick one at random
|
||||||
if common.runtimeData.publicHouses[city] and common.runtimeData.publicHouses[city][common.publicHouseTypes.inns] then
|
if common.runtimeData.publicHouses.byType[city] and common.runtimeData.publicHouses.byType[city][common.publicHouseTypes.inns] then
|
||||||
local choice = table.choice(common.runtimeData.publicHouses[city][common.publicHouseTypes.inns])
|
local choice = table.choice(common.runtimeData.publicHouses.byType[city][common.publicHouseTypes.inns])
|
||||||
if not choice then return nil end
|
if not choice then return nil end
|
||||||
log(common.logLevels.medium, "[HOUSING] Picking inn %s, %s for %s", choice.city, choice.name, npc.object.name)
|
log(common.logLevels.medium, "[HOUSING] Picking inn %s, %s for %s", choice.city, choice.name, npc.object.name)
|
||||||
return choice.cell
|
return choice.cell
|
||||||
|
@ -43,9 +43,9 @@ end
|
||||||
|
|
||||||
this.pickPublicHouseForNPC = function(npc, city)
|
this.pickPublicHouseForNPC = function(npc, city)
|
||||||
-- look for wandering guild members
|
-- look for wandering guild members
|
||||||
if common.runtimeData.publicHouses[city] and
|
if common.runtimeData.publicHouses.byType[city] and
|
||||||
common.runtimeData.publicHouses[city][common.publicHouseTypes.guildhalls] then
|
common.runtimeData.publicHouses.byType[city][common.publicHouseTypes.guildhalls] then
|
||||||
for _, data in pairs(common.runtimeData.publicHouses[city][common.publicHouseTypes.guildhalls]) do
|
for _, data in pairs(common.runtimeData.publicHouses.byType[city][common.publicHouseTypes.guildhalls]) do
|
||||||
-- if npc's faction and proprietor's faction match, pick that one
|
-- if npc's faction and proprietor's faction match, pick that one
|
||||||
if npc.object.faction == data.proprietor.object.faction then
|
if npc.object.faction == data.proprietor.object.faction then
|
||||||
log(common.logLevels.medium, "[HOUSING] Picking %s for %s based on faction", data.cell.id, npc.object.name)
|
log(common.logLevels.medium, "[HOUSING] Picking %s for %s based on faction", data.cell.id, npc.object.name)
|
||||||
|
@ -55,8 +55,8 @@ this.pickPublicHouseForNPC = function(npc, city)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- temple members go to the temple
|
-- temple members go to the temple
|
||||||
if common.runtimeData.publicHouses[city] and common.runtimeData.publicHouses[city][common.publicHouseTypes.temples] then
|
if common.runtimeData.publicHouses.byType[city] and common.runtimeData.publicHouses.byType[city][common.publicHouseTypes.temples] then
|
||||||
for _, data in pairs(common.runtimeData.publicHouses[city][common.publicHouseTypes.temples]) do
|
for _, data in pairs(common.runtimeData.publicHouses.byType[city][common.publicHouseTypes.temples]) do
|
||||||
if npc.object.faction == data.proprietor.object.faction then
|
if npc.object.faction == data.proprietor.object.faction then
|
||||||
log(common.logLevels.medium, "[HOUSING] Picking temple %s for %s based on faction", data.cell.id, npc.object.name)
|
log(common.logLevels.medium, "[HOUSING] Picking temple %s for %s based on faction", data.cell.id, npc.object.name)
|
||||||
return data.cell
|
return data.cell
|
||||||
|
@ -101,9 +101,9 @@ this.pickHomeForNPC = function(cell, npc)
|
||||||
|
|
||||||
-- if nothing was found, then we'll settle on Canton works cell, if the cell is a Canton
|
-- if nothing was found, then we'll settle on Canton works cell, if the cell is a Canton
|
||||||
if common.isCantonCell(cell) then
|
if common.isCantonCell(cell) then
|
||||||
if common.runtimeData.publicHouses[city] and
|
if common.runtimeData.publicHouses.byType[city] and
|
||||||
common.runtimeData.publicHouses[city][common.publicHouseTypes.cantonworks] then
|
common.runtimeData.publicHouses.byType[city][common.publicHouseTypes.cantonworks] then
|
||||||
local canton = table.choice(common.runtimeData.publicHouses[city][common.publicHouseTypes.cantonworks])
|
local canton = table.choice(common.runtimeData.publicHouses.byType[city][common.publicHouseTypes.cantonworks])
|
||||||
log(common.logLevels.medium, "[HOUSING] Picking works %s, %s for %s", canton.city, canton.name, npc.object.name)
|
log(common.logLevels.medium, "[HOUSING] Picking works %s, %s for %s", canton.city, canton.name, npc.object.name)
|
||||||
|
|
||||||
if canton then return dataTables.createHomedNPCTableEntry(npc, canton.cell, cell, false) end
|
if canton then return dataTables.createHomedNPCTableEntry(npc, canton.cell, cell, false) end
|
||||||
|
|
|
@ -45,8 +45,7 @@ end
|
||||||
local function checkEnteredPublicHouse(cell, city)
|
local function checkEnteredPublicHouse(cell, city)
|
||||||
local typeOfPub = common.pickPublicHouseType(cell)
|
local typeOfPub = common.pickPublicHouseType(cell)
|
||||||
|
|
||||||
local publicHouse = common.runtimeData.publicHouses[city] and
|
local publicHouse = common.runtimeData.publicHouses.byName[city] and common.runtimeData.publicHouses.byName[city][cell.id]
|
||||||
(common.runtimeData.publicHouses[city][typeOfPub] and common.runtimeData.publicHouses[city][typeOfPub][cell.name])
|
|
||||||
|
|
||||||
if publicHouse then
|
if publicHouse then
|
||||||
local msg = string.format("Entering public space %s, a%s %s in the town of %s.", publicHouse.name,
|
local msg = string.format("Entering public space %s, a%s %s in the town of %s.", publicHouse.name,
|
||||||
|
|
Loading…
Reference in a new issue