@@ -283,13 +283,69 @@ namespace
283283 }
284284 return sol::optional<std::string_view>(rec.mResultScript );
285285 });
286+ recordInfoBindingsClass[" conditions" ]
287+ = sol::readonly_property ([lua = lua.lua_state ()](const ESM::DialInfo& rec) -> sol::object {
288+ if (rec.mData .mType == ESM::Dialogue::Type::Journal)
289+ return sol::nil;
290+ sol::table res (lua, sol::create);
291+ for (const ESM::DialogueCondition& condition : rec.mSelects )
292+ res.add (&condition);
293+ return res;
294+ });
295+ }
296+
297+ void prepareBindingsForDialogueConditions (sol::state_view& lua)
298+ {
299+ auto conditionBindingsClass = lua.new_usertype <ESM::DialogueCondition>(" ESM3_Dialogue_Info_Condition" );
300+ conditionBindingsClass[" type" ] = sol::readonly_property (
301+ [](const ESM::DialogueCondition& condition) -> int { return condition.mFunction ; });
302+ conditionBindingsClass[" operator" ] = sol::readonly_property (
303+ [](const ESM::DialogueCondition& condition) -> int { return condition.mComparison ; });
304+ conditionBindingsClass[" value" ] = sol::readonly_property ([](const ESM::DialogueCondition& condition) -> double {
305+ return std::visit ([](auto value) -> double { return value; }, condition.mValue );
306+ });
307+ conditionBindingsClass[" recordId" ]
308+ = sol::readonly_property ([](const ESM::DialogueCondition& condition) -> ESM::RefId {
309+ switch (condition.mFunction )
310+ {
311+ case ESM::DialogueCondition::Function::Function_Journal:
312+ case ESM::DialogueCondition::Function::Function_Item:
313+ case ESM::DialogueCondition::Function::Function_Dead:
314+ case ESM::DialogueCondition::Function::Function_NotId:
315+ case ESM::DialogueCondition::Function::Function_NotFaction:
316+ case ESM::DialogueCondition::Function::Function_NotClass:
317+ case ESM::DialogueCondition::Function::Function_NotRace:
318+ return ESM::StringRefId (condition.mVariable );
319+ default :
320+ return {};
321+ }
322+ });
323+ conditionBindingsClass[" variableName" ]
324+ = sol::readonly_property ([](const ESM::DialogueCondition& condition) -> std::optional<std::string> {
325+ switch (condition.mFunction )
326+ {
327+ case ESM::DialogueCondition::Function::Function_Global:
328+ case ESM::DialogueCondition::Function::Function_Local:
329+ case ESM::DialogueCondition::Function::Function_NotLocal:
330+ return Misc::StringUtils::lowerCase (condition.mVariable );
331+ default :
332+ return {};
333+ }
334+ });
335+ conditionBindingsClass[" cellName" ]
336+ = sol::readonly_property ([](const ESM::DialogueCondition& condition) -> std::optional<std::string_view> {
337+ if (condition.mFunction == ESM::DialogueCondition::Function::Function_NotCell)
338+ return condition.mVariable ;
339+ return {};
340+ });
286341 }
287342
288343 void prepareBindingsForDialogueRecords (sol::state_view& lua)
289344 {
290345 prepareBindingsForDialogueRecord (lua);
291346 prepareBindingsForDialogueRecordInfoList (lua);
292347 prepareBindingsForDialogueRecordInfoListElement (lua);
348+ prepareBindingsForDialogueConditions (lua);
293349 }
294350}
295351
@@ -311,6 +367,10 @@ namespace sol
311367 struct is_automagical <ESM::DialInfo> : std::false_type
312368 {
313369 };
370+ template <>
371+ struct is_automagical <ESM::DialogueCondition> : std::false_type
372+ {
373+ };
314374}
315375
316376namespace MWLua
@@ -338,6 +398,96 @@ namespace MWLua
338398
339399 prepareBindingsForDialogueRecords (lua);
340400
401+ api[" CONDITION_OPERATOR" ] = LuaUtil::makeStrictReadOnly (
402+ lua.create_table_with (" Equal" , ESM::DialogueCondition::Comparison::Comp_Eq, " NotEqual" ,
403+ ESM::DialogueCondition::Comparison::Comp_Ne, " Greater" , ESM::DialogueCondition::Comparison::Comp_Gt,
404+ " GreaterEqual" , ESM::DialogueCondition::Comparison::Comp_Ge, " Less" ,
405+ ESM::DialogueCondition::Comparison::Comp_Ls, " LessEqual" , ESM::DialogueCondition::Comparison::Comp_Le));
406+ api[" CONDITION_TYPE" ] = LuaUtil::makeStrictReadOnly (lua.create_table_with (" FacReactionLowest" ,
407+ ESM::DialogueCondition::Function::Function_FacReactionLowest, " FacReactionHighest" ,
408+ ESM::DialogueCondition::Function::Function_FacReactionHighest, " RankRequirement" ,
409+ ESM::DialogueCondition::Function::Function_RankRequirement, " Reputation" ,
410+ ESM::DialogueCondition::Function::Function_Reputation, " HealthPercent" ,
411+ ESM::DialogueCondition::Function::Function_Health_Percent, " PcReputation" ,
412+ ESM::DialogueCondition::Function::Function_PcReputation, " PcLevel" ,
413+ ESM::DialogueCondition::Function::Function_PcLevel, " PcHealthPercent" ,
414+ ESM::DialogueCondition::Function::Function_PcHealthPercent, " PcMagicka" ,
415+ ESM::DialogueCondition::Function::Function_PcMagicka, " PcFatigue" ,
416+ ESM::DialogueCondition::Function::Function_PcFatigue, " PcStrength" ,
417+ ESM::DialogueCondition::Function::Function_PcStrength, " PcBlock" ,
418+ ESM::DialogueCondition::Function::Function_PcBlock, " PcArmorer" ,
419+ ESM::DialogueCondition::Function::Function_PcArmorer, " PcMediumArmor" ,
420+ ESM::DialogueCondition::Function::Function_PcMediumArmor, " PcHeavyArmor" ,
421+ ESM::DialogueCondition::Function::Function_PcHeavyArmor, " PcBluntWeapon" ,
422+ ESM::DialogueCondition::Function::Function_PcBluntWeapon, " PcLongBlade" ,
423+ ESM::DialogueCondition::Function::Function_PcLongBlade, " PcAxe" ,
424+ ESM::DialogueCondition::Function::Function_PcAxe, " PcSpear" ,
425+ ESM::DialogueCondition::Function::Function_PcSpear, " PcAthletics" ,
426+ ESM::DialogueCondition::Function::Function_PcAthletics, " PcEnchant" ,
427+ ESM::DialogueCondition::Function::Function_PcEnchant, " PcDestruction" ,
428+ ESM::DialogueCondition::Function::Function_PcDestruction, " PcAlteration" ,
429+ ESM::DialogueCondition::Function::Function_PcAlteration, " PcIllusion" ,
430+ ESM::DialogueCondition::Function::Function_PcIllusion, " PcConjuration" ,
431+ ESM::DialogueCondition::Function::Function_PcConjuration, " PcMysticism" ,
432+ ESM::DialogueCondition::Function::Function_PcMysticism, " PcRestoration" ,
433+ ESM::DialogueCondition::Function::Function_PcRestoration, " PcAlchemy" ,
434+ ESM::DialogueCondition::Function::Function_PcAlchemy, " PcUnarmored" ,
435+ ESM::DialogueCondition::Function::Function_PcUnarmored, " PcSecurity" ,
436+ ESM::DialogueCondition::Function::Function_PcSecurity, " PcSneak" ,
437+ ESM::DialogueCondition::Function::Function_PcSneak, " PcAcrobatics" ,
438+ ESM::DialogueCondition::Function::Function_PcAcrobatics, " PcLightArmor" ,
439+ ESM::DialogueCondition::Function::Function_PcLightArmor, " PcShortBlade" ,
440+ ESM::DialogueCondition::Function::Function_PcShortBlade, " PcMarksman" ,
441+ ESM::DialogueCondition::Function::Function_PcMarksman, " PcMercantile" ,
442+ ESM::DialogueCondition::Function::Function_PcMercantile, " PcSpeechcraft" ,
443+ ESM::DialogueCondition::Function::Function_PcSpeechcraft, " PcHandToHand" ,
444+ ESM::DialogueCondition::Function::Function_PcHandToHand, " PcGender" ,
445+ ESM::DialogueCondition::Function::Function_PcGender, " PcExpelled" ,
446+ ESM::DialogueCondition::Function::Function_PcExpelled, " PcCommonDisease" ,
447+ ESM::DialogueCondition::Function::Function_PcCommonDisease, " PcBlightDisease" ,
448+ ESM::DialogueCondition::Function::Function_PcBlightDisease, " PcClothingModifier" ,
449+ ESM::DialogueCondition::Function::Function_PcClothingModifier, " PcCrimeLevel" ,
450+ ESM::DialogueCondition::Function::Function_PcCrimeLevel, " SameGender" ,
451+ ESM::DialogueCondition::Function::Function_SameSex, " SameRace" ,
452+ ESM::DialogueCondition::Function::Function_SameRace, " SameFaction" ,
453+ ESM::DialogueCondition::Function::Function_SameFaction, " FactionRankDifference" ,
454+ ESM::DialogueCondition::Function::Function_FactionRankDifference, " Detected" ,
455+ ESM::DialogueCondition::Function::Function_Detected, " Alarmed" ,
456+ ESM::DialogueCondition::Function::Function_Alarmed, " Choice" ,
457+ ESM::DialogueCondition::Function::Function_Choice, " PcIntelligence" ,
458+ ESM::DialogueCondition::Function::Function_PcIntelligence, " PcWillpower" ,
459+ ESM::DialogueCondition::Function::Function_PcWillpower, " PcAgility" ,
460+ ESM::DialogueCondition::Function::Function_PcAgility, " PcSpeed" ,
461+ ESM::DialogueCondition::Function::Function_PcSpeed, " PcEndurance" ,
462+ ESM::DialogueCondition::Function::Function_PcEndurance, " PcPersonality" ,
463+ ESM::DialogueCondition::Function::Function_PcPersonality, " PcLuck" ,
464+ ESM::DialogueCondition::Function::Function_PcLuck, " PcCorprus" ,
465+ ESM::DialogueCondition::Function::Function_PcCorprus, " Weather" ,
466+ ESM::DialogueCondition::Function::Function_Weather, " PcVampire" ,
467+ ESM::DialogueCondition::Function::Function_PcVampire, " Level" ,
468+ ESM::DialogueCondition::Function::Function_Level, " Attacked" ,
469+ ESM::DialogueCondition::Function::Function_Attacked, " TalkedToPc" ,
470+ ESM::DialogueCondition::Function::Function_TalkedToPc, " PcHealth" ,
471+ ESM::DialogueCondition::Function::Function_PcHealth, " CreatureTarget" ,
472+ ESM::DialogueCondition::Function::Function_CreatureTarget, " FriendHit" ,
473+ ESM::DialogueCondition::Function::Function_FriendHit, " Fight" ,
474+ ESM::DialogueCondition::Function::Function_Fight, " Hello" , ESM::DialogueCondition::Function::Function_Hello,
475+ " Alarm" , ESM::DialogueCondition::Function::Function_Alarm, " Flee" ,
476+ ESM::DialogueCondition::Function::Function_Flee, " ShouldAttack" ,
477+ ESM::DialogueCondition::Function::Function_ShouldAttack, " Werewolf" ,
478+ ESM::DialogueCondition::Function::Function_Werewolf, " PcWerewolfKills" ,
479+ ESM::DialogueCondition::Function::Function_PcWerewolfKills, " Global" ,
480+ ESM::DialogueCondition::Function::Function_Global, " Local" ,
481+ ESM::DialogueCondition::Function::Function_Local, " Journal" ,
482+ ESM::DialogueCondition::Function::Function_Journal, " Item" , ESM::DialogueCondition::Function::Function_Item,
483+ " Dead" , ESM::DialogueCondition::Function::Function_Dead, " NotId" ,
484+ ESM::DialogueCondition::Function::Function_NotId, " NotFaction" ,
485+ ESM::DialogueCondition::Function::Function_NotFaction, " NotClass" ,
486+ ESM::DialogueCondition::Function::Function_NotClass, " NotRace" ,
487+ ESM::DialogueCondition::Function::Function_NotRace, " NotCell" ,
488+ ESM::DialogueCondition::Function::Function_NotCell, " NotLocal" ,
489+ ESM::DialogueCondition::Function::Function_NotLocal));
490+
341491 return LuaUtil::makeReadOnly (api);
342492 }
343493}
0 commit comments