khanat-client-data-NeL/data/ryz/ryz_ring/r2_unit_test.lua

1510 lines
38 KiB
Lua
Raw Blame History

--BaseY = -32594
BaseX = 21570
BaseY = -1363
UnitTest = {}
UnitTest.testAddSecondaryActUi = function()
function Form_onOk(form)
local act =r2.newComponent("Act")
local features = act.Features
local tmpDefault = r2.newComponent("DefaultFeature")
table.insert(features, tmpDefault)
r2.requestInsertNode(r2.ScenarioInstanceId, "Acts", -1, "", act)
end
function Form_onCancel(form)
end
r2:doForm("CreateNewAdventureActDescription", {}, Form_onOk, Form_onCancel)
end
UnitTest.testLoadAnimationScenarioUi = function()
local function onOk(form)
if (form.LoadScenario_Name ~= nil and type(form.LoadScenario_Name) == "string") then
if form.LoadScenario_Name == "" then
local ui = r2:getForm("LoadScenario")
ui.active = true
ui.Env.Choice = nil
r2.CurrentForm = ui
messageBox(i18n.get("uiR2EDInvalidName"))
return
end
local filename = form.LoadScenario_Name
if string.find(filename, '\.r2', -3) == nil then
local ui = r2:getForm("LoadScenario")
ui.active = true
ui.Env.Choice = nil
r2.CurrentForm = ui
messageBox(i18n.get("uiR2EDInvalidName"))
return
end
filename = form.Path .. filename
local header = r2.getFileHeader(filename)
local mainland = not header or header.NevraxScenario ~= "1" or header.TrialAllowed ~= "1"
local trial = isPlayerFreeTrial()
if mainland and getDbProp("SERVER:USER:IS_NEWBIE") == 1 and trial then
local ui = r2:getForm("LoadScenario")
ui.active = true
ui.Env.Choice = nil
r2.CurrentForm = ui
r2.onSystemMessageReceived("ERR", "", "uiRingLoadingNotARoSScenario")
return
end
local ok, errStr = r2.RingAccess.loadAnimation(filename)
if not ok then
local ui = r2:getForm("LoadScenario")
ui.active = true
ui.Env.Choice = nil
r2.CurrentForm = ui
messageBox(i18n.get("uiR2EDInvalidScenario"))
end
end
end
local function onCancel(data, form)
local ui = r2:getForm("LoadScenario")
ui.active = true
ui.Env.Choice = nil
r2.CurrentForm = ui
end
local str = r2:getStartingAnimationFilename();
local ok, errStr = r2.RingAccess.loadAnimation(str)
if ok and string.len(str) ~= 0 then
local header = r2.getFileHeader(str)
local mainland = not header or header.NevraxScenario ~= "1" or header.TrialAllowed ~= "1"
local newbie = getDbProp("SERVER:USER:IS_NEWBIE") == 1
if mainland and isPlayerFreeTrial() and newbie then
r2.onSystemMessageReceived("ERR", "", "uiRingLoadingNotARoSScenario")
ok = false
end
end
if not ok then
r2:doForm("LoadScenario", {}, onOk, onCancel)
if string.len(str) ~= 0 then
messageBox(errStr)
end
end
end
UnitTest.testWaitAnimationScenarioLoadingUi = function()
-- local ui = getUI("ui:interface:r2ed_animation_waiting")
-- ui.active = true
--- setTopWindow(ui)
end
UnitTest.testLoadScenarioUi = function()
local function onCancel(data, form)
end
local function onOk(form)
if (form.LoadScenario_Name ~= nil and type(form.LoadScenario_Name) == "string") then
if form.LoadScenario_Name == "" then
messageBox(i18n.get("uiR2EDLoadScenario_InvalidFileName"))
return
end
local ucName = ucstring()
ucName:fromUtf8(form.LoadScenario_Name)
local filename = tostring(ucName)
if string.find(filename, '\.r2', -3) == nil then
messageBox(i18n.get("uiR2EDLoadScenario_InvalidFileName"))
return
end
-- if string.find(filename, '\.r2', -3) == nil then
-- filename = form.Name .. ".r2"
-- end
local path = form.Path
local extendedFileName = filename
if path and path ~= "" then
extendedFileName = path..filename
end
if form.LoadScenario_Level == ""
and form.LoadScenario_Rules == ""
and config.R2EDExtendedDebug == 1 then
messageBox(i18n.get("uiR2EDLoadScenario_LoadScenarioWithoutHeader"))
elseif form.RingAccess and form.RingAccess == 0 then
local ui = r2:getForm("LoadScenario")
ui.active = true
r2.CurrentForm = ui
messageBox(i18n.get("uiR2EDLoadScenario_No"))
return
end
local header = r2.getFileHeader(extendedFileName)
if header then
local locked = header and header.OtherCharAccess == "RunOnly"
if locked and header.ModifierMD5 and string.len(header.ModifierMD5) > 0 then
if not r2.hasCharacterSameCharacterIdMd5(header.ModifierMD5) then
if config.R2EDExtendedDebug ~=1 then
r2.onSystemMessageReceived("ERR", "", "uiR2EDLoadingLockedScenario")
else
local ui = r2:getForm("LoadScenario")
ui.active = true
r2.CurrentForm = ui
r2.onSystemMessageReceived("ERR", "", "uiR2EDLoadingLockedScenarioOverride")
return
end
else
end
end
end
local ok = r2.load(extendedFileName)
if not ok then
messageBox(i18n.get("uiR2EDInvalidScenario"))
else
r2.acts.deleteOldScenario = true
end
end
end
r2:doForm("LoadScenario", {}, onOk, onCancel)
end
function UnitTest.saveScenario(name, overwrite)
if (name ~= nil and type(name) == "string")
then
if name == "" then
messageBox(i18n.get("uiR2EDInvalidName"))
return
end
if string.find(name, '\.r2', -3) == nil then
name = name .. ".r2"
end
-- update scenario name with the new name
if name ~= r2.Scenario.Ghost_Name then
r2.requestNewAction(i18n.get("uiR2EDChangeScenarioName"))
r2.requestSetNode(r2.Scenario.InstanceId, "Ghost_Name", nlfile.getFilename(name))
r2.requestEndAction() -- force a flush
end
local extendedFilename = r2.getScenarioSavePath()..name
--
if overwrite ~= true then
local file = io.open(extendedFilename, "r")
if file ~= nil then
io.close(file)
validMessageBox(concatUCString(ucstring(name), i18n.get("uiR2EDConfirmOverWrite")), "lua", "UnitTest.saveScenario('" .. name .. "', true )", "", "", "ui:interface")
return
end
end
local ok, ret = pcall(r2.Version.save, extendedFilename)
local errorMsg = ret
if ok and ret then
displaySystemInfo(concatUCString(i18n.get("uiR2EDSaveSuccessFull"), ucstring(name)), "BC")
else
displaySystemInfo(concatUCString(i18n.get("uiR2EDSaveFailure"), ucstring(name)), "BC")
end
end
end
UnitTest.testSaveScenarioUi = function()
local function onOk(form)
local smallName = form.Name
uc=ucstring()
uc:fromUtf8(smallName)
local str = uc:toString()
UnitTest.saveScenario(str, false)
end
local function onCancel(form)
end
r2:doForm("SaveScenario", {}, onOk, onCancel)
end
UnitTest.tesConnectAdventure = function()
local function onOk(form)
if (form.AdventureId ~= nil and type(form.AdventureId) == "number")
then
r2.requestMapConnection(form.AdventureId)
else
debugInfo("R2Lua can't connect adventure")
end
end
local function onCancel(form)
end
r2:doForm("ConnectAdventure", {}, onOk, onCancel)
end
UnitTest.createRoad = function(x,y,name)
local road = r2.newComponent("Road")
local function wp(x, y, z)
local wayPoint = r2.newComponent("WayPoint")
local pos = r2.newComponent("Position")
pos.x = x
pos.y = y
pos.z = z
wayPoint.Position = pos
return wayPoint
end
road.Base = "palette.geom.road"
road.Name = name
local tmpPositions = road.Points
table.insert(tmpPositions, wp(x - 5, y, 0))
table.insert(tmpPositions, wp(x + 5, y, 0))
table.insert(tmpPositions, wp(x, y - 5, 0))
return road
end
--- UserComponent
r2.getUserComponentSourceExtension = function () return "lua" end
r2.getUserComponentExtension = function () return "lua" end
r2.getUserComponentExamplesDirectory= function () return "examples/user_components" end
r2.getUserComponentBinairyDirectory = function () return "ring_features" end
r2.UserComponentsManager = {}
local UserComponentsManager = r2.UserComponentsManager
function UserComponentsManager:newPackage(identifiant)
local package = {}
package.Name = "UnnamedPackage"
package.Description = "Undescribed Package"
package.Components = {}
if (not identifiant) then
package.GlobalNamespace = true
else
package.FileInfo = clone(UserComponentsManager.CurrentFileInfo)
end
function package:fullname(name)
if package.GlobalNamespace then
return name
else
return name .. "_" .. package.MD5
end
end
function package:newComponent(name)
if not package.GlobalNamespace then
if r2.Scenario.UserComponents.UserComponents[self.FileInfo.Md5] then
r2.requestInsertNode(r2.Scenario.InstanceId, "UserComponents", -1, self.Md5, self.FileInfo.Package)
end
end
return r2.newComponent(fullname(name))
end
function package:getUniqId()
return self:fullname(self.Name)
end
return clone(package)
end
function UserComponentsManager:newComponent()
local component = {
BaseClass="LogicEntity",
Name = "Unknown",
Menu="ui:interface:r2ed_feature_menu",
DisplayerUI = "R2::CDisplayerLua",
DisplayerUIParams = "defaultUIDisplayer",
DisplayerVisual = "R2::CDisplayerVisualEntity",
Text = "uiR2EDtooltipCreateUnkownComponent",
Tooltip = "uiR2EDtooltipCreateUnkownComponent",
Icon = "r2ed_feature_timer.tga",
IconOver = "r2ed_feature_timer_over.tga",
IconPushed= "r2ed_feature_timer_pushed.tga",
Parameters = {},
ApplicableActions = {},
Events = {},
Conditions = {},
TextContexts = {},
TextParameters = {},
LiveParameters = {},
Prop = { }
}
function component:registerMenu(logicEntityMenu)
logicEntityMenu:addLine(ucstring(self.Name), "lua", "", self.Name)
end
function component:createImpl()
if not r2:checkAiQuota() then return end
component:create()
end
function component:create()
end
-----------------------------------------------------------------------------------------------
-- from base class
component.getParentTreeNode = function(this)
return this:getFeatureParentTreeNode()
end
---------------------------------------------------------------------------------------------------------
-- from base class
component.appendInstancesByType = function(this, destTable, kind)
assert(type(kind) == "string")
--this:delegate():appendInstancesByType(destTable, kind)
r2.Classes.LogicEntity.appendInstancesByType(this, destTable, kind)
for k, component in specPairs(this.Components) do
component:appendInstancesByType(destTable, kind)
end
end
---------------------------------------------------------------------------------------------------------
-- from base class
component.getSelectBarSons = function(this)
return Components
end
---------------------------------------------------------------------------------------------------------
-- from base class
component.canHaveSelectBarSons = function(this)
return false;
end
function component:onPostCreate() end
function component:translator(context)
r2.Translator.createAiGroup(self, context)
end
function component:pretranslate(context)
r2.Translator.translateAiGroup(self, context)
end
return clone(component)
end
function UserComponentsManager:addUserComponentIntoPalette(componentId, package, component)
local theText, theTooltip, theIcon, theIconOver, theIconPushed = component.Text, component.Tooltip, component.Icon, component.IconOver, component.IconPushed
if not theText then theText = "uiR2EDtooltipCreateUnkownComponent" end
if not theTooltip then theTooltip = "uiR2EDtooltipCreateUnkownComponent" end
if not theIcon then theIcon = "r2ed_feature_timer.tga" end
if not theIconOver then theIconOver = "r2ed_feature_timer_over.tga" end
if not theIconPushed then theIconPushed = "r2ed_feature_timer_pushed.tga" end
local palette = getUI("ui:interface:r2ed_palette")
assert(palette)
local menu = palette:find("sbtree_features")
assert(menu)
menu = menu:find("feature_list")
assert(menu)
local theParent = "parent"
if componentId == 1 then
theParent = "parent"
else
theParent = "r2_user_component" .. tostring(componentId - 1)
end
local instance = createGroupInstance("named_r2ed_tool", menu.id , {
id="r2_user_component"..tostring(componentId),
tooltip=theTooltip,
onclick_l="lua",
posparent="parent",
posref="TL TL", x=tostring(componentId * 4),
y=tostring(1 + componentId * -64),
icon = theIcon,
icon_over = theIconOver,
icon_pushed = theIconPushed,
text=theText,
params_l="r2.UserComponentsManager.Packages['".. package:getUniqId() .. "'].Components['".. component.Name.."']:create()"
})
debugInfo("r2.UserComponentsManager.Packages['".. package:getUniqId() .. "'].Components['".. component.Name.."']:createImpl()")
assert(instance)
menu:addGroup(instance)
end
function UserComponentsManager:updateUserComponentsUi()
local index = 0
local k, package = next(self.Packages)
while k do
local kC, component = next(package.Components)
while kC do
UserComponentsManager:addUserComponentIntoPalette(index, package, component)
index = index + 1
kC, component = next(package.Components, kC)
end
k, package = next(self.Packages, k)
end
end
function UserComponentsManager:updateUserComponents()
local index = 0
local k, package = next(self.Packages)
while k do
local kC, component = next(package.Components)
while kC do
r2.registerComponent(component, package)
kC, component = next(package.Components, kC)
end
k, package = next(self.Packages, k)
end
self:updateUserComponentsUi();
end
function UserComponentsManager:registerPackageComponents(package)
local kC, component = next(package.Components)
while kC do
r2.registerComponent(component, package)
kC, component = next(package.Components, kC)
end
end
function UserComponentsManager:addUserComponent(filename)
local package = self:loadPackage(filename)
assert(package)
self.Packages[package:getUniqId()] = package
self:registerPackageComponents(package)
UserComponentsManager:updateUserComponentsUi()
end
function UserComponentsManager:registerFileInfo(fileinfo)
self.CurrentFileInfo = fileinfo
end
function UserComponentsManager:loadPackage(filename)
self.CurrentPackage = nil
self.CurrentFileInfo = nil
local str = r2.readUserComponentFile(filename)
if not str then
debugInfo("Error in package '" .. filename .. "'")
return nil
end
local f, msg = loadstring(str)
if not f then
debugInfo("Syntax error in package '" .. filename .. "': '" .. msg .. "'")
return nil
end
local ok, msg = pcall(f)
if not ok then
debugInfo("Loading error in package '" .. filename .. "': '" .. msg .. "'")
return nil
end
if not self.CurrentPackage then
debugInfo("No Package information in '"..filename.."'")
return nil
end
r2.updateUserComponentsInfo(filename, self.CurrentPackage.Name, self.CurrentPackage.Description,
self.CurrentFileInfo.TimeStamp, self.CurrentFileInfo.MD5)
self.CurrentPackage.fileinfo = clone(self.CurrentFileInfo)
return self.CurrentPackage
end
function UserComponentsManager:init()
self.UserComponentDirectory = "./ring_features"
self.Packages = {}
self.CurrentPackage = nil
-- r2.requestSetNode(r2.Scenario.InstanceId, "UserComponents", {}) -- TODO to remove
self.Instanece = self
end
function UserComponentsManager:addUserComponentIntoScenario(filename)
local package= self:loadPackage(filename)
if not package then return end
local uniqId = package:getUniqId()
-- TODO
if r2.Scenario.UserComponents[ uniqId ] then
debugInfo("The User defined Component '".. package.Name .. "' is already present in the current scenario.")
return
else
r2.requestInsertNode(r2.Scenario.InstanceId, "UserComponents", -1, uniqId, uniqId)
-- TODO: requestUpdateComponent
-- UserComponentsManager:addUserComponent(filename)
r2.registerUserComponent(filename)
end
end
function UserComponentsManager:addUserComponentUi()
end
function UserComponentsManager:test()
-- UserComponentsManager:addUserComponent("./ring_features/r2_features_zone_triggers.lua.r2c")
end
function UserComponentsManager:registerPackage(package)
assert(package)
self.CurrentPackage = package
end
function UserComponentsManager:registerComponent(package, component)
if not package then return end
if not component then return end
package.Components[package:fullname(component.Name)] = component
end
function UserComponentsManager:compileUserComponent(filename)
local component = self:loadPackage(filename)
if not component then
debugInfo("Can not compile user component.")
return
end
component = nil
r2.saveUserComponentFile(filename, true)
end
UserComponentsManager:init()
function UserComponentsManager:createUserComponentUi(otherDirectory)
local directory = otherDirectory
if (directory == nil) then directory= r2.getUserComponentExamplesDirectory() end
local extension = r2.getUserComponentSourceExtension()
local function onOk(form)
local filename = directory .."/".. form.Name
self:compileUserComponent(filename)
end
local function onCancel() end
debugInfo(extension)
r2:doForm("LoadUserComponent", {Directory=directory, Extension=extension}, onOk, onCancel)
end
function UserComponentsManager:importUserComponentUi(otherDirectory)
local directory = otherDirectory
if (directory == nil) then directory= r2.getUserComponentBinairyDirectory() end
local extension = r2.getUserComponentExtension()
local function onOk(form)
local filename = directory.."/".. form.Name
UserComponentsManager:addUserComponentIntoScenario(filename)
end
local function onCancel() end
r2:doForm("LoadUserComponent", {Directory=self.UserComponentDirectory, Extension=extension}, onOk, onCancel)
end
-----------------------------------------------------------------------------------------------------------------------------------------
-- Ring Access
--
r2.RingAccess = { }
local RingAccess = r2.RingAccess
function RingAccess.testAccess(access)
-- always true in local mode
if config.Local == 1 then
return true
end
--
local t = string.sub(access, 1, 1)
local v = tonumber(string.sub(access, 2))
local charAccessMap = r2.getRingAccessAsMap(r2.getCharacterRingAccess())
if charAccessMap[t] == nil then return false end
if charAccessMap[t] < v then return false end
return true
end
function RingAccess.updateLevel(access, level, allowed)
if string.len(access) == 0 then
return true, level
end
local t = string.sub(access, 1, 1)
local v = tonumber(string.sub(access, 2, string.len(access)))
if level[t] == nil or level[t] < v then
level[t] = v
end
if allowed[t] == nil or allowed[t] < v then
return false, level
end
return true, level
end
function RingAccess.errorMessageIsland(islandName, accessWanted, accessCharacter)
local accessWantedMap = r2.getRingAccessAsMap(accessWanted)
local accessCharacterMap = accessCharacter
local k, v = next(accessWantedMap, nil);
assert( k)
local charLevel = accessCharacterMap[k]
if charLevel == nil then charLevel = 0 end
return RingAccess.errorMessageImpl("InvalidIslandLevel", islandName, k, v, charLevel)
end
function RingAccess.errorMessageBot(entityName, accessWanted, accessCharacter)
local accessWantedMap = r2.getRingAccessAsMap(accessWanted)
local accessCharacterMap = accessCharacter
local k, v = next(accessWantedMap, nil);
assert( k)
local charLevel = accessCharacterMap[k]
if charLevel == nil then charLevel = 0 end
return RingAccess.errorMessageImpl("InvalidBotLevel", entityName, k, v, charLevel)
end
function RingAccess.errorMessageGeneric( accessWanted, accessCharacter)
local accessWantedMap = r2.getRingAccessAsMap(accessWanted)
local accessCharacterMap = accessCharacter
local k, v = next(accessWantedMap, nil);
assert( k)
local charLevel = accessCharacterMap[k]
if charLevel == nil then charLevel = 0 end
return RingAccess.errorMessageImpl("InvalidLevel", nil, k, v, charLevel)
end
function RingAccess.errorMessageImpl(errorType, name, package, entityLevel, charLevel)
local trad
local entityName
if errorType == "InvalidIslandLevel" then
trad = i18n.get("uiR2EDErrMessageNoEnoughRingPointFor".."Island")
entityName = i18n.get(name):toUtf8()
elseif errorType == "InvalidBotLevel" then
trad = i18n.get("uiR2EDErrMessageNoEnoughRingPointFor".."Bot")
entityName = name
elseif errorType =="InvalidLevel" then
trad = i18n.get("uiR2EDErrMessageNoEnoughRingPointFor".."Generic")
else
trad = i18n.get("uiR2EDErrMessageDataCorrupted")
package = nil
entityLevel = nil
chatLevel = nil
entityName = nil
end
local str = trad:toUtf8()
if package and string.len(package) ~= 0 then
local category = i18n.get(string.format("uiR2EDRingAccessCategory_%s", package))
str=string.gsub (str, "<Package>", category:toUtf8())
end
if entityLevel then
str=string.gsub (str, "<EntityLevel>", tostring(entityLevel))
end
if charLevel then
str=string.gsub (str, "<CharLevel>", tostring(charLevel))
end
if entityName then
str=string.gsub (str, "<EntityName>", entityName)
end
local err = {}
err.Type = errorType
err.Name = name
err.Package = package
err.CharLevel = charLevel
err.EntityLevel = entityLevel
err.What = str
return err
end
function RingAccess.dumpRingAccessLocations(level, allowed, ok)
local k1, v1 = next(r2.Scenario.Locations, nil)
while k1 do
local access = r2.getIslandRingAccess(v1.IslandName)
local map = r2.getRingAccessAsMap(access)
r2.print(access)
local k, v = next(map, nil)
if k then
if not level[k] then level[k] = {} end
if not level[k][v] then level[k][v] = {} end
table.insert(level[k][v], { Ok=test, Type="Island", Name=v1.IslandName} )
end
k1, v1 = next(r2.Scenario.Locations, k1)
end
return ok, level
end
function RingAccess.dumpRingAccessEntityRec(node, level, allowed, ok, err )
local isTree = false
if type(node) == "table" then
isTree = true
elseif type(node) == "userdata" then
local mt = getmetatable(node)
if mt~= nil and mt.__next ~= nil then
isTree = true
end
end
if isTree then
if node.Class ~= nil then
local access = ""
local access2 = nil
local type = "Unknown"
if node.isKindOf and node:isKindOf("Npc") then
access2 = node.RingAccess
local sheet = ""
if node.Sheet then sheet = node.Sheet end
access = r2.getSheetRingAccess(node.SheetClient, sheet)
type = "Bot"
elseif node.RingAccess then
local access = node.RingAccess
type = "Component"
end
local map = r2.getRingAccessAsMap(access)
local k, v = next(map, nil)
if k then
if not level[k] then level[k] = {} end
if not level[k][v] then level[k][v] = {} end
local obj = { Ok=test, Type=type, Name=node.Name, PaletteId=access2}
table.insert(level[k][v], obj)
end
end
local t = nil
if node.Components then t = node.Components end
if node.Acts then t = node.Acts end
if node.Features then t = node.Features end
if t then
local k, v = next(t, nil)
while k do
ok, level, err = RingAccess.dumpRingAccessEntityRec(v, level, allowed, ok, err)
k, v = next(t, k)
end
end
end
return ok, level, err
end
function RingAccess.dumpRingAccess()
local level = {} -- will be filled
local allowed = r2.getRingAccessAsMap(r2.getCharacterRingAccess())
local ok = true
local err= {}
err.What = ""
ok, level = RingAccess.dumpRingAccessLocations(level, allowed, ok, err)
ok, level, err = RingAccess.dumpRingAccessEntityRec(r2.Scenario, level, allowed, ok, err)
RingAccess.saveRingAccessLevel(level)
return ok, level, err
end
function RingAccess.saveRingAccessLevel(data)
local function dumpRec(item, f)
local k,v = next(item)
while k do
f:write(k.."='"..v.."', ")
k,v = next(item, k)
end
end
local filename = "scenario_level.txt"
local f = io.open(filename, "w")
assert(f)
f:write("-- "..filename.." ".. os.date() .."'\n\n")
f:write("r2.ScenarioRingAccess = {\n\n")
local catId, cat = next(data, nil)
while catId do
f:write("\t"..catId.."= {\n")
local levelId, level = next(cat, nil)
while levelId do
f:write("\t\t"..levelId.."= {\n")
local itemId, item = next(level, nil)
while itemId do
f:write("\t\t\t{");
dumpRec(item,f)
f:write("}\n");
itemId, item = next(level, itemId)
end
f:write("\t\t}\n")
levelId, level = next(cat, levelId)
end
f:write("\t}\n")
catId, cat = next(data, catId)
end
f:write("}\n")
f:flush()
f:close()
messageBox("Ring access has been saved in \""..filename.."\"")
end
function RingAccess.verifyLocations(level, allowed, ok, err)
local k, v = next(r2.Scenario.Locations, nil)
while k do
local access = r2.getIslandRingAccess(v.IslandName)
local test, level = RingAccess.updateLevel(access, level, allowed)
if not test then
if ok then
ok = false
err = RingAccess.errorMessageIsland(v.IslandName, access, allowed)
end
end
k, v = next(r2.Scenario.Locations, k)
end
return ok, level, err
end
function RingAccess.verifyEntityRec(node, level, allowed, ok, err )
local isTree = false
if type(node) == "table" then
isTree = true
elseif type(node) == "userdata" then
local mt = getmetatable(node)
if mt~= nil and mt.__next ~= nil then
isTree = true
end
end
if isTree then
if node.Class ~= nil then
if node.isKindOf and node:isKindOf("Npc") then
local access = node.RingAccess
local test, level = RingAccess.updateLevel(access, level, allowed)
local sheet = ""
if node.Sheet then sheet = node.Sheet end
local access2 = r2.getSheetRingAccess(node.SheetClient, sheet)
local test2, level = RingAccess.updateLevel(access2, level, allowed)
if not test2 then
test = false
access = access2
end
if not test and ok then
ok = false
err = RingAccess.errorMessageBot(node.Name, access, allowed)
end
elseif node.RingAccess then
local test = RingAccess.updateLevel(node.RingAccess, level, allowed)
if not test and ok then
ok = false
err = RingAccess.errorMessageGeneric(node.access, allowed)
end
end
end
local t = nil
if node.Components then t = node.Components end
if node.Acts then t = node.Acts end
if node.Features then t = node.Features end
if t then
local k, v = next(t, nil)
while k do
ok, level, err = RingAccess.verifyEntityRec(v, level, allowed, ok, err)
k, v = next(t, k)
end
end
end
return ok, level, err
end
function RingAccess.verifyScenario()
local level = {} -- will be filled
local allowed = r2.getRingAccessAsMap(r2.getCharacterRingAccess())
local ok = true
local err= {}
err.What = ""
ok, level, err = RingAccess.verifyLocations(level, allowed, ok, err)
ok, level, err = RingAccess.verifyEntityRec(r2.Scenario, level, allowed, ok, err)
return ok, level, err
end
function RingAccess.verifyRtScenario(rtScenario)
local ok, err = r2.verifyRtScenario(rtScenario)
if not ok then
err = RingAccess.errorMessageImpl(err.Type, err.EntityName, err.Package, err.EntityLevel, err.CharLevel)
end
return ok, err
end
function RingAccess.getAccessListAsString(list)
local ret = ''
local k,v = next(list)
while k do
if string.len(ret) ~= 0 then ret = ret ..':' end
ret = ret .. k .. tostring(v)
k, v= next(list, k)
end
return ret
end
function RingAccess.createAccessList()
assert( config.R2EDExtendedDebug == 1)
function createAccessListRec(node, f)
if r2.isTable(node) then
-- each palette entry
if node.Id ~= nil then
local base = r2.getPaletteElement(node.Id)
local access = r2.getPropertyValue(base, "RingAccess")
local sheet = r2.getPropertyValue(base, "Sheet")
local sheetClient = r2.getPropertyValue(base, "SheetClient")
if not sheet then sheet = "" end
if not sheetClient then sheetClient = "" end
f:write(string.format(" <entityAccess name=\"%s\" package=\"%s\" sheetClient=\"%s\" sheetServer=\"%s\"/>\n", node.Id, access, sheetClient, sheet))
else
local k,v = next(node, nil)
while k do
createAccessListRec(v, f)
k,v = next(node, k)
end
end
end
end
local f = io.open("data_common/r2/r2_ring_access.xml", "w")
assert(f)
f:write("<?xml version=\"1.0\"?>\n\n")
f:write("<!-- Do not modify this file!! He is generated by r2.RingAccess.createAccessList() with data from r2_palette.lua -->\n\n")
f:write("<entitiesAccess>\n")
createAccessListRec(r2.Palette, f)
f:write("</entitiesAccess>\n")
f:flush()
f:close()
end
function RingAccess.loadAnimation(str)
RingAccess.LoadAnimation = true
local ok, msg = r2.loadAnimation(str)
RingAccess.LoadAnimation = false
return ok, msg
end
function r()
resetR2UICache()
runCommand('resetEditorAndReloadUI')
-- UserComponentsManager:addUserComponentUi()
end
function t2()
-- UserComponentsManager:loadPackage('./ring_features/r2_features_zone_triggers.lua.r2c.gz')
end
function t3()
-- r2.registerUserComponent('./ring_features/r2_features_zone_triggers.lua.r2c.gz')
end
function t5()
local toto = "&ezr_<72><5F>'_\\)d //:1' 2 <20><><EFBFBD><EFBFBD>'..)<29>\/:*?\"<>|<7C>)@4 58ftgsfdg\"\/:*?\"<>|"
toto = string.gsub(toto, "[\\\/\:\*\?\"\<\>\|]", "_")
end
r2.UserComponentManager = r2.UserComponentsManager
function r2:dumpDialogsAsText(filename, noMessage)
local function dumpRec(entity, f)
if entity:isKindOf("ChatSequence") then
f:write("{\n\tName=[["..entity.Name.."]], Texts={\n")
local stepId, step = next(entity.Components)
while stepId do
local who =""
if tostring(step.Actions[0].Who) == "" then
who = step.Actions[0].WhoNoEntity
else
local whoInst = r2:getInstanceFromId(step.Actions[0].Who)
if whoInst then
who = whoInst.Name
end
end
local what = ""
if tostring(step.Actions[0].Says) ~= "" then
local whatInst = r2:getInstanceFromId(step.Actions[0].Says)
if whatInst then
local tmp = ucstring()
tmp:fromUtf8(whatInst.Text)
what = tmp:toString()
end
end
id = tostring(step.Actions[0].Says)
if id ~= "" then
f:write("\t\t{Id=[["..id.."]], Who=[["..who.."]], Text=[["..what.."]], },\n")
end
stepId, step = next(entity.Components, stepId)
end
f:write("\t}\n},\n")
end
if entity.Components then
local componentId, comp = next(entity.Components, nil)
while componentId do
dumpRec(comp)
componentId, comp = next(entity.Components, componentId)
end
end
end
local allNames = r2:getAllNames()
local function dumpBotnameRec(entity, f)
assert(f)
if not entity:isKindOf("Act") and not entity:isKindOf("Scenario") and entity.Name and entity.Name~="" then
local mustPrint = true
-- do not print DefaultName eg "Growling Gingo"
if entity:isKindOf("Npc") then
local basename = entity.Base
if basename then basename = r2.PaletteIdToTranslation[ basename ] end
if basename ~= nil and basename == entity.Name then
mustPrint = false
end
local found = false
local types, names = next (allNames)
while types and mustPrint do
local index, name = next (names)
while index and mustPrint do
if entity.Name == name then mustPrint = false end
index, name = next (names, index)
end
types, names = next (allNames, types)
end
local base = r2.getPaletteElement(entity.Base)
if base and base.Name == entity.Name then mustPrint = false end
end
if mustPrint then
f:write("\t{ Id=[["..entity.InstanceId.."]], Name=[["..entity.Name.."]], },\n");
end
end
if entity.Components then
local componentId, comp = next(entity.Components, nil)
while componentId do
dumpBotnameRec(comp, f)
componentId, comp = next(entity.Components, componentId)
end
end
end
local previousEntity = nil
local function dumpVariousPropertyRec(entity, f)
assert(f)
local function dumpProperty(property, entity, f)
if entity[property] and string.len( entity[property] ) > 0 then
if previousEntity ~= entity.InstanceId then f:write("\n") end
previousEntity = entity.InstanceId
f:write("\t{\tId=[["..entity.InstanceId.."]], Property=[[".. property .. "]], Text=[[".. entity[property] .. "]]},\n");
end
end
if not r2.isTable(entity) then return end
if entity.iKindOf and entity:isKindOf("Location") then
dumpProperty("Name", entity, f)
end
if entity.iKindOf and entity:isKindOf("PlotItem") then
dumpProperty("Name", entity, f)
dumpProperty("Comment", entity, f)
dumpProperty("Desc", entity, f)
end
-- Act or Scenenario description
dumpProperty("Title", entity, f)
dumpProperty("ShortDescription", entity, f)
dumpProperty("PreActDescription", entity, f)
-- Mission
dumpProperty("BroadcastText", entity, f)
dumpProperty("ContextualText", entity, f)
dumpProperty("MissionSucceedText", entity, f)
dumpProperty("MissionText", entity, f)
dumpProperty("WaitValidationText", entity, f)
local k,v = next(entity)
while k do
dumpVariousPropertyRec(v, f)
k,v = next(entity, k)
end
end
if not filename then filename = "scenario_texts.txt" end
local f = io.open(filename, "w")
do
assert(f)
f:write("-- scenario_texts.txt '".. os.date() .."'\n\n")
f:write("-- Here are the content of differents the dialogs\n")
f:write("-- You must only translate the \"Text\" field (not the \"Who\" or \"Name\")\n")
f:write("r2.DialogsAsText = {\n")
local actId, act = next(r2.Scenario.Acts, nil)
while actId do
local featureId, feature = next(act.Features, nil)
while featureId do
dumpRec(feature, f)
featureId, feature = next(act.Features, featureId)
end
actId, act = next(r2.Scenario.Acts, actId)
end
f:write("}\n\n\n")
end
do
assert(f)
f:write("\n-- Here are the content of different component name of the scenario\n")
f:write("-- Generic Fauana name and default botname are not present\n")
f:write("-- You only have to translate the \"Name\" Field\n")
f:write("r2.BotnameAsText = {\n\n")
local actId, act = next(r2.Scenario.Acts, nil)
while actId do
local featureId, feature = next(act.Features, nil)
while featureId do
dumpBotnameRec(feature, f)
featureId, feature = next(act.Features, featureId)
end
actId, act = next(r2.Scenario.Acts, actId)
end
f:write("}\n\n\n")
end
do
assert(f)
f:write("\n-- Here are the content of different field of the scenario like plot item/act description\n")
f:write("-- or task description/task text\n")
f:write("-- You only have to translate the \"Text\" Field\n")
f:write("r2.DiversText = {\n\n")
dumpVariousPropertyRec(r2.Scenario, f)
f:write("}\n")
f:flush()
f:close()
end
if not noMessage then
messageBox("Text content has been saved in \"scenario_text.txt\"")
end
end
function r2:updateDialogsFromText(filename, noMessage)
if not filename then filename = "dialog.txt" end
local f = io.open(filename, "r")
if not f then
if not noMessage then
messageBox("Can not open \""..filename.."\"")
else
ld.log("Can not open \""..filename.."\"")
end
return
end
assert(f)
if f ~= nil then
local content = f:read("*all")
io.close(f)
local fun, msg = loadstring(content)
if not fun then
local err = "Syntax error in \""..filename.."\":"..msg
if not noMessage then
messageBox(err)
else
ld.log(err)
end
return
end
r2.DialogsAsText = {}
r2.BotnameAsText = {}
r2.DiversText = {}
fun()
local dialogId, dialog = next(r2.DialogsAsText, nil)
while dialogId do
local textId, text = next(dialog.Texts, nil)
while textId do
local t = tostring(text.Text)
local uc=ucstring(t)
local utf8=uc:toUtf8()
r2.requestSetNode(tostring(text.Id), "Text", utf8)
textId, text = next(dialog.Texts, textId)
end
dialogId, dialog = next(r2.DialogsAsText, dialogId)
end
do
local id, value = next(r2.BotnameAsText, nil)
while id do
local t = tostring(value.Name)
local uc=ucstring(t)
local utf8=uc:toUtf8()
r2.requestSetNode(tostring(value.Id), "Name", utf8)
id, value = next(r2.BotnameAsText, id)
end
end
do
local id, value = next(r2.DiversText, nil)
while id do
local t = tostring(value.Text)
local uc=ucstring(t)
local utf8=uc:toUtf8()
r2.requestSetNode(tostring(value.Id), value.Property, utf8)
id, value = next(r2.DiversText, id)
end
end
end
if not noMessage then
messageBox("Dialogs content has been update with text from \""..filename.."\"")
end
return true
end
ld = {}
ld.WaitingCommands = {}
function ld.runScript(scriptName)
table.insert(ld.WaitingCommands, {'runScript', scriptName})
end
function ld.translate(textFilename, fileToSave)
table.insert(ld.WaitingCommands, {'translate', textFilename, fileToSave})
end
function ld.saveTexts(fileToSave)
table.insert(ld.WaitingCommands, {'saveTexts', fileToSave})
end
function ld.loadScena(fileToLoad)
table.insert(ld.WaitingCommands, {'loadScena', fileToLoad})
end
function ld.log(toto)
debugInfo("ld: "..toto)
local f = io.open("ld.log", "a")
f:write(tostring(os.date()).." "..toto.."\n")
f:flush()
f:close()
end
function ld.update()
local command = nil
if ld.lock == 1 then return end
if table.getn( ld.WaitingCommands ) > 0 then
command=table.remove(ld.WaitingCommands, 1)
else
return
end
if command[1] == 'saveTexts' then
ld.log("ld.saveTexts " .. command[2])
r2:dumpDialogsAsText(command[2], true)
elseif command[1] == 'loadScena' then
ld.log("ld.loadScena " .. command[2])
ld.lock = 1
r2.load(command[2 ])
elseif command[1] == 'translate' then
ld.log("ld.translate " .. command[2] .. " " .. command[3])
r2.requestNewAction("Update")
r2:updateDialogsFromText(command[2], true)
r2.requestEndAction()
r2.requestNewAction("Save")
r2.Version.save(command[3])
r2.requestEndAction()
elseif command[1] == 'runScript' then
debugInfo("ld.runScript " .. command[2])
dofile(command[2])
else
ld.log("Unknown command:" .. command[1])
end
ld.log( tostring(table.getn(ld.WaitingCommands)) .. " tasks restantes")
if table.getn(ld.WaitingCommands) == 0 then
ld.log("")
end
end
function createVisitZone()
r2.Features['VisitZone'].Components.VisitZone:create()
end
function createAmbush()
r2.Features['Ambush'].Components.Ambush:createProtected()
end
function createManHunt()
r2.Features['ManHuntFeature'].Components.ManHunt:create()
end
function createTimedSpawner()
r2.Features['TimedSpawner'].Components.TimedSpawner:create()
end
function createRandomChest()
r2.Features['RandomChest'].Components.RandomChest:create()
end
function createDelivery()
r2.Features['DeliveryTask'].Components.DeliveryTask:create()
end
function createKillNpc()
r2.Features['KillNpc'].Components.KillNpc:create()
end
function createTargetMob()
r2.Features['TargetMob'].Components.TargetMob:create()
end
function testIsInPalette()
if r2.isInPalette("palette.entities.creatures.ccegf4") then
debugInfo("Machin is in palette")
else
debugInfo("Machin is NOT in palette bordel")
end
end
function createHiddenChest()
r2.Features['HiddenChest'].Components.HiddenChest:create()
end
function createHunt()
r2.Features['HuntTask'].Components.HuntTask:create()
end
function testFiles()
local files = {"r2_translator.lua", "r2_logic.lua", "r2_unit_test.lua", "r2_features.lua", "r2_components.lua", "r2_version.lua"}
local k,v = next(files)
while k do
local f = fileLookup(v)
local fun= loadfile(f)
if not fun then
if f == "" then
debugInfo("Error: "..v.." is an unknown file.")
else
debugInfo("Error: "..f.." has syntax errors.")
end
end
k,v = next(files, k)
end
end