From valkyrie-mom
Item distribution patterns for Valkyrie MoM. Use when giving random items, unique items, starting items, or creating item inspection events.
npx claudepluginhub thijs-hakkenberg/valkyriemcp --plugin valkyrie-momThis skill uses the workspace's default tool permissions.
Patterns for distributing items to investigators in Mansions of Madness scenarios.
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Guides building MCP servers enabling LLMs to interact with external services via tools. Covers best practices, TypeScript/Node (MCP SDK), Python (FastMCP).
Generates original PNG/PDF visual art via design philosophy manifestos for posters, graphics, and static designs on user request.
Patterns for distributing items to investigators in Mansions of Madness scenarios.
Give a random item matching a trait category. Leave itemname empty and set traits:
upsert_item("QItemSearchWeapon", {
traits: "weapon"
})
upsert_item("QItemSearchLight", {
traits: "lightsource"
})
upsert_item("QItemSearchCommon", {
traits: "common"
})
Available traits: weapon, lightsource, equipment, common, spell
The game randomly selects an item matching the trait from its internal pool.
Give a specific named item. Set itemname and leave traits empty:
upsert_item("QItemPuzzleBox", {
itemname: "ItemCommonPuzzleBox"
})
upsert_item("QItemKnife", {
itemname: "ItemCommonKnife"
})
Use search_game_content with type "Item" to find valid item catalog IDs.
Specify multiple items — the game picks one at random:
upsert_item("QItemRandomWeapon", {
itemname: "ItemCommonKnife ItemCommonAxe ItemCommonPipe"
})
Combine itemname and traits. The itemname acts as an exclusion list — the game picks a random item matching the trait that is NOT in the itemname list:
# Give a random common item, but never the knife or lantern
upsert_item("QItemMysteryCommon", {
traits: "common",
itemname: "ItemCommonKnife ItemCommonKeroseneLantern"
})
Items given to investigators at the beginning of the scenario. Set starting=True:
# Each investigator gets a random weapon
upsert_item("QItemStartWeapon", {
starting: "True",
traits: "weapon"
})
# Each investigator gets a light source
upsert_item("QItemStartLight", {
starting: "True",
traits: "lightsource"
})
# A specific starting item for the scenario
upsert_item("QItemStartLetter", {
starting: "True",
itemname: "ItemCommonOldJournal"
})
Give a random starting item from a trait pool, excluding specific items:
upsert_item("QItemStartEquip", {
starting: "True",
traits: "equipment",
itemname: "ItemCommonBarricade ItemCommonAlarmClock"
})
Attach an event to an item that fires when the investigator inspects it. Use the inspect field:
upsert_item("QItemMysteriousLetter", {
itemname: "ItemCommonOldJournal",
inspect: "EventReadLetter"
})
upsert_event("EventReadLetter", {
buttons: "1",
event1: "EventLetterRead"
})
set_localization({
"EventReadLetter.text": "<i>The faded handwriting reads:\\n\\n\"They must not find the key. I have hidden it where only the moonlight touches.\"</i>",
"EventReadLetter.button1": "{qst:CONTINUE}"
})
Inspection events are great for:
Use the add field on an event to give an item to the active investigator:
upsert_event("EventFindKey", {
buttons: "1",
add: "QItemGoldenKey",
event1: "EventKeyFound"
})
Use the remove field to take an item away:
upsert_event("EventUseKey", {
display: "false",
buttons: "1",
remove: "QItemGoldenKey",
add: "TokenUnlockedDoor",
event1: "EventDoorUnlocked"
})
Check if a player has found an item by using a tracking variable:
# When finding the key, set a flag
upsert_event("EventFindKey", {
buttons: "1",
operations: "hasKey,=,1",
add: "QItemGoldenKey",
event1: "EventKeyNarrative"
})
# Later, check the flag
upsert_event("EventTryDoor", {
display: "false",
buttons: "2",
vartests: "VarOperation:hasKey,>=,1",
event1: "EventDoorLocked", # no key
event2: "EventDoorUnlock" # has key
})
itemname) for story-critical gear; use traits for general loot