mirror of
https://github.com/migatu/vtt_work.git
synced 2026-07-14 21:38:39 +00:00
11 lines
11 KiB
Plaintext
11 lines
11 KiB
Plaintext
{"_id":"4be25d217b8dd9de","name":"Add Gear to Selected Voidship","type":"script","img":"icons/svg/plus.svg","scope":"global","author":null,"ownership":{"default":2},"command":"(async ()=>{const a=canvas.tokens?.controlled[0]?.actor; if(!a) return ui.notifications.warn('Select a voidship token.'); const pack=game.packs.get('wg-voidships-builder.wg-voidship-items'); if(!pack) return ui.notifications.error('Items pack not found.'); // 1) Pobierz index z nazwami i ID\nconst index=await pack.getIndex({fields:['name']}); const names=[...index].map(e=>e.name); names.sort((x,y)=>x.localeCompare(y)); const opts=names.map(n=>`<option>${n}</option>`).join(''); const content=`<p>Choose items to add (Ctrl/Cmd+Click):</p><select id=it multiple size=14 style='width:100%'>${opts}</select>`; new Dialog({title:'Add Gear', content, buttons:{ok:{label:'Add',callback:async html=>{const sel=[...html[0].querySelector('#it').selectedOptions].map(o=>o.value); if(!sel.length) return; // 2) Zamień nazwy na ID z indexu\nconst idByName={}; for(const e of index) idByName[e.name]=e._id; const ids=sel.map(n=>idByName[n]).filter(Boolean); if(!ids.length){ui.notifications.warn('Nothing matched selection IDs.');return;} // 3) Pobierz dokumenty po ID i dodaj do aktora\nconst docs=await pack.getDocuments(ids); const data=docs.map(d=>d.toObject()); const created=await a.createEmbeddedDocuments('Item', data); ui.notifications.info(`Added ${created.length}/${sel.length} item(s) to ${a.name}.`);}}}}).render(true);})();"}
|
|
{"_id": "41ade68c839678fa", "name": "Remove All Gear (Selected)", "type": "script", "img": "icons/svg/trash.svg", "command": "(async()=>{const a=canvas.tokens.controlled[0]?.actor; if(!a) return ui.notifications.warn('Select a voidship token.'); const ids=a.items.filter(i=>['gear','weapon'].includes(i.type)).map(i=>i.id); if(!ids.length) return ui.notifications.info('No gear/weapon items to remove.'); await a.deleteEmbeddedDocuments('Item', ids); ui.notifications.info(`Removed ${ids.length} items from ${a.name}.`);})();", "scope": "global", "author": null, "ownership": {"default": 2}}
|
|
{"_id": "5079989f359a3c3d", "name": "Toggle Geller (Primary/Reserve)", "type": "script", "img": "icons/svg/aura.svg", "command": "(async()=>{const a=canvas.tokens.controlled[0]?.actor; if(!a) return ui.notifications.warn('Select a voidship token.'); const g=a.getFlag('wg-voidships','geller')||{primaryActive:false,reserveActive:false}; const content=`<p>Primary: <input type=checkbox id=p ${g.primaryActive?'checked':''}></p><p>Reserve: <input type=checkbox id=r ${g.reserveActive?'checked':''}></p>`; new Dialog({title:'Geller Fields',content,buttons:{ok:{label:'Set',callback:async html=>{const p=html[0].querySelector('#p').checked; const r=html[0].querySelector('#r').checked; await a.setFlag('wg-voidships','geller',{primaryActive:p,reserveActive:r}); ChatMessage.create({content:`${a.name}: Geller Primary ${p?'ON':'OFF'} / Reserve ${r?'ON':'OFF'}`});}}}}).render(true);})();", "scope": "global", "author": null, "ownership": {"default": 2}}
|
|
{"_id": "6a4bc2349dda4733", "name": "Organize Builder Compendia Folders", "type": "script", "img": "icons/svg/folder.svg", "command": "(async ()=>{\n const moduleId = \"wg-voidships-builder\";\n const packs = {\n items: game.packs.get(`${moduleId}.wg-voidship-items`),\n hulls: game.packs.get(`${moduleId}.wg-voidship-hulls`)\n };\n async function ensureFolder(pack, name) {\n await pack.getIndex();\n const typeName = pack.documentName; // \"Item\" or \"Actor\"\n const existing = pack.folders.find(f => f.name === name);\n if (existing) return existing;\n return Folder.create({ name, type: typeName, sorting: \"a\" }, { pack: pack.collection });\n }\n // Items\n if (packs.items) {\n const fWeapons = await ensureFolder(packs.items, \"Weapons\");\n const fEssential = await ensureFolder(packs.items, \"Essential Components\");\n const fSupplemental = await ensureFolder(packs.items, \"Supplemental Components\");\n const fOrdnance = await ensureFolder(packs.items, \"Ordnance\");\n const docs = await packs.items.getDocuments();\n for (const d of docs) {\n const kw = String(d.system?.keywords ?? \"\").toUpperCase();\n let folder = fSupplemental;\n if (d.type === \"weapon\") folder = fWeapons;\n else if (kw.includes(\"ESSENTIAL\")) folder = fEssential;\n else if (kw.includes(\"ORDNANCE\")) folder = fOrdnance;\n if (!d.folder || d.folder.id !== folder.id) {\n await d.update({ folder: folder.id }, { pack: packs.items.collection });\n }\n }\n }\n // Hulls\n if (packs.hulls) {\n const fHulls = await ensureFolder(packs.hulls, \"Hulls\");\n const docs = await packs.hulls.getDocuments();\n for (const d of docs) {\n if (!d.folder || d.folder.id !== fHulls.id) {\n await d.update({ folder: fHulls.id }, { pack: packs.hulls.collection });\n }\n }\n }\n ui.notifications.info(\"Voidships Builder: Compendium folders organized.\");\n})();", "scope": "global", "author": null, "ownership": {"default": 2}}
|
|
{"_id": "a68969a2ac5a2855", "name": "Import Voidships", "type": "script", "img": "icons/svg/sword.svg", "command": "game.wgVoidshipsMacros.importVoidships();", "scope": "global", "author": null, "ownership": {"default": 2}}
|
|
{"_id": "72e2ff46870f2723", "name": "Create Voidship Crit Table (d66)", "type": "script", "img": "icons/svg/d20-black.svg", "command": "game.wgVoidshipsMacros.createCritTable();", "scope": "global", "author": null, "ownership": {"default": 2}}
|
|
{"_id": "9c4931885b529b9c", "name": "Apply Voidship Hit", "type": "script", "img": "icons/svg/splash.svg", "command": "game.wgVoidshipsMacros.applyHit();", "scope": "global", "author": null, "ownership": {"default": 2}}
|
|
{"_id": "473e9b2b97086116", "name": "Recharge Void Shields", "type": "script", "img": "icons/svg/regen.svg", "command": "game.wgVoidshipsMacros.rechargeShields();", "scope": "global", "author": null, "ownership": {"default": 2}}
|
|
{"_id": "dfd9ef292fb3774f", "name": "Set Void Shields", "type": "script", "img": "icons/svg/aura.svg", "command": "game.wgVoidshipsMacros.setShields();", "scope": "global", "author": null, "ownership": {"default": 2}}
|
|
{"_id":"6f2a9b8c7d6e5f40","name":"Payload → Apply/Revert","type":"script","img":"icons/commodities/tech/cog-brass.webp","scope":"global","author":null,"ownership":{"default":2},"command":"(async()=>{function T(s){const t=String(s??\"\").split(\":\");return{name:t[0].trim(),rating:(t[1]||\"-\").trim()}};const actor=canvas.tokens?.controlled[0]?.actor??game.user?.character; if(!actor){ui.notifications.warn(\"Select a token or open an actor sheet.\");return;} const weapons=actor.items.filter(i=>i.type===\"weapon\"&&(((i.system?.traits?.list)||[]).some(t=>((t.name||\"\").toLowerCase()).includes(\"payload\"))||[\"torpedo tubes\",\"launch bay\"].includes((i.name||\"\").toLowerCase()))); if(!weapons.length){ui.notifications.warn(\"No payload-capable weapons on actor.\");return;} const packs=game.packs.filter(p=>p.documentName===\"Item\"&&/^wg-voidship-/.test(p.metadata?.name||p.metadata?.id||\"\")); const PL=[]; for(const p of packs){try{const docs=await p.getDocuments(); for(const d of docs){const pl=d.system?.payload; if(pl) PL.push({name:d.name,id:d.uuid,mount:pl.mount,data:d})}}catch(e){console.warn(e)}} for(const it of actor.items.filter(i=>i.type==='gear'&&i.system?.payload)){PL.push({name:`${it.name} (owned)`,id:it.uuid,mount:it.system.payload.mount,data:it})} const wOpts=weapons.map(w=>`<option value=\"${w.id}\">${w.name}</option>`).join(\"\"); function payloadOpts(m){const o=PL.filter(p=>p.mount===m).map(p=>`<option value=\"${p.id}\">${p.name}</option>`).join(\"\");return o||`<option value=\"\">(no payloads for ${m})</option>`} let mount='torpedo'; const dlg=new Dialog({title:\"Apply Payload to Weapon\",content:`<form><div class='form-group'><label>Weapon</label><select name='weapon'>${wOpts}</select></div><div class='form-group'><label>Payload (auto)</label><select name='payload'></select></div><div class='form-group'><label>Or paste Payload UUID</label><input type='text' name='uuid' placeholder='Compendium or world item UUID (optional)'/></div><p style='font-size:11px;opacity:.8'>Payloady są w kompendiach wg-voidship-*. Możesz też mieć je w ekwipunku aktora.</p></form>`,render:html=>{const $w=html.find(\"select[name='weapon']\"); const setList=()=>{const wid=$w.val(); const w=actor.items.get(wid); const nm=(w?.name||\"\").toLowerCase(); mount=nm.includes('torpedo')? 'torpedo' : (nm.includes('launch bay')? 'launch-bay' : (((w?.system?.traits?.list)||[]).some(t=>((t.name||\"\").toLowerCase()).includes(\"torpedo\"))? 'torpedo' : 'launch-bay')); html.find(\"select[name='payload']\").html(payloadOpts(mount))}; $w.on('change',setList); setList()},buttons:{apply:{label:\"Apply\",callback:async html=>{const wid=html.find(\"select[name='weapon']\").val(); const uuid=(html.find(\"input[name='uuid']\").val()||\"\").trim(); let pid=html.find(\"select[name='payload']\").val(); let doc=null; try{if(uuid) doc=await fromUuid(uuid)}catch(e){console.warn(e)} if(!doc&&pid) doc=await fromUuid(pid); if(!doc){ui.notifications.error(\"No valid payload selected.\");return;} const pl=doc.system?.payload; if(!pl||!['torpedo','launch-bay'].includes(pl.mount)){ui.notifications.error(\"Selected item has no compatible payload data.\");return;} const w=actor.items.get(wid); const backup={name:w.name,damage:w.system?.damage,traits:w.system?.traits,keywords:w.system?.keywords,description:w.system?.description}; await w.update({\"flags.wgvoid.payloadBackup\":backup,\"flags.wgvoid.payloadRef\":doc.uuid}); const base=Array.isArray(w.system?.traits?.list)?w.system.traits.list:[]; const kept=base.filter(t=>((t.name||\"\").toLowerCase()).indexOf(\"payload\")==-1); const newTraits=[...kept,...(pl.traits||[]).map(T),{name:\"payload-applied\",rating:doc.name}]; const dm=pl.damage||{}; const note=`<hr/><b>Payload:</b> ${doc.name}<br/><i>${doc.system?.description||''}</i>${pl.special? `<br/><b>Special:</b> ${pl.special}`:\"\"}${pl.attack?.notes? `<br/><b>Attack:</b> ${pl.attack.notes}`:\"\"}`; await w.update({\"system.damage.base\":(dm.base??0),\"system.damage.ed.base\":(dm.ed??0),\"system.damage.ap.base\":(dm.ap??0),\"system.traits.list\":newTraits,\"system.description\":`${w.system?.description||\"\"}\\n\\n${note}`,\"system.keywords\":`${w.system?.keywords||\"\"}, PAYLOAD-APPLIED`}); ui.notifications.info(`Applied ${doc.name} to ${w.name}.`)}},revert:{label:\"Revert\",callback:async html=>{const wid=html.find(\"select[name='weapon']\").val(); const w=actor.items.get(wid); const b=w.getFlag('wgvoid','payloadBackup'); if(!b){ui.notifications.warn(\"No backup on this weapon.\");return;} await w.update({\"system.damage\":b.damage,\"system.traits\":b.traits,\"system.description\":b.description,\"system.keywords\":b.keywords}); await w.update({\"flags.wgvoid\":null}); ui.notifications.info(`Reverted ${w.name} to pre-payload state.`)}},cancel:{label:\"Cancel\"}},default:\"apply\"}).render(true);})();"}
|