Skip to content

Commit 7ca6fbb

Browse files
committed
Merge branch 'dialoguefilters' into 'master'
Expose info conditions to Lua Closes #8076 See merge request OpenMW/openmw!5045
2 parents bca843f + 8f2d38d commit 7ca6fbb

File tree

7 files changed

+275
-8
lines changed

7 files changed

+275
-8
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ message(STATUS "Configuring OpenMW...")
8282
set(OPENMW_VERSION_MAJOR 0)
8383
set(OPENMW_VERSION_MINOR 51)
8484
set(OPENMW_VERSION_RELEASE 0)
85-
set(OPENMW_LUA_API_REVISION 109)
85+
set(OPENMW_LUA_API_REVISION 110)
8686
set(OPENMW_POSTPROCESSING_API_REVISION 4)
8787

8888
set(OPENMW_VERSION_COMMITHASH "")

apps/opencs/model/world/infoselectwrapper.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ const char* CSMWorld::ConstInfoSelectWrapper::FunctionEnumStrings[] = {
4242
"PC Light Armor",
4343
"PC Short Blade",
4444
"PC Marksman",
45-
"PC Merchantile",
45+
"PC Mercantile",
4646
"PC Speechcraft",
4747
"PC Hand to Hand",
4848
"PC Sex",
@@ -297,7 +297,7 @@ void CSMWorld::ConstInfoSelectWrapper::updateComparisonType()
297297
case ESM::DialogueCondition::Function_PcLightArmor:
298298
case ESM::DialogueCondition::Function_PcShortBlade:
299299
case ESM::DialogueCondition::Function_PcMarksman:
300-
case ESM::DialogueCondition::Function_PcMerchantile:
300+
case ESM::DialogueCondition::Function_PcMercantile:
301301
case ESM::DialogueCondition::Function_PcSpeechcraft:
302302
case ESM::DialogueCondition::Function_PcHandToHand:
303303
case ESM::DialogueCondition::Function_PcGender:
@@ -485,7 +485,7 @@ std::pair<int, int> CSMWorld::ConstInfoSelectWrapper::getValidIntRange() const
485485
case ESM::DialogueCondition::Function_PcLightArmor:
486486
case ESM::DialogueCondition::Function_PcShortBlade:
487487
case ESM::DialogueCondition::Function_PcMarksman:
488-
case ESM::DialogueCondition::Function_PcMerchantile:
488+
case ESM::DialogueCondition::Function_PcMercantile:
489489
case ESM::DialogueCondition::Function_PcSpeechcraft:
490490
case ESM::DialogueCondition::Function_PcHandToHand:
491491
case ESM::DialogueCondition::Function_PcClothingModifier:

apps/openmw/mwdialogue/filter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,7 @@ int MWDialogue::Filter::getSelectStructInteger(const SelectWrapper& select) cons
426426
case ESM::DialogueCondition::Function_PcLightArmor:
427427
case ESM::DialogueCondition::Function_PcShortBlade:
428428
case ESM::DialogueCondition::Function_PcMarksman:
429-
case ESM::DialogueCondition::Function_PcMerchantile:
429+
case ESM::DialogueCondition::Function_PcMercantile:
430430
case ESM::DialogueCondition::Function_PcSpeechcraft:
431431
case ESM::DialogueCondition::Function_PcHandToHand:
432432
{

apps/openmw/mwdialogue/selectwrapper.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ int MWDialogue::SelectWrapper::getArgument() const
130130
return 22;
131131
case ESM::DialogueCondition::Function_PcMarksman:
132132
return 23;
133-
case ESM::DialogueCondition::Function_PcMerchantile:
133+
case ESM::DialogueCondition::Function_PcMercantile:
134134
return 24;
135135
case ESM::DialogueCondition::Function_PcSpeechcraft:
136136
return 25;
@@ -193,7 +193,7 @@ MWDialogue::SelectWrapper::Type MWDialogue::SelectWrapper::getType() const
193193
case ESM::DialogueCondition::Function_PcLightArmor:
194194
case ESM::DialogueCondition::Function_PcShortBlade:
195195
case ESM::DialogueCondition::Function_PcMarksman:
196-
case ESM::DialogueCondition::Function_PcMerchantile:
196+
case ESM::DialogueCondition::Function_PcMercantile:
197197
case ESM::DialogueCondition::Function_PcSpeechcraft:
198198
case ESM::DialogueCondition::Function_PcHandToHand:
199199
case ESM::DialogueCondition::Function_FriendHit:

apps/openmw/mwlua/dialoguebindings.cpp

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

316376
namespace 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
}

components/esm3/dialoguecondition.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ namespace ESM
5252
Function_PcLightArmor,
5353
Function_PcShortBlade,
5454
Function_PcMarksman,
55-
Function_PcMerchantile,
55+
Function_PcMercantile,
5656
Function_PcSpeechcraft,
5757
Function_PcHandToHand,
5858
Function_PcGender,

0 commit comments

Comments
 (0)