mirror of
https://github.com/SillyTavern/SillyTavern.git
synced 2025-03-02 02:47:52 +01:00
World Info inclusion group prio toggle
This commit is contained in:
parent
f90f370fed
commit
8db39a58fb
@ -5111,7 +5111,7 @@
|
|||||||
<small for="characterFilter" data-i18n="Filter to Character(s)">
|
<small for="characterFilter" data-i18n="Filter to Character(s)">
|
||||||
Filter to Character(s)
|
Filter to Character(s)
|
||||||
</small>
|
</small>
|
||||||
<label class="checkbox_label flexNoGap">
|
<label class="checkbox_label flexNoGap margin-r5" for="character_exclusion">
|
||||||
<input type="checkbox" name="character_exclusion" />
|
<input type="checkbox" name="character_exclusion" />
|
||||||
<span>
|
<span>
|
||||||
<small data-i18n="Character Exclusion">Character Exclusion</small>
|
<small data-i18n="Character Exclusion">Character Exclusion</small>
|
||||||
@ -5127,12 +5127,27 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex1 flex-container flexFlowColumn flexNoGap">
|
<div class="flex1 flex-container flexFlowColumn flexNoGap">
|
||||||
<label for="group">
|
<div class="flex-container justifySpaceBetween">
|
||||||
<small data-i18n="Inclusion Group">
|
<small for="group" data-i18n="Inclusion Group">
|
||||||
Inclusion Group
|
Inclusion Group
|
||||||
|
<a href="https://docs.sillytavern.app/usage/core-concepts/worldinfo/#inclusion-group" class="notes-link" target="_blank"
|
||||||
|
title="Inclusion Groups ensure only one entry from a group is activated at a time, if multiple are triggered. Documentation: World Info - Inclusion Group" data-i18n="[title]Inclusion Groups ensure only one entry from a group is activated at a time, if multiple are triggered. Documentation: World Info - Inclusion Group">
|
||||||
|
<span class="fa-solid fa-circle-question note-link-span"></span>
|
||||||
|
</a>
|
||||||
</small>
|
</small>
|
||||||
</label>
|
<label class="checkbox_label flexNoGap margin-r5" for="groupPrio">
|
||||||
<input type="text" class="text_pole" name="group" rows="1" data-i18n="[placeholder]Only one entry with the same label will be activated" placeholder="Only one entry with the same label will be activated">
|
<input type="checkbox" name="groupPrio" />
|
||||||
|
<span>
|
||||||
|
<small data-i18n="Prioritize Inclusion" title="Prioritize this entry: When checked, this entry is prioritized out of all selections. If multiple are prioritized, the one with the highest 'Order' is chosen. " data-i18n="[title]Prioritize this entry: When checked, this entry is prioritized out of all selections. If multiple are prioritized, the one with the highest 'Order' is chosen.">
|
||||||
|
Prioritize Inclusion
|
||||||
|
<div class="fa-solid fa-circle-info opacity50p"></div>
|
||||||
|
</small>
|
||||||
|
</span>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="range-block-range">
|
||||||
|
<input type="text" class="text_pole margin0" name="group" rows="1" data-i18n="[placeholder]Only one entry with the same label will be activated" placeholder="Only one entry with the same label will be activated">
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div name="WIEntryBottomControls" class="flex-container flex1 justifySpaceBetween world_entry_form_horizontal">
|
<div name="WIEntryBottomControls" class="flex-container flex1 justifySpaceBetween world_entry_form_horizontal">
|
||||||
|
@ -1338,6 +1338,18 @@ function getWorldEntry(name, data, entry) {
|
|||||||
groupInput.val(entry.group ?? '').trigger('input');
|
groupInput.val(entry.group ?? '').trigger('input');
|
||||||
setTimeout(() => createEntryInputAutocomplete(groupInput, getInclusionGroupCallback(data)), 1);
|
setTimeout(() => createEntryInputAutocomplete(groupInput, getInclusionGroupCallback(data)), 1);
|
||||||
|
|
||||||
|
// inclusion priority
|
||||||
|
const groupPrioInput = template.find('input[name="groupPrio"]');
|
||||||
|
groupPrioInput.data('uid', entry.uid);
|
||||||
|
groupPrioInput.on('input', function () {
|
||||||
|
const uid = $(this).data('uid');
|
||||||
|
const value = $(this).prop('checked');
|
||||||
|
data.entries[uid].groupPrio = value;
|
||||||
|
setOriginalDataValue(data, uid, 'extensions.groupPrio', data.entries[uid].groupPrio);
|
||||||
|
saveWorldInfo(name, data);
|
||||||
|
});
|
||||||
|
groupPrioInput.prop('checked', entry.groupPrio).trigger('input');
|
||||||
|
|
||||||
// probability
|
// probability
|
||||||
if (entry.probability === undefined) {
|
if (entry.probability === undefined) {
|
||||||
entry.probability = null;
|
entry.probability = null;
|
||||||
@ -2376,15 +2388,25 @@ function filterByInclusionGroups(newEntries, allActivatedEntries) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const removeEntry = (entry) => newEntries.splice(newEntries.indexOf(entry), 1);
|
||||||
|
function removeAllBut(group, chosen, logging = true) {
|
||||||
|
for (const entry of group) {
|
||||||
|
if (entry === chosen) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (logging) console.debug(`Removing loser from inclusion group '${entry.group}' entry '${entry.uid}'`, entry);
|
||||||
|
removeEntry(entry)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (const [key, group] of Object.entries(grouped)) {
|
for (const [key, group] of Object.entries(grouped)) {
|
||||||
console.debug(`Checking inclusion group '${key}' with ${group.length} entries`, group);
|
console.debug(`Checking inclusion group '${key}' with ${group.length} entries`, group);
|
||||||
|
|
||||||
if (Array.from(allActivatedEntries).some(x => x.group === key)) {
|
if (Array.from(allActivatedEntries).some(x => x.group === key)) {
|
||||||
console.debug(`Skipping inclusion group check, group already activated '${key}'`);
|
console.debug(`Skipping inclusion group check, group already activated '${key}'`);
|
||||||
// We need to forcefully deactivate all other entries in the group
|
// We need to forcefully deactivate all other entries in the group
|
||||||
for (const entry of group) {
|
removeAllBut(group, null, false);
|
||||||
newEntries.splice(newEntries.indexOf(entry), 1);
|
|
||||||
}
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2393,6 +2415,14 @@ function filterByInclusionGroups(newEntries, allActivatedEntries) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check for group prio
|
||||||
|
const prios = group.filter(x => x.groupPrio).sort(sortFn);
|
||||||
|
if (prios.length) {
|
||||||
|
console.debug(`Activated inclusion group '${key}' with by prio winner entry '${prios[0].uid}'`, prios[0]);
|
||||||
|
removeAllBut(group, prios[0]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// Do weighted random using probability of entry as weight
|
// Do weighted random using probability of entry as weight
|
||||||
const totalWeight = group.reduce((acc, item) => acc + item.probability, 0);
|
const totalWeight = group.reduce((acc, item) => acc + item.probability, 0);
|
||||||
const rollValue = Math.random() * totalWeight;
|
const rollValue = Math.random() * totalWeight;
|
||||||
@ -2403,7 +2433,7 @@ function filterByInclusionGroups(newEntries, allActivatedEntries) {
|
|||||||
currentWeight += entry.probability;
|
currentWeight += entry.probability;
|
||||||
|
|
||||||
if (rollValue <= currentWeight) {
|
if (rollValue <= currentWeight) {
|
||||||
console.debug(`Activated inclusion group '${key}' with entry '${entry.uid}'`, entry);
|
console.debug(`Activated inclusion group '${key}' with roll winner entry '${entry.uid}'`, entry);
|
||||||
winner = entry;
|
winner = entry;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -2415,14 +2445,7 @@ function filterByInclusionGroups(newEntries, allActivatedEntries) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Remove every group item from newEntries but the winner
|
// Remove every group item from newEntries but the winner
|
||||||
for (const entry of group) {
|
removeAllBut(group, winner);
|
||||||
if (entry === winner) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
console.debug(`Removing loser from inclusion group '${key}' entry '${entry.uid}'`, entry);
|
|
||||||
newEntries.splice(newEntries.indexOf(entry), 1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user