204 lines
6.2 KiB
Lua
204 lines
6.2 KiB
Lua
|
-- main tables of environement & general editor functions
|
||
|
|
||
|
---------------
|
||
|
-- FUNCTIONS --
|
||
|
---------------
|
||
|
|
||
|
------------------------------------------------------------------------------------------------------------
|
||
|
-- Helper : eval a property in an instance of a class :
|
||
|
-- if the property is a value, then that value is returned
|
||
|
-- if the property is a function, then the 'this' parameter is passed to the function and the result is returned
|
||
|
-- if the property is nil, then the defualt value is returned
|
||
|
function r2:evalProp(prop, this, defaultValue)
|
||
|
if type(prop) == "function" then return prop(this) -- could have been this:prop(), too...
|
||
|
elseif prop ~= nil then return prop
|
||
|
else return defaultValue
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-------------------------------------------------------------------------------------
|
||
|
-- get translation id for a property, followed by a boolean (false if not found)
|
||
|
function r2:getPropertyTranslationId(prop)
|
||
|
local translationId
|
||
|
local found = true
|
||
|
if prop.Translation ~= nil then
|
||
|
translationId = prop.Translation
|
||
|
elseif i18n.hasTranslation('uiR2EDProp_' .. prop.Name) then
|
||
|
translationId = 'uiR2EDProp_' .. prop.Name
|
||
|
elseif i18n.hasTranslation('uiR2ED' .. prop.Name) then
|
||
|
translationId = 'uiR2ED' .. prop.Name
|
||
|
else
|
||
|
translationId = prop.Name
|
||
|
found = false
|
||
|
end
|
||
|
return translationId, found
|
||
|
end
|
||
|
|
||
|
-------------------------------------------------------------------------------------
|
||
|
-- get translation id for a property, as an ucstring
|
||
|
function r2:getPropertyTranslation(prop)
|
||
|
local translationId = r2:getPropertyTranslationId(prop)
|
||
|
if (i18n.hasTranslation(translationId)) then
|
||
|
return i18n.get(translationId)
|
||
|
else
|
||
|
return ucstring(translationId)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
|
||
|
------------------------------------------------------------------------------------------------------------
|
||
|
-- return the left quota for the current scenario (called by C++)
|
||
|
function r2:getLeftQuota()
|
||
|
return r2.ScenarioWindow:getLeftQuota()
|
||
|
end
|
||
|
|
||
|
|
||
|
------------------------------------------------------------------------------------------------------------
|
||
|
-- retrieve class description of an instance (in the r2.Classes table)
|
||
|
function r2:getClass(instance)
|
||
|
if instance == nil or instance.isNil then
|
||
|
debugInfo("Calling r2:getClass on nil instance")
|
||
|
debugInfo(debug.traceback())
|
||
|
return
|
||
|
end
|
||
|
if instance.Class == nil then
|
||
|
debugInfo("Calling r2:getClass on class with no 'Class' field")
|
||
|
debugInfo(debug.traceback())
|
||
|
return
|
||
|
end
|
||
|
return r2.Classes[instance.Class]
|
||
|
end
|
||
|
|
||
|
------------------------------------------------------------------------------------------------------------
|
||
|
-- get parent instance of an object in the editor (that is an object with an InstanceId)
|
||
|
function r2:getParentInstance(object)
|
||
|
debugInfo(debug.traceback())
|
||
|
assert(nil) -- deprecated : use special member 'ParentInstance' instead
|
||
|
--if object == nil then return nil end
|
||
|
--local parent = object.Parent
|
||
|
--while parent ~= nil do
|
||
|
-- if parent.InstanceId ~= nil then
|
||
|
-- return parent
|
||
|
-- end
|
||
|
-- parent = parent.Parent
|
||
|
--end
|
||
|
--return nil
|
||
|
end
|
||
|
|
||
|
------------------------------------------------------------------------------------------------------------
|
||
|
-- get max number of acts in a scenario
|
||
|
function r2:getMaxNumberOfAdditionnalActs()
|
||
|
return getDefine("r2ed_max_num_additionnal_acts")
|
||
|
end
|
||
|
|
||
|
------------------------------------------------------------------------------------------------------------
|
||
|
-- Explore a tree of instance, each instance that has a sheet id is append to the list
|
||
|
function r2:exploreInstanceTree(obj, destTable)
|
||
|
if obj.InstanceId ~= nil then
|
||
|
table.insert(destTable, obj)
|
||
|
end
|
||
|
for k, v in specPairs(obj) do
|
||
|
if type(v) == "userdata" and v.Size ~= nil then
|
||
|
-- this is a sub array
|
||
|
r2:exploreInstanceTree(v, destTable)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
|
||
|
-- test from a sheet id if an object is a bot object
|
||
|
function r2:isBotObject(sheetClient)
|
||
|
return getCharacterSheetSkel(sheetClient, false) == ""
|
||
|
or string.match(sheetClient, "object_[%w_]*%.creature") -- patch for bot objects (with skeletons -> wind turbine)
|
||
|
end
|
||
|
|
||
|
-- helper function for pasting : relocate the 'Position' field of 'dest' for proper pasting
|
||
|
function r2:relocatePos(dest)
|
||
|
local x, y, z = r2:findEmptyPlace(dest.Position.x, dest.Position.y)
|
||
|
if x ~= nil then
|
||
|
dest.Position.x = x
|
||
|
dest.Position.y = y
|
||
|
dest.Position.z = z
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- Get a new position were to paste an object
|
||
|
function r2:getPastePosition()
|
||
|
local x, y, z = r2:getUserEntityPosition()
|
||
|
local fx, fy = r2:getUserEntityFront()
|
||
|
x = x + fx * 4
|
||
|
y = y + fy * 4
|
||
|
x = x + 3 * math.random(-100, 100) / 100
|
||
|
y = y + 3 * math.random(-100, 100) / 100
|
||
|
local nx, ny = r2:findEmptyPlace(x, y)
|
||
|
if nx ~= nil then
|
||
|
return nx, ny, z
|
||
|
else
|
||
|
return r2:getUserEntityPosition() -- no empty place found, paste on user
|
||
|
end
|
||
|
end
|
||
|
|
||
|
|
||
|
------------------------------------------------------------------------------------------------------------------
|
||
|
--------------------
|
||
|
-- INIT / GLOBALS --
|
||
|
--------------------
|
||
|
|
||
|
--debugInfo("Initializing main tables")
|
||
|
if r2 == nil then
|
||
|
r2 = {} -- for vianney's tests (is initialized by the caller otherwise)
|
||
|
end
|
||
|
|
||
|
------------------
|
||
|
-- MISC GLOBALS --
|
||
|
------------------
|
||
|
|
||
|
r2.ScratchUCStr = ucstring() -- scratch ucstring, useful to do call from utf8 without to create a new object
|
||
|
|
||
|
---------------------
|
||
|
-- EDITION GLOBALS --
|
||
|
---------------------
|
||
|
|
||
|
r2.maxId = {}
|
||
|
|
||
|
-- define in r2_features.lua
|
||
|
r2.Features={}
|
||
|
|
||
|
-- define in r2_basic_bricks.lua
|
||
|
r2.BasicBricks = {}
|
||
|
|
||
|
-- define in r2_palette.lua
|
||
|
r2.Palette = {}
|
||
|
|
||
|
-- definition of all R2 classes (contains both basic components and components of features)
|
||
|
r2.Classes = {}
|
||
|
|
||
|
-- current content of the clipboard after the selection has been copied
|
||
|
r2.ClipBoard = nil
|
||
|
r2.ClipBoardSrcInstanceId = nil
|
||
|
r2.ClipBoardDisplayName = nil
|
||
|
|
||
|
|
||
|
-----------------------
|
||
|
-- ANIMATION GLOBALS --
|
||
|
-----------------------
|
||
|
|
||
|
-- contains var related to animation
|
||
|
r2.AnimGlobals =
|
||
|
{
|
||
|
Acts = nil, -- set to nil until received by server, contains
|
||
|
-- the list of acts accessible at runtime by the animator
|
||
|
UserTriggers = nil, -- set to nil until received by server, contains
|
||
|
-- the list of triggers that an animator can fire at runtime
|
||
|
|
||
|
-------------------------------------------------------------------------------------
|
||
|
reset = function(this)
|
||
|
this.Acts = nil
|
||
|
this.UserTriggers = nil
|
||
|
end
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|