3094 lines
92 KiB
Lua
3094 lines
92 KiB
Lua
|
|
||
|
-- SEX -----------------------------------------------------------------------------------
|
||
|
r2.male = "male"
|
||
|
r2.female = "female"
|
||
|
r2.sexSelection = "male"
|
||
|
|
||
|
-- RACE ----------------------------------------------------------------------------------
|
||
|
r2.raceSelection = "Fyros"
|
||
|
r2.fyros = "Fyros"
|
||
|
r2.matis = "Matis"
|
||
|
r2.tryker = "Tryker"
|
||
|
r2.zorai = "Zorai"
|
||
|
|
||
|
r2.NPCNames = {} -- All available names
|
||
|
r2.NPCAllNames = {} -- All Names (even those who are not available)
|
||
|
|
||
|
-- CHANGE VIEW ---------------------------------------------------------------------------
|
||
|
r2.faceView = false
|
||
|
r2.camPosY = -16.4
|
||
|
r2.camZoomPosY = -3.9
|
||
|
r2.camTgtZ = -0.79
|
||
|
r2.camTgtZZorai = -0.75
|
||
|
r2.camPosYZorai = -18.3
|
||
|
r2.distlimitmin = 9.0
|
||
|
r2.distlimitmax = -r2.camPosY
|
||
|
r2.distlimitminZoom = 2.5
|
||
|
|
||
|
-- FACE MORPH EDIT TEXT ------------------------------------------------------------------
|
||
|
r2.raceMorphEditText = {}
|
||
|
r2.raceMorphEditText[r2.fyros] = { [1]="Mouth level", [2]="Eyes",
|
||
|
[3]="Nose level", [4]="Mouth width",
|
||
|
[5]="Nose length", [6]="Nose width",
|
||
|
[7]="Brown width", [8]="Chin"}
|
||
|
|
||
|
r2.raceMorphEditText[r2.matis] = { [1]="Eyes level", [2]="Nose level",
|
||
|
[3]="Nose length", [4]="Nose width",
|
||
|
[5]="Mouth width", [6]="Mouth level",
|
||
|
[7]="Ear size", [8]="Chin"}
|
||
|
|
||
|
r2.raceMorphEditText[r2.tryker] = { [1]="Eyes level", [2]="Nose level",
|
||
|
[3]="Nose length", [4]="Nose width",
|
||
|
[5]="Mouth width", [6]="Mouth level",
|
||
|
[7]="Ear size", [8]="Chin"}
|
||
|
|
||
|
r2.raceMorphEditText[r2.zorai] = { [1]="Eyes size", [2]="bottom horn 1",
|
||
|
[3]="bottom horn 2",[4]="middle horn 1",
|
||
|
[5]="middle horn 2",[6]="top horn 1",
|
||
|
[7]="top horn 2", [8]=""}
|
||
|
|
||
|
r2.tableBodySets = {}
|
||
|
r2.tableFaceSets = {}
|
||
|
r2.tableFaceMorph = {}
|
||
|
|
||
|
r2.raceSheetNameMatch =
|
||
|
{
|
||
|
["basic_fyros_male.creature"] = "Fyros",
|
||
|
["basic_fyros_female.creature"] = "Fyros",
|
||
|
["basic_matis_male.creature"] = "Matis",
|
||
|
["basic_matis_female.creature"] = "Matis",
|
||
|
["basic_tryker_male.creature"] = "Tryker",
|
||
|
["basic_tryker_female.creature"] = "Tryker",
|
||
|
["basic_zorai_male.creature"] = "Zorai",
|
||
|
["basic_zorai_female.creature"] = "Zorai"
|
||
|
}
|
||
|
|
||
|
r2.raceSheetClient =
|
||
|
{
|
||
|
male = {Fyros="basic_fyros_male.creature",
|
||
|
Matis="basic_matis_male.creature",
|
||
|
Tryker="basic_tryker_male.creature",
|
||
|
Zorai="basic_zorai_male.creature"},
|
||
|
|
||
|
female= {Fyros="basic_fyros_female.creature",
|
||
|
Matis="basic_matis_female.creature",
|
||
|
Tryker="basic_tryker_female.creature",
|
||
|
Zorai="basic_zorai_female.creature"}
|
||
|
}
|
||
|
|
||
|
|
||
|
-- ITEM INDEX / SLIDER VALUE FACES SETS --------------------------------------------------
|
||
|
r2.sliderValueToItemIndex = {}
|
||
|
r2.sliderValueToItemIndex[r2.fyros] = {[0] = "fy_cheveux_shave01.sitem", [1] = "fy_cheveux_short01.sitem",
|
||
|
[2] = "fy_cheveux_short02.sitem", [3] = "fy_cheveux_medium01.sitem",
|
||
|
[4] = "fy_cheveux_medium02.sitem", [5] = "fy_cheveux_medium03.sitem",
|
||
|
[6] = "fy_cheveux_long01.sitem"}
|
||
|
|
||
|
r2.sliderValueToItemIndex[r2.matis] = {[0] = "ma_cheveux_shave01.sitem", [1] = "ma_cheveux_short01.sitem",
|
||
|
[2] = "ma_cheveux_short02.sitem", [3] = "ma_cheveux_medium01.sitem",
|
||
|
[4] = "ma_cheveux_medium02.sitem", [5] = "ma_cheveux_long01.sitem",
|
||
|
[6] = "ma_cheveux_long02.sitem"}
|
||
|
|
||
|
r2.sliderValueToItemIndex[r2.tryker] = {[0] = "tr_cheveux_shave01.sitem", [1] = "tr_cheveux_short01.sitem",
|
||
|
[2] = "tr_cheveux_short02.sitem", [3] = "tr_cheveux_short03.sitem",
|
||
|
[4] = "tr_cheveux_medium01.sitem", [5] = "tr_cheveux_medium02.sitem",
|
||
|
[6] = "tr_cheveux_long01.sitem"}
|
||
|
|
||
|
r2.sliderValueToItemIndex[r2.zorai] = {[0] = "zo_cheveux_shave01.sitem", [1] = "zo_cheveux_short01.sitem",
|
||
|
[2] = "zo_cheveux_medium01.sitem", [3] = "zo_cheveux_medium02.sitem",
|
||
|
[4] = "zo_cheveux_medium03.sitem", [5] = "zo_cheveux_long01.sitem",
|
||
|
[6] = "zo_cheveux_long02.sitem"}
|
||
|
|
||
|
r2.itemIndexToSliderValue = {}
|
||
|
|
||
|
r2.hasHelmet = false
|
||
|
|
||
|
r2.hairType = {}
|
||
|
|
||
|
r2.selectEquipmentSet = false
|
||
|
|
||
|
-----------------------------------------------------------------------
|
||
|
-- Current fonction to change an attribute in a npc
|
||
|
-- default is to do a 'requestSetNode'
|
||
|
function r2:setNpcAttribute(instanceId, propName, propValue)
|
||
|
r2.requestSetNode(instanceId, propName, propValue)
|
||
|
end
|
||
|
|
||
|
|
||
|
|
||
|
-- INIT ITEM INDEX TO SLIDER VALUE TABLE -------------------------------------------------
|
||
|
function r2:initItemIndexToSliderValueTable()
|
||
|
|
||
|
r2.itemIndexToSliderValue={}
|
||
|
local races = {r2.fyros, r2.matis, r2.tryker, r2.zorai}
|
||
|
|
||
|
for key1, value1 in pairs(races) do
|
||
|
r2.itemIndexToSliderValue[value1] = {}
|
||
|
|
||
|
for key2, value2 in pairs(r2.sliderValueToItemIndex[value1]) do
|
||
|
local itemIndex = getSheetId(value2)
|
||
|
r2.itemIndexToSliderValue[value1][itemIndex] = key2
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
|
||
|
local body_sliders = {GabaritHeight ="slider_height",
|
||
|
GabaritTorsoWidth ="slider_torso",
|
||
|
GabaritArmsWidth ="slider_arms",
|
||
|
GabaritLegsWidth ="slider_legs",
|
||
|
GabaritBreastSize ="slider_breast",
|
||
|
|
||
|
HairType ="slider_haircut",
|
||
|
HairColor ="slider_hair_color",
|
||
|
Tattoo ="slider_tattoos",
|
||
|
EyesColor ="slider_eye_color",
|
||
|
|
||
|
MorphTarget1 ="slider_morph_target1",
|
||
|
MorphTarget2 ="slider_morph_target2",
|
||
|
MorphTarget3 ="slider_morph_target3",
|
||
|
MorphTarget4 ="slider_morph_target4",
|
||
|
MorphTarget5 ="slider_morph_target5",
|
||
|
MorphTarget6 ="slider_morph_target6",
|
||
|
MorphTarget7 ="slider_morph_target7",
|
||
|
MorphTarget8 ="slider_morph_target8"}
|
||
|
|
||
|
r2.sheetTypeCB = {}
|
||
|
|
||
|
|
||
|
-- share npc displayer between all instances
|
||
|
local npcCustomPropertySheetDisplayerTable = clone(r2:propertySheetDisplayer())
|
||
|
|
||
|
local oldCustomNPCOnAttrModified = npcCustomPropertySheetDisplayerTable.onAttrModified
|
||
|
|
||
|
|
||
|
------------------------------------------------
|
||
|
function npcCustomPropertySheetDisplayerTable:onPostCreate(instance)
|
||
|
end
|
||
|
------------------------------------------------
|
||
|
function npcCustomPropertySheetDisplayerTable:onErase(instance)
|
||
|
end
|
||
|
------------------------------------------------
|
||
|
function npcCustomPropertySheetDisplayerTable:onPreHrcMove(instance)
|
||
|
r2:npcPropertySheetDisplayer():onPreHrcMove(instance)
|
||
|
end
|
||
|
------------------------------------------------
|
||
|
function npcCustomPropertySheetDisplayerTable:onPostHrcMove(instance)
|
||
|
r2:npcPropertySheetDisplayer():onPostHrcMove(instance)
|
||
|
end
|
||
|
------------------------------------------------
|
||
|
function npcCustomPropertySheetDisplayerTable:onFocus(instance, hasFocus)
|
||
|
end
|
||
|
|
||
|
------------------------------------------------
|
||
|
r2.customizationOpen = false
|
||
|
function npcCustomPropertySheetDisplayerTable:onSelect(instance, isSelected)
|
||
|
r2:npcPropertySheetDisplayer():onSelect(instance, isSelected)
|
||
|
|
||
|
local npcUI = getUI("ui:interface:r2ed_npc")
|
||
|
assert(npcUI)
|
||
|
if not isSelected then
|
||
|
r2.customizationOpen = npcUI.active
|
||
|
npcUI.active = false
|
||
|
else
|
||
|
r2.raceSelection = getR2PlayerRace(instance.SheetClient)
|
||
|
|
||
|
if r2.customizationOpen == true then
|
||
|
r2.customizationOpen = false
|
||
|
npcCustomPropertySheetDisplayerTable:updateAll(instance)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
------------------------------------------------
|
||
|
function npcCustomPropertySheetDisplayerTable:updateAll(instance)
|
||
|
-- nico patch :
|
||
|
-- replace the r2:setNpcProperty function, so that it does call 'requestSetNode', but rather forward call
|
||
|
-- to the displayer directly...
|
||
|
local function bypassRequestNode(this, instanceId, propName, propValue)
|
||
|
local instance = r2:getInstanceFromId(instanceId)
|
||
|
instance.DisplayerProperties:onAttrModified(instance, propName)
|
||
|
end
|
||
|
local oldSetNpcAttribute = r2.setNpcAttribute
|
||
|
r2.setNpcAttribute = bypassRequestNode
|
||
|
local ok, msg = pcall(self.updateAllPrivate, self, instance)
|
||
|
if not ok then
|
||
|
debugInfo(msg)
|
||
|
end
|
||
|
r2.setNpcAttribute = oldSetNpcAttribute
|
||
|
end
|
||
|
|
||
|
------------------------------------------------
|
||
|
function npcCustomPropertySheetDisplayerTable:updateAllPrivate(instance)
|
||
|
|
||
|
-- if attribute is visible in the generic property sheet, then update it
|
||
|
local propDesc = instance:getPropDesc(attributeName)
|
||
|
if propDesc and propDesc.Visible ~= false then -- NB : "visible" may be nil, which default to 'true'...
|
||
|
-- property visible in the generic property sheet so update it
|
||
|
--debugInfo("Updating in generic property sheet : " .. attributeName)
|
||
|
oldCustomNPCOnAttrModified(self, instance, attributeName)
|
||
|
end
|
||
|
|
||
|
assert(instance)
|
||
|
local npcUI = getUI("ui:interface:r2ed_npc")
|
||
|
assert(npcUI)
|
||
|
|
||
|
local propWnd = r2:getPropertySheet(instance)
|
||
|
if propWnd.active then
|
||
|
local nameEBox = propWnd:find("Name"):find("eb")
|
||
|
local name = nameEBox.uc_input_string:toUtf8()
|
||
|
r2:setNpcAttribute(instance.InstanceId, "Name", name)
|
||
|
end
|
||
|
|
||
|
npcUI.active = true
|
||
|
|
||
|
r2:updateNPCView(instance)
|
||
|
r2.hairType = {}
|
||
|
|
||
|
-- update sex
|
||
|
local sexCB = npcUI:find("sex").combo_box
|
||
|
assert(sexCB)
|
||
|
|
||
|
if isR2PlayerMale(instance.SheetClient) then
|
||
|
r2.sexSelection = r2.male
|
||
|
else
|
||
|
r2.sexSelection = r2.female
|
||
|
end
|
||
|
sexCB.Env.locked = true
|
||
|
sexCB.selection_text = r2.sexSelection
|
||
|
sexCB.Env.locked = false
|
||
|
|
||
|
-- update race in combo box
|
||
|
local raceCB = npcUI:find("race").combo_box
|
||
|
assert(raceCB)
|
||
|
r2.raceSelection = getR2PlayerRace(instance.SheetClient)
|
||
|
local sliderHairType = r2.itemIndexToSliderValue[r2.raceSelection][instance.HairType]
|
||
|
r2.hasHelmet = (sliderHairType == nil)
|
||
|
|
||
|
if not r2.hasHelmet then
|
||
|
r2.hairType.hairCut = sliderHairType
|
||
|
r2.hairType.hairColor = instance.HairColor
|
||
|
else
|
||
|
r2.hairType.hairCut = 0
|
||
|
r2.hairType.hairColor = 0
|
||
|
end
|
||
|
raceCB.Env.locked = true
|
||
|
raceCB.selection_text = r2.raceSelection
|
||
|
raceCB.Env.locked = false
|
||
|
|
||
|
-- update name
|
||
|
local editName = npcUI:find("name").edit_box_group
|
||
|
assert(editName)
|
||
|
editName.uc_input_string = instance:getDisplayName()
|
||
|
npcUI.uc_title = concatUCString(i18n.get("uiRE2DPropertiesOf"), instance:getDisplayName())
|
||
|
|
||
|
-- update notes
|
||
|
local editNotes = npcUI:find("small_description")
|
||
|
assert(editNotes)
|
||
|
if instance.Notes ~= nil then
|
||
|
editNotes.input_string = instance.Notes
|
||
|
else
|
||
|
editNotes.input_string = ""
|
||
|
end
|
||
|
|
||
|
-- update avoidable equipment
|
||
|
r2:updateEquipment(instance, false)
|
||
|
|
||
|
-- update link color
|
||
|
local toggleB = npcUI:find("color_link").toggle_butt
|
||
|
assert(toggleB)
|
||
|
local link = false
|
||
|
if instance.LinkColor==1 then link=true end
|
||
|
toggleB.pushed = not link
|
||
|
|
||
|
-- update weapons
|
||
|
comboBox = npcUI:find("hands"):find("combo_box")
|
||
|
|
||
|
local handsLevel = r2:getHandsLevel(instance.SheetModel, instance.Sheet)
|
||
|
local rightHandIndex = instance.WeaponRightHand
|
||
|
local leftHandIndex = instance.WeaponLeftHand
|
||
|
|
||
|
local handsKey = rightHandIndex..":"..leftHandIndex..":"..handsLevel
|
||
|
local weaponsName = r2.itemIndexEquipmentToSelectionText[instance.Equipment][comboBox.Env.nameComboBox][handsKey]
|
||
|
comboBox.Env.locked = true
|
||
|
comboBox.selection_text = weaponsName
|
||
|
comboBox.Env.locked = false
|
||
|
|
||
|
-- camera target is out of 3D character
|
||
|
r2:updateRaceView()
|
||
|
r2.faceView = false
|
||
|
|
||
|
-- update body sliders
|
||
|
for key, value in pairs(body_sliders) do
|
||
|
local slider = npcUI:find(value):find("slider")
|
||
|
assert(slider)
|
||
|
if value == "slider_haircut" and not r2.hasHelmet then
|
||
|
slider.value = r2.itemIndexToSliderValue[r2.raceSelection][instance["HairType"] ]
|
||
|
else
|
||
|
slider.value = instance[key]
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- empty body/face/morph sets
|
||
|
local bodyCB = npcUI:find("body_sets").combo_box
|
||
|
assert(bodyCB)
|
||
|
bodyCB.view_text = r2.emptyComboLine
|
||
|
|
||
|
local faceCB = npcUI:find("face_sets").combo_box
|
||
|
assert(faceCB)
|
||
|
faceCB.view_text = r2.emptyComboLine
|
||
|
|
||
|
local morphCB = npcUI:find("face_morph").combo_box
|
||
|
assert(morphCB)
|
||
|
morphCB.view_text = r2.emptyComboLine
|
||
|
|
||
|
r2:updateRaceUI()
|
||
|
end
|
||
|
|
||
|
------------------------------------------------
|
||
|
function r2:initTypeUI(instance)
|
||
|
|
||
|
local propertiesUI = getUI(r2:getDefaultPropertySheetUIPath(instance.Class))
|
||
|
assert(propertiesUI)
|
||
|
|
||
|
-- update avoidable types
|
||
|
local typeCB = propertiesUI:find("TypeNPC")
|
||
|
assert(typeCB)
|
||
|
|
||
|
typeCB:resetTexts()
|
||
|
|
||
|
local currentType = ""
|
||
|
|
||
|
-- search for current ecosystem et level selected in palette UI
|
||
|
local levelMin, levelMax, ecosystem = r2:getPaletteAccessibilityFactors()
|
||
|
|
||
|
local place = 0
|
||
|
if ecosystem and levelMin and levelMax then
|
||
|
|
||
|
-- parent palette element in palette UI (type node)
|
||
|
local typePalette = r2.PaletteIdToType[instance.Base]
|
||
|
r2.sheetTypeCB = {}
|
||
|
|
||
|
-- for each element of this type, check if must be added in combo box (only if also showed in palette UI)
|
||
|
-- then the same test is used than in r2:setupPaletteAccessibleContent
|
||
|
for typeKey, typeValue in pairs(typePalette) do
|
||
|
|
||
|
local typeTranslation = typeValue.Translation
|
||
|
local typeElement = r2.getPaletteElement(typeValue.Id)
|
||
|
|
||
|
local show = false
|
||
|
local levelElt = defaulting(typeElement.Level, 1)
|
||
|
local ecosystemElt = defaulting(typeElement.Ecosystem, "")
|
||
|
if string.match(typeElement.SheetClient, "object.*") then
|
||
|
show = true
|
||
|
elseif levelElt >= levelMin and levelElt <= levelMax and (ecosystemElt == "" or string.match(ecosystemElt, ecosystem)) then
|
||
|
show = true
|
||
|
end
|
||
|
|
||
|
if show then
|
||
|
|
||
|
r2.sheetTypeCB[typeCB:getNumTexts()] = typeValue
|
||
|
|
||
|
typeCB:addText(i18n.get(typeTranslation))
|
||
|
|
||
|
if instance.Base==typeValue.Id then
|
||
|
currentType = typeValue.Translation
|
||
|
end
|
||
|
|
||
|
if currentType=="" then place = place+1 end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if tostring(instance.TypeNPC)=="-1" then
|
||
|
-- TypeNPC
|
||
|
r2:setNpcAttribute(instance.InstanceId, "TypeNPC", place)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
------------------------------------------------
|
||
|
|
||
|
r2.bodyAttributesCB = {
|
||
|
["GabaritHeight"] = {comboBox="body_sets", updateComboBox="r2ed_add_body_sets", tableSets="tableBodySets"},
|
||
|
["GabaritTorsoWidth"] = {comboBox="body_sets", updateComboBox="r2ed_add_body_sets", tableSets="tableBodySets"},
|
||
|
["GabaritArmsWidth"] = {comboBox="body_sets", updateComboBox="r2ed_add_body_sets", tableSets="tableBodySets"},
|
||
|
["GabaritLegsWidth"] = {comboBox="body_sets", updateComboBox="r2ed_add_body_sets", tableSets="tableBodySets"},
|
||
|
["GabaritBreastSize"] = {comboBox="body_sets", updateComboBox="r2ed_add_body_sets", tableSets="tableBodySets"},
|
||
|
["EyesColor"] = {comboBox="face_sets", updateComboBox="r2ed_add_face_sets", tableSets="tableFaceSets"},
|
||
|
["Tattoo"] = {comboBox="face_sets", updateComboBox="r2ed_add_face_sets", tableSets="tableFaceSets"},
|
||
|
["HairType"] = {comboBox="face_sets", updateComboBox="r2ed_add_face_sets", tableSets="tableFaceSets"},
|
||
|
["HairColor"] = {comboBox="face_sets", updateComboBox="r2ed_add_face_sets", tableSets="tableFaceSets"},
|
||
|
["MorphTarget1"] = {comboBox="face_morph", updateComboBox="r2ed_add_face_morph", tableSets="tableFaceMorph"},
|
||
|
["MorphTarget2"] = {comboBox="face_morph", updateComboBox="r2ed_add_face_morph", tableSets="tableFaceMorph"},
|
||
|
["MorphTarget3"] = {comboBox="face_morph", updateComboBox="r2ed_add_face_morph", tableSets="tableFaceMorph"},
|
||
|
["MorphTarget4"] = {comboBox="face_morph", updateComboBox="r2ed_add_face_morph", tableSets="tableFaceMorph"},
|
||
|
["MorphTarget5"] = {comboBox="face_morph", updateComboBox="r2ed_add_face_morph", tableSets="tableFaceMorph"},
|
||
|
["MorphTarget6"] = {comboBox="face_morph", updateComboBox="r2ed_add_face_morph", tableSets="tableFaceMorph"},
|
||
|
["MorphTarget7"] = {comboBox="face_morph", updateComboBox="r2ed_add_face_morph", tableSets="tableFaceMorph"},
|
||
|
["MorphTarget8"] = {comboBox="face_morph", updateComboBox="r2ed_add_face_morph", tableSets="tableFaceMorph"},
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
function npcCustomPropertySheetDisplayerTable:onAttrModified(instance, attributeName)
|
||
|
|
||
|
|
||
|
r2:npcPropertySheetDisplayer():onAttrModified(instance, attributeName)
|
||
|
|
||
|
if r2:getSelectedInstance()==nil or r2:getSelectedInstance().InstanceId ~= instance.InstanceId then
|
||
|
return
|
||
|
end
|
||
|
|
||
|
r2:updateNPCView(instance)
|
||
|
|
||
|
local npcUI = getUI("ui:interface:r2ed_npc")
|
||
|
|
||
|
local comboBox
|
||
|
|
||
|
if attributeName == "HairType" then
|
||
|
local sliderHairType = r2.itemIndexToSliderValue[r2.raceSelection][instance.HairType]
|
||
|
r2.hasHelmet = (sliderHairType == nil)
|
||
|
end
|
||
|
|
||
|
-- SEX AND RACE
|
||
|
if attributeName == "SheetClient" then
|
||
|
|
||
|
-- sex
|
||
|
comboBox = npcUI:find("sex").combo_box
|
||
|
|
||
|
local isFemale = string.find(instance[attributeName], "female")
|
||
|
if isFemale ~= nil then
|
||
|
r2.sexSelection = r2.female
|
||
|
else
|
||
|
r2.sexSelection = r2.male
|
||
|
end
|
||
|
comboBox.Env.locked = true
|
||
|
comboBox.selection_text = r2.sexSelection
|
||
|
comboBox.Env.locked = false
|
||
|
|
||
|
-- race
|
||
|
local comboBox = npcUI:find("race").combo_box
|
||
|
r2.raceSelection = r2.raceSheetNameMatch[instance[attributeName]]
|
||
|
comboBox.Env.locked = true
|
||
|
comboBox.selection_text = r2.raceSelection
|
||
|
comboBox.Env.locked = false
|
||
|
|
||
|
r2:updateRaceView()
|
||
|
r2:updateFaceView()
|
||
|
|
||
|
r2:updateRaceUI()
|
||
|
|
||
|
return
|
||
|
end
|
||
|
|
||
|
|
||
|
-- NAME
|
||
|
if attributeName == "Name" then
|
||
|
local editName = npcUI:find("name").edit_box_group
|
||
|
assert(editName)
|
||
|
editName.uc_input_string = instance:getDisplayName()
|
||
|
npcUI.uc_title = concatUCString(i18n.get("uiRE2DPropertiesOf"), instance:getDisplayName())
|
||
|
editName:cancelFocusOnText()
|
||
|
return
|
||
|
end
|
||
|
|
||
|
-- NOTES
|
||
|
if attributeName == "Notes" then
|
||
|
local editNotes= npcUI:find("small_description")
|
||
|
assert(editNotes)
|
||
|
editNotes.input_string = instance[attributeName]
|
||
|
editNotes:cancelFocusOnText()
|
||
|
return
|
||
|
end
|
||
|
|
||
|
|
||
|
-- EQUIPMENT PIECE
|
||
|
local slider
|
||
|
for cbbName, v in pairs(r2.equipmentEnv) do
|
||
|
if v.propName == attributeName then
|
||
|
|
||
|
comboBox = npcUI:find(cbbName):find("combo_box")
|
||
|
assert(comboBox)
|
||
|
|
||
|
local CBText = r2.itemIndexEquipmentToSelectionText[instance.Equipment][cbbName][instance[attributeName]]
|
||
|
if CBText==nil then CBText= r2.noPiece end
|
||
|
if attributeName == "HairType" then
|
||
|
slider = npcUI:find("slider_haircut")
|
||
|
assert(slider)
|
||
|
slider.active = (CBText == r2.noPiece)
|
||
|
if slider.active then
|
||
|
local value = r2.itemIndexToSliderValue[r2.raceSelection][instance["HairType"] ]
|
||
|
if value then
|
||
|
slider:find("slider").value = value
|
||
|
end
|
||
|
end
|
||
|
|
||
|
slider = npcUI:find("slider_hair_color")
|
||
|
assert(slider)
|
||
|
slider.active = (CBText == r2.noPiece)
|
||
|
if slider.active then
|
||
|
slider:find("slider").value = instance.HairColor
|
||
|
end
|
||
|
end
|
||
|
|
||
|
comboBox.Env.locked = true
|
||
|
comboBox.selection_text = CBText
|
||
|
comboBox.Env.locked = false
|
||
|
|
||
|
-- if equipment is 'no one', color slider must be hidden
|
||
|
slider = npcUI:find(cbbName):find("slider")
|
||
|
assert(slider)
|
||
|
local line = npcUI:find(cbbName):find("line_slider")
|
||
|
assert(line)
|
||
|
slider.active = (CBText ~= r2.noPiece)
|
||
|
line.active = (CBText ~= r2.noPiece)
|
||
|
if slider.active then
|
||
|
slider.value = instance[v.propColorName]
|
||
|
end
|
||
|
|
||
|
return
|
||
|
end
|
||
|
|
||
|
if v.propColorName == attributeName then
|
||
|
if attributeName == "HairColor" then
|
||
|
if not r2.hasHelmet then
|
||
|
slider = npcUI:find("slider_hair_color"):find("slider")
|
||
|
assert(slider)
|
||
|
slider.value = instance[attributeName]
|
||
|
end
|
||
|
else
|
||
|
slider = npcUI:find(cbbName):find("slider")
|
||
|
assert(slider)
|
||
|
slider.value = instance[attributeName]
|
||
|
end
|
||
|
|
||
|
for k, v1 in pairs(r2.equipementComboB) do
|
||
|
slider = npcUI:find(v1):find("slider")
|
||
|
local comboBox = npcUI:find(cbbName):find("combo_box")
|
||
|
local propName = r2.equipmentEnv[v1].propName
|
||
|
local comboText
|
||
|
if propName=="HairType" then
|
||
|
if r2.hasHelmet then
|
||
|
comboText = r2.itemIndexEquipmentToSelectionText[instance.Equipment][v1][instance[propName]]
|
||
|
else
|
||
|
comboText = r2.noPiece
|
||
|
end
|
||
|
else
|
||
|
comboText = r2.itemIndexEquipmentToSelectionText[instance.Equipment][v1][instance[propName]]
|
||
|
end
|
||
|
end
|
||
|
return
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- EQUIPMENT
|
||
|
if attributeName == "Equipment" then
|
||
|
r2:updateEquipment(instance, false)
|
||
|
end
|
||
|
|
||
|
-- LINK COLOR
|
||
|
if attributeName == "LinkColor" then
|
||
|
local toggleB = npcUI:find("color_link").toggle_butt
|
||
|
assert(toggleB)
|
||
|
local link = false
|
||
|
if instance.LinkColor==1 then link=true end
|
||
|
toggleB.pushed = not link
|
||
|
end
|
||
|
|
||
|
-- BODY SETS / FACE SETS/ FACE MORPH
|
||
|
local sliderUIPath = body_sliders[attributeName]
|
||
|
if sliderUIPath then
|
||
|
r2:updateBodyAttribute(attributeName, instance[attributeName])
|
||
|
return
|
||
|
end
|
||
|
|
||
|
-- FUNCTION
|
||
|
if attributeName == "Function" then
|
||
|
local functionCB = npcUI:find("fonction").combo_box
|
||
|
assert(functionCB)
|
||
|
functionCB.Env.locked = true
|
||
|
functionCB.selection_text = instance[attributeName]
|
||
|
functionCB.Env.locked = false
|
||
|
return
|
||
|
end
|
||
|
|
||
|
-- SHEET
|
||
|
if attributeName == "Sheet" then
|
||
|
|
||
|
-- update weapons
|
||
|
local weaponsCB = npcUI:find("hands"):find("combo_box")
|
||
|
assert(weaponsCB)
|
||
|
|
||
|
local handsLevel = r2:getHandsLevel(instance.SheetModel, instance.Sheet)
|
||
|
local rightHandIndex = instance.WeaponRightHand
|
||
|
local leftHandIndex = instance.WeaponLeftHand
|
||
|
|
||
|
local handsKey = rightHandIndex..":"..leftHandIndex..":"..handsLevel
|
||
|
local weaponsName = r2.itemIndexEquipmentToSelectionText[instance.Equipment][weaponsCB.Env.nameComboBox][handsKey]
|
||
|
if weaponsName then
|
||
|
weaponsCB.Env.locked = true
|
||
|
weaponsCB.selection_text = weaponsName
|
||
|
weaponsCB.Env.locked = false
|
||
|
end
|
||
|
|
||
|
return
|
||
|
end
|
||
|
|
||
|
-- PROFILE
|
||
|
if attributeName == "Profile" then
|
||
|
local profileCB = npcUI:find("speed_aggro").profile.combo_box
|
||
|
assert(profileCB)
|
||
|
profileCB.Env.locked = true
|
||
|
profileCB.selection_text = r2.profileCB[instance[attributeName]]
|
||
|
profileCB.Env.locked = false
|
||
|
return
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-------------------------------------------------------------------------------------------
|
||
|
function r2:npcCustomPropertySheetDisplayer()
|
||
|
return npcCustomPropertySheetDisplayerTable -- returned shared displayer to avoid wasting memory
|
||
|
end
|
||
|
|
||
|
|
||
|
-- share npc displayer between all instances
|
||
|
local npcPropertySheetDisplayerTable = clone(r2:propertySheetDisplayer())
|
||
|
|
||
|
local oldNPCOnAttrModified = npcPropertySheetDisplayerTable.onAttrModified
|
||
|
|
||
|
------------------------------------------------
|
||
|
function npcPropertySheetDisplayerTable:onPostCreate(instance)
|
||
|
end
|
||
|
------------------------------------------------
|
||
|
function npcPropertySheetDisplayerTable:onErase(instance)
|
||
|
end
|
||
|
------------------------------------------------
|
||
|
function npcPropertySheetDisplayerTable:onPreHrcMove(instance)
|
||
|
end
|
||
|
------------------------------------------------
|
||
|
function npcPropertySheetDisplayerTable:onPostHrcMove(instance)
|
||
|
|
||
|
local selectedInstance = r2:getSelectedInstance()
|
||
|
if selectedInstance and selectedInstance==instance then
|
||
|
|
||
|
r2.miniActivities:openEditor()
|
||
|
|
||
|
if r2.activities.isInitialized then
|
||
|
r2.activities.isInitialized = false
|
||
|
r2.activities:initEditorAfterFirstCall()
|
||
|
end
|
||
|
end
|
||
|
|
||
|
instance:updatePermanentStatutIcon()
|
||
|
r2.events:updateElementsUI()
|
||
|
end
|
||
|
------------------------------------------------
|
||
|
function npcPropertySheetDisplayerTable:onFocus(instance, hasFocus)
|
||
|
end
|
||
|
|
||
|
------------------------------------------------
|
||
|
function npcPropertySheetDisplayerTable:onSelect(instance, isSelected)
|
||
|
|
||
|
r2:activeLogicEntityPropertySheetDisplayer():onSelect(instance, isSelected)
|
||
|
|
||
|
r2:initTypeUI(instance)
|
||
|
end
|
||
|
|
||
|
------------------------------------------------
|
||
|
function npcPropertySheetDisplayerTable:onAttrModified(instance, attributeName)
|
||
|
|
||
|
-- if attribute is visible in the generic property sheet, then update it
|
||
|
local propDesc = instance:getPropDesc(attributeName)
|
||
|
if propDesc and propDesc.Visible ~= false then -- NB : "visible" may be nil, which default to 'true'...
|
||
|
-- property visible in the generic property sheet so update it
|
||
|
oldNPCOnAttrModified(self, instance, attributeName)
|
||
|
end
|
||
|
|
||
|
r2:activeLogicEntityPropertySheetDisplayer():onAttrModified(instance, attributeName)
|
||
|
end
|
||
|
|
||
|
-------------------------------------------------------------------------------------------
|
||
|
function r2:npcPropertySheetDisplayer()
|
||
|
return npcPropertySheetDisplayerTable -- returned shared displayer to avoid wasting memory
|
||
|
end
|
||
|
|
||
|
------------------ UPDATE NPC EDITOR -------------------------------------------------------
|
||
|
function r2:updateNPCView(instance)
|
||
|
|
||
|
local npcUI = getUI("ui:interface:r2ed_npc")
|
||
|
assert(npcUI)
|
||
|
|
||
|
local char3D = npcUI:find("char3d").char
|
||
|
assert(char3D)
|
||
|
|
||
|
local slotEntity = instance.DisplayerVisual.slotEntity
|
||
|
assert(slotEntity)
|
||
|
|
||
|
if slotEntity > -1 then
|
||
|
char3D:setupCharacter3D(slotEntity)
|
||
|
end
|
||
|
|
||
|
-- disable char LOD interpolation
|
||
|
char3D:enableLOD(false)
|
||
|
end
|
||
|
|
||
|
------------------ BODY --------------------------------------------------------------------
|
||
|
|
||
|
r2.bodyAttNb = 5
|
||
|
r2.bodyAttributes = {[1] = "GabaritHeight", [2] = "GabaritTorsoWidth",
|
||
|
[3] = "GabaritArmsWidth", [4] = "GabaritLegsWidth",
|
||
|
[5] = "GabaritBreastSize"}
|
||
|
|
||
|
r2.bodySliders = {[1] = "slider_height", [2] = "slider_torso",
|
||
|
[3] = "slider_arms", [4] = "slider_legs",
|
||
|
[5] = "slider_breast"}
|
||
|
|
||
|
|
||
|
r2.bodyKeys = {[1] = "GabaritHeight", [2] = "GabaritTorsoWidth",
|
||
|
[3] = "GabaritArmsWidth", [4] = "GabaritLegsWidth",
|
||
|
[5] = "GabaritBreastSize"}
|
||
|
|
||
|
|
||
|
------------------ FACE ---------------------------------------------------------------------
|
||
|
|
||
|
r2.faceAttNb = 4
|
||
|
r2.faceAttributes = {[1] = "HairType", [2] = "HairColor",
|
||
|
[3] = "Tattoo", [4] = "EyesColor"}
|
||
|
|
||
|
r2.faceSliders = {[1] = "slider_haircut", [2] = "slider_hair_color",
|
||
|
[3] = "slider_tattoos", [4] = "slider_eye_color"}
|
||
|
|
||
|
r2.faceKeys = {[1] = "HairType", [2] = "HairColor",
|
||
|
[3] = "Tattoo", [4] = "EyesColor"}
|
||
|
|
||
|
|
||
|
------------------ MORPH --------------------------------------------------------------------
|
||
|
|
||
|
r2.morphAttNb = 8
|
||
|
r2.morphAttributes = {[1] = "MorphTarget1", [2] = "MorphTarget2",
|
||
|
[3] = "MorphTarget3", [4] = "MorphTarget4",
|
||
|
[5] = "MorphTarget5", [6] = "MorphTarget6",
|
||
|
[7] = "MorphTarget7", [8] = "MorphTarget8"}
|
||
|
|
||
|
r2.morphSliders = {[1] = "slider_morph_target1", [2] = "slider_morph_target2",
|
||
|
[3] = "slider_morph_target3", [4] = "slider_morph_target4",
|
||
|
[5] = "slider_morph_target5", [6] = "slider_morph_target6",
|
||
|
[7] = "slider_morph_target7", [8] = "slider_morph_target8"}
|
||
|
|
||
|
r2.morphKeys = {[1] = "MorphTarget1", [2] = "MorphTarget2",
|
||
|
[3] = "MorphTarget3", [4] = "MorphTarget4",
|
||
|
[5] = "MorphTarget5", [6] = "MorphTarget6",
|
||
|
[7] = "MorphTarget7", [8] = "MorphTarget8"}
|
||
|
|
||
|
r2.emptyComboLine = ""
|
||
|
|
||
|
|
||
|
-- INIT NPC EDITOR ---------------------------------------------------------------------------
|
||
|
|
||
|
function r2:initNpcEditor()
|
||
|
|
||
|
local npcUI = getUI("ui:interface:r2ed_npc")
|
||
|
|
||
|
-- equipment color sliders
|
||
|
local levelDesignEnabled = getClientCfgVar("LevelDesignEnabled")
|
||
|
local maxVal = 5
|
||
|
if tonumber(levelDesignEnabled)==1 then maxVal = 7 end
|
||
|
|
||
|
for i=1, r2.equipmentAttNb do
|
||
|
local slider = npcUI:find(r2.equipementComboB[i]):find("slider")
|
||
|
assert(slider)
|
||
|
slider.max = maxVal
|
||
|
end
|
||
|
|
||
|
-- race
|
||
|
local raceCB = npcUI:find("race").combo_box
|
||
|
assert(raceCB)
|
||
|
raceCB:resetTexts()
|
||
|
raceCB:addText(ucstring("Fyros"))
|
||
|
raceCB:addText(ucstring("Matis"))
|
||
|
raceCB:addText(ucstring("Tryker"))
|
||
|
raceCB:addText(ucstring("Zorai"))
|
||
|
|
||
|
-- sex
|
||
|
local sexCB = npcUI:find("sex").combo_box
|
||
|
assert(sexCB)
|
||
|
sexCB:resetTexts()
|
||
|
sexCB:addText(ucstring(r2.female))
|
||
|
sexCB:addText(ucstring(r2.male))
|
||
|
|
||
|
-- Equipment
|
||
|
r2:initEquipmentEnv()
|
||
|
|
||
|
r2:loadTables()
|
||
|
|
||
|
-- body sets
|
||
|
local bodySetsCB = npcUI:find("body_sets").combo_box
|
||
|
assert(bodySetsCB)
|
||
|
local updateBodySetsCB = getUI("ui:interface:r2ed_add_body_sets"):find("update_sets").combo_box
|
||
|
assert(updateBodySetsCB)
|
||
|
bodySetsCB:resetTexts()
|
||
|
updateBodySetsCB:resetTexts()
|
||
|
|
||
|
for k, v in pairs(r2.tableBodySets) do
|
||
|
bodySetsCB:addText(ucstring(k))
|
||
|
updateBodySetsCB:addText(ucstring(k))
|
||
|
end
|
||
|
|
||
|
-- face sets
|
||
|
local faceSetsCB = npcUI:find("face_sets").combo_box
|
||
|
assert(faceSetsCB)
|
||
|
local updateFaceSetsCB = getUI("ui:interface:r2ed_add_face_sets"):find("update_sets").combo_box
|
||
|
assert(updateFaceSetsCB)
|
||
|
faceSetsCB:resetTexts()
|
||
|
updateFaceSetsCB:resetTexts()
|
||
|
|
||
|
for k, v in pairs(r2.tableFaceSets) do
|
||
|
faceSetsCB:addText(ucstring(k))
|
||
|
updateFaceSetsCB:addText(ucstring(k))
|
||
|
end
|
||
|
|
||
|
-- face morph
|
||
|
local faceMorphCB = npcUI:find("face_morph").combo_box
|
||
|
assert(faceMorphCB)
|
||
|
local updateFaceMorphCB = getUI("ui:interface:r2ed_add_face_morph"):find("update_sets").combo_box
|
||
|
assert(updateFaceMorphCB)
|
||
|
faceMorphCB:resetTexts()
|
||
|
updateFaceMorphCB:resetTexts()
|
||
|
|
||
|
for k, v in pairs(r2.tableFaceMorph) do
|
||
|
faceMorphCB:addText(ucstring(k))
|
||
|
updateFaceMorphCB:addText(ucstring(k))
|
||
|
end
|
||
|
|
||
|
bodySetsCB.view_text = r2.emptyComboLine
|
||
|
updateBodySetsCB.view_text = r2.emptyComboLine
|
||
|
faceSetsCB.view_text = r2.emptyComboLine
|
||
|
updateFaceSetsCB.view_text = r2.emptyComboLine
|
||
|
faceMorphCB.view_text = r2.emptyComboLine
|
||
|
updateFaceMorphCB.view_text = r2.emptyComboLine
|
||
|
|
||
|
r2:initItemIndexToSliderValueTable()
|
||
|
end
|
||
|
|
||
|
-- SAVE TABLE ------------------------------------------------------------------------------
|
||
|
|
||
|
function r2:saveTable(fileName, t)
|
||
|
io.output(io.open(fileName,"w"))
|
||
|
r2:serialize(t)
|
||
|
io.close()
|
||
|
end
|
||
|
|
||
|
function r2:serialize(o)
|
||
|
|
||
|
if type(o) == "number" then
|
||
|
io.write(o)
|
||
|
elseif type(o) == "string" then
|
||
|
--io.write(string.format('%q', o))
|
||
|
io.write("["..o.."]")
|
||
|
elseif type(o) == "table" then
|
||
|
io.write("{\n")
|
||
|
for k,v in pairs(o) do
|
||
|
r2:serialize(k)
|
||
|
io.write(" = ")
|
||
|
r2:serialize(v)
|
||
|
io.write("\n")
|
||
|
end
|
||
|
io.write("}")
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- LOAD TABLE ------------------------------------------------------------------------------
|
||
|
|
||
|
function r2:loadTables()
|
||
|
|
||
|
r2.equipmentSets = r2:loadTable("save\\equipmentSets.txt")
|
||
|
r2.tableBodySets = r2:loadTable("save\\tableBodySets.txt")
|
||
|
r2.tableFaceSets = r2:loadTable("save\\tableFaceSets.txt")
|
||
|
r2.tableFaceMorph = r2:loadTable("save\\tableFaceMorph.txt")
|
||
|
|
||
|
r2:loadRaceSexNames(r2.fyros, r2.male)
|
||
|
r2:loadRaceSexNames(r2.fyros, r2.female)
|
||
|
r2:loadRaceSexNames(r2.matis, r2.male)
|
||
|
r2:loadRaceSexNames(r2.matis, r2.female)
|
||
|
r2:loadRaceSexNames(r2.tryker, r2.male)
|
||
|
r2:loadRaceSexNames(r2.tryker, r2.female)
|
||
|
r2:loadRaceSexNames(r2.zorai, r2.male)
|
||
|
r2:loadRaceSexNames(r2.zorai, r2.female)
|
||
|
end
|
||
|
|
||
|
function r2:loadTable(fileName)
|
||
|
|
||
|
function loadTableR(file)
|
||
|
|
||
|
local resultT = {}
|
||
|
local s, e, l, line, key, value
|
||
|
local line = file:read("*l")
|
||
|
|
||
|
while line ~= "}" do
|
||
|
|
||
|
s, e = string.find(line, " = ")
|
||
|
|
||
|
key = string.sub(line, 1, s-1)
|
||
|
value = string.sub(line, e+1)
|
||
|
|
||
|
-- KEY
|
||
|
-- string key
|
||
|
if string.sub(key, 1, 1) == "[" then
|
||
|
l = string.len(key)
|
||
|
key= string.sub(key, 2, l-1)
|
||
|
-- number key
|
||
|
else
|
||
|
key = tonumber(key)
|
||
|
end
|
||
|
|
||
|
-- VALUE
|
||
|
-- string value
|
||
|
if string.sub(value, 1, 1) == "[" then
|
||
|
l = string.len(value)
|
||
|
value= string.sub(value, 2, l-1)
|
||
|
-- number value
|
||
|
elseif value == "{" then
|
||
|
value = loadTableR(file)
|
||
|
else
|
||
|
value = tonumber(value)
|
||
|
end
|
||
|
|
||
|
resultT[key] = value
|
||
|
line = file:read("*l")
|
||
|
end
|
||
|
return resultT
|
||
|
end
|
||
|
|
||
|
local file = io.open(fileName, "r")
|
||
|
|
||
|
if file == nil then return {} end
|
||
|
|
||
|
if file:read("*l") ~= "{" then
|
||
|
io.close(file)
|
||
|
return {}
|
||
|
end
|
||
|
|
||
|
local resultT = loadTableR(file)
|
||
|
io.close(file)
|
||
|
return resultT
|
||
|
end
|
||
|
|
||
|
|
||
|
function r2:loadRaceSexNamesImpl(race, sex)
|
||
|
local fileName = fileLookup(race.."_" .. sex .. ".txt")
|
||
|
if fileName == "" then return end
|
||
|
local resultT = {}
|
||
|
local count = 1
|
||
|
for line in io.lines(fileName) do
|
||
|
resultT[count] = line
|
||
|
count = count + 1
|
||
|
end
|
||
|
return resultT
|
||
|
end
|
||
|
|
||
|
function r2:loadRaceSexNames(race, sex)
|
||
|
local resultT = r2:loadRaceSexNamesImpl(race, sex)
|
||
|
r2.NPCNames[race .. "_" .. sex] = resultT
|
||
|
end
|
||
|
|
||
|
function r2:loadAllRaceSexNames(race, sex)
|
||
|
local resultT = r2:loadRaceSexNamesImpl(race, sex)
|
||
|
r2.NPCAllNames[race .. "_" .. sex] = resultT
|
||
|
end
|
||
|
|
||
|
function r2:getAllNames()
|
||
|
if (table.getn(r2.NPCAllNames) == 0) then
|
||
|
r2:loadAllRaceSexNames(r2.fyros, r2.male)
|
||
|
r2:loadAllRaceSexNames(r2.fyros, r2.female)
|
||
|
r2:loadAllRaceSexNames(r2.matis, r2.male)
|
||
|
r2:loadAllRaceSexNames(r2.matis, r2.female)
|
||
|
r2:loadAllRaceSexNames(r2.tryker, r2.male)
|
||
|
r2:loadAllRaceSexNames(r2.tryker, r2.female)
|
||
|
r2:loadAllRaceSexNames(r2.zorai, r2.male)
|
||
|
r2:loadAllRaceSexNames(r2.zorai, r2.female)
|
||
|
end
|
||
|
|
||
|
return r2.NPCAllNames
|
||
|
end
|
||
|
|
||
|
|
||
|
-- UPDATE RACE VIEW ---------------------------------------------------------------------------
|
||
|
|
||
|
function r2:updateRaceView()
|
||
|
|
||
|
local npcUI = getUI("ui:interface:r2ed_npc")
|
||
|
assert(npcUI)
|
||
|
local scene3D = npcUI:find("char3d")
|
||
|
assert(scene3D)
|
||
|
|
||
|
-- camera target is out of 3D character
|
||
|
local camera = scene3D.cam
|
||
|
assert(camera)
|
||
|
if r2.raceSelection == r2.zorai then
|
||
|
camera.tgtz = r2.camTgtZZorai
|
||
|
camera.posy = r2.camPosYZorai
|
||
|
r2.distlimitmax = -r2.camPosYZorai
|
||
|
scene3D.distlimitmax = r2.distlimitmax
|
||
|
else
|
||
|
camera.tgtz = r2.camTgtZ
|
||
|
camera.posy = r2.camPosY
|
||
|
r2.distlimitmax = -r2.camPosY
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- CHANGE VIEW --------------------------------------------------------------------------------
|
||
|
|
||
|
function r2:changeView()
|
||
|
|
||
|
local npcUI = getUI("ui:interface:r2ed_npc")
|
||
|
assert(npcUI)
|
||
|
local scene3D = npcUI:find("char3d")
|
||
|
assert(scene3D)
|
||
|
|
||
|
local camera = scene3D.cam
|
||
|
assert(camera)
|
||
|
|
||
|
if r2.faceView then
|
||
|
scene3D.distlimitmin = r2.distlimitmin
|
||
|
scene3D.distlimitmax = r2.distlimitmax
|
||
|
if r2.raceSelection == r2.zorai then
|
||
|
camera.tgtz = r2.camTgtZZorai
|
||
|
camera.posy = r2.camPosYZorai
|
||
|
else
|
||
|
camera.tgtz = r2.camTgtZ
|
||
|
camera.posy = r2.camPosY
|
||
|
end
|
||
|
r2.faceView = false
|
||
|
else
|
||
|
scene3D.distlimitmin = r2.distlimitminZoom
|
||
|
scene3D.distlimitmax = -r2.camZoomPosY
|
||
|
local char3D = scene3D.char
|
||
|
assert(char3D)
|
||
|
local headZ = char3D.headz
|
||
|
camera.tgtz = headZ + 0.07
|
||
|
camera.posy = r2.camZoomPosY
|
||
|
r2.faceView = true
|
||
|
end
|
||
|
end
|
||
|
|
||
|
|
||
|
-----------------------------------------------------------------------------------------------
|
||
|
-- PROFILE ------------------------------------------------------------------------------------
|
||
|
-----------------------------------------------------------------------------------------------
|
||
|
|
||
|
-- UPDATE NAME --------------------------------------------------------------------------------
|
||
|
function r2:updateName()
|
||
|
|
||
|
local selection = r2:getSelectedInstance()
|
||
|
if selection == nil then return end
|
||
|
|
||
|
local npcUI = getUI("ui:interface:r2ed_npc")
|
||
|
assert(npcUI)
|
||
|
|
||
|
local editName = npcUI:find("name").edit_box_group
|
||
|
assert(editName)
|
||
|
|
||
|
local newString = editName.uc_input_string:toUtf8()
|
||
|
local oldString = defaulting(selection.Name, "")
|
||
|
if newString ~= oldString then
|
||
|
r2.requestNewAction(i18n.get("uiR2EDUpdateNpcNameAction"))
|
||
|
r2:setNpcAttribute(selection.InstanceId, "Name", newString)
|
||
|
end
|
||
|
|
||
|
return editName.uc_input_string:toUtf8()
|
||
|
end
|
||
|
|
||
|
-- UPDATE NOTES --------------------------------------------------------------------------------
|
||
|
function r2:updateNotes()
|
||
|
|
||
|
local selection = r2:getSelectedInstance()
|
||
|
if selection == nil then return end
|
||
|
|
||
|
local npcUI = getUI("ui:interface:r2ed_npc")
|
||
|
assert(npcUI)
|
||
|
|
||
|
local editNotes = npcUI:find("small_description")
|
||
|
assert(editNotes)
|
||
|
|
||
|
local newString = editNotes.uc_input_string:toUtf8()
|
||
|
local oldString = defaulting(selection.Notes, "")
|
||
|
if newString ~= oldString then
|
||
|
r2.requestNewAction(i18n.get("uiR2EDUpdateNpcNotesAction"))
|
||
|
r2:setNpcAttribute(selection.InstanceId, "Notes", newString)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- UPDATE RACE --------------------------------------------------------------------------------
|
||
|
function r2:updateRace(race)
|
||
|
|
||
|
local selection = r2:getSelectedInstance()
|
||
|
if selection == nil then
|
||
|
debugInfo("No selection")
|
||
|
return
|
||
|
end
|
||
|
|
||
|
local name = selection.Name
|
||
|
if not race and not getUICaller().Env.locked then
|
||
|
r2:updateNotes()
|
||
|
name = r2:updateName()
|
||
|
end
|
||
|
|
||
|
r2.requestNewAction(i18n.get("uiR2EDUpdateNpcRaceAction"))
|
||
|
|
||
|
local npcUI = getUI("ui:interface:r2ed_npc")
|
||
|
assert(npcUI)
|
||
|
|
||
|
local sliderValue
|
||
|
if r2.hasHelmet then
|
||
|
sliderValue = r2.hairType.hairCut
|
||
|
else
|
||
|
sliderValue = r2.itemIndexToSliderValue[r2.raceSelection][selection.HairType]
|
||
|
end
|
||
|
|
||
|
local oldRaceSelection = r2.raceSelection
|
||
|
if race==nil then
|
||
|
race = getUICaller().selection_text
|
||
|
end
|
||
|
r2.raceSelection = race
|
||
|
|
||
|
-- requestSetNode
|
||
|
local sheetClientName = r2.raceSheetClient[r2.sexSelection][r2.raceSelection]
|
||
|
if not getUICaller().Env.locked then
|
||
|
|
||
|
r2:setNpcAttribute(selection.InstanceId, "SheetClient", sheetClientName)
|
||
|
|
||
|
-- hairType item index of new race
|
||
|
if not r2.hasHelmet then
|
||
|
local itemIndex = getSheetId(r2.sliderValueToItemIndex[r2.raceSelection][sliderValue])
|
||
|
r2:setNpcAttribute(selection.InstanceId, "HairType", itemIndex)
|
||
|
end
|
||
|
|
||
|
if r2:isRandomizedNPCName(name, oldRaceSelection, r2.sexSelection) then
|
||
|
local name = r2:randomNPCName(r2.raceSelection, r2.sexSelection)
|
||
|
r2:setNpcAttribute(selection.InstanceId, "Name", name)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
r2.requestEndAction()
|
||
|
end
|
||
|
|
||
|
function r2:updateRaceUI()
|
||
|
|
||
|
local npcUI = getUI("ui:interface:r2ed_npc")
|
||
|
assert(npcUI)
|
||
|
|
||
|
-- no eyes color and morph8 for Zorai
|
||
|
local eyesColor = npcUI:find("slider_eye_color")
|
||
|
assert(eyesColor)
|
||
|
local sliderMorph8 = npcUI:find("slider_morph_target8")
|
||
|
assert(sliderMorph8)
|
||
|
if r2.raceSelection == r2.zorai then
|
||
|
eyesColor.active = false
|
||
|
sliderMorph8.active = false
|
||
|
else
|
||
|
eyesColor.active = true
|
||
|
sliderMorph8.active = true
|
||
|
end
|
||
|
|
||
|
-- update morph sliders labels
|
||
|
for key, value in pairs(r2.morphSliders) do
|
||
|
local sliderMorph = npcUI:find(value)
|
||
|
assert(sliderMorph)
|
||
|
sliderMorph:find("slider_text_place"):find("slider_text").hardtext = r2.raceMorphEditText[r2.raceSelection][key]
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- UPDATE SEX ---------------------------------------------------------------------------------
|
||
|
function r2:updateSex()
|
||
|
|
||
|
local selection = r2:getSelectedInstance()
|
||
|
if selection == nil then
|
||
|
debugInfo("No selection")
|
||
|
return
|
||
|
end
|
||
|
|
||
|
local name = selection.Name
|
||
|
if not getUICaller().Env.locked then
|
||
|
r2:updateNotes()
|
||
|
name = r2:updateName()
|
||
|
end
|
||
|
|
||
|
r2.requestNewAction(i18n.get("uiR2EDUpdateNpcSexAction"))
|
||
|
|
||
|
local npcUI = getUI("ui:interface:r2ed_npc")
|
||
|
assert(npcUI)
|
||
|
|
||
|
local oldSexSelection = r2.sexSelection
|
||
|
r2.sexSelection = getUICaller().selection_text
|
||
|
|
||
|
-- update sex
|
||
|
local breastGroup = npcUI:find("slider_breast")
|
||
|
assert(breastGroup)
|
||
|
if r2.sexSelection == r2.male then
|
||
|
breastGroup.active = false
|
||
|
else
|
||
|
breastGroup.active = true
|
||
|
end
|
||
|
|
||
|
if not getUICaller().Env.locked then
|
||
|
-- requestSetNode
|
||
|
local sheetClientName = r2.raceSheetClient[r2.sexSelection][r2.raceSelection]
|
||
|
r2:setNpcAttribute(selection.InstanceId, "SheetClient", sheetClientName)
|
||
|
|
||
|
if r2:isRandomizedNPCName(name, r2.raceSelection, oldSexSelection) then
|
||
|
local name = r2:randomNPCName(r2.raceSelection, r2.sexSelection)
|
||
|
r2:setNpcAttribute(selection.InstanceId, "Name", name)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
r2.requestEndAction()
|
||
|
end
|
||
|
|
||
|
-- UPDATE SEX ---------------------------------------------------------------------------------
|
||
|
function r2:updateType()
|
||
|
|
||
|
local selection = r2:getSelectedInstance()
|
||
|
if selection == nil then return end
|
||
|
|
||
|
local oldTypeNPC = selection.TypeNPC
|
||
|
|
||
|
local typeNPC = getUICaller().selection
|
||
|
local base = r2.sheetTypeCB[typeNPC].Id
|
||
|
local typeElement = r2.getPaletteElement(base)
|
||
|
|
||
|
r2.requestNewAction(i18n.get("uiR2EDUpdateNpcTypeAction"))
|
||
|
|
||
|
-- TypeNPC
|
||
|
r2:setNpcAttribute(selection.InstanceId, "TypeNPC", typeNPC)
|
||
|
|
||
|
-- RingAccess
|
||
|
r2:setNpcAttribute(selection.InstanceId, "RingAccess", typeElement.RingAccess)
|
||
|
|
||
|
if selection:isKindOf("NpcCustom") then
|
||
|
-- SheetModel
|
||
|
r2:setNpcAttribute(selection.InstanceId, "SheetModel", typeElement.SheetModel)
|
||
|
|
||
|
-- Sheet
|
||
|
local level = r2:getLevel(selection)+1
|
||
|
local sheet = typeElement.Sheet
|
||
|
|
||
|
local s,e = string.find(sheet, ".creature")
|
||
|
local firstPart = string.sub(sheet, 1, s-2)
|
||
|
local newSheet = firstPart .. level .. ".creature"
|
||
|
|
||
|
r2:setNpcAttribute(selection.InstanceId, "Sheet", newSheet)
|
||
|
|
||
|
-- Base
|
||
|
r2:setNpcAttribute(selection.InstanceId, "Base", base)
|
||
|
|
||
|
-- Type
|
||
|
r2:setNpcAttribute(selection.InstanceId, "Type", typeElement.Type)
|
||
|
|
||
|
-- Equipment
|
||
|
local tableEquipment = r2.equipmentPalette[selection.Equipment]
|
||
|
local newTableEquipment = r2.equipmentPalette[typeElement.Equipment]
|
||
|
|
||
|
local chestNb = r2:getPieceEquipmentNumber(tableEquipment.chest_plate, selection.JacketModel)
|
||
|
local jacketModel = r2:getPieceEquipmentFromNumber(newTableEquipment.chest_plate, chestNb)
|
||
|
|
||
|
local legsNb = r2:getPieceEquipmentNumber(tableEquipment.legs, selection.TrouserModel)
|
||
|
local trouserModel = r2:getPieceEquipmentFromNumber(newTableEquipment.legs, legsNb)
|
||
|
|
||
|
local bootsNb = r2:getPieceEquipmentNumber(tableEquipment.boots, selection.FeetModel)
|
||
|
local feetModel = r2:getPieceEquipmentFromNumber(newTableEquipment.boots, bootsNb)
|
||
|
|
||
|
local glovesNb = r2:getPieceEquipmentNumber(tableEquipment.gloves, selection.HandsModel)
|
||
|
local handsModel = r2:getPieceEquipmentFromNumber(newTableEquipment.gloves, glovesNb)
|
||
|
|
||
|
local armsNb = r2:getPieceEquipmentNumber(tableEquipment.arms_guard, selection.ArmModel)
|
||
|
local armModel = r2:getPieceEquipmentFromNumber(newTableEquipment.arms_guard, armsNb)
|
||
|
|
||
|
local weaponRHNb = r2:getPieceEquipmentNumber(tableEquipment.hands, selection.WeaponRightHand)
|
||
|
local weaponRightHand = r2:getPieceEquipmentFromNumber(newTableEquipment.hands, weaponRHNb, "right")
|
||
|
|
||
|
local weaponLHNb = r2:getPieceEquipmentNumber(tableEquipment.hands, selection.WeaponLeftHand)
|
||
|
local weaponLeftHand = r2:getPieceEquipmentFromNumber(newTableEquipment.hands, weaponLHNb, "left")
|
||
|
|
||
|
local helmetNb = r2:getPieceEquipmentNumber(tableEquipment.helmet, selection.HairType)
|
||
|
|
||
|
r2:setNpcAttribute(selection.InstanceId, "Equipment", typeElement.Equipment)
|
||
|
r2:setNpcAttribute(selection.InstanceId, "JacketModel", jacketModel)
|
||
|
r2:setNpcAttribute(selection.InstanceId, "TrouserModel", trouserModel)
|
||
|
r2:setNpcAttribute(selection.InstanceId, "FeetModel", feetModel)
|
||
|
r2:setNpcAttribute(selection.InstanceId, "HandsModel", handsModel)
|
||
|
r2:setNpcAttribute(selection.InstanceId, "ArmModel", armModel)
|
||
|
r2:setNpcAttribute(selection.InstanceId, "WeaponRightHand", weaponRightHand)
|
||
|
r2:setNpcAttribute(selection.InstanceId, "WeaponLeftHand", weaponLeftHand)
|
||
|
|
||
|
if helmetNb>=0 then
|
||
|
local helmetType = r2:getPieceEquipmentFromNumber(newTableEquipment.helmet, helmetNb)
|
||
|
if helmetType>0 then
|
||
|
r2:setNpcAttribute(selection.InstanceId, "HairType", helmetType)
|
||
|
elseif helmetType==0 then
|
||
|
local itemIndex = getSheetId(r2.sliderValueToItemIndex[r2.raceSelection][0])
|
||
|
r2:setNpcAttribute(selection.InstanceId, "HairType", itemIndex)
|
||
|
--r2:setNpcAttribute(selection.InstanceId, "HairColor", r2.hairType.hairColor)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
else
|
||
|
-- Base
|
||
|
r2:setNpcAttribute(selection.InstanceId, "Base", base)
|
||
|
|
||
|
-- SheetClient
|
||
|
r2:setNpcAttribute(selection.InstanceId, "SheetClient", typeElement.SheetClient)
|
||
|
|
||
|
-- Name
|
||
|
local oldName = i18n.get(r2.sheetTypeCB[oldTypeNPC].Translation):toUtf8()
|
||
|
if selection.Class == "Npc" and string.find(selection.Name, oldName) then
|
||
|
local ucNewName = getUICaller():getText(typeNPC)
|
||
|
local newName = r2:genInstanceName(ucNewName):toUtf8()
|
||
|
r2:setNpcAttribute(selection.InstanceId, "Name", newName)
|
||
|
|
||
|
elseif selection.Name == oldName then
|
||
|
r2:setNpcAttribute(selection.InstanceId, "Name", getUICaller().selection_text)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
r2.requestEndAction()
|
||
|
end
|
||
|
|
||
|
-- UPDATE FUCNTION ----------------------------------------------------------------------------
|
||
|
function r2:updateFunction()
|
||
|
|
||
|
if getUICaller().Env.locked then
|
||
|
return
|
||
|
end
|
||
|
|
||
|
local selection = r2:getSelectedInstance()
|
||
|
assert(selection)
|
||
|
|
||
|
r2.requestNewAction(i18n.get("uiR2EDUpdateNpcFunctionAction"))
|
||
|
r2:setNpcAttribute(selection.InstanceId, "Function", getUICaller().selection_text)
|
||
|
end
|
||
|
|
||
|
-- UPDATE LEVEL ------------------------------------------------------------------------------
|
||
|
r2.updateLevel = function(value)
|
||
|
|
||
|
local selection = r2:getSelectedInstance()
|
||
|
assert(selection)
|
||
|
|
||
|
local level = tonumber(value)+1
|
||
|
local sheet = selection.Sheet
|
||
|
|
||
|
local s,e = string.find(sheet, ".creature")
|
||
|
local firstPart = string.sub(sheet, 1, s-2)
|
||
|
local newSheet = firstPart .. level .. ".creature"
|
||
|
|
||
|
r2.requestNewAction(i18n.get("uiR2EDUpdateNpcLevelAction"))
|
||
|
r2:setNpcAttribute(selection.InstanceId, "Sheet", newSheet)
|
||
|
end
|
||
|
|
||
|
function r2:getHandsLevel(sheetModel, sheet)
|
||
|
|
||
|
local s,e = string.find(sheetModel, "$hands")
|
||
|
local base = string.sub(sheetModel, 1, s-1)
|
||
|
local endSheetModel = string.sub(sheetModel, e+1)
|
||
|
s,e = string.find(endSheetModel, "$level")
|
||
|
local titi = string.sub(endSheetModel, 1, s-1)
|
||
|
|
||
|
s,e = string.find(sheet, base)
|
||
|
local startHands = string.sub(sheet, e+1)
|
||
|
s,e = string.find(startHands, titi)
|
||
|
|
||
|
return string.sub(startHands, 1, s-1)
|
||
|
end
|
||
|
|
||
|
function r2:getLevel(instance)
|
||
|
|
||
|
local sheet = instance.Sheet
|
||
|
local s,e = string.find(sheet, ".creature")
|
||
|
|
||
|
return tonumber(string.sub(sheet, s-1, s-1))-1
|
||
|
end
|
||
|
|
||
|
-----------------------------------------------------------------------------------------------
|
||
|
-- BODY ---------------------------------------------------------------------------------------
|
||
|
-----------------------------------------------------------------------------------------------
|
||
|
|
||
|
-- UPDATE FACE VIEW ---------------------------------------------------------------------------
|
||
|
|
||
|
function r2:updateFaceView()
|
||
|
|
||
|
if r2.faceView then
|
||
|
local npcUI = getUI("ui:interface:r2ed_npc")
|
||
|
assert(npcUI)
|
||
|
local camera = npcUI:find("char3d").cam
|
||
|
assert(camera)
|
||
|
local char3D = npcUI:find("char3d").char
|
||
|
assert(char3D)
|
||
|
local headZ = char3D.headz
|
||
|
camera.tgtz = headZ + 0.07
|
||
|
camera.posy = r2.camZoomPosY
|
||
|
end
|
||
|
end
|
||
|
|
||
|
|
||
|
-- UPDATE BODY ATTRIBUTE ----------------------------------------------------------------------
|
||
|
function r2:changeBodyAttribute(attributeName, requestType)
|
||
|
|
||
|
local value = getUICaller().value
|
||
|
local sliderValue = nil
|
||
|
if attributeName == "HairType" then
|
||
|
r2.hairType.hairCut = value
|
||
|
sliderValue = getSheetId(r2.sliderValueToItemIndex[r2.raceSelection][value])
|
||
|
elseif attributeName == "HairColor" then
|
||
|
r2.hairType.hairColor = value
|
||
|
end
|
||
|
|
||
|
local selection = r2:getSelectedInstance()
|
||
|
if selection == nil then
|
||
|
debugInfo("No selection")
|
||
|
return
|
||
|
end
|
||
|
|
||
|
r2.requestNewAction(i18n.get("uiR2EDChangeNpcBodyAttributeAction"))
|
||
|
|
||
|
if sliderValue == nil then
|
||
|
sliderValue = value
|
||
|
end
|
||
|
|
||
|
if requestType == 'local' then
|
||
|
r2.requestSetLocalNode(selection.InstanceId, attributeName, sliderValue)
|
||
|
elseif requestType == 'commit' then
|
||
|
r2.requestCommitLocalNode(selection.InstanceId, attributeName)
|
||
|
elseif requestType == 'cancel' then
|
||
|
r2.requestRollbackLocalNode(selection.InstanceId, attributeName)
|
||
|
end
|
||
|
|
||
|
r2.requestEndAction()
|
||
|
end
|
||
|
|
||
|
-- UPDATE BODY ATTRIBUTE FROM ON ATTRIBUTE MODIFIED -----------------------------------------------
|
||
|
function r2:updateBodyAttribute(attributeName, value)
|
||
|
|
||
|
local npcUI = getUI("ui:interface:r2ed_npc")
|
||
|
assert(npcUI)
|
||
|
|
||
|
if attributeName == "HairType" then
|
||
|
value = r2.itemIndexToSliderValue[r2.raceSelection][value]
|
||
|
end
|
||
|
|
||
|
local slider = npcUI:find(body_sliders[attributeName]):find("slider")
|
||
|
assert(slider)
|
||
|
slider.value = value
|
||
|
|
||
|
if attributeName == "GabaritHeight" then r2:updateFaceView() end
|
||
|
|
||
|
if not r2:matchWithBodyAttributesSet(attributeName, value) then
|
||
|
local comboBox = npcUI:find(r2.bodyAttributesCB[attributeName].comboBox).combo_box
|
||
|
assert(comboBox)
|
||
|
comboBox.view_text = r2.emptyComboLine
|
||
|
|
||
|
local updateComboBox = "ui:interface:"..r2.bodyAttributesCB[attributeName].updateComboBox
|
||
|
local updateCB = getUI(updateComboBox):find("update_sets").combo_box
|
||
|
assert(updateCB)
|
||
|
updateCB.view_text = r2.emptyComboLine
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function r2:matchWithBodyAttributesSet(attributeName, value)
|
||
|
|
||
|
local npcUI = getUI("ui:interface:r2ed_npc")
|
||
|
assert(npcUI)
|
||
|
|
||
|
local comboBox = npcUI:find(r2.bodyAttributesCB[attributeName].comboBox).combo_box
|
||
|
assert(comboBox)
|
||
|
|
||
|
local tableSets = r2[r2.bodyAttributesCB[attributeName].tableSets]
|
||
|
if tableSets == nil then return false end
|
||
|
|
||
|
local setValues = tableSets[tostring(comboBox.selection_text)]
|
||
|
if setValues == nil then return false end
|
||
|
|
||
|
return (setValues[attributeName] == value)
|
||
|
end
|
||
|
|
||
|
-- RANDOM BODY ------------------------------------------------------------------------------
|
||
|
function r2:randomBody()
|
||
|
|
||
|
local selection = r2:getSelectedInstance()
|
||
|
if selection == nil then
|
||
|
debugInfo("No selection")
|
||
|
return
|
||
|
end
|
||
|
|
||
|
r2.requestNewAction(i18n.get("uiR2EDRandomNpcBodyAction"))
|
||
|
|
||
|
local randomValue
|
||
|
for i = 1,r2.bodyAttNb do
|
||
|
randomValue = math.random(0,14)
|
||
|
r2:setNpcAttribute(selection.InstanceId, r2.bodyAttributes[i], randomValue)
|
||
|
end
|
||
|
|
||
|
r2.requestEndAction()
|
||
|
end
|
||
|
|
||
|
|
||
|
-- RANDOM BODY SETS ---------------------------------------------------------------------------
|
||
|
function r2:randomSets(sets)
|
||
|
|
||
|
local npcUI = getUI("ui:interface:r2ed_npc")
|
||
|
assert(npcUI)
|
||
|
local setsCombo = getUI("ui:interface:r2ed_npc"):find(sets).combo_box
|
||
|
assert(setsCombo)
|
||
|
|
||
|
if setsCombo.selectionNb > 0 then
|
||
|
local randomSelection = math.random(1, setsCombo.selectionNb)
|
||
|
if setsCombo.selectionNb > 1 then
|
||
|
while randomSelection == (setsCombo.selection+1) do
|
||
|
randomSelection = math.random(1, setsCombo.selectionNb)
|
||
|
end
|
||
|
end
|
||
|
setsCombo.selection = randomSelection-1
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- ADD BODY SETS -----------------------------------------------------------------------------
|
||
|
|
||
|
|
||
|
|
||
|
function r2:addBodySets()
|
||
|
|
||
|
local addBodySets = getUI("ui:interface:r2ed_add_body_sets")
|
||
|
assert(addBodySets)
|
||
|
local editText = addBodySets:find("new_sets").edit_box_group
|
||
|
assert(editText)
|
||
|
if editText.input_string~="" then
|
||
|
local updateBodySetsCombo = addBodySets:find("update_sets").combo_box
|
||
|
assert(updateBodySetsCombo)
|
||
|
|
||
|
local npcUI = getUI("ui:interface:r2ed_npc")
|
||
|
assert(npcUI)
|
||
|
local bodySetsCombo = npcUI:find("body_sets").combo_box
|
||
|
assert(bodySetsCombo)
|
||
|
|
||
|
bodySetsCombo:addText(editText.uc_input_string)
|
||
|
updateBodySetsCombo:addText(editText.uc_input_string)
|
||
|
|
||
|
-- add new sets in table
|
||
|
local bodySets = npcUI:find("body_sets_scroll_target")
|
||
|
assert(bodySets)
|
||
|
r2.tableBodySets[editText.input_string] = {}
|
||
|
|
||
|
local sliderValue
|
||
|
for i = 1,r2.bodyAttNb do
|
||
|
sliderValue = bodySets:find(r2.bodySliders[i]):find("slider").value
|
||
|
r2.tableBodySets[editText.input_string][r2.bodyKeys[i]] = sliderValue
|
||
|
end
|
||
|
r2:saveTable("save\\tableBodySets.txt", r2.tableBodySets)
|
||
|
|
||
|
-- update set of main window combo box
|
||
|
bodySetsCombo.selection_text = editText.input_string
|
||
|
updateBodySetsCombo.selection_text = editText.input_string
|
||
|
|
||
|
editText.input_string = ""
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- UPDATE BODY SETS --------------------------------------------------------------------------
|
||
|
function r2:updateBodySets()
|
||
|
|
||
|
local updateBodySetsCombo = getUI("ui:interface:r2ed_add_body_sets"):find("update_sets").combo_box
|
||
|
assert(updateBodySetsCombo)
|
||
|
local bodySetsName = updateBodySetsCombo.selection_text
|
||
|
|
||
|
-- update sets in table
|
||
|
local npcUI = getUI("ui:interface:r2ed_npc")
|
||
|
assert(npcUI)
|
||
|
local bodySets = npcUI:find("body_sets_scroll_target")
|
||
|
assert(bodySets)
|
||
|
|
||
|
local sliderValue
|
||
|
for i = 1,r2.bodyAttNb do
|
||
|
sliderValue = bodySets:find(r2.bodySliders[i]):find("slider").value
|
||
|
r2.tableBodySets[bodySetsName][r2.bodyKeys[i]] = sliderValue
|
||
|
end
|
||
|
r2:saveTable("save\\tableBodySets.txt", r2.tableBodySets)
|
||
|
|
||
|
-- update set of main window combo box
|
||
|
local bodySetsCombo = npcUI:find("body_sets").combo_box
|
||
|
assert(bodySetsCombo)
|
||
|
bodySetsCombo.selection_text = bodySetsName
|
||
|
end
|
||
|
|
||
|
-- REMOVE BODY SETS ---------------------------------------------------------------------------
|
||
|
function r2:removeBodySets()
|
||
|
|
||
|
local updateBodySetsCombo = getUI("ui:interface:r2ed_add_body_sets"):find("update_sets").combo_box
|
||
|
assert(updateBodySetsCombo)
|
||
|
local bodySetsName = updateBodySetsCombo.selection_text
|
||
|
|
||
|
-- delete sets in table
|
||
|
r2.tableBodySets[bodySetsName] = nil
|
||
|
r2:saveTable("save\\tableBodySets.txt", r2.tableBodySets)
|
||
|
|
||
|
-- delete sets in combo box
|
||
|
updateBodySetsCombo:removeSelection(updateBodySetsCombo.selection)
|
||
|
updateBodySetsCombo.view_text = r2.emptyComboLine
|
||
|
|
||
|
local bodySetsCombo = getUI("ui:interface:r2ed_npc"):find("body_sets").combo_box
|
||
|
assert(bodySetsCombo)
|
||
|
bodySetsCombo:removeText(bodySetsName)
|
||
|
bodySetsCombo.view_text = r2.emptyComboLine
|
||
|
end
|
||
|
|
||
|
-- SELECT BODY SETS ---------------------------------------------------------------------------
|
||
|
function r2:selectBodySets()
|
||
|
|
||
|
local bodySetsCombo = getUI("ui:interface:r2ed_npc"):find("body_sets").combo_box
|
||
|
assert(bodySetsCombo)
|
||
|
|
||
|
local selection = r2:getSelectedInstance()
|
||
|
|
||
|
if bodySetsCombo.view_text == r2.emptyComboLine then
|
||
|
return
|
||
|
else
|
||
|
r2.requestNewAction(i18n.get("uiR2EDSelectNpcBodySetsAction"))
|
||
|
|
||
|
local bodySetsValue = r2.tableBodySets[bodySetsCombo.selection_text]
|
||
|
if bodySetsValue == nil then return end
|
||
|
|
||
|
-- update sliders values
|
||
|
for i = 1,r2.bodyAttNb do
|
||
|
r2:setNpcAttribute(selection.InstanceId, r2.bodyAttributes[i], bodySetsValue[r2.bodyKeys[i]])
|
||
|
end
|
||
|
|
||
|
r2.requestEndAction()
|
||
|
end
|
||
|
|
||
|
local bodySetsPopup = getUI("ui:interface:r2ed_add_body_sets"):find("update_sets").combo_box
|
||
|
assert(bodySetsPopup)
|
||
|
bodySetsPopup.selection_text = bodySetsCombo.selection_text
|
||
|
end
|
||
|
|
||
|
|
||
|
----------------------------------------------------------------------------------------------
|
||
|
-- RANDOM FACE ------------------------------------------------------------------------------
|
||
|
function r2:randomFace()
|
||
|
|
||
|
local selection = r2:getSelectedInstance()
|
||
|
if selection == nil then
|
||
|
debugInfo("No selection")
|
||
|
return
|
||
|
end
|
||
|
|
||
|
r2.requestNewAction(i18n.get("uiR2EDRandomNpcFaceAction"))
|
||
|
|
||
|
local randomValue
|
||
|
for i = 1,r2.faceAttNb do
|
||
|
|
||
|
if r2.faceAttributes[i] == "HairColor" then
|
||
|
randomValue = math.random(0,5)
|
||
|
elseif r2.faceAttributes[i] == "Tattoo" then
|
||
|
randomValue = math.random(0,31)
|
||
|
elseif r2.faceAttributes[i] == "HairType" then
|
||
|
randomValue = math.random(0,6)
|
||
|
else
|
||
|
randomValue = math.random(0,7)
|
||
|
end
|
||
|
|
||
|
if r2.faceAttributes[i] == "HairType" then
|
||
|
if not r2.hasHelmet then
|
||
|
local itemIndex = getSheetId(r2.sliderValueToItemIndex[r2.raceSelection][randomValue])
|
||
|
r2:setNpcAttribute(selection.InstanceId, r2.faceAttributes[i], itemIndex)
|
||
|
end
|
||
|
elseif not (r2.faceAttributes[i] == "HairColor" and r2.hasHelmet) then
|
||
|
r2:setNpcAttribute(selection.InstanceId, r2.faceAttributes[i], randomValue)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
r2.requestEndAction()
|
||
|
end
|
||
|
|
||
|
-- ADD FACE SETS -----------------------------------------------------------------------------
|
||
|
|
||
|
function r2:addFaceSets()
|
||
|
|
||
|
local addFaceSets = getUI("ui:interface:r2ed_add_face_sets")
|
||
|
assert(addFaceSets)
|
||
|
local editText = addFaceSets:find("new_sets").edit_box_group
|
||
|
assert(editText)
|
||
|
if editText.input_string~="" then
|
||
|
local updateFaceSetsCombo = addFaceSets:find("update_sets").combo_box
|
||
|
assert(updateFaceSetsCombo)
|
||
|
|
||
|
local npcUI = getUI("ui:interface:r2ed_npc")
|
||
|
assert(npcUI)
|
||
|
local faceSetsCombo = npcUI:find("face_sets").combo_box
|
||
|
assert(faceSetsCombo)
|
||
|
|
||
|
faceSetsCombo:addText(editText.uc_input_string)
|
||
|
updateFaceSetsCombo:addText(editText.uc_input_string)
|
||
|
|
||
|
-- add new sets in table
|
||
|
local faceSets = npcUI:find("face_sets_scroll_target")
|
||
|
assert(faceSets)
|
||
|
r2.tableFaceSets[editText.input_string] = {}
|
||
|
|
||
|
local sliderValue
|
||
|
for i = 1,r2.faceAttNb do
|
||
|
sliderValue = faceSets:find(r2.faceSliders[i]):find("slider").value
|
||
|
r2.tableFaceSets[editText.input_string][r2.faceKeys[i] ] = sliderValue
|
||
|
end
|
||
|
r2:saveTable("save\\tableFaceSets.txt", r2.tableFaceSets)
|
||
|
|
||
|
-- update set of main window combo box
|
||
|
faceSetsCombo.selection_text = editText.input_string
|
||
|
updateFaceSetsCombo.selection_text = editText.input_string
|
||
|
|
||
|
editText.input_string = ""
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- UPDATE FACE SETS --------------------------------------------------------------------------
|
||
|
function r2:updateFaceSets()
|
||
|
|
||
|
local updateFaceSetsCombo = getUI("ui:interface:r2ed_add_face_sets"):find("update_sets").combo_box
|
||
|
assert(updateFaceSetsCombo)
|
||
|
local faceSetsName = updateFaceSetsCombo.selection_text
|
||
|
|
||
|
-- update sets in table
|
||
|
local npcUI = getUI("ui:interface:r2ed_npc")
|
||
|
assert(npcUI)
|
||
|
local faceSets = npcUI:find("face_sets_scroll_target")
|
||
|
assert(faceSets)
|
||
|
|
||
|
local sliderValue
|
||
|
for i = 1,r2.faceAttNb do
|
||
|
sliderValue = faceSets:find(r2.faceSliders[i]):find("slider").value
|
||
|
r2.tableFaceSets[faceSetsName][r2.faceKeys[i] ] = sliderValue
|
||
|
end
|
||
|
r2:saveTable("save\\tableFaceSets.txt", r2.tableFaceSets)
|
||
|
|
||
|
-- update set of main window combo box
|
||
|
local faceSetsCombo = npcUI:find("face_sets").combo_box
|
||
|
assert(faceSetsCombo)
|
||
|
faceSetsCombo.selection_text = faceSetsName
|
||
|
end
|
||
|
|
||
|
-- REMOVE FACE SETS ---------------------------------------------------------------------------
|
||
|
function r2:removeFaceSets()
|
||
|
|
||
|
local updateFaceSetsCombo = getUI("ui:interface:r2ed_add_face_sets"):find("update_sets").combo_box
|
||
|
assert(updateFaceSetsCombo)
|
||
|
local faceSetsName = updateFaceSetsCombo.selection_text
|
||
|
|
||
|
-- delete sets in table
|
||
|
r2.tableFaceSets[faceSetsName] = nil
|
||
|
r2:saveTable("save\\tableFaceSets.txt", r2.tableFaceSets)
|
||
|
|
||
|
-- delete sets in combo box
|
||
|
updateFaceSetsCombo:removeSelection(updateFaceSetsCombo.selection)
|
||
|
|
||
|
local faceSetsCombo = getUI("ui:interface:r2ed_npc"):find("face_sets").combo_box
|
||
|
assert(faceSetsCombo)
|
||
|
faceSetsCombo:removeText(faceSetsName)
|
||
|
faceSetsCombo.view_text = r2.emptyComboLine
|
||
|
end
|
||
|
|
||
|
-- SELECT FACE SETS ---------------------------------------------------------------------------
|
||
|
function r2:selectFaceSets()
|
||
|
|
||
|
local faceSetsCombo = getUI("ui:interface:r2ed_npc"):find("face_sets").combo_box
|
||
|
assert(faceSetsCombo)
|
||
|
|
||
|
local selection = r2:getSelectedInstance()
|
||
|
|
||
|
if faceSetsCombo.view_text == r2.emptyComboLine then
|
||
|
return
|
||
|
else
|
||
|
r2.requestNewAction(i18n.get("uiR2EDSelectNpcFaceSetsAction"))
|
||
|
|
||
|
local faceSetsValue = r2.tableFaceSets[faceSetsCombo.selection_text]
|
||
|
if faceSetsValue == nil then return end
|
||
|
|
||
|
-- update sliders values
|
||
|
for i = 1,r2.faceAttNb do
|
||
|
local requestSetNode = true
|
||
|
local requestValue = faceSetsValue[r2.faceKeys[i] ]
|
||
|
|
||
|
if r2.faceAttributes[i] == "HairType" then
|
||
|
if not r2.hasHelmet then
|
||
|
requestValue = getSheetId(r2.sliderValueToItemIndex[r2.raceSelection][faceSetsValue[r2.faceKeys[i]]])
|
||
|
else
|
||
|
r2.hairType.hairCut = faceSetsValue[r2.faceKeys[i] ]
|
||
|
requestSetNode = false
|
||
|
end
|
||
|
elseif r2.faceAttributes[i] == "HairColor" and r2.hasHelmet then
|
||
|
r2.hairType.hairColor = faceSetsValue[r2.faceKeys[i] ]
|
||
|
requestSetNode = false
|
||
|
end
|
||
|
|
||
|
if requestSetNode then
|
||
|
r2:setNpcAttribute(selection.InstanceId, r2.faceAttributes[i], requestValue)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
r2.requestEndAction()
|
||
|
end
|
||
|
|
||
|
local faceSetsPopup = getUI("ui:interface:r2ed_add_face_sets"):find("update_sets").combo_box
|
||
|
assert(faceSetsPopup)
|
||
|
faceSetsPopup.selection_text = faceSetsCombo.selection_text
|
||
|
end
|
||
|
|
||
|
----------------------------------------------------------------------------------------------
|
||
|
-- RANDOM FACE MORPH -------------------------------------------------------------------------
|
||
|
function r2:randomFaceMorph()
|
||
|
|
||
|
local selection = r2:getSelectedInstance()
|
||
|
if selection == nil then
|
||
|
debugInfo("No selection")
|
||
|
return
|
||
|
end
|
||
|
|
||
|
r2.requestNewAction(i18n.get("uiR2EDRandomNPCFaceMorphAction"))
|
||
|
|
||
|
local randomValue
|
||
|
for i = 1,r2.morphAttNb do
|
||
|
|
||
|
randomValue = math.random(0,7)
|
||
|
r2:setNpcAttribute(selection.InstanceId, r2.morphAttributes[i], randomValue)
|
||
|
end
|
||
|
|
||
|
r2.requestEndAction()
|
||
|
end
|
||
|
|
||
|
-- ADD FACE MORPH ---------------------------------------------------------------------------
|
||
|
|
||
|
function r2:addFaceMorph()
|
||
|
|
||
|
local addFaceMorph = getUI("ui:interface:r2ed_add_face_morph")
|
||
|
assert(addFaceMorph)
|
||
|
local editText = addFaceMorph:find("new_sets").edit_box_group
|
||
|
assert(editText)
|
||
|
if editText.input_string~="" then
|
||
|
local updateFaceMorphCombo = addFaceMorph:find("update_sets").combo_box
|
||
|
assert(updateFaceMorphCombo)
|
||
|
|
||
|
local npcUI = getUI("ui:interface:r2ed_npc")
|
||
|
assert(npcUI)
|
||
|
local faceMorphCombo = npcUI:find("face_morph").combo_box
|
||
|
assert(faceMorphCombo)
|
||
|
|
||
|
faceMorphCombo:addText(editText.uc_input_string)
|
||
|
updateFaceMorphCombo:addText(editText.uc_input_string)
|
||
|
|
||
|
-- add new sets in table
|
||
|
local faceMorph = npcUI:find("face_morph_scroll_target")
|
||
|
assert(faceMorph)
|
||
|
r2.tableFaceMorph[editText.input_string] = {}
|
||
|
|
||
|
local sliderValue
|
||
|
for i = 1,r2.morphAttNb do
|
||
|
sliderValue = faceMorph:find(r2.morphSliders[i]):find("slider").value
|
||
|
r2.tableFaceMorph[editText.input_string][r2.morphKeys[i] ] = sliderValue
|
||
|
end
|
||
|
r2:saveTable("save\\tableFaceMorph.txt", r2.tableFaceMorph)
|
||
|
|
||
|
-- update set of main window combo box
|
||
|
faceMorphCombo.selection_text = editText.input_string
|
||
|
updateFaceMorphCombo.selection_text = editText.input_string
|
||
|
|
||
|
editText.input_string = ""
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- UPDATE FACE MORPH ------------------------------------------------------------------------
|
||
|
function r2:updateFaceMorph()
|
||
|
|
||
|
local updateFaceMorphCombo = getUI("ui:interface:r2ed_add_face_morph"):find("update_sets").combo_box
|
||
|
assert(updateFaceMorphCombo)
|
||
|
local faceMorphName = updateFaceMorphCombo.selection_text
|
||
|
|
||
|
-- update sets in table
|
||
|
local npcUI = getUI("ui:interface:r2ed_npc")
|
||
|
assert(npcUI)
|
||
|
local faceMorph = npcUI:find("face_morph_scroll_target")
|
||
|
assert(faceMorph)
|
||
|
|
||
|
local sliderValue
|
||
|
for i = 1,r2.morphAttNb do
|
||
|
sliderValue = faceMorph:find(r2.morphSliders[i]):find("slider").value
|
||
|
r2.tableFaceMorph[faceMorphName][r2.morphKeys[i] ] = sliderValue
|
||
|
end
|
||
|
r2:saveTable("save\\tableFaceMorph.txt", r2.tableFaceMorph)
|
||
|
|
||
|
-- update set of main window combo box
|
||
|
local faceMorphCombo = npcUI:find("face_morph").combo_box
|
||
|
assert(faceMorphCombo)
|
||
|
faceMorphCombo.selection_text = faceMorphName
|
||
|
end
|
||
|
|
||
|
-- REMOVE FACE MORPH ---------------------------------------------------------------------------
|
||
|
function r2:removeFaceMorph()
|
||
|
|
||
|
local updateFaceMorphCombo = getUI("ui:interface:r2ed_add_face_morph"):find("update_sets").combo_box
|
||
|
assert(updateFaceMorphCombo)
|
||
|
local faceMorphName = updateFaceMorphCombo.selection_text
|
||
|
|
||
|
-- delete sets in table
|
||
|
r2.tableFaceMorph[faceMorphName] = nil
|
||
|
r2:saveTable("save\\tableFaceMorph.txt", r2.tableFaceMorph)
|
||
|
|
||
|
-- delete sets in combo box
|
||
|
updateFaceMorphCombo:removeSelection(updateFaceMorphCombo.selection)
|
||
|
updateFaceMorphCombo.view_text = r2.emptyComboLine
|
||
|
|
||
|
local faceMorphCombo = getUI("ui:interface:r2ed_npc"):find("face_morph").combo_box
|
||
|
assert(faceMorphCombo)
|
||
|
faceMorphCombo:removeText(faceMorphName)
|
||
|
faceMorphCombo.view_text = r2.emptyComboLine
|
||
|
end
|
||
|
|
||
|
-- SELECT FACE MORPH ---------------------------------------------------------------------------
|
||
|
function r2:selectMorphSets()
|
||
|
|
||
|
local faceMorphCombo = getUI("ui:interface:r2ed_npc"):find("face_morph").combo_box
|
||
|
assert(faceMorphCombo)
|
||
|
|
||
|
local selection = r2:getSelectedInstance()
|
||
|
|
||
|
if faceMorphCombo.view_text == r2.emptyComboLine then
|
||
|
return
|
||
|
else
|
||
|
r2.requestNewAction(i18n.get("uiR2EDSelectNPCMorphSetsAction"))
|
||
|
|
||
|
local faceMorphValue = r2.tableFaceMorph[faceMorphCombo.selection_text]
|
||
|
if faceMorphValue == nil then return end
|
||
|
|
||
|
-- update sliders values
|
||
|
for i = 1,r2.morphAttNb do
|
||
|
r2:setNpcAttribute(selection.InstanceId, r2.morphAttributes[i], faceMorphValue[r2.morphKeys[i]])
|
||
|
end
|
||
|
|
||
|
r2.requestEndAction()
|
||
|
end
|
||
|
|
||
|
local faceMorphPopup = getUI("ui:interface:r2ed_add_face_morph"):find("update_sets").combo_box
|
||
|
assert(faceMorphPopup)
|
||
|
faceMorphPopup.selection_text = faceMorphCombo.selection_text
|
||
|
end
|
||
|
|
||
|
|
||
|
-- CLOSE MODAL SETS WINDOW ----------------------------------------------------------------------
|
||
|
|
||
|
function r2:closeModalBodySets()
|
||
|
r2:closeModal("ui:interface:r2ed_add_body_sets")
|
||
|
end
|
||
|
|
||
|
function r2:closeModalFaceSets()
|
||
|
r2:closeModal("ui:interface:r2ed_add_face_sets")
|
||
|
end
|
||
|
|
||
|
function r2:closeModalFaceMorph()
|
||
|
r2:closeModal("ui:interface:r2ed_add_face_morph")
|
||
|
end
|
||
|
|
||
|
function r2:closeModal(window)
|
||
|
|
||
|
local modalWindow = getUI(window)
|
||
|
assert(modalWindow)
|
||
|
|
||
|
local editText = modalWindow:find("new_sets").edit_box_group
|
||
|
assert(editText)
|
||
|
editText.input_string = ""
|
||
|
|
||
|
modalWindow.active = false
|
||
|
end
|
||
|
|
||
|
|
||
|
-----------------------------------------------------------------------------------------------
|
||
|
-- GROUP --------------------------------------------------------------------------------------
|
||
|
-----------------------------------------------------------------------------------------------
|
||
|
|
||
|
r2.profile = {Civil="normal", Bandit="bandit", Guard = "guard"}
|
||
|
r2.profileCB = {normal="Civil", bandit="Bandit", guard="Guard"}
|
||
|
|
||
|
-- UPDATE PROFILE -----------------------------------------------------------------------------
|
||
|
function r2:updateProfile()
|
||
|
|
||
|
if getUICaller().Env.locked then
|
||
|
return
|
||
|
end
|
||
|
|
||
|
local selection = r2:getSelectedInstance()
|
||
|
assert(selection)
|
||
|
|
||
|
r2.requestNewAction(i18n.get("uiR2EDUpdateNPCProfileAction"))
|
||
|
r2:setNpcAttribute(selection.InstanceId, "Profile", r2.profile[getUICaller().selection_text])
|
||
|
end
|
||
|
|
||
|
-----------------------------------------------------------------------------------------------
|
||
|
-- EQUIPMENT ----------------------------------------------------------------------------------
|
||
|
-----------------------------------------------------------------------------------------------
|
||
|
|
||
|
r2.equipmentPalette = {}
|
||
|
r2.itemIndexEquipmentToSelectionText = {}
|
||
|
r2.equipmentEnv = {}
|
||
|
r2.noPiece = i18n.get("uiR2EdNoPiece"):toUtf8()
|
||
|
|
||
|
r2.equipmentAttNb = 6
|
||
|
|
||
|
r2.colorAttributes = {[1] = "JacketColor", [2] = "TrouserColor",
|
||
|
[3] = "FeetColor", [4] = "HandsColor",
|
||
|
[5] = "ArmColor"}
|
||
|
|
||
|
r2.equipementComboB = {[1] = "chest_plate", [2] = "legs",
|
||
|
[3] = "boots", [4] = "gloves",
|
||
|
[5] = "arms_guard", [6] = "helmet",
|
||
|
}
|
||
|
|
||
|
r2.equipmentKeys = r2.equipementComboB
|
||
|
|
||
|
r2.equipmentSets = {}
|
||
|
|
||
|
r2.linkColorB = false
|
||
|
r2.linkedColor = 0
|
||
|
|
||
|
function r2:initEquipmentEnv()
|
||
|
|
||
|
local npcUI = getUI("ui:interface:r2ed_npc")
|
||
|
assert(npcUI)
|
||
|
|
||
|
local nameComboBox = "helmet"
|
||
|
local comboBox = npcUI:find(nameComboBox).label_combo_box.combo_box
|
||
|
local slider = npcUI:find(nameComboBox):find("slider")
|
||
|
comboBox.Env.nameComboBox = nameComboBox
|
||
|
slider.name = nameComboBox
|
||
|
r2.equipmentEnv[nameComboBox] = {propName = "HairType", propColorName = "HairColor"}
|
||
|
|
||
|
nameComboBox = "chest_plate"
|
||
|
comboBox = npcUI:find(nameComboBox).label_combo_box.combo_box
|
||
|
slider = npcUI:find(nameComboBox):find("slider")
|
||
|
comboBox.Env.nameComboBox = nameComboBox
|
||
|
slider.name = nameComboBox
|
||
|
r2.equipmentEnv[nameComboBox] = {propName = "JacketModel", propColorName = "JacketColor"}
|
||
|
|
||
|
nameComboBox = "legs"
|
||
|
comboBox = npcUI:find(nameComboBox).label_combo_box.combo_box
|
||
|
slider = npcUI:find(nameComboBox):find("slider")
|
||
|
comboBox.Env.nameComboBox = nameComboBox
|
||
|
slider.name = nameComboBox
|
||
|
r2.equipmentEnv[nameComboBox] = {propName = "TrouserModel", propColorName = "TrouserColor"}
|
||
|
|
||
|
nameComboBox = "boots"
|
||
|
comboBox = npcUI:find(nameComboBox).label_combo_box.combo_box
|
||
|
slider = npcUI:find(nameComboBox):find("slider")
|
||
|
comboBox.Env.nameComboBox = nameComboBox
|
||
|
slider.name = nameComboBox
|
||
|
r2.equipmentEnv[nameComboBox] = {propName = "FeetModel", propColorName = "FeetColor"}
|
||
|
|
||
|
nameComboBox = "gloves"
|
||
|
comboBox = npcUI:find(nameComboBox).label_combo_box.combo_box
|
||
|
slider = npcUI:find(nameComboBox):find("slider")
|
||
|
comboBox.Env.nameComboBox = nameComboBox
|
||
|
slider.name = nameComboBox
|
||
|
r2.equipmentEnv[nameComboBox] = {propName = "HandsModel", propColorName = "HandsColor"}
|
||
|
|
||
|
nameComboBox = "arms_guard"
|
||
|
comboBox = npcUI:find(nameComboBox).label_combo_box.combo_box
|
||
|
slider = npcUI:find(nameComboBox):find("slider")
|
||
|
comboBox.Env.nameComboBox = nameComboBox
|
||
|
slider.name= nameComboBox
|
||
|
r2.equipmentEnv[nameComboBox] = {propName = "ArmModel", propColorName = "ArmColor"}
|
||
|
|
||
|
nameComboBox = "hands"
|
||
|
comboBox = npcUI:find(nameComboBox).combo_box
|
||
|
comboBox.Env.nameComboBox = nameComboBox
|
||
|
|
||
|
for equId, equTable in pairs(r2.equipmentPalette) do
|
||
|
r2.itemIndexEquipmentToSelectionText[equId] = {}
|
||
|
for comboName, comboList in pairs(equTable) do
|
||
|
r2.itemIndexEquipmentToSelectionText[equId][comboName] = {}
|
||
|
if tostring(comboName) ~= "hands" then
|
||
|
for k, v in pairs(comboList) do
|
||
|
local itemIndex = getSheetId(v.itemFile)
|
||
|
r2.itemIndexEquipmentToSelectionText[equId][comboName][itemIndex] = v.trad
|
||
|
end
|
||
|
else
|
||
|
for k, v in pairs(comboList) do
|
||
|
local rightHandIndex = getSheetId(v.rightHand)
|
||
|
local leftHandIndex = getSheetId(v.leftHand)
|
||
|
local handsLevel = v.handsLevel
|
||
|
local handsKey = rightHandIndex..":"..leftHandIndex..":"..handsLevel
|
||
|
r2.itemIndexEquipmentToSelectionText[equId][comboName][handsKey] = v.trad
|
||
|
|
||
|
end
|
||
|
end
|
||
|
r2.itemIndexEquipmentToSelectionText[equId][comboName][0] = r2.noPiece
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-----------------------------------------------------------------------------------------------
|
||
|
|
||
|
function r2.addR2PlayerEquipment(paletteElt, equipmentTable)
|
||
|
|
||
|
local tempTable = {}
|
||
|
|
||
|
for equType, v in pairs(equipmentTable) do
|
||
|
|
||
|
tempTable[equType] = {}
|
||
|
for equName, equFile in pairs(v) do
|
||
|
local tradEquName = i18n.get(equName):toUtf8()
|
||
|
if tostring(equType) ~= "hands" then
|
||
|
if equName == "uiR2EDequipment_none" then
|
||
|
table.insert(tempTable[equType], 1, {["trad"]=tradEquName, ["itemFile"]=equFile})
|
||
|
else
|
||
|
table.insert(tempTable[equType], {["trad"]=tradEquName, ["itemFile"]=equFile})
|
||
|
end
|
||
|
else
|
||
|
local s, e = string.find(equFile, ":")
|
||
|
if s==nil or e==nil then
|
||
|
debugInfo("Palette problem with equipment : "..paletteElt.Equipment)
|
||
|
end
|
||
|
local rightHand = string.sub(equFile, 1, e-1)
|
||
|
|
||
|
equFile = string.sub(equFile, e+1)
|
||
|
s, e = string.find(equFile, ":")
|
||
|
if s==nil or e==nil then
|
||
|
debugInfo("Palette probleme with equipment : "..paletteElt.Equipment)
|
||
|
end
|
||
|
local leftHand = string.sub(equFile, 1, e-1)
|
||
|
|
||
|
equFile = string.sub(equFile, e+1)
|
||
|
local handsLevel = equFile
|
||
|
table.insert(tempTable[equType], {
|
||
|
["trad"]=tradEquName,
|
||
|
["rightHand"]=rightHand,
|
||
|
["leftHand"]=leftHand,
|
||
|
["handsLevel"]=handsLevel
|
||
|
})
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
r2.equipmentPalette[paletteElt.Equipment] = tempTable
|
||
|
end
|
||
|
|
||
|
-----------------------------------------------------------------------------------------------
|
||
|
|
||
|
function r2:updateEquipment(instance, init)
|
||
|
|
||
|
local equipmentId = instance.Equipment
|
||
|
|
||
|
local npcUI = getUI("ui:interface:r2ed_npc")
|
||
|
assert(npcUI)
|
||
|
|
||
|
local comboBox
|
||
|
|
||
|
-- update current equipment
|
||
|
if r2.equipmentPalette[equipmentId] then
|
||
|
|
||
|
for k, v in pairs(r2.equipmentPalette[equipmentId]) do
|
||
|
comboBox = npcUI:find(k):find("combo_box")
|
||
|
assert(comboBox)
|
||
|
|
||
|
comboBox:resetTexts()
|
||
|
|
||
|
for k1, v1 in pairs(v) do
|
||
|
comboBox:addText(ucstring(v1.trad))
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if init then r2.hasHelmet = false end
|
||
|
end
|
||
|
|
||
|
-- update equipment sets
|
||
|
comboBox = npcUI:find("equipment_sets").combo_box
|
||
|
assert(comboBox)
|
||
|
|
||
|
local comboBoxPopup = getUI("ui:interface:r2ed_add_equipment_set"):find("update_sets").combo_box
|
||
|
assert(comboBoxPopup)
|
||
|
|
||
|
comboBox:resetTexts()
|
||
|
comboBoxPopup:resetTexts()
|
||
|
|
||
|
if r2.equipmentSets[equipmentId] then
|
||
|
for k1, v1 in pairs(r2.equipmentSets[equipmentId]) do
|
||
|
comboBox:addText(ucstring(k1))
|
||
|
comboBoxPopup:addText(ucstring(k1))
|
||
|
end
|
||
|
end
|
||
|
comboBox.view_text = r2.emptyComboLine
|
||
|
comboBoxPopup.view_text = r2.emptyComboLine
|
||
|
|
||
|
local toggleB = npcUI:find("color_link").toggle_butt
|
||
|
assert(toggleB)
|
||
|
toggleB.pushed = true
|
||
|
r2:linkColor()
|
||
|
|
||
|
-- update selection texts
|
||
|
local comboBox, slider
|
||
|
local helmetB = true
|
||
|
for k, v in pairs(r2.equipmentEnv) do
|
||
|
comboBox = npcUI:find(k):find("combo_box")
|
||
|
assert(comboBox)
|
||
|
slider = npcUI:find(k):find("slider")
|
||
|
local line = npcUI:find(k):find("line_slider")
|
||
|
|
||
|
local CBText = r2.itemIndexEquipmentToSelectionText[instance.Equipment][comboBox.Env.nameComboBox][instance[v.propName] ]
|
||
|
if CBText==nil then CBText=r2.noPiece end
|
||
|
comboBox.Env.locked = true
|
||
|
comboBox.selection_text = CBText
|
||
|
comboBox.Env.locked = false
|
||
|
|
||
|
line.active = (CBText~=r2.noPiece)
|
||
|
slider.active = (CBText~=r2.noPiece)
|
||
|
if slider.active then
|
||
|
slider.value = instance[v.propColorName]
|
||
|
end
|
||
|
|
||
|
if v.propName == "HairType" then
|
||
|
slider = npcUI:find("slider_haircut")
|
||
|
assert(slider)
|
||
|
slider.active = (CBText == r2.noPiece)
|
||
|
if slider.active then
|
||
|
local value = r2.itemIndexToSliderValue[r2.raceSelection][instance.HairType]
|
||
|
if value then
|
||
|
slider:find("slider").value = value
|
||
|
end
|
||
|
end
|
||
|
|
||
|
slider = npcUI:find("slider_hair_color")
|
||
|
assert(slider)
|
||
|
slider.active = (CBText == r2.noPiece)
|
||
|
if slider.active then
|
||
|
slider:find("slider").value = instance.HairColor
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-----------------------------------------------------------------------------------------------
|
||
|
|
||
|
function r2:updatePieceEquipment()
|
||
|
|
||
|
if not r2.selectEquipmentSet then
|
||
|
r2.requestNewAction(i18n.get("uiR2EDUpdateEquipmentPieceAction"))
|
||
|
end
|
||
|
|
||
|
local selection = r2:getSelectedInstance()
|
||
|
if selection == nil then
|
||
|
debugInfo("No selection")
|
||
|
return
|
||
|
end
|
||
|
|
||
|
local npcUI = getUI("ui:interface:r2ed_npc")
|
||
|
assert(npcUI)
|
||
|
|
||
|
local equipmentType = getUICaller().selection_text
|
||
|
local nameComboBox = getUICaller().Env.nameComboBox
|
||
|
local itemIndex
|
||
|
|
||
|
if equipmentType == r2.noPiece then
|
||
|
if r2.equipmentEnv[nameComboBox].propName == "HairType" then
|
||
|
local sliderHair = npcUI:find("slider_haircut")
|
||
|
assert(sliderHair)
|
||
|
local sliderHairColor = npcUI:find("slider_hair_color")
|
||
|
assert(sliderHairColor)
|
||
|
|
||
|
if not getUICaller().Env.locked and r2.hasHelmet then
|
||
|
|
||
|
itemIndex = getSheetId(r2.sliderValueToItemIndex[r2.raceSelection][r2.hairType.hairCut])
|
||
|
r2:setNpcAttribute(selection.InstanceId, r2.equipmentEnv[nameComboBox].propName, itemIndex)
|
||
|
r2:setNpcAttribute(selection.InstanceId, r2.equipmentEnv[nameComboBox].propColorName, r2.hairType.hairColor)
|
||
|
end
|
||
|
|
||
|
else
|
||
|
if not getUICaller().Env.locked then
|
||
|
r2:setNpcAttribute(selection.InstanceId, r2.equipmentEnv[nameComboBox].propName, 0)
|
||
|
end
|
||
|
end
|
||
|
else
|
||
|
if r2.equipmentEnv[nameComboBox].propName == "HairType" then
|
||
|
local sliderHair = npcUI:find("slider_haircut")
|
||
|
assert(sliderHair)
|
||
|
local sliderHairColor = npcUI:find("slider_hair_color")
|
||
|
assert(sliderHairColor)
|
||
|
end
|
||
|
local itemFile = ""
|
||
|
for k, v in pairs(r2.equipmentPalette[selection.Equipment][nameComboBox]) do
|
||
|
if v.trad == equipmentType then itemFile = v.itemFile break end
|
||
|
end
|
||
|
|
||
|
itemIndex = getSheetId(itemFile)
|
||
|
if not getUICaller().Env.locked then
|
||
|
r2:setNpcAttribute(selection.InstanceId, r2.equipmentEnv[nameComboBox].propName, itemIndex)
|
||
|
end
|
||
|
|
||
|
if r2.linkColorB then
|
||
|
r2:updateColor(npcUI:find(nameComboBox):find("slider"))
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if not r2.saveEquipmentSet and not r2:matchWithEquipmentSet(nameComboBox, equipmentType) then
|
||
|
local updateEquSetCombo = getUI("ui:interface:r2ed_add_equipment_set"):find("update_sets").combo_box
|
||
|
assert(updateEquSetCombo)
|
||
|
updateEquSetCombo.view_text = r2.emptyComboLine
|
||
|
|
||
|
local equSetCombo = npcUI:find("equipment_sets").combo_box
|
||
|
assert(equSetCombo)
|
||
|
equSetCombo.view_text = r2.emptyComboLine
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function r2:matchWithEquipmentSet(nameComboBox, equipmentType)
|
||
|
|
||
|
local npcUI = getUI("ui:interface:r2ed_npc")
|
||
|
assert(npcUI)
|
||
|
|
||
|
local equSetCombo = npcUI:find("equipment_sets").combo_box
|
||
|
assert(equSetCombo)
|
||
|
|
||
|
local setName = equSetCombo.selection_text
|
||
|
if setName==r2.emptyComboLine then return false end
|
||
|
|
||
|
local selection = r2:getSelectedInstance()
|
||
|
|
||
|
if r2.equipmentSets[selection.Equipment] == nil then return false end
|
||
|
local equSetsValue = r2.equipmentSets[selection.Equipment][setName]
|
||
|
if equSetsValue == nil then return false end
|
||
|
|
||
|
return (equSetsValue[nameComboBox].comboSelection == equipmentType)
|
||
|
end
|
||
|
|
||
|
function r2:updateWeapons()
|
||
|
|
||
|
local selection = r2:getSelectedInstance()
|
||
|
local hands = getUICaller()
|
||
|
if hands.Env.locked == true then return end
|
||
|
|
||
|
r2.requestNewAction(i18n.get("uiR2EDUpdateNPCWeaponsAction"))
|
||
|
|
||
|
local equipmentType = hands.selection_text
|
||
|
|
||
|
local handsTable
|
||
|
for k, v in pairs(r2.equipmentPalette[selection.Equipment][hands.Env.nameComboBox]) do
|
||
|
if v.trad == equipmentType then handsTable = v break end
|
||
|
end
|
||
|
assert(handsTable)
|
||
|
|
||
|
local rightHandFile = handsTable.rightHand
|
||
|
local rightHandIndex = getSheetId(rightHandFile)
|
||
|
local leftHandFile = handsTable.leftHand
|
||
|
local leftHandIndex = getSheetId(leftHandFile)
|
||
|
local handsLevel = handsTable.handsLevel
|
||
|
|
||
|
local sheet = selection.Sheet
|
||
|
local s, e = string.find(sheet, ".creature")
|
||
|
local level = string.sub(sheet, s-1, s-1)
|
||
|
|
||
|
local newSheet = selection.SheetModel
|
||
|
|
||
|
newSheet = string.gsub(newSheet, "$hands", handsLevel)
|
||
|
newSheet = string.gsub(newSheet, "$level", level)
|
||
|
|
||
|
r2:setNpcAttribute(selection.InstanceId, "WeaponRightHand", rightHandIndex)
|
||
|
r2:setNpcAttribute(selection.InstanceId, "WeaponLeftHand", leftHandIndex)
|
||
|
r2:setNpcAttribute(selection.InstanceId, "Sheet", newSheet)
|
||
|
|
||
|
r2.requestEndAction()
|
||
|
end
|
||
|
|
||
|
-----------------------------------------------------------------------------------------------
|
||
|
|
||
|
function r2:closeModalEquipment()
|
||
|
r2:closeModal("ui:interface:r2ed_add_equipment_set")
|
||
|
end
|
||
|
|
||
|
-----------------------------------------------------------------------------------------------
|
||
|
|
||
|
function r2:addEquipmentSet()
|
||
|
|
||
|
local selection = r2:getSelectedInstance()
|
||
|
assert(selection)
|
||
|
|
||
|
local addEquSet = getUI("ui:interface:r2ed_add_equipment_set")
|
||
|
assert(addEquSet)
|
||
|
local editText = addEquSet:find("new_sets").edit_box_group
|
||
|
assert(editText)
|
||
|
if editText.input_string~="" then
|
||
|
local updateEquSetCombo = addEquSet:find("update_sets").combo_box
|
||
|
assert(updateEquSetCombo)
|
||
|
|
||
|
local npcUI = getUI("ui:interface:r2ed_npc")
|
||
|
assert(npcUI)
|
||
|
local equSetCombo = npcUI:find("equipment_sets").combo_box
|
||
|
assert(equSetCombo)
|
||
|
|
||
|
updateEquSetCombo:addText(editText.uc_input_string)
|
||
|
equSetCombo:addText(editText.uc_input_string)
|
||
|
|
||
|
if r2.equipmentSets[selection.Equipment] == nil then
|
||
|
r2.equipmentSets[selection.Equipment] = {}
|
||
|
end
|
||
|
r2.equipmentSets[selection.Equipment][editText.input_string] = {}
|
||
|
|
||
|
for i=1, r2.equipmentAttNb do
|
||
|
local comboBox = npcUI:find(r2.equipementComboB[i]):find("combo_box")
|
||
|
local slider = npcUI:find(r2.equipementComboB[i]):find("slider")
|
||
|
|
||
|
r2.equipmentSets[selection.Equipment][editText.input_string][r2.equipmentKeys[i] ] = {
|
||
|
comboSelection = comboBox.selection_text, color = slider.value}
|
||
|
end
|
||
|
|
||
|
r2:saveTable("save\\equipmentSets.txt", r2.equipmentSets)
|
||
|
|
||
|
equSetCombo.selection_text = editText.input_string
|
||
|
|
||
|
editText.input_string=""
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- SELECT EQUIPMENT SETS ---------------------------------------------------------------------------
|
||
|
|
||
|
r2.saveEquipmentSet = false
|
||
|
|
||
|
function r2:selectEquipmentSets()
|
||
|
|
||
|
r2.selectEquipmentSet = true
|
||
|
|
||
|
local npcUI = getUI("ui:interface:r2ed_npc")
|
||
|
assert(npcUI)
|
||
|
|
||
|
local equSetCombo = npcUI:find("equipment_sets").combo_box
|
||
|
assert(equSetCombo)
|
||
|
|
||
|
local selection = r2:getSelectedInstance()
|
||
|
|
||
|
if equSetCombo.view_text == r2.emptyComboLine then
|
||
|
return
|
||
|
else
|
||
|
if r2.equipmentSets[selection.Equipment] == nil then return end
|
||
|
local equSetsValue = r2.equipmentSets[selection.Equipment][equSetCombo.selection_text]
|
||
|
if equSetsValue == nil then return end
|
||
|
|
||
|
r2.requestNewAction(i18n.get("uiR2EDSelectNPCEquipmentSetsAction"))
|
||
|
r2.saveEquipmentSet = true
|
||
|
|
||
|
-- update comboBoxes and sliders values
|
||
|
for i = 1,r2.equipmentAttNb do
|
||
|
|
||
|
local comboItemText = equSetsValue[r2.equipementComboB[i]].comboSelection
|
||
|
local colorPiece = equSetsValue[r2.equipementComboB[i]].color
|
||
|
|
||
|
local comboBox = npcUI:find(r2.equipementComboB[i]).label_combo_box.combo_box
|
||
|
assert(comboBox)
|
||
|
|
||
|
if comboItemText == r2.noPiece then
|
||
|
local propName = r2.equipmentEnv[r2.equipementComboB[i]].propName
|
||
|
if not (propName == "HairType" and not r2.hasHelmet) then
|
||
|
|
||
|
comboBox.selection_text = r2.noPiece
|
||
|
|
||
|
if r2.equipmentEnv[r2.equipementComboB[i] ].propColorName ~= "HairColor" then
|
||
|
r2:setNpcAttribute(selection.InstanceId, r2.equipmentEnv[r2.equipementComboB[i]].propColorName, 0)
|
||
|
npcUI:find(r2.equipementComboB[i]):find("slider").value = 0
|
||
|
end
|
||
|
end
|
||
|
else
|
||
|
comboBox.selection_text = equSetsValue[r2.equipmentKeys[i]].comboSelection
|
||
|
|
||
|
r2:setNpcAttribute(selection.InstanceId, r2.equipmentEnv[r2.equipementComboB[i]].propColorName, colorPiece)
|
||
|
npcUI:find(r2.equipementComboB[i]):find("slider").value = colorPiece
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local updateEquSetsCombo = getUI("ui:interface:r2ed_add_equipment_set"):find("update_sets").combo_box
|
||
|
assert(updateEquSetsCombo)
|
||
|
|
||
|
updateEquSetsCombo.selection_text = equSetCombo.selection_text
|
||
|
|
||
|
r2.saveEquipmentSet = false
|
||
|
r2.requestEndAction(i18n.get("uiR2EDSelectNPCEquipmentSetsAction"))
|
||
|
end
|
||
|
|
||
|
r2.selectEquipmentSet = false
|
||
|
end
|
||
|
|
||
|
-----------------------------------------------------------------------------------------------
|
||
|
|
||
|
function r2:updateEquipmentSet()
|
||
|
|
||
|
if r2.saveEquipmentSet then return end
|
||
|
|
||
|
local selection = r2:getSelectedInstance()
|
||
|
|
||
|
local updateEquSetsCombo = getUI("ui:interface:r2ed_add_equipment_set"):find("update_sets").combo_box
|
||
|
assert(updateEquSetsCombo)
|
||
|
local equSetsName = updateEquSetsCombo.selection_text
|
||
|
|
||
|
-- update sets in table
|
||
|
local npcUI = getUI("ui:interface:r2ed_npc")
|
||
|
assert(npcUI)
|
||
|
|
||
|
local comboBSelection, slider
|
||
|
for i = 1,r2.equipmentAttNb do
|
||
|
comboBSelection = npcUI:find(r2.equipementComboB[i]):find("combo_box").selection_text
|
||
|
r2.equipmentSets[selection.Equipment][equSetsName][r2.equipementComboB[i] ].comboSelection = comboBSelection
|
||
|
slider = npcUI:find(r2.equipementComboB[i]):find("slider")
|
||
|
|
||
|
r2.equipmentSets[selection.Equipment][equSetsName][r2.equipementComboB[i] ].color = slider.value
|
||
|
end
|
||
|
|
||
|
r2:saveTable("save\\equipmentSets.txt", r2.equipmentSets)
|
||
|
|
||
|
local equSetCombo = npcUI:find("equipment_sets").combo_box
|
||
|
assert(equSetCombo)
|
||
|
equSetCombo.selection_text = updateEquSetsCombo.selection_text
|
||
|
end
|
||
|
|
||
|
-----------------------------------------------------------------------------------------------
|
||
|
|
||
|
function r2:removeEquipment()
|
||
|
|
||
|
local selection = r2:getSelectedInstance()
|
||
|
|
||
|
local updateEquSetsCombo = getUI("ui:interface:r2ed_add_equipment_set"):find("update_sets").combo_box
|
||
|
assert(updateEquSetsCombo)
|
||
|
local equSetsName = updateEquSetsCombo.selection_text
|
||
|
|
||
|
-- delete sets in table
|
||
|
r2.equipmentSets[selection.Equipment][equSetsName] = nil
|
||
|
r2:saveTable("save\\equipmentSets.txt", r2.equipmentSets)
|
||
|
|
||
|
-- delete sets in combo box
|
||
|
updateEquSetsCombo:removeSelection(updateEquSetsCombo.selection)
|
||
|
|
||
|
local equSetsCombo = getUI("ui:interface:r2ed_npc"):find("equipment_sets").combo_box
|
||
|
assert(equSetsCombo)
|
||
|
equSetsCombo:removeText(equSetsName)
|
||
|
equSetsCombo.view_text = r2.emptyComboLine
|
||
|
|
||
|
updateEquSetsCombo.view_text = r2.emptyComboLine
|
||
|
end
|
||
|
|
||
|
-----------------------------------------------------------------------------------------------
|
||
|
|
||
|
function r2:randomEquipment()
|
||
|
r2.requestNewAction(i18n.get("uiR2EDRandomNpcEquipmentAction"))
|
||
|
r2.selectEquipmentSet = true
|
||
|
|
||
|
local npcUI = getUI("ui:interface:r2ed_npc")
|
||
|
assert(npcUI)
|
||
|
|
||
|
for i=1, r2.equipmentAttNb do -- no right or left hand
|
||
|
local comboBox = npcUI:find(r2.equipementComboB[i]):find("combo_box")
|
||
|
if comboBox.selectionNb > 0 then
|
||
|
comboBox.selection = math.random(1, comboBox.selectionNb) - 1
|
||
|
end
|
||
|
end
|
||
|
|
||
|
r2.selectEquipmentSet = false
|
||
|
r2.requestEndAction()
|
||
|
end
|
||
|
|
||
|
-----------------------------------------------------------------------------------------------
|
||
|
|
||
|
function r2:randomColor()
|
||
|
|
||
|
local npcUI = getUI("ui:interface:r2ed_npc")
|
||
|
assert(npcUI)
|
||
|
|
||
|
local levelDesignEnabled = getClientCfgVar("LevelDesignEnabled")
|
||
|
local maxVal = 5
|
||
|
if tonumber(levelDesignEnabled)==1 then maxVal = 7 end
|
||
|
|
||
|
if r2.linkColorB then
|
||
|
local randomColor = math.random(0, maxVal)
|
||
|
while r2.linkedColor == randomColor do
|
||
|
randomColor = math.random(0, maxVal)
|
||
|
end
|
||
|
r2.linkedColor = randomColor
|
||
|
end
|
||
|
|
||
|
for i=1, r2.equipmentAttNb do -- no right or left hand
|
||
|
local slider = npcUI:find(r2.equipementComboB[i]):find("slider")
|
||
|
|
||
|
if not r2.linkColorB then
|
||
|
slider.value = math.random(0, maxVal)
|
||
|
end
|
||
|
end
|
||
|
r2:updateLinkColor()
|
||
|
end
|
||
|
|
||
|
---------RANDOM ALL NPC PROPERTIES -------------------------------------------------------------
|
||
|
|
||
|
function r2:randomNPCSex(sheetClient)
|
||
|
|
||
|
local race
|
||
|
local s = string.find(sheetClient, "fyros")
|
||
|
if s ~= nil then race = "Fyros" end
|
||
|
|
||
|
s = string.find(sheetClient, "matis")
|
||
|
if s ~= nil then race = "Matis" end
|
||
|
|
||
|
s = string.find(sheetClient, "tryker")
|
||
|
if s ~= nil then race = "Tryker" end
|
||
|
|
||
|
s = string.find(sheetClient, "zorai")
|
||
|
if s ~= nil then race = "Zorai" end
|
||
|
|
||
|
local sex = (math.random(0,10)>5)
|
||
|
if sex == true then
|
||
|
sex = r2.male
|
||
|
else
|
||
|
sex = r2.female
|
||
|
end
|
||
|
|
||
|
return r2.raceSheetClient[sex][race]
|
||
|
end
|
||
|
|
||
|
function r2:randomNPCProperties(equipmentId, race)
|
||
|
|
||
|
local result = {}
|
||
|
|
||
|
-- random body
|
||
|
result["GabaritHeight"] = math.random(0,14)
|
||
|
result["GabaritTorsoWidth"] = math.random(0,14)
|
||
|
result["GabaritArmsWidth"] = math.random(0,14)
|
||
|
result["GabaritLegsWidth"] = math.random(0,14)
|
||
|
result["GabaritBreastSize"] = math.random(0,14)
|
||
|
|
||
|
-- random face
|
||
|
result["HairColor"] = math.random(0,5)
|
||
|
result["Tattoo"] = math.random(0,31)
|
||
|
result["HairType"] = getSheetId(r2.sliderValueToItemIndex[race][math.random(0,6)])
|
||
|
result["EyesColor"] = math.random(0,7)
|
||
|
|
||
|
-- random face morph
|
||
|
result["MorphTarget1"] = math.random(0,7)
|
||
|
result["MorphTarget2"] = math.random(0,7)
|
||
|
result["MorphTarget3"] = math.random(0,7)
|
||
|
result["MorphTarget4"] = math.random(0,7)
|
||
|
result["MorphTarget5"] = math.random(0,7)
|
||
|
result["MorphTarget6"] = math.random(0,7)
|
||
|
result["MorphTarget7"] = math.random(0,7)
|
||
|
result["MorphTarget8"] = math.random(0,7)
|
||
|
|
||
|
-- random equipment
|
||
|
r2:randomNPCEquipment(equipmentId, result)
|
||
|
|
||
|
return result
|
||
|
end
|
||
|
|
||
|
function r2:randomNPCEquipment(equipmentId, result)
|
||
|
|
||
|
if result == nil then
|
||
|
result = {}
|
||
|
end
|
||
|
|
||
|
local tableEquipment = r2.equipmentPalette[equipmentId]
|
||
|
assert(tableEquipment)
|
||
|
local hasHelmet = false
|
||
|
local size = 0
|
||
|
local hasNudeOption = false
|
||
|
for k, v in pairs(tableEquipment.helmet) do
|
||
|
size = size+1
|
||
|
if k == r2.noPiece then
|
||
|
hasNudeOption = true
|
||
|
end
|
||
|
end
|
||
|
if size > 0 and (not hasNudeOption or (math.random(0,10) > 5)) then
|
||
|
local helmetType = r2:randomPieceEquipment(tableEquipment.helmet, false)
|
||
|
if helmetType ~= 0 then
|
||
|
result["HairType"] = helmetType
|
||
|
hasHelmet = true
|
||
|
end
|
||
|
end
|
||
|
result["JacketModel"] = r2:randomPieceEquipment(tableEquipment.chest_plate, false)
|
||
|
result["TrouserModel"] = r2:randomPieceEquipment(tableEquipment.legs, false)
|
||
|
result["FeetModel"] = r2:randomPieceEquipment(tableEquipment.boots, false)
|
||
|
result["HandsModel"] = r2:randomPieceEquipment(tableEquipment.gloves, false)
|
||
|
result["ArmModel"] = r2:randomPieceEquipment(tableEquipment.arms_guard, false)
|
||
|
|
||
|
local weaponRH, weaponLH = r2:randomPieceEquipment(tableEquipment.hands, true)
|
||
|
result["WeaponRightHand"] = weaponRH
|
||
|
result["WeaponLeftHand"] = weaponLH
|
||
|
|
||
|
-- random equipment color
|
||
|
local levelDesignEnabled = getClientCfgVar("LevelDesignEnabled")
|
||
|
local maxVal = 5
|
||
|
if tonumber(levelDesignEnabled)==1 then maxVal = 7 end
|
||
|
result["JacketColor"] = math.random(0, maxVal)
|
||
|
result["ArmColor"] = math.random(0, maxVal)
|
||
|
result["HandsColor"] = math.random(0, maxVal)
|
||
|
result["TrouserColor"] = math.random(0, maxVal)
|
||
|
result["FeetColor"] = math.random(0, maxVal)
|
||
|
if hasHelmet then
|
||
|
result["HairColor"] = math.random(0,maxVal)
|
||
|
end
|
||
|
|
||
|
return result
|
||
|
end
|
||
|
|
||
|
-- Same as randomNPCName but can return 2 times the same name
|
||
|
function r2:randomNPCName2(race, sex)
|
||
|
local allNames = r2:getAllNames()
|
||
|
local tableNames = allNames[race .."_" .. sex]
|
||
|
if not tableNames or table.getn(tableNames) == 0 then return "" end
|
||
|
local indexName = math.random(1, table.getn(tableNames))
|
||
|
return tableNames[indexName]
|
||
|
end
|
||
|
|
||
|
function r2:randomNPCName(race, sex)
|
||
|
|
||
|
-- random name
|
||
|
local tableNames = r2.NPCNames[race .."_" .. sex]
|
||
|
|
||
|
local name = ""
|
||
|
if table.getn(tableNames) == 0 then
|
||
|
r2:loadRaceSexNames(race, sex)
|
||
|
tableNames = r2.NPCNames[race .."_" .. sex]
|
||
|
end
|
||
|
|
||
|
if table.getn(tableNames) > 0 then
|
||
|
local indexName = math.random(1, table.getn(tableNames))
|
||
|
name = tableNames[indexName]
|
||
|
tableNames[indexName] = tableNames[table.getn(tableNames)]
|
||
|
tableNames[table.getn(tableNames)] = nil
|
||
|
end
|
||
|
|
||
|
return name
|
||
|
end
|
||
|
|
||
|
function r2:isRandomizedNPCName(name, race, sex)
|
||
|
|
||
|
local tableNames = r2:loadRaceSexNamesImpl(race, sex)
|
||
|
|
||
|
for k, vName in pairs(tableNames) do
|
||
|
if vName==name then return true end
|
||
|
end
|
||
|
|
||
|
return false
|
||
|
end
|
||
|
|
||
|
function r2:searchSheet(equipmentId, weaponRH, weaponLH, sheet, sheetModel)
|
||
|
|
||
|
local tableEquipment = r2.equipmentPalette[equipmentId]
|
||
|
assert(tableEquipment)
|
||
|
|
||
|
local hands = tableEquipment.hands
|
||
|
|
||
|
for k, v in pairs(hands) do
|
||
|
local rightHand = v.rightHand
|
||
|
local leftHand = v.leftHand
|
||
|
if weaponRH==getSheetId(rightHand) and weaponLH==getSheetId(leftHand) then
|
||
|
local handsLevel = v.handsLevel
|
||
|
|
||
|
local s, e = string.find(sheet, ".creature")
|
||
|
local level = string.sub(sheet, s-1, s-1)
|
||
|
|
||
|
local newSheet = sheetModel
|
||
|
newSheet = string.gsub(newSheet, "$hands", handsLevel)
|
||
|
newSheet = string.gsub(newSheet, "$level", level)
|
||
|
return newSheet
|
||
|
end
|
||
|
end
|
||
|
|
||
|
return ""
|
||
|
end
|
||
|
|
||
|
|
||
|
-- Return a random NPC (Warning names can be duplicates)
|
||
|
function r2:randomNPC(base)
|
||
|
assert(base)
|
||
|
|
||
|
local npc = r2.newComponent("NpcCustom")
|
||
|
|
||
|
npc.Base = base
|
||
|
|
||
|
-- random equipment and random sex
|
||
|
local sheetClient = r2.getPropertyValue(npc, "SheetClient")
|
||
|
|
||
|
local sexSheetClient = r2:randomNPCSex(sheetClient)
|
||
|
npc.SheetClient = sexSheetClient
|
||
|
|
||
|
local raceSelection = getR2PlayerRace(npc.SheetClient)
|
||
|
local sexSelection = nil
|
||
|
if isR2PlayerMale(npc.SheetClient) then
|
||
|
sexSelection = r2.male
|
||
|
else
|
||
|
sexSelection = r2.female
|
||
|
end
|
||
|
|
||
|
local equipment = r2.getPropertyValue(npc, "Equipment")
|
||
|
|
||
|
local results = r2:randomNPCProperties(equipment, raceSelection)
|
||
|
local k,v = next(results, nil)
|
||
|
while v do
|
||
|
npc[k] = v
|
||
|
k,v = next(results, k)
|
||
|
end
|
||
|
npc.Name = r2:randomNPCName2(raceSelection, sexSelection)
|
||
|
|
||
|
return npc
|
||
|
end
|
||
|
|
||
|
function r2:randomPieceEquipment(pieces, isHands)
|
||
|
|
||
|
local keyPlace = 1
|
||
|
assert(pieces ~= nil)
|
||
|
local size = 0
|
||
|
-- why table.getn(pieces) doesn't work???
|
||
|
for k, v in pairs(pieces) do
|
||
|
size = size + 1
|
||
|
end
|
||
|
|
||
|
if size > 1 then
|
||
|
keyPlace = math.random(1,size)
|
||
|
end
|
||
|
|
||
|
local key, itemFileName
|
||
|
local count = 1
|
||
|
for k, v in pairs(pieces) do
|
||
|
if count == keyPlace then
|
||
|
key = k
|
||
|
tempTable = v
|
||
|
break
|
||
|
end
|
||
|
count = count + 1
|
||
|
end
|
||
|
if key == r2.noPiece or tempTable == nil then
|
||
|
return 0
|
||
|
elseif isHands==true then
|
||
|
local rightHand = getSheetId(tempTable.rightHand)
|
||
|
local leftHand = getSheetId(tempTable.leftHand)
|
||
|
return rightHand, leftHand
|
||
|
else
|
||
|
return getSheetId(tempTable.itemFile)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function r2:getPieceEquipmentNumber(pieces, piece)
|
||
|
|
||
|
|
||
|
local pieceNb = 0
|
||
|
for k, v in pairs(pieces) do
|
||
|
|
||
|
if v.rightHand and v.leftHand then
|
||
|
|
||
|
if getSheetId(v.rightHand) == piece then
|
||
|
return pieceNb
|
||
|
elseif getSheetId(v.leftHand) == piece then
|
||
|
return pieceNb
|
||
|
end
|
||
|
|
||
|
elseif getSheetId(v.itemFile) == piece then
|
||
|
return pieceNb
|
||
|
end
|
||
|
pieceNb = pieceNb + 1
|
||
|
end
|
||
|
|
||
|
return -1
|
||
|
end
|
||
|
|
||
|
function r2:getPieceEquipmentFromNumber(pieces, number, handSide)
|
||
|
|
||
|
|
||
|
local pieceNb = 0
|
||
|
for k, v in pairs(pieces) do
|
||
|
|
||
|
if pieceNb == number then
|
||
|
if v.rightHand and v.leftHand then
|
||
|
if handSide == "right" then
|
||
|
return getSheetId(v.rightHand)
|
||
|
elseif handSide == "left" then
|
||
|
return getSheetId(v.leftHand)
|
||
|
end
|
||
|
else
|
||
|
return getSheetId(v.itemFile)
|
||
|
end
|
||
|
end
|
||
|
pieceNb = pieceNb + 1
|
||
|
end
|
||
|
|
||
|
return -1
|
||
|
end
|
||
|
|
||
|
-----------------------------------------------------------------------------------------------
|
||
|
|
||
|
function r2:updatePieceEquipmentColor(requestType)
|
||
|
|
||
|
if not r2.linkColorB then
|
||
|
r2:updateColor(getUICaller(), requestType)
|
||
|
else
|
||
|
local npcUI = getUI("ui:interface:r2ed_npc")
|
||
|
assert(npcUI)
|
||
|
|
||
|
r2.linkedColor = getUICaller().value
|
||
|
r2:updateLinkColor(requestType)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-----------------------------------------------------------------------------------------------
|
||
|
r2.updateLinkColors = false
|
||
|
function r2:updateLinkColor(requestType)
|
||
|
|
||
|
local npcUI = getUI("ui:interface:r2ed_npc")
|
||
|
assert(npcUI)
|
||
|
|
||
|
if not r2.linkColorAction then
|
||
|
r2.requestNewAction(i18n.get("uiR2EDUpdateLinkedNPCColorAction"))
|
||
|
end
|
||
|
|
||
|
r2.updateLinkColors = true
|
||
|
|
||
|
for i=1, r2.equipmentAttNb do
|
||
|
r2:updateColor(npcUI:find(r2.equipementComboB[i]):find("slider"), requestType)
|
||
|
end
|
||
|
|
||
|
r2.updateLinkColors = false
|
||
|
|
||
|
if not r2.linkColorAction then
|
||
|
r2.requestEndAction()
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function r2:updateColor(slider, requestType)
|
||
|
|
||
|
local selection = r2:getSelectedInstance()
|
||
|
if selection == nil then
|
||
|
debugInfo("No selection")
|
||
|
return
|
||
|
end
|
||
|
|
||
|
if not r2.updateLinkColors then
|
||
|
r2.requestNewAction(i18n.get("uiR2EDUpdateNPCColorAction"))
|
||
|
end
|
||
|
|
||
|
local npcUI = getUI("ui:interface:r2ed_npc")
|
||
|
assert(npcUI)
|
||
|
|
||
|
local nameComboBox = slider.name
|
||
|
local equipmentType = npcUI:find(nameComboBox):find("combo_box").selection_text
|
||
|
|
||
|
if equipmentType == r2.noPiece then
|
||
|
slider.value = 0
|
||
|
else
|
||
|
if r2.linkColorB then
|
||
|
slider.value = r2.linkedColor
|
||
|
end
|
||
|
|
||
|
local propColor = r2.equipmentEnv[nameComboBox].propColorName
|
||
|
if requestType == nil then
|
||
|
r2:setNpcAttribute(selection.InstanceId, propColor, slider.value)
|
||
|
elseif requestType == 'local' then
|
||
|
r2.requestSetLocalNode(selection.InstanceId, propColor, slider.value)
|
||
|
elseif requestType == 'commit' then
|
||
|
r2.requestCommitLocalNode(selection.InstanceId, propColor)
|
||
|
elseif requestType == 'cancel' then
|
||
|
r2.requestRollbackLocalNode(selection.InstanceId, propColor)
|
||
|
else
|
||
|
debugInfo("r2:updateColor : unknown request type")
|
||
|
end
|
||
|
end
|
||
|
r2.requestEndAction()
|
||
|
end
|
||
|
|
||
|
-----------------------------------------------------------------------------------------------
|
||
|
r2.linkColorAction=false
|
||
|
function r2:linkColor()
|
||
|
|
||
|
local npcUI = getUI("ui:interface:r2ed_npc")
|
||
|
assert(npcUI)
|
||
|
local toggleB = npcUI:find("color_link").toggle_butt
|
||
|
assert(toggleB)
|
||
|
r2.linkColorB = not toggleB.pushed
|
||
|
|
||
|
-- update LinkColor property
|
||
|
local selection = r2:getSelectedInstance()
|
||
|
if selection == nil then return end
|
||
|
|
||
|
r2.linkColorAction = true
|
||
|
r2.requestNewAction(i18n.get("uiR2EDLinkColorEquipment"))
|
||
|
local link = 0
|
||
|
if r2.linkColorB then link=1 end
|
||
|
r2:setNpcAttribute(selection.InstanceId, "LinkColor", link)
|
||
|
|
||
|
-- update colors
|
||
|
if not r2.linkColorB then
|
||
|
r2.linkedColor = 0
|
||
|
else
|
||
|
local colors = {}
|
||
|
local slider
|
||
|
|
||
|
for i=r2.equipmentAttNb, 1, -1 do -- no right or left hand
|
||
|
|
||
|
slider = npcUI:find(r2.equipementComboB[i]):find("slider")
|
||
|
|
||
|
local nameComboBox = slider.name
|
||
|
local equipmentType = npcUI:find(nameComboBox):find("combo_box").selection_text
|
||
|
|
||
|
if equipmentType ~= r2.noPiece then
|
||
|
local value = slider.value
|
||
|
if colors[value] == nil then colors[value] = 0 end
|
||
|
colors[value] = colors[value] + 1
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local colorMax = -1
|
||
|
local colorMaxCount = 0
|
||
|
|
||
|
for k, v in pairs(colors) do
|
||
|
if v > colorMaxCount then
|
||
|
colorMaxCount = v
|
||
|
colorMax = k
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if colorMax~=-1 then
|
||
|
if colorMaxCount==1 then colorMax = slider.value end
|
||
|
|
||
|
r2.linkedColor = colorMax
|
||
|
|
||
|
r2:updateLinkColor()
|
||
|
end
|
||
|
end
|
||
|
|
||
|
r2.requestEndAction()
|
||
|
r2.linkColorAction = false
|
||
|
end
|
||
|
|
||
|
---------PREVIEW -----------------------------------------------------------------------------
|
||
|
|
||
|
function r2:preview()
|
||
|
|
||
|
local npcUI = getUI("ui:interface:r2ed_npc")
|
||
|
assert(npcUI)
|
||
|
|
||
|
local npcView = npcUI:find("npc_view")
|
||
|
assert(npcView)
|
||
|
|
||
|
local sep = npcUI:find("v_sep")
|
||
|
assert(sep)
|
||
|
|
||
|
if npcView.active then
|
||
|
npcUI.pop_min_w = npcUI.pop_min_w - 300
|
||
|
npcUI.pop_max_w = npcUI.pop_max_w - 300
|
||
|
npcUI.x = npcUI.x + 300
|
||
|
else
|
||
|
npcUI.pop_min_w = npcUI.pop_min_w + 300
|
||
|
npcUI.pop_max_w = npcUI.pop_max_w + 300
|
||
|
npcUI.x = npcUI.x - 300
|
||
|
end
|
||
|
|
||
|
npcView.active = not npcView.active
|
||
|
sep.active = not sep.active
|
||
|
end
|
||
|
|
||
|
function r2:isNPCPlant(sheetClient)
|
||
|
return string.match(sheetClient, "cp[%w_]*%.creature")
|
||
|
end
|
||
|
|
||
|
|
||
|
|