{deck}
version:1
card:0
size:[512,342]
script:"0"
name:"Puppeteer"
author:"John Earnest"

{script:0}
on command x do pt.command[deck x] end
on animate   do pt.animate[deck]   end
{end}

{card:Index}
image:"%%[encoded data, 5544 characters]"
script:"Index.0"
{widgets}
field1:{"type":"field","size":[132,17],"pos":[338,111],"locked":1,"font":"menu","show":"invert","border":0,"align":"center","value":"Puppets for Decker"}
button1:{"type":"button","size":[60,20],"pos":[442,312],"script":"Index.1","text":"Next","style":"rect"}
field2:{"type":"field","size":[248,55],"pos":[14,142],"locked":1,"show":"transparent","border":0,"value":{"text":["Puppeteer is  a module (\"pt\") which provides a system for organizing and animating character sprites for use in Visual Novels and similar interactive content.\n\n","Index:"],"font":["","menu"],"arg":["",""]}}
index:{"type":"field","size":[243,117],"pos":[16,197],"locked":1,"volatile":1,"script":"Index.2","scrollbar":1}
version:{"type":"field","size":[42,14],"pos":[16,318],"locked":1,"volatile":1,"border":0}

{script:Index.0}
on view do
 bullet:image["%%IMG0AAYADQAAAAB49Pz8/HgAAAA="]
 i:select c:key t:value..widgets.title.text where value..widgets.title from deck.cards
 index.value:raze each row in rows i
  rtext.make["" "" bullet],
  rtext.make["  "],
  rtext.make[("%s\n" format row.t) "mono" row.c]
 end
 version.text:"v%0.1f" format deck.modules.pt.version
end
{end}

{script:Index.1}
on click do
 t.Prev:"SlideRight"
 t.Next:"SlideLeft"
 t.Index:"BoxOut"
 go[me.text t[me.text] 15]
end
{end}

{script:Index.2}
on link val do
 go[val "BoxIn" 15]
end
{end}

{card:puppets}
{widgets}
button1:{"type":"button","size":[60,20],"pos":[442,312],"script":"Index.1","text":"Next","style":"rect"}
button2:{"type":"button","size":[60,20],"pos":[10,312],"script":"Index.1","text":"Prev","style":"rect"}
title:{"type":"field","size":[492,17],"pos":[10,22],"locked":1,"font":"menu","show":"invert","border":1,"align":"center","value":"what's a puppet?"}
button3:{"type":"button","size":[60,20],"pos":[78,312],"script":"Index.1","text":"Index","style":"rect"}
field1:{"type":"field","size":[410,37],"pos":[54,40],"locked":1,"border":0,"value":"A puppet is an object you can position and move on cards, give different \"emote\" appearances, and give several types of \"idle\" animation. Puppeteer coordinates creating and destroying puppets, as well as feeding them the events that allow them to animate."}
button4:{"type":"button","size":[134,22],"pos":[198,275],"script":"puppets.0","text":"Create Puppet"}
field2:{"type":"field","size":[125,66],"pos":[362,145],"locked":1,"show":"invert","border":0,"align":"center","value":"Most puppets consist of a canvas widget and a corresponding invisible field widget containing the animation state of the puppet."}

{script:puppets.0}
on click do
 a:"Create Puppet"
 b:"Remove Puppet"
 if b~me.text
  me.text:a
  pt.clear[]
 else
  me.text:b
  pt.command[deck ("show lily neutral","anim lily bob")]
 end
end
{end}

{card:installation}
{widgets}
button1:{"type":"button","size":[60,20],"pos":[442,312],"script":"Index.1","text":"Next","style":"rect"}
button2:{"type":"button","size":[60,20],"pos":[10,312],"script":"Index.1","text":"Prev","style":"rect"}
title:{"type":"field","size":[492,17],"pos":[10,22],"locked":1,"font":"menu","show":"invert","border":1,"align":"center","value":"installation"}
button3:{"type":"button","size":[60,20],"pos":[78,312],"script":"Index.1","text":"Index","style":"rect"}
field1:{"type":"field","size":[248,245],"pos":[254,48],"locked":1,"border":0,"value":{"text":["In addition to the importing the \"pt\" module into your own decks, you will need to ensure that any animate[] or command[] events sent to cards where puppets will appear are forwarded to the \"pt\" module along with a reference to the deck.\n\nThe simplest way to meet this requirement is to copy and paste the script fragments on the left into your deck's top-level script. (\"File -> Properties... -> Script...\" in the menu)\n\nFor more advanced applications of Puppeteer or interoperation with ","Dialogizer"," you may additionally find it useful to override these definitions on a card-by-card basis; we'll see some examples later."],"font":["","",""],"arg":["","dialogizer",""]}}
field2:{"type":"field","size":[232,87],"pos":[10,48],"border":1,"style":"code","value":"on animate do\n pt.animate[deck]\nend\n\non command x do\n pt.command[deck x]\nend\n"}

{card:boxy}
{widgets}
button1:{"type":"button","size":[60,20],"pos":[442,312],"script":"Index.1","text":"Next","style":"rect"}
button2:{"type":"button","size":[60,20],"pos":[10,312],"script":"Index.1","text":"Prev","style":"rect"}
title:{"type":"field","size":[492,17],"pos":[10,22],"locked":1,"font":"menu","show":"invert","border":1,"align":"center","value":"character sheets"}
button3:{"type":"button","size":[60,20],"pos":[78,312],"script":"Index.1","text":"Index","style":"rect"}
field1:{"type":"field","size":[248,202],"pos":[254,48],"locked":1,"border":0,"value":"The graphics for puppets are defined on cards which we'll call \"character sheets\".\n\nThe name of a character sheet card is the name we'll use to refer to the puppet. Each \"emote\" for the puppet should have a named canvas on the character sheet.\n\nIf you create a second canvas with the same name as an emote, plus a \"_blink\" suffix, Puppeteer will automatically provide a periodic blink animation for that emote.\n\nPuppets display animation frames as transparent: see \"Transparency Mask\" mode for drawing tools. You may also want to use a solid outline to help your puppets stand out from card backgrounds.\n\nThe current card is named \"boxy\", and contains several canvases, allowing it to function as a character sheet."}
smile:{"type":"canvas","size":[105,89],"pos":[10,63],"locked":1,"image":"%%IMG2AGkAWQAzAQYAYAEMAFgBFwBOAQwgBgENAEcBDCAMAQ0AQQELIBYBCgA8AQggHwEKADcBBiAlAQsAMQEFICsBCgArAQcgJQECIAoBCAAnAQggJAECIBABBwAiAQggIwEDIBQBCAAdAQYgJQECIBkBCQAYAQYgJQECIB4BCQATAQYgJQECICMBBwAPAQcgJAEDICgBBQAMAQcgIwEDIC0BAwALAQYgIgEDIDABAwALAQcgHAEFIC8BASADAQMADAEDIAMBBSAVAQIgMwECIAMBAwAMAQMgCAECIBEBAiA0AQIgBAEDAAwBAyAKAQQgCgEDIDUBASAGAQMADAEDIA4BAiAFAQMgNgEDIAYBAwAMAQMgEAEFIDgBASAJAQMADAEDIBMBBCA0AQIgCgEDAAwBAyAXAQUgKgEFIAwBAwAMAQMgHAEDICQBAyARAQMADAEDIB8BAyAfAQIgFAEDAAwBAyAiAQQgFgEFIBYBAwAMAQMgJQEXIBsBAwAMAQMgJwEBIC8BAwAMAQMgJwEBIC8BAwAMAQMgJwEBICIBBSAIAQMADAEDICcBASAgAQIgBQEBIAcBAwANAQMgJgEBIB8BAiAGAQEgBwEDAA0BAyAmAQEgHgEBIAkBASAFAQMADgEDICYBASAeAQEgCQEBIAUBAwAOAQMgJgEBIAgBAiABAQIgEQEBIAMBASAFAQEgBQEDAA4BAyAmAQEgBwEBIAIBAyARAQEgCQEBIAQBAwAPAQMgJgEBIAYBASAGAQEgEAEBIAgBAiAEAQMADwEDICYBASAEAQIgCAEBIBABASAHAQEgBQEDAA8BAyAmAQEgBAEBIAkBASAQAQEgBwEBIAUBAwAQAQMgJQEBIAQBASAJAQEgEAEBIAQBAyAGAQMAEAEDICUBASAEAQEgBAEBIAQBASARAQQgCQEDABABAyAlAQEgBAEBIAkBASAGAQcgEQEDABABAyAlAQEgBAEBIAkBASAGAQggEAEDABABAyAlAQEgBAEBIAgBAiAGAQggEAEDABABAyAkAQEgBQEBIAgBASAHAQggEAEDABEBAyAjAQEgBQEDIAUBAiAHAQggEAEDABEBAyAjAQEgBwEHIAgBCCAQAQMAEQEDICMBASAWAQggDwEDABIBAyAjAQEgFgEIIAMBBCAIAQMAEgEDICMBASAXAQUgBAECIAIBASAIAQMAEgEDICMBASAfAQIgBAEBIAcBAwATAQMgIQEBIB8BAiAFAQEgBwEDABMBAyAhAQEgHgECIAYBASAGAQMAFAEDICEBASAPAQcgBwECIAYBAiAGAQMAFAEDICEBASAOAQIgBQEIIAgBASAHAQMAFAEDICEBASAOAQEgFQEBIAgBAwAVAQMgIQEBIA0BASAUAQEgCQEDABMBBSAhAQEgDQEBIBIBAiAKAQMAEAEJICABASANAQIgDwECIAsBAwAPAQkgAgEBIB8BASANAQMgBgEJIAwBAwAOAQYgBwECIB0BASAQAQcgEwEEAA0BBCAMAQQgGQEBICgBBQAMAQUgEQEDIBcBASAiAQsACQEGIBUBBCATAQEgHwEDIAcBBgAGAQYgGQECIBIBASAXAQkgCwEGAAUBBiAaAQIgEAEBIBQBAyAWAQUABwEEIBoBAyAOAQEgEQEDIBsBBAAHAQQgHAEDIAsBASAOAQMgIAEDAAgBBCAcAQIgCgEBIAsBAyAiAQUACAEFIBwBAyAIAQEgCAECICABCgAJAQUgHgEEIAQBASAFAQMgHwEMAAwBBCAlAQEgAgEDICABCgASAQQgIwEBICEBCQAYAQUgIAECIB4BCQAcAQYgHgECIBwBCQAgAQYgGgEFIBkBBwAmAQYgFgEJIBQBBwArAQUgEwENIBABBwAvAQUgDgEHAAUBBSANAQcAMwEFIAoBBwAJAQQgCgEGADcBBiAGAQcADAEFIAUBBwA7AQcgAgEFABABBiACAQYAPwEKABQBCgBDAQcAFwEFAEgBBAAZAQQASQECABwBAQAn","scale":1}
smile_blink:{"type":"canvas","size":[105,89],"pos":[10,167],"locked":1,"image":"%%IMG2AGkAWQAzAQYAYAEMAFgBFwBOAQwgBgENAEcBDCAMAQ0AQQELIBYBCgA8AQggHwEKADcBBiAlAQsAMQEFICsBCgArAQcgJQECIAoBCAAnAQggJAECIBABBwAiAQggIwEDIBQBCAAdAQYgJQECIBkBCQAYAQYgJQECIB4BCQATAQYgJQECICMBBwAPAQcgJAEDICgBBQAMAQcgIwEDIC0BAwALAQYgIgEDIDABAwALAQcgHAEFIC8BASADAQMADAEDIAMBBSAVAQIgMwECIAMBAwAMAQMgCAECIBEBAiA0AQIgBAEDAAwBAyAKAQQgCgEDIDUBASAGAQMADAEDIA4BAiAFAQMgNgEDIAYBAwAMAQMgEAEFIDgBASAJAQMADAEDIBMBBCA0AQIgCgEDAAwBAyAXAQUgKgEFIAwBAwAMAQMgHAEDICQBAyARAQMADAEDIB8BAyAfAQIgFAEDAAwBAyAiAQQgFgEFIBYBAwAMAQMgJQEXIBsBAwAMAQMgJwEBIC8BAwAMAQMgJwEBIC8BAwAMAQMgJwEBIC8BAwAMAQMgJwEBIC8BAwANAQMgJgEBICgBAiAFAQMADQEDICYBASAkAQQgBgEDAA4BAyAmAQEgIwEBIAoBAwAOAQMgJgEBICIBASALAQMADgEDICYBASAeAQQgCwEDAA8BAyAmAQEgHQEGIAoBAwAPAQMgJgEBICIBASAKAQMADwEDICYBASAtAQMAEAEDICUBASAOAQQgGwEDABABAyAlAQEgDAEDIAEBAiAbAQMAEAEDICUBASAGAQYgBAEBIAQBByARAQMAEAEDICUBASAVAQggEAEDABABAyAlAQEgFQEIIBABAwAQAQMgJAEBIBYBCCAQAQMAEQEDICMBASAWAQggEAEDABEBAyAjAQEgFgEIIBABAwARAQMgIwEBIBYBCCAPAQMAEgEDICMBASAWAQggAwEEIAgBAwASAQMgIwEBIBcBBSAEAQIgAgEBIAgBAwASAQMgIwEBIB8BAiAEAQEgBwEDABMBAyAhAQEgHwECIAUBASAHAQMAEwEDICEBASAeAQIgBgEBIAYBAwAUAQMgIQEBIA8BByAHAQIgBgECIAYBAwAUAQMgIQEBIA4BAiAFAQggCAEBIAcBAwAUAQMgIQEBIA4BASAVAQEgCAEDABUBAyAhAQEgDQEBIBQBASAJAQMAEwEFICEBASANAQEgEgECIAoBAwAQAQkgIAEBIA0BAiAPAQIgCwEDAA8BCSACAQEgHwEBIA0BAyAGAQkgDAEDAA4BBiAHAQIgHQEBIBABByATAQQADQEEIAwBBCAZAQEgKAEFAAwBBSARAQMgFwEBICIBCwAJAQYgFQEEIBMBASAfAQMgBwEGAAYBBiAZAQIgEgEBIBcBCSALAQYABQEGIBoBAiAQAQEgFAEDIBYBBQAHAQQgGgEDIA4BASARAQMgGwEEAAcBBCAcAQMgCwEBIA4BAyAgAQMACAEEIBwBAiAKAQEgCwEDICIBBQAIAQUgHAEDIAgBASAIAQIgIAEKAAkBBSAeAQQgBAEBIAUBAyAfAQwADAEEICUBASACAQMgIAEKABIBBCAjAQEgIQEJABgBBSAgAQIgHgEJABwBBiAeAQIgHAEJACABBiAaAQUgGQEHACYBBiAWAQkgFAEHACsBBSATAQ0gEAEHAC8BBSAOAQcABQEFIA0BBwAzAQUgCgEHAAkBBCAKAQYANwEGIAYBBwAMAQUgBQEHADsBByACAQUAEAEGIAIBBgA/AQoAFAEKAEMBBwAXAQUASAEEABkBBABJAQIAHAEBACc=","scale":1}
field2:{"type":"field","size":[57,13],"pos":[10,49],"locked":1,"border":0,"value":"smile"}
field3:{"type":"field","size":[57,13],"pos":[10,153],"locked":1,"border":0,"value":"smile_blink"}
button4:{"type":"button","size":[134,22],"pos":[198,275],"script":"boxy.0","text":"Create Puppet"}
smile_open:{"type":"canvas","size":[105,89],"pos":[128,63],"locked":1,"image":"%%IMG2AGkAWQAzAQYAYAEMAFgBFwBOAQwgBgENAEcBDCAMAQ0AQQELIBYBCgA8AQggHwEKADcBBiAlAQsAMQEFICsBCgArAQcgJQECIAoBCAAnAQggJAECIBABBwAiAQggIwEDIBQBCAAdAQYgJQECIBkBCQAYAQYgJQECIB4BCQATAQYgJQECICMBBwAPAQcgJAEDICgBBQAMAQcgIwEDIC0BAwALAQYgIgEDIDABAwALAQcgHAEFIC8BASADAQMADAEDIAMBBSAVAQIgMwECIAMBAwAMAQMgCAECIBEBAiA0AQIgBAEDAAwBAyAKAQQgCgEDIDUBASAGAQMADAEDIA4BAiAFAQMgNgEDIAYBAwAMAQMgEAEFIDgBASAJAQMADAEDIBMBBCA0AQIgCgEDAAwBAyAXAQUgKgEFIAwBAwAMAQMgHAEDICQBAyARAQMADAEDIB8BAyAfAQIgFAEDAAwBAyAiAQQgFgEFIBYBAwAMAQMgJQEXIBsBAwAMAQMgJwEBIC8BAwAMAQMgJwEBIC8BAwAMAQMgJwEBICIBBSAIAQMADAEDICcBASAgAQIgBQEBIAcBAwANAQMgJgEBIB8BAiAGAQEgBwEDAA0BAyAmAQEgHgEBIAkBASAFAQMADgEDICYBASAeAQEgCQEBIAUBAwAOAQMgJgEBIAgBAiABAQIgEQEBIAMBASAFAQEgBQEDAA4BAyAmAQEgBwEBIAIBAyARAQEgCQEBIAQBAwAPAQMgJgEBIAYBASAGAQEgEAEBIAgBAiAEAQMADwEDICYBASAEAQIgCAEBIBABASAHAQEgBQEDAA8BAyAmAQEgBAEBIAkBASAQAQEgBwEBIAUBAwAQAQMgJQEBIAQBASAJAQEgEAEBIAQBAyAGAQMAEAEDICUBASAEAQEgBAEBIAQBASARAQQgCQEDABABAyAlAQEgBAEBIAkBASAGAQcgEQEDABABAyAlAQEgBAEBIAkBASAGAQggEAEDABABAyAlAQEgBAEBIAgBAiAGAQggEAEDABABAyAkAQEgBQEBIAgBASAHAQggEAEDABEBAyAjAQEgBQEDIAUBAiAHAQggEAEDABEBAyAjAQEgBwEHIAgBCCAQAQMAEQEDICMBASAWAQggDwEDABIBAyAjAQEgFgEIIA8BAwASAQMgIwEBIBcBBSARAQMAEgEDICMBASAtAQMAEwEDICEBASAuAQMAEwEDICEBASAtAQMAFAEDICEBASAcAQMgDgEDABQBAyAhAQEgFgEGIAMBASANAQMAFAEDICEBASAUAQMgCAEBIA0BAwAVAQMgIQEBIBMBASAKAQEgDQEDABMBBSAhAQEgEwEBIAkBAiANAQMAEAEJICABASATAQEgBwEDIA0BAwAPAQkgAgEBIB8BASATAQMgAwEDIA8BAwAOAQYgBwECIB0BASAVAQUgEAEEAA0BBCAMAQQgGQEBICgBBQAMAQUgEQEDIBcBASAiAQsACQEGIBUBBCATAQEgHwEDIAcBBgAGAQYgGQECIBIBASAXAQkgCwEGAAUBBiAaAQIgEAEBIBQBAyAWAQUABwEEIBoBAyAOAQEgEQEDIBsBBAAHAQQgHAEDIAsBASAOAQMgIAEDAAgBBCAcAQIgCgEBIAsBAyAiAQUACAEFIBwBAyAIAQEgCAECICABCgAJAQUgHgEEIAQBASAFAQMgHwEMAAwBBCAlAQEgAgEDICABCgASAQQgIwEBICEBCQAYAQUgIAECIB4BCQAcAQYgHgECIBwBCQAgAQYgGgEFIBkBBwAmAQYgFgEJIBQBBwArAQUgEwENIBABBwAvAQUgDgEHAAUBBSANAQcAMwEFIAoBBwAJAQQgCgEGADcBBiAGAQcADAEFIAUBBwA7AQcgAgEFABABBiACAQYAPwEKABQBCgBDAQcAFwEFAEgBBAAZAQQASQECABwBAQAn","scale":1}
smile_open2:{"type":"canvas","size":[105,89],"pos":[128,166],"locked":1,"image":"%%IMG2AGkAWQAzAQYAYAEMAFgBFwBOAQwgBgENAEcBDCAMAQ0AQQELIBYBCgA8AQggHwEKADcBBiAlAQsAMQEFICsBCgArAQcgJQECIAoBCAAnAQggJAECIBABBwAiAQggIwEDIBQBCAAdAQYgJQECIBkBCQAYAQYgJQECIB4BCQATAQYgJQECICMBBwAPAQcgJAEDICgBBQAMAQcgIwEDIC0BAwALAQYgIgEDIDABAwALAQcgHAEFIC8BASADAQMADAEDIAMBBSAVAQIgMwECIAMBAwAMAQMgCAECIBEBAiA0AQIgBAEDAAwBAyAKAQQgCgEDIDUBASAGAQMADAEDIA4BAiAFAQMgNgEDIAYBAwAMAQMgEAEFIDgBASAJAQMADAEDIBMBBCA0AQIgCgEDAAwBAyAXAQUgKgEFIAwBAwAMAQMgHAEDICQBAyARAQMADAEDIB8BAyAfAQIgFAEDAAwBAyAiAQQgFgEFIBYBAwAMAQMgJQEXIBsBAwAMAQMgJwEBIC8BAwAMAQMgJwEBIC8BAwAMAQMgJwEBICIBBSAIAQMADAEDICcBASAgAQIgBQEBIAcBAwANAQMgJgEBIB8BAiAGAQEgBwEDAA0BAyAmAQEgHgEBIAkBASAFAQMADgEDICYBASAeAQEgCQEBIAUBAwAOAQMgJgEBIAgBAiABAQIgEQEBIAMBASAFAQEgBQEDAA4BAyAmAQEgBwEBIAIBAyARAQEgCQEBIAQBAwAPAQMgJgEBIAYBASAGAQEgEAEBIAgBAiAEAQMADwEDICYBASAEAQIgCAEBIBABASAHAQEgBQEDAA8BAyAmAQEgBAEBIAkBASAQAQEgBwEBIAUBAwAQAQMgJQEBIAQBASAJAQEgEAEBIAQBAyAGAQMAEAEDICUBASAEAQEgBAEBIAQBASARAQQgCQEDABABAyAlAQEgBAEBIAkBASAGAQcgEQEDABABAyAlAQEgBAEBIAkBASAGAQggEAEDABABAyAlAQEgBAEBIAgBAiAGAQggEAEDABABAyAkAQEgBQEBIAgBASAHAQggEAEDABEBAyAjAQEgBQEDIAUBAiAHAQggEAEDABEBAyAjAQEgBwEHIAgBCCAQAQMAEQEDICMBASAWAQggDwEDABIBAyAjAQEgFgEIIA8BAwASAQMgIwEBIBcBBSAIAQIgBwEDABIBAyAjAQEgIAEFIAgBAwATAQMgIQEBICABASABAQMgCQEDABMBAyAhAQEgHAEHIAoBAwAUAQMgIQEBIBgBBCABAQQgDAEDABQBAyAhAQEgEAEIIAMBAiAQAQMAFAEDICEBASAKAQYgBgEGIBEBAwAVAQMgIQEBIAoBCyAXAQMAEwEFICEBASAsAQMAEAEJICABASArAQMADwEJIAIBASAfAQEgKwEDAA4BBiAHAQIgHQEBICoBBAANAQQgDAEEIBkBASAoAQUADAEFIBEBAyAXAQEgIgELAAkBBiAVAQQgEwEBIB8BAyAHAQYABgEGIBkBAiASAQEgFwEJIAsBBgAFAQYgGgECIBABASAUAQMgFgEFAAcBBCAaAQMgDgEBIBEBAyAbAQQABwEEIBwBAyALAQEgDgEDICABAwAIAQQgHAECIAoBASALAQMgIgEFAAgBBSAcAQMgCAEBIAgBAiAgAQoACQEFIB4BBCAEAQEgBQEDIB8BDAAMAQQgJQEBIAIBAyAgAQoAEgEEICMBASAhAQkAGAEFICABAiAeAQkAHAEGIB4BAiAcAQkAIAEGIBoBBSAZAQcAJgEGIBYBCSAUAQcAKwEFIBMBDSAQAQcALwEFIA4BBwAFAQUgDQEHADMBBSAKAQcACQEEIAoBBgA3AQYgBgEHAAwBBSAFAQcAOwEHIAIBBQAQAQYgAgEGAD8BCgAUAQoAQwEHABcBBQBIAQQAGQEEAEkBAgAcAQEAJw==","scale":1}
field4:{"type":"field","size":[70,15],"pos":[128,49],"locked":1,"show":"transparent","border":0,"value":"smile_open"}
field5:{"type":"field","size":[70,14],"pos":[128,153],"locked":1,"show":"transparent","border":0,"value":"smile_open2"}

{script:boxy.0}
on click do
 a:"Create Puppet"
 b:"Remove Puppet"
 if b~me.text
  me.text:a
  pt.clear[]
 else
  me.text:b
  pt.command[deck ("show boxy smile","anim boxy bob")]
 end
end
{end}

{card:positions}
image:"%%[encoded data, 5996 characters]"
{widgets}
button1:{"type":"button","size":[60,20],"pos":[442,312],"script":"Index.1","text":"Next","style":"rect"}
button2:{"type":"button","size":[60,20],"pos":[10,312],"script":"Index.1","text":"Prev","style":"rect"}
title:{"type":"field","size":[492,17],"pos":[10,22],"locked":1,"font":"menu","show":"invert","border":1,"align":"center","value":"stage directions"}
button3:{"type":"button","size":[60,20],"pos":[78,312],"script":"Index.1","text":"Index","style":"rect"}
field1:{"type":"field","size":[306,67],"pos":[107,45],"locked":1,"border":0,"value":"Puppeteer uses named positions for describing where puppets will be placed on the card, dividing the card into a grid of 9 main sections.\n\nThere are also named positions off the edges of the card, for describing where puppets enter and exit the \"stage\"."}
field2:{"type":"field","size":[85,14],"pos":[33,194],"locked":1,"font":"mono","show":"transparent","border":0,"style":"plain","align":"right","value":"offcenterleft"}
field3:{"type":"field","size":[90,15],"pos":[374,194],"locked":1,"font":"mono","show":"transparent","border":0,"style":"plain","value":"offcenterright"}
field4:{"type":"field","size":[83,14],"pos":[121,194],"locked":1,"font":"mono","show":"transparent","border":0,"style":"plain","align":"center","value":"centerleft"}
field5:{"type":"field","size":[89,15],"pos":[284,194],"locked":1,"font":"mono","show":"transparent","border":0,"style":"plain","align":"center","value":"centerright"}
field6:{"type":"field","size":[64,15],"pos":[212,194],"locked":1,"font":"mono","show":"transparent","border":0,"style":"plain","align":"center","value":"center"}
field7:{"type":"field","size":[86,15],"pos":[33,149],"locked":1,"font":"mono","show":"transparent","border":0,"style":"plain","align":"right","value":"offtopleft"}
field8:{"type":"field","size":[90,15],"pos":[374,149],"locked":1,"font":"mono","show":"transparent","border":0,"style":"plain","value":"offtopright"}
field9:{"type":"field","size":[83,16],"pos":[121,149],"locked":1,"font":"mono","show":"transparent","border":0,"style":"plain","align":"center","value":"topleft"}
field10:{"type":"field","size":[89,15],"pos":[284,149],"locked":1,"font":"mono","show":"transparent","border":0,"style":"plain","align":"center","value":"topright"}
field11:{"type":"field","size":[63,16],"pos":[212,149],"locked":1,"font":"mono","show":"transparent","border":0,"style":"plain","align":"center","value":"top"}
field12:{"type":"field","size":[86,15],"pos":[33,239],"locked":1,"font":"mono","show":"transparent","border":0,"style":"plain","align":"right","value":"offleft"}
field13:{"type":"field","size":[90,15],"pos":[374,239],"locked":1,"font":"mono","show":"transparent","border":0,"style":"plain","value":"offright"}
field14:{"type":"field","size":[83,15],"pos":[121,239],"locked":1,"font":"mono","show":"transparent","border":0,"style":"plain","align":"center","value":"left"}
field15:{"type":"field","size":[89,15],"pos":[284,239],"locked":1,"font":"mono","show":"transparent","border":0,"style":"plain","align":"center","value":"right"}
field16:{"type":"field","size":[63,15],"pos":[212,239],"locked":1,"font":"mono","show":"transparent","border":0,"style":"plain","align":"center","value":"bottom"}
field17:{"type":"field","size":[83,15],"pos":[121,266],"locked":1,"font":"mono","show":"transparent","border":0,"style":"plain","align":"center","value":"offbottomleft"}
field18:{"type":"field","size":[89,15],"pos":[284,266],"locked":1,"font":"mono","show":"transparent","border":0,"style":"plain","align":"center","value":"offbottomright"}
field19:{"type":"field","size":[63,15],"pos":[212,266],"locked":1,"font":"mono","show":"transparent","border":0,"style":"plain","align":"center","value":"offbottom"}
field20:{"type":"field","size":[63,15],"pos":[212,123],"locked":1,"font":"mono","show":"transparent","border":0,"style":"plain","align":"center","value":"offtop"}

{card:commandandclear}
{widgets}
button1:{"type":"button","size":[60,20],"pos":[442,312],"script":"Index.1","text":"Next","style":"rect"}
button2:{"type":"button","size":[60,20],"pos":[10,312],"script":"Index.1","text":"Prev","style":"rect"}
title:{"type":"field","size":[492,17],"pos":[10,22],"locked":1,"font":"menu","show":"invert","border":1,"align":"center","value":"pt.command[], pt.clear[]"}
button3:{"type":"button","size":[60,20],"pos":[78,312],"script":"Index.1","text":"Index","style":"rect"}
field1:{"type":"field","size":[248,130],"pos":[254,48],"locked":1,"border":0,"value":"The pt.command[] function is used for creating and manipulating puppets. It takes the deck and a string or list of strings (commands) as arguments.\n\nEach command begins with an optional \"!\", followed by a command name and several whitespace-separated arguments. We'll discuss commands in detail shortly. The \"show\" command seen here creates a puppet if it doesn't already exist."}
ex1:{"type":"field","size":[232,130],"pos":[10,48],"border":1,"style":"code","value":"pt.command[deck \"!show boxy smile\"]\n"}
button4:{"type":"button","size":[60,20],"pos":[254,158],"script":"commandandclear.0","text":"Try It!"}
field2:{"type":"field","size":[248,63],"pos":[254,240],"locked":1,"border":0,"value":"The pt.clear[] function removes all puppets from the current card. Optionally, you can specify a particular card to clear of puppets."}
ex2:{"type":"field","size":[232,63],"pos":[10,240],"border":1,"style":"code","value":"pt.clear[card]"}
button5:{"type":"button","size":[60,20],"pos":[255,283],"script":"commandandclear.1","text":"Try It!"}

{script:commandandclear.0}
on click do
 eval[ex1.text () 1]
end
{end}

{script:commandandclear.1}
on click do
 eval[ex2.text () 1]
end
{end}

{card:showhide}
{widgets}
button1:{"type":"button","size":[60,20],"pos":[442,312],"script":"Index.1","text":"Next","style":"rect"}
button2:{"type":"button","size":[60,20],"pos":[10,312],"script":"Index.1","text":"Prev","style":"rect"}
title:{"type":"field","size":[492,17],"pos":[10,22],"locked":1,"font":"menu","show":"invert","border":1,"align":"center","value":"!show, !hide"}
button3:{"type":"button","size":[60,20],"pos":[78,312],"script":"Index.1","text":"Index","style":"rect"}
field1:{"type":"field","size":[248,147],"pos":[254,48],"locked":1,"border":0,"value":{"text":["The !show command creates puppets (if needed) and sets their emote and/or position.\n\n","!show NAME EMOTE POS","\n\nNAME is the name of a puppet.\nEMOTE is the name of one of the puppet's emotes.\nPOS is a ","stage position",".\n\nIf POS is missing, it defaults to \"center\", as we've seen previously!"],"font":["","mono","","",""],"arg":["","","","positions",""]}}
ex1:{"type":"field","size":[232,147],"pos":[10,48],"border":1,"style":"code","value":"pt.command[deck\n \"!show boxy smile centerleft\"\n]\n"}
button4:{"type":"button","size":[60,20],"pos":[254,175],"script":"commandandclear.0","text":"Try It!"}
button6:{"type":"button","size":[108,20],"pos":[214,312],"script":"showhide.0","text":"Clear Puppets","style":"rect"}
ex2:{"type":"field","size":[232,94],"pos":[10,204],"border":1,"style":"code","value":"pt.command[deck\n \"!hide boxy\"\n]\n"}
field3:{"type":"field","size":[248,93],"pos":[254,204],"locked":1,"border":0,"value":{"text":["The !hide command renders puppets invisible until the next !show.\n\n","!hide NAME","\n"],"font":["","mono",""],"arg":["","",""]}}
button5:{"type":"button","size":[60,20],"pos":[254,277],"script":"commandandclear.1","text":"Try It!"}

{script:showhide.0}
on click do
 pt.clear[card]
end
{end}

{card:custompositions}
image:"%%IMG2AgABVgD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wChFVoA/wCnFQEAWBUBAP8ApxUBAFgVAQD/AKcVAQBYFQEA/wCnFQEAWBUBAP8ApxUBAFgVAQD/AKcVAQBYFQEA/wCnFQEAWBUBAP8ApxUBAFgVAQD/AKcVAQBYFQEA/wCnFQEAWBUBAP8ApxUBAFgVAQD/AKcVAQBYFQEA/wCnFQEAWBUBAP8ApxUBAFgVAQD/AKcVAQBYFQEA/wCnFQEAWBUBAP8ApxUBAFgVAQD/AKcVAQBYFQEA/wCnFQEAWBUBAP8ApxUBAFgVAQD/AKcVAQBYFQEA/wCnFQEAWBUBAP8ApxUBAFgVAQD/AKcVAQBYFQEA/wCnFQEAWBUBAP8ApxUBAFgVAQD/AKcVAQBYFQEA/wCnFQEAWBUBAP8ApxUBAFgVAQD/AKcVAQBYFQEA/wCnFQEAWBUBAP8ApxUBAFgVAQD/AKcVAQBYFQEA/wCnFQEAWBUBAP8ApxUBAFgVAQD/AKcVAQBYFQEA/wCnFQEAWBUBAP8ApxUBAFgVAQD/AKcVAQBYFQEA/wCnFQEAWBUBAP8ApxUBAFgVAQD/AKcVAQBYFQEA/wCnFQEAWBUBAP8ApxUBAFgVAQD/AKcVAQBYFQEA/wCnFQEAWBUBAP8ApxUBAFgVAQD/AKcVAQBYFQEA/wCnFQEAWBUBAP8ApxUBAFgVAQD/AKcVAQBYFQEA/wCnFQEAWBUBAP8ApxUBAFgVAQD/AKcVAQBYFQEA/wCnFQEAWBUBAP8ApxUBAFgVAQD/AKcVAQBYFQEA/wCnFQEAWBUBAP8ApxUBAFgVAQD/AKcVAQBYFQEA/wCnFQEAWBUBAP8ApxUBAFgVAQD/AKcVAQBYFQEA/wCnFQEAWBUBAP8ApxUBAFgVAQD/AKcVAQBYFQEA/wCnFQEAWBUBAP8ApxUBAFgVAQD/AKcVAQBYFQEA/wCnFQEAWBUBAP8ApxUBAFgVAQD/AKcVAQBYFQEA/wCnFQEAWBUBAP8ApxUBAFgVAQD/AKcVAQBYFQEA/wCnFQEAWBUBAP8ApxUBAFgVAQD/AKcVAQBYFQEA/wCnFQEAWBUBAP8ApxUBAFgVAQD/AKcVAQBYFQEA/wCnFQEAWBUBAP8ApxUBAFgVAQD/AKcVAQBYFQEA/wCnFQEAWBUBAP8ApxUBAFgVAQD/AKcVAQBYFQEA/wCnFQEAWBUBAP8ApxVaAP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/"
{widgets}
button1:{"type":"button","size":[60,20],"pos":[442,312],"script":"Index.1","text":"Next","style":"rect"}
button2:{"type":"button","size":[60,20],"pos":[10,312],"script":"Index.1","text":"Prev","style":"rect"}
title:{"type":"field","size":[492,17],"pos":[10,22],"locked":1,"font":"menu","show":"invert","border":1,"align":"center","value":"custom positions"}
button3:{"type":"button","size":[60,20],"pos":[78,312],"script":"Index.1","text":"Index","style":"rect"}
field1:{"type":"field","size":[248,81],"pos":[254,48],"locked":1,"border":0,"value":"If the built-in named positions won't do for your purposes, you can specify POS for commands with the name of a widget on the current card. Puppets will be centered on the centerpoint of said widget. An invisible button will do fine for this purpose."}
ex1:{"type":"field","size":[232,81],"pos":[10,48],"border":1,"style":"code","value":"pt.command[deck\n \"!show boxy smile theplace\"\n]\n"}
button4:{"type":"button","size":[60,20],"pos":[254,109],"script":"commandandclear.0","text":"Try It!"}
button6:{"type":"button","size":[108,20],"pos":[214,312],"script":"showhide.0","text":"Clear Puppets","style":"rect"}
theplace:{"type":"button","size":[79,80],"pos":[77,177],"show":"none"}
field3:{"type":"field","size":[57,14],"pos":[74,158],"locked":1,"border":0,"value":"theplace"}

{card:flip}
{widgets}
button1:{"type":"button","size":[60,20],"pos":[442,312],"script":"Index.1","text":"Next","style":"rect"}
button2:{"type":"button","size":[60,20],"pos":[10,312],"script":"Index.1","text":"Prev","style":"rect"}
title:{"type":"field","size":[492,17],"pos":[10,22],"locked":1,"font":"menu","show":"invert","border":1,"align":"center","value":"!flip"}
button3:{"type":"button","size":[60,20],"pos":[78,312],"script":"Index.1","text":"Index","style":"rect"}
field1:{"type":"field","size":[248,254],"pos":[254,48],"locked":1,"border":0,"value":{"text":["The !flip command mirrors puppets horizontally.\n\n","!flip NAME DIR","\n\nDIR is 1 (flip horizontally) or 0 (restore to original).\n\nAll the puppets we've worked with so far have had character sheets drawn to face right by default, so a DIR of 1 makes them face left, while a DIR of 0 makes them face right. Sticking to this convention (or breaking it) is entirely up to you!\n\nIf the DIR argument is missing, the !flip command will make the indicated puppet face the opposite direction."],"font":["","mono",""],"arg":["","",""]}}
ex1:{"type":"field","size":[232,175],"pos":[10,48],"border":1,"style":"code","value":"pt.command[deck\n \"!show boxy smile centerleft\",\n \"!flip boxy 1\"\n]\n"}
button4:{"type":"button","size":[60,20],"pos":[254,203],"script":"commandandclear.0","text":"Try It!"}
button6:{"type":"button","size":[108,20],"pos":[214,312],"script":"showhide.0","text":"Clear Puppets","style":"rect"}

{card:order}
{widgets}
button1:{"type":"button","size":[60,20],"pos":[442,312],"script":"Index.1","text":"Next","style":"rect"}
button2:{"type":"button","size":[60,20],"pos":[10,312],"script":"Index.1","text":"Prev","style":"rect"}
title:{"type":"field","size":[492,17],"pos":[10,22],"locked":1,"font":"menu","show":"invert","border":1,"align":"center","value":"!order"}
button3:{"type":"button","size":[60,20],"pos":[78,312],"script":"Index.1","text":"Index","style":"rect"}
field1:{"type":"field","size":[248,147],"pos":[254,48],"locked":1,"border":0,"value":{"text":["The !order command reorders puppets with respect to each other and other widgets on the card. By default, puppets are stacked back-to-front in the order that they were created, just like ordinary widgets on a card.\n\n","!order NAME front\n!order NAME back","\n\n\nNote that Puppeteer is designed to take ","Dialogizer"," into account, and will not position puppets in front of Dialogizer's modal dialogs!"],"font":["","mono","","",""],"arg":["","","","dialogizer",""]}}
ex1:{"type":"field","size":[232,147],"pos":[10,48],"border":1,"style":"code","value":"pt.command[deck\n \"!show boxy smile centerleft\",\n \"!show lily neutral centerleft\"\n]\n\n# clear the puppets and try this\n# script without the following:\npt.command[deck\n \"!order lily back\"\n]"}
button4:{"type":"button","size":[60,20],"pos":[254,175],"script":"commandandclear.0","text":"Try It!"}
button6:{"type":"button","size":[108,20],"pos":[214,312],"script":"showhide.0","text":"Clear Puppets","style":"rect"}

{card:anim}
{widgets}
button1:{"type":"button","size":[60,20],"pos":[442,312],"script":"Index.1","text":"Next","style":"rect"}
button2:{"type":"button","size":[60,20],"pos":[10,312],"script":"Index.1","text":"Prev","style":"rect"}
title:{"type":"field","size":[492,17],"pos":[10,22],"locked":1,"font":"menu","show":"invert","border":1,"align":"center","value":"!anim"}
button3:{"type":"button","size":[60,20],"pos":[78,312],"script":"Index.1","text":"Index","style":"rect"}
field1:{"type":"field","size":[248,238],"pos":[254,48],"locked":1,"border":0,"value":{"text":["The !anim command assigns puppets an idle animation, which will loop continuously until altered.\n\n","!anim NAME none\n!anim NAME bob\n!anim NAME shake\n!anim NAME breathe","\n\n\"bob\" slowly oscillates vertically.\n\n\"shake\" oscillates horizontally.\n\n\"breathe\" slowly stretches and squashes the puppet's image horizontally.\n\nBreathing uses the same nearest-neighbor image scaling as is typical in Decker. For best results, use images with simple lineart. Note how boxy's overall form is preserved well, but the fine details on his face are mangled."],"font":["","mono",""],"arg":["","",""]}}
ex1:{"type":"field","size":[232,147],"pos":[10,48],"border":1,"style":"code","value":"pt.command[deck\n \"!show boxy smile centerleft\",\n \"!anim boxy %s\" format mode.value\n]\n"}
button4:{"type":"button","size":[60,20],"pos":[254,266],"script":"commandandclear.0","text":"Try It!"}
button6:{"type":"button","size":[108,20],"pos":[214,312],"script":"showhide.0","text":"Clear Puppets","style":"rect"}
mode:{"type":"contraption","size":[140,26],"pos":[56,244],"script":"anim.0","def":"enum","widgets":{"s":{"size":[140,26],"interval":[0,3],"value":2,"format":"shake"},"o":{"size":[140,20],"value":"none\nbob\nshake\nbreathe"}}}
field3:{"type":"field","size":[57,13],"pos":[56,229],"locked":1,"border":0,"value":"mode"}

{script:anim.0}
on change val do
 
end
{end}

{card:movewait}
image:"%%IMG2AgABVgD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wBjAQMA/wD9AQUA/wD8AQUA/wD8AQUA/wD9AQMA/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AQA=="
{widgets}
button1:{"type":"button","size":[60,20],"pos":[442,312],"script":"Index.1","text":"Next","style":"rect"}
button2:{"type":"button","size":[60,20],"pos":[10,312],"script":"Index.1","text":"Prev","style":"rect"}
title:{"type":"field","size":[492,17],"pos":[10,22],"locked":1,"font":"menu","show":"invert","border":1,"align":"center","value":"!move, !wait"}
button3:{"type":"button","size":[60,20],"pos":[78,312],"script":"Index.1","text":"Index","style":"rect"}
field1:{"type":"field","size":[248,238],"pos":[254,48],"locked":1,"border":0,"value":{"text":["The !move command moves a puppet to a new location, animating as it goes.\n\n","!move NAME POS DELAY\n","\nDELAY is given in frames, at 60 frames per second. If not specified, defaults to 30 frames. The minimum delay is 1. If you start a new !move or otherwise change a puppet's position while it is still moving, it will immediately \"snap\" to the new position.\n\n\nThe !wait command blocks execution of the current script while allowing pending puppet animations to progress.\n\n","!wait DELAY","\n\nIf DELAY is not specified, this command will wait for all in-progress moves to finish."],"font":["","mono","","mono",""],"arg":["","","","",""]}}
ex1:{"type":"field","size":[232,238],"pos":[10,48],"border":1,"style":"code","value":"pt.command[deck\n \"!show boxy smile centerleft\",\n \"!move boxy centerright 60\",\n \"!wait\"\n]\npt.clear[card]\n"}
button4:{"type":"button","size":[60,20],"pos":[254,266],"script":"commandandclear.0","text":"Try It!"}
button6:{"type":"button","size":[108,20],"pos":[214,312],"script":"showhide.0","text":"Clear Puppets","style":"rect"}

{card:clear}
{widgets}
button1:{"type":"button","size":[60,20],"pos":[442,312],"script":"Index.1","text":"Next","style":"rect"}
button2:{"type":"button","size":[60,20],"pos":[10,312],"script":"Index.1","text":"Prev","style":"rect"}
title:{"type":"field","size":[492,17],"pos":[10,22],"locked":1,"font":"menu","show":"invert","border":1,"align":"center","value":"!clear"}
button3:{"type":"button","size":[60,20],"pos":[78,312],"script":"Index.1","text":"Index","style":"rect"}
field1:{"type":"field","size":[248,238],"pos":[254,48],"locked":1,"border":0,"value":"The !clear command removes all puppets, just like pt.clear[]. It takes no arguments.\n"}
ex1:{"type":"field","size":[232,238],"pos":[10,48],"border":1,"style":"code","value":"pt.command[deck\n \"!show boxy smile centerright\",\n \"!move boxy centerleft 60\",\n \"!wait\",\n \"!clear\"\n]\n"}
button4:{"type":"button","size":[60,20],"pos":[254,266],"script":"commandandclear.0","text":"Try It!"}
button6:{"type":"button","size":[108,20],"pos":[214,312],"script":"showhide.0","text":"Clear Puppets","style":"rect"}

{card:dialogizer}
{widgets}
button1:{"type":"button","size":[60,20],"pos":[442,312],"script":"Index.1","text":"Next","style":"rect"}
button2:{"type":"button","size":[60,20],"pos":[10,312],"script":"Index.1","text":"Prev","style":"rect"}
title:{"type":"field","size":[492,17],"pos":[10,22],"locked":1,"font":"menu","show":"invert","border":1,"align":"center","value":"puppeteer and dialogizer"}
button3:{"type":"button","size":[60,20],"pos":[78,312],"script":"Index.1","text":"Index","style":"rect"}
field1:{"type":"field","size":[248,97],"pos":[254,48],"locked":1,"border":0,"value":{"text":["Puppeteer is designed as a companion to ","Dialogizer",", a Decker module which manages modal dialogs.\n\nAs described in ","installation",", puppeteer requires that animate[] and command[] events sent to the current card be forwarded to the \"pt\" module. Dialogizer sends compatible events to the current card while dialog boxes are open."],"font":["","","","",""],"arg":["","http://beyondloom.com/decker/dialog.html","","installation",""]}}
field2:{"type":"field","size":[232,84],"pos":[10,48],"border":1,"style":"code","value":"on animate do\n pt.animate[deck]\nend\n\non command x do\n pt.command[deck x]\nend\n"}
ex1:{"type":"field","size":[232,54],"pos":[10,163],"border":1,"style":"code","value":"dd.open[deck]\ndd.say[script.value]\ndd.close[]\npt.clear[]"}
field4:{"type":"field","size":[248,141],"pos":[254,163],"locked":1,"border":0,"value":"Thanks to the above plumbing, we can use Puppeteer commands from within rich text prose fed to Dialogizer!\n\nAs a convenience, you can group several Puppeteer commands together, separated by only a single newline. The leading \"!\" is mandatory when you're embedding commands in Dialogizer prose."}
script:{"type":"field","size":[232,67],"pos":[10,237],"scrollbar":1,"value":{"text":["!show lily neutral\n!anim lily bob\n!wait 30\n!show lily neutral_open\n\n","Weird Bug:"," Hiya, I'm Lily!\n\n","Lily:"," I'm an exposition fairy.\n\n!show lily smug\n\n","Lily:"," Exposition Fairies are among the world's largest insects!\n\n!show lily mad\n\n","Lily:"," We are also extremely venomous.\n\n!show lily happy\n\n","Lily:"," Isn't learning fun?\n\n!show lily neutral\n!move lily offtop\n!wait"],"font":["","menu","","menu","","menu","","menu","","menu",""],"arg":["","","","","","","","","","",""]}}
field3:{"type":"field","size":[57,14],"pos":[10,223],"locked":1,"border":0,"value":"script"}
button4:{"type":"button","size":[60,20],"pos":[254,284],"script":"commandandclear.0","text":"Try It!"}

{card:shake}
{widgets}
button1:{"type":"button","size":[60,20],"pos":[442,312],"script":"Index.1","text":"Next","style":"rect"}
button2:{"type":"button","size":[60,20],"pos":[10,312],"script":"Index.1","text":"Prev","style":"rect"}
title:{"type":"field","size":[492,17],"pos":[10,22],"locked":1,"font":"menu","show":"invert","border":1,"align":"center","value":"!shake"}
button3:{"type":"button","size":[60,20],"pos":[78,312],"script":"Index.1","text":"Index","style":"rect"}
field1:{"type":"field","size":[248,255],"pos":[254,48],"locked":1,"border":0,"value":{"text":["The !shake command shakes the screen, as a convenient, simple way to add emphasis to your cutscenes.\n\n","!shake XMAG YMAG DELAY","\n\nXMAG and YMAG control the magnitude of the shake along the X (horizontal) and Y (vertical) axis of the screen, respectively. Each is specified in terms of pixels.\n\nDELAY specifies the duration of the shake effect in frames, at 60 frames per second. The minimum delay is 1.  The shake effect is synchronous, blocking other interaction and animation until it is complete.\n\nIf any arguments are omitted, the arguments provided to the most recent !shake will be re-used; this is helpful if you want to have several shakes in sequence."],"font":["","mono",""],"arg":["","",""]}}
button4:{"type":"button","size":[60,20],"pos":[254,283],"script":"shake.0","text":"Try It!"}
script:{"type":"field","size":[232,241],"pos":[10,62],"scrollbar":1,"value":{"text":["!show lily neutral center\n!wait 30\n!show lily neutral_open\n\n","Lily:"," Hi there.\n\n!show lily ohno\n\n","Lily:"," W-What are you doing with my dishes?\n\n!shake 5 5 15\n!wait 30\n\n!shake 30 30 15\n!wait 30\n\n!shake 60 0 15\n!wait 10\n!shake\n!wait 10\n!shake\n!wait 30\n\n!shake 0 30 15\n!wait 60\n\n!show lily sad\n\n","Lily:"," Those were limited-edition novelties..."],"font":["","menu","","menu","","menu",""],"arg":["","","","","","",""]}}
field3:{"type":"field","size":[57,14],"pos":[10,48],"locked":1,"border":0,"value":"script"}

{script:shake.0}
on click do
 dd.open[deck]
 dd.say[script.value]
 dd.close[]
 pt.clear[]
end
{end}

{card:talk}
{widgets}
button1:{"type":"button","size":[60,20],"pos":[442,312],"script":"Index.1","text":"Next","style":"rect"}
button2:{"type":"button","size":[60,20],"pos":[10,312],"script":"Index.1","text":"Prev","style":"rect"}
title:{"type":"field","size":[492,17],"pos":[10,22],"locked":1,"font":"menu","show":"invert","border":1,"align":"center","value":"!talk"}
button3:{"type":"button","size":[60,20],"pos":[78,312],"script":"Index.1","text":"Index","style":"rect"}
field1:{"type":"field","size":[248,255],"pos":[254,48],"locked":1,"border":0,"value":{"text":["The !talk command selects zero or more puppets by name as the speaker or speakers during a dialog box.\n\n","!talk NAME1 NAME2...","\n\nIf no names are provided, no puppets will attempt a talking animation until the next !talk command selects some.\n\nA talking animation consists of puppet frames given by the name of the current emote, a \"_open\" suffix, and then any additional suffix, excluding any blink frames. For example, if a puppet's emote is \"neutral\", it might have two talking frames defined as \"neutral_open1\" and \"neutral_open2\". The base emote and talking animation frames will be cycled sequentially while the puppet is intended to be talking.\n\nDialogizer modals will only trigger talking animations when the \".speed\" setting (text display speed) is nonzero."],"font":["","mono",""],"arg":["","",""]}}
button4:{"type":"button","size":[60,20],"pos":[254,283],"script":"talk.0","text":"Try It!"}
script:{"type":"field","size":[232,241],"pos":[10,62],"scrollbar":1,"scroll":120,"value":{"text":["!show lily neutral centerleft\n!anim lily bob\n!wait 30\n!talk lily\n\n","Lily:"," Talking animations can look kinda weird.\nIt all comes down to the animation frames you draw.\n\n","Lily:"," You may have to experiment to get a look you're happy with.\n\n!show boxy smile offcenterright\n!flip boxy\n!move boxy centerright\n!wait 30\n!talk boxy\n\n","Boxy:"," You really said it, Lily!\n\n!show lily ohno\n\n","Boxy:"," Talking animations can be tricky, but it's important to trust in yourself and rely upon the power of friendship!\n\n","Boxy:"," This reminds me of that one time...    blah blah blah\n        blah blah blah          blah blah blah\n    Blah blah blah blah     chickens\n     blah    blah...\n\n!wait 120\n!talk\n\n","Narrator:"," (Lily had no idea Boxy had the capacity for speech and was deeply unnerved by this interaction.)"],"font":["","menu","","menu","","menu","","menu","","menu","","menu",""],"arg":["","","","","","","","","","","","",""]}}
field3:{"type":"field","size":[57,14],"pos":[10,48],"locked":1,"border":0,"value":"script"}

{script:talk.0}
on click do
 dd.open[deck ().speed:3]
 dd.say[script.value]
 dd.close[]
 pt.clear[]
end
{end}

{card:customcommands}
script:"customcommands.0"
{widgets}
button1:{"type":"button","size":[60,20],"pos":[442,312],"script":"Index.1","text":"Next","style":"rect"}
button2:{"type":"button","size":[60,20],"pos":[10,312],"script":"Index.1","text":"Prev","style":"rect"}
title:{"type":"field","size":[492,17],"pos":[10,22],"locked":1,"font":"menu","show":"invert","border":1,"align":"center","value":"custom commands"}
button3:{"type":"button","size":[60,20],"pos":[78,312],"script":"Index.1","text":"Index","style":"rect"}
field1:{"type":"field","size":[248,70],"pos":[254,48],"locked":1,"border":0,"value":"It's also possible to handle your own custom commands before passing the buck to pt. The current card script is shown to the left, defining some custom styles for dd.\n\nThis approach works equally well as a card-level or deck-level script."}
field2:{"type":"field","size":[232,149],"pos":[10,48],"border":1,"scrollbar":1,"style":"code","value":"on command x do\n if x~\"light\"\n  o.speed:2\n  o.fcolor:colors.black\n  o.bcolor:colors.white\n  dd.style[o]\n elseif x~\"dark\"\n  o.speed:2\n  o.fcolor:colors.white\n  o.bcolor:colors.black\n  dd.style[o]\n else\n  pt.command[deck x]\n end\nend"}
script:{"type":"field","size":[232,80],"pos":[10,224],"scrollbar":1,"scroll":439,"value":{"text":["!show lily neutral offcenterleft\n!anim lily bob\n!move lily centerleft\n!wait\n!show lily neutral_open\n\n!dark\n\n","Lily:"," Hey, Lilac!\n\n!show lily neutral\n!show lilac neutral offcenterright\n!anim lilac bob\n!flip lilac 1\n!move lilac centerright\n!wait\n!show lilac neutral_open\n\n!light\n\n","Lilac:"," Y-yeah?\n\n!show lilac neutral\n!show lily neutral_open\n\n!dark\n\n","Lily:"," Could you help me with a quick demo?\n\n!show lily neutral\n!show lilac neutral_open\n\n!light\n\n","Lilac:"," I d-don't really want to do a demo...\nThat sounds stressful.\n\n!show lilac neutral\n!show lily neutral_open\n\n!dark\n\n","Lily:"," You just did one!\n\n!show lily neutral\n!show lilac happy\n!wait 60\n!move lily offcenterleft\n!move lilac offcenterright\n!wait"],"font":["","menu","","menu","","menu","","menu","","menu",""],"arg":["","","","","","","","","","",""]}}
field3:{"type":"field","size":[57,14],"pos":[10,208],"locked":1,"border":0,"value":"script"}
button4:{"type":"button","size":[60,20],"pos":[254,284],"script":"shake.0","text":"Try It!"}

{script:customcommands.0}
on command x do
 if x~"light"
  o.speed:2
  o.fcolor:colors.black
  o.bcolor:colors.white
  dd.style[o]
 elseif x~"dark"
  o.speed:2
  o.fcolor:colors.white
  o.bcolor:colors.black
  dd.style[o]
 else
  pt.command[deck x]
 end
end
{end}

{card:lil}
{widgets}
button1:{"type":"button","size":[60,20],"pos":[442,312],"script":"Index.1","text":"Next","style":"rect"}
button2:{"type":"button","size":[60,20],"pos":[10,312],"script":"Index.1","text":"Prev","style":"rect"}
title:{"type":"field","size":[492,17],"pos":[10,22],"locked":1,"font":"menu","show":"invert","border":1,"align":"center","value":"!lil"}
button3:{"type":"button","size":[60,20],"pos":[78,312],"script":"Index.1","text":"Index","style":"rect"}
field1:{"type":"field","size":[248,81],"pos":[254,48],"locked":1,"border":0,"value":"Yet another approach would be to use the !lil command, which can be followed by any arbitrary lil code you like, as long as it doesn't contain any blank lines.\n\nThis is very convenient for one-off logic, but anything you find yourself doing repeatedly should probably go in a custom command."}
script:{"type":"field","size":[232,244],"pos":[10,60],"scrollbar":1,"value":{"text":["!show lily neutral_open center\n!anim lily bob\n\n","Lily:"," Look what I can do:\n\n!lil alert[2+3]\n\n!show lily ohno\n\n","Lily:"," Woah.\n\n!show lily neutral_open\n\n","Lily:"," Did you notice how that kinda froze time for a moment?\nCreepy, right?\n\n","Lily:"," Built-in alerts don't service   ","animate[]","  events, so Puppeteer can't drive blinking or idle animations, like Dialogizer permits."],"font":["","menu","","menu","","menu","","menu","","mono",""],"arg":["","","","","","","","","","",""]}}
field3:{"type":"field","size":[57,14],"pos":[10,44],"locked":1,"border":0,"value":"script"}
button4:{"type":"button","size":[60,20],"pos":[254,284],"script":"shake.0","text":"Try It!"}

{card:fancypuppets}
{widgets}
button1:{"type":"button","size":[60,20],"pos":[442,312],"script":"Index.1","text":"Next","style":"rect"}
button2:{"type":"button","size":[60,20],"pos":[10,312],"script":"Index.1","text":"Prev","style":"rect"}
title:{"type":"field","size":[492,17],"pos":[10,22],"locked":1,"font":"menu","show":"invert","border":1,"align":"center","value":"fancy puppets"}
button3:{"type":"button","size":[60,20],"pos":[78,312],"script":"Index.1","text":"Index","style":"rect"}
field1:{"type":"field","size":[248,208],"pos":[254,48],"locked":1,"border":0,"value":{"text":["The puppets we've seen so far use a collection of canvases as their character sheet. Alternatively, you can make a character sheet containing a single contraption, which we'll call a \"Fancy Puppet\".\n\nFancy puppets are entirely responsible for drawing and animating their internal appearance, but obey !move, !hide, etc. They may have the following attributes:\n\n- .animate[]: should do exactly the same thing as an internal call to view[]\n- .anim: fed the argument to !anim\n- .flip: fed the argument to !flip\n- .emote: fed the emote name whenever it changes\n- .talk: fed 1 or 0 when ","talking animations"," should begin and end, respectively.\n\nFancy puppets are an advanced feature, and not for the faint of heart, or those strongly averse to Lil."],"font":["","",""],"arg":["","talk",""]}}
script:{"type":"field","size":[232,236],"pos":[10,68],"scrollbar":1,"value":{"text":["!show eggbug neutral\n!anim eggbug bob\n!wait 60\n\n!show eggbug open\n\n","Eggbug:"," *purring noises*\n\n!show eggbug neutral\n!wait 60\n!show eggbug mad\n\n","Eggbug:"," *mischevious noises*\n\n!move eggbug offcenterleft\n!wait"],"font":["","menu","","menu",""],"arg":["","","","",""]}}
field3:{"type":"field","size":[57,14],"pos":[10,53],"locked":1,"border":0,"value":"script"}
button4:{"type":"button","size":[60,20],"pos":[254,284],"script":"shake.0","text":"Try It!"}

{card:setup}
{widgets}
button2:{"type":"button","size":[60,20],"pos":[10,312],"script":"Index.1","text":"Prev","style":"rect"}
button3:{"type":"button","size":[60,20],"pos":[442,312],"script":"Index.1","text":"Index","style":"rect"}
field1:{"type":"field","size":[248,117],"pos":[254,48],"locked":1,"border":0,"value":"Sometimes it's desirable to set up puppets before you change cards, so that you can use transitions and see the puppets already in place.\n\nThe pt.setup[] function behaves just like pt.command[], except you also specify a card to recieve the command(s).\n\npt.clear[] can also take an optional target card, so you don't have to clean up puppets until after an exit transition is finished."}
ex1:{"type":"field","size":[232,149],"pos":[10,48],"border":1,"style":"code","value":"pt.setup[deck stage\n \"!show lily sad center\",\n \"!anim lily bob\"\n]\n\ngo[stage \"BoxIn\"]\ndd.open[deck]\ndd.say[script.value]\ndd.close[]\n\ngo[\"Back\" \"BoxOut\"]\npt.clear[stage]"}
script:{"type":"field","size":[232,80],"pos":[10,224],"scrollbar":1,"value":{"text":["","Lily:"," *sniffle*\n\n","Lily:"," I was terribly lonely here by myself.\n\n!show lily happy\n\n","Lily:"," But now you're here, too!\nHooray!\n\n!show lily ohno\n\n","Lily:"," W-wait, are you leaving already?"],"font":["","menu","","menu","","menu","","menu",""],"arg":["","","","","","","","",""]}}
field3:{"type":"field","size":[57,14],"pos":[10,208],"locked":1,"border":0,"value":"script"}
title:{"type":"field","size":[492,17],"pos":[10,22],"locked":1,"font":"menu","show":"invert","border":1,"align":"center","value":"pt.setup[]"}
button4:{"type":"button","size":[60,20],"pos":[254,177],"script":"commandandclear.0","text":"Try It!"}

{card:lily}
image:"%%IMG2AgABVg7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8O/w7/Dv8Org=="
{widgets}
neutral:{"type":"canvas","size":[168,167],"pos":[9,28],"locked":1,"show":"transparent","image":"%%[encoded data, 6268 characters]","scale":1}
neutral_open:{"type":"canvas","size":[168,167],"pos":[5,132],"locked":1,"show":"transparent","image":"%%[encoded data, 6288 characters]","scale":1}
neutral_blink:{"type":"canvas","size":[168,167],"pos":[26,26],"locked":1,"show":"transparent","image":"%%[encoded data, 6060 characters]","scale":1}
neutral_open_blink:{"type":"canvas","size":[168,167],"pos":[18,141],"locked":1,"show":"transparent","image":"%%[encoded data, 6072 characters]","scale":1}
ohno_blink:{"type":"canvas","size":[168,168],"pos":[51,38],"locked":1,"image":"%%[encoded data, 5800 characters]","scale":1}
ohno:{"type":"canvas","size":[168,168],"pos":[55,30],"locked":1,"image":"%%[encoded data, 5884 characters]","scale":1}
unamused:{"type":"canvas","size":[168,167],"pos":[331,157],"locked":1,"image":"%%[encoded data, 6180 characters]","scale":1}
happy:{"type":"canvas","size":[168,167],"pos":[332,27],"locked":1,"image":"%%[encoded data, 7108 characters]","scale":1}
mad:{"type":"canvas","size":[168,167],"pos":[175,50],"locked":1,"image":"%%[encoded data, 6524 characters]","scale":1}
furious:{"type":"canvas","size":[168,167],"pos":[183,63],"locked":1,"image":"%%[encoded data, 7032 characters]","scale":1}
sad:{"type":"canvas","size":[168,168],"pos":[194,79],"locked":1,"image":"%%[encoded data, 6564 characters]","scale":1}
smug:{"type":"canvas","size":[168,167],"pos":[68,154],"locked":1,"image":"%%[encoded data, 6132 characters]","scale":1}
smug_blink:{"type":"canvas","size":[168,167],"pos":[169,164],"locked":1,"image":"%%[encoded data, 5988 characters]","scale":1}

{card:lilac}
image:"%%IMG2AgABVgn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8J/wn/Cf8Jrg=="
{widgets}
neutral:{"type":"canvas","size":[168,174],"pos":[1,25],"locked":1,"image":"%%[encoded data, 5980 characters]","scale":1}
neutral_blink:{"type":"canvas","size":[168,174],"pos":[1,204],"locked":1,"image":"%%[encoded data, 5804 characters]","scale":1}
happy:{"type":"canvas","size":[168,174],"pos":[347,24],"locked":1,"image":"%%[encoded data, 6028 characters]","scale":1}
happy_blink:{"type":"canvas","size":[168,174],"pos":[348,204],"locked":1,"image":"%%[encoded data, 5860 characters]","scale":1}
neutral_open:{"type":"canvas","size":[168,174],"pos":[173,25],"locked":1,"image":"%%[encoded data, 6024 characters]","scale":1}
neutral_open_blink:{"type":"canvas","size":[168,174],"pos":[173,204],"locked":1,"image":"%%[encoded data, 5864 characters]","scale":1}

{card:galena}
{widgets}
neutral:{"type":"canvas","size":[244,239],"pos":[259,25],"locked":1,"border":1,"image":"%%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TAEEAKABBARMAQQAoAEEBEwBBACgAQQETAEEAJ8BBQRMAQQAnwEEBE0BBACfAQQETQEEAJ4BBQRNAQQAngEEBE4BBACeAQQETgEEAJ4BBAROAQQAnQEFBE4BBACdAQQETwEEAJwBBQRPAQQAnAEEBFABBACcAQQEUAEEAJwBBARQAQQAmwEFBFABBACbAQQEUQEEAJsBBARRAQQAmgEFBFEBBACaAQQEUgEEAJoBBARSAQQAmQEFBFIBBACZAQQEUwEEAJgBBQRTAQQAmAEEBFQBBACYAQQEVAEEAJcBBQRUAQQAlwEEBFUBBACWAQUEVQEEAJUBBQRWAQQAlQEEBFYBBQCUAQUEVgEEAJUBBARXAQQAlAEFBFcBBACTAQUEWAEEAJMBBARZAQQAkwEEBFkBBACSAQUEWQEEAJIBBARZAQUAkQEFBFkBBACSAQQEWgEEAJEBBQRaAQQAkAEGBFoBBACQAQUEWwEEAJABBARcAQQAjwEFBFwBBACOAQYEXAEFAI0BBQReAQQAjAEFBF8BBACMAQQEYAEEAIsBBQRgAQUAiQEFBGIBBACIAQYEYgEFAIcBBQRkAQQAhgEFBGUBBQCFAQQEZgEFAIQBBQRnAQQAgwEFBGgBBQCCAQQEagEFAIABBQRrAQUAfgEFBG0BBAB+AQQEbgEFAHwBBQRuAQcAeQEFBHABBwB4AQUEcgEGAHcBBAR0AQYAdQEFBHYBBwByAQQEeAEHAHEBBAR5AQcAbwEFBHoBCABtAQQEfQEHAGwBBAR+AQcAagEFBIABBgBpAQQEgwEFAGgBBASEAQUAZgEFBIUBBQBlAQQEhwEGAGMBBASIAQYAYgEEBIkBBgBhAQQEigEGAF8BBQSMAQYAXQEEBI4BBgBbAQUEjwEGAFoBBASRAQYAWQEEBJMBBQBYAQQElAEFAFYBBQSVAQUAVQEEBJcBBABVAQQElwEGAFMBBASYAQYAUQEFBJgBEgBFAQQEmgEXAD8BBASbARsAOgEEBJwBHAA4AQQEqgEQADYBBASwAQwANAEEBLUBCAAzAQQEtwEHADIBBAS5AQcAMAEEBLsBBgAvAQQEvAEHAC0BBAS9AQcALAEEBL8BBwAqAQQEwAEHACkBBATCAQYAKAEEBMMBBgAnAQQExAEGACYBBATGAQUAJQEFBMYBBAAmAQQExgEFACUBBATHAQQAJQEEBMcBBQAkAQUExwEJACABBATHAQwAHQEEBMgBDAAcAQUEyAEMABwBBATOAQcAGwEEBNEBBQAaAQUE0QEGABgBBQTSAQYAGAEEBNMBBgAXAQUE0wEFABgBBATUAQUAFwEFBNQBBQAWAQUE1QEEABcBBATVAQUAFgEFBNUBBQAVAQUE1gEG","scale":1}
alert_open:{"type":"canvas","size":[249,239],"pos":[89,36],"locked":1,"image":"%%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","scale":1}
alert:{"type":"canvas","size":[243,239],"pos":[29,128],"locked":1,"image":"%%IMG2APMA7wBDAQUA6gEKAOYBDgDkAQ8A4wEKIAIBBADPAQkACgEHIAYBBADMAQ0ACAEGIAgBBADKARAABgEGIAkBBADJARIABAEGIAoBBADIAQggBgEGAAIBBiALAQQAxwEGIAoBDCALAQUAxgEGIAwBCSANAQwAvwEFIA4BByAOAQ0AvQEFIBEBBCAPAQ4AvAEEICUBDwC7AQQgJgEFIAUBBQC6AQQgMAEFALoBBCAxAQQAugEEIDEBBAC6AQQgMQEEALoBBCAxAQYAuAEEICIBGAC1AQQgHQEfALMBBCAaASUAsAEEIBYBDAQUAQoArwEFIBIBCwQbAQkArgEEIBEBCAQhAQkApwEJIA8BBwQnAQcApQEKIA4BBwQpAQcApAEJIA0BCAQsAQYAowEIIA0BBwQwAQUAoQEFIBABBAQ1AQUAoAEEIBABBAQ2AQYAnwEEIA8BAwQ5AQYAngEEIA4BBAQ6AQYAnQEEIA4BAwQOAQ4EIQEFAJwBBCANAQQECAEVBCABBgCbAQQgDQEDBAcBGAQgAQYAmgEEIAwBAwQGARsEIAEGAJkBBSAKAQMEBgEMIAkBCAQhAQQAmgEEIAoBAwQGAQcgEAEHBCABBQCZAQUgCQEDBAUBBiATAQYEIQEFAJgBBSAIAQMEBgEFIAgBAyALAQUEBAEBBBwBBACZAQUgBwEDBAUBBSAHAQcgCgEEBAMBAwQbAQUAmQEEIAYBAwQGAQQgBwEJIAkBBAQDAQMEHAEFAJQBCCAGAQMEBgEEIAUBDSAHAQUEAgEDBB0BBQCQAQsgBQEEBAYBBCAEAQwgCQEFBAIBBAQdAQQAjwELIAYBAwQGAQUgBAELIAoBBQQDAQMEHQEFAI4BCiAHAQMEBgEFIAQBCyAKAQUEAwEDBB0BBQCOAQYgCgEEBAYBBSAEAQsgCgEFBAMBAwQeAQUAjQEEIAsBBAQHAQUgBAELIAoBBQQDAQMEHwEEAI0BBCAKAQQECAEEIAUBDCADAQEgBQEFBAMBAwQKAQ0ECAEFAIwBBSAIAQQECQEEIAUBECAFAQUEAwEDBAcBAQQBARAEBwEFAIoBBiAHAQQECgEFIAUBDiAGAQUEAwEDBAYBFAQHAQQAigEGIAYBBAQIAQEEAgEGIAUBDCAGAQUEBAEDBAcBFAQGAQUAiQEPBAgBAwQCAQYgBQEKIAYBBgQEAQMEBwEDIAwBBQQHAQQAiQEPBAgBAwQDAQYgEwEHBAMBBAQHAQMgDQEFBAYBBQCIARAEBwEDBAQBBiARAQcEBAEDBAkBAyANAQUEBgEEAIgBCAkFAQQEBgEEBAQBBiAPAQgEBQEBBAoBAyAOAQQEBgEEAIcBBgkJAQMEBwEEBAQBByAMAQgEEQEDIA4BBQQFAQUAhQEGCQoBAwQIAQMEBAEIIAgBCgQSAQMgDwEEBAYBBACEAQYJDAEDBAgBAQQGARgEEwEDIA8BBAQGAQUAggEFCQ4BAwQRARcEEgEDIA8BBAQHAQQAgQEGCQ8BAwQQARgEEQEDIA8BBAQHAQQAgAEGCRABAwQPAQQEAQENBAQBAwQRAQMgDwEEBAcBBAB/AQUJEwEEBA0BAwQHAQMECgEBBBIBAyAPAQQEBwEFAH0BBQkWAQMEDAEDBAcBAwQdAQMgDwEEBAgBBAB8AQUJGAEDBAwBAQQIAQMEHAEEIA8BBAQIAQUAegEFCRoBAwQUAQMEHAEDIBABBAQJAQQAeQEFCRwBAgQVAQEEHAEEIBABBAQJAQQAeAEGCRwBAwQwAQQgEQEEBAkBBAB3AQYJHAEFBC4BBCASAQQECQEEAHYBBQkdAQIgAQEEBCwBBCATAQQECQEFAHQBBQkbAQEJAQEDIAIBBAQsAQQgEgEEBAoBBAB0AQQJGAEKIAIBBAQrAQQgEQEFBAoBBABzAQUJEwEPIAMBBAQqAQQgEAEFBAsBBQByAQQJEQESIAQBBAQpAQQgDQEIBAwBBAByAQQJDgEWIAQBBAQoAQUgCQEKBA0BBAByAQQJDAELCQcBBiAGAQMEJwEGIAcBCgQOAQQAcgEECQsBCgkJAQYgBgEFBCYBFQQPAQQAcgEECQkBCQkMAQYgBwEHBCQBEAQTAQUAcQEECQgBBwkPAQYgCQEJBCEBDAQXAQQAcQEECQYBCAkMAQogCwEKBCABCQQYAQQAcQEECQUBBwkMAQwgDQEJBEABBQBwAQUJBAEJCQgBDiARAQYEQAEEAHEBBAkDASAgEQEHBD8BBABxAQQJAgEYAAUBBCARAQcEPwEEAHEBBAkBAQYAAgEPAAcBBCAQAQcEQAEFAHABCgAFAQsACAEFIBABBAREAQQAcAEJABkBBCARAQQERAEEAHABCAAaAQQgEAEFBEQBBABwAQcAGwEEIBABBARFAQQAcQEFABwBBCAPAQUERQEFAHEBAwAdAQQgDwEEBEcBBACRAQQgDwEEBEcBBACRAQUgDgEEBEcBBACSAQYgCwEFBEcBBACSAQggBwEGBEgBBACTARQESAEFAJMBEgRKAQQAlgEPBEoBBACYAQ0ESgEEAKEBBARKAQUAoAEEBEsBBACgAQQESwEEAKABBARLAQQAoAEEBEsBBACgAQQESwEEAJ8BBQRLAQQAnwEEBEwBBACfAQQETAEEAJ8BBARMAQQAnwEEBEwBBACeAQUETAEEAJ4BBARNAQQAngEEBE0BBACdAQUETQEEAJ0BBAROAQQAnQEEBE4BBACdAQQETgEEAJwBBQROAQQAnAEEBE8BBACbAQUETwEEAJsBBARQAQQAmwEEBFABBACbAQQEUAEEAJoBBQRQAQQAmgEEBFEBBACaAQQEUQEEAJkBBQRRAQQAmQEEBFIBBACZAQQEUgEEAJgBBQRSAQQAmAEEBFMBBACXAQUEUwEEAJcBBARUAQQAlwEEBFQBBACWAQUEVAEEAJYBBARVAQQAlQEFBFUBBACUAQUEVgEEAJQBBARWAQUAkwEFBFYBBACUAQQEVwEEAJMBBQRXAQQAkgEFBFgBBACSAQQEWQEEAJIBBARZAQQAkQEFBFkBBACRAQQEWQEFAJABBQRZAQQAkQEEBFoBBACQAQUEWgEEAI8BBgRaAQQAjwEFBFsBBACPAQQEXAEEAI4BBQRcAQQAjQEGBFwBBQCMAQUEXgEEAIsBBQRfAQQAiwEEBGABBACKAQUEYAEFAIgBBQRiAQQAhwEGBGIBBQCGAQUEZAEEAIUBBQRlAQUAhAEEBGYBBQCDAQUEZwEEAIIBBQRoAQUAgQEEBGoBBQB/AQUEawEFAH0BBQRtAQQAfQEEBG4BBQB7AQUEbgEHAHgBBQRwAQcAdwEFBHIBBgB2AQQEdAEGAHQBBQR2AQcAcQEEBHgBBwBwAQQEeQEHAG4BBQR6AQgAbAEEBH0BBwBrAQQEfgEHAGkBBQSAAQYAaAEEBIMBBQBnAQQEhAEFAGUBBQSFAQUAZAEEBIcBBgBiAQQEiAEGAGEBBASJAQYAYAEEBIoBBgBeAQUEjAEGAFwBBASOAQYAWgEFBI8BBgBZAQQEkQEGAFgBBASTAQUAVwEEBJQBBQBVAQUElQEFAFQBBASXAQQAVAEEBJcBBgBSAQQEmAEGAFABBQSYARIARAEEBJoBFwA+AQQEmwEbADkBBAScARwANwEEBKoBEAA1AQQEsAEMADMBBAS1AQgAMgEEBLcBBwAxAQQEuQEHAC8BBAS7AQYALgEEBLwBBwAsAQQEvQEHACsBBAS/AQcAKQEEBMABBwAoAQQEwgEGACcBBATDAQYAJgEEBMQBBgAlAQQExgEFACQBBQTGAQQAJQEEBMYBBQAkAQQExwEEACQBBATHAQUAIwEFBMcBCQAfAQQExwEMABwBBATIAQwAGwEFBMgBDAAbAQQEzgEHABoBBATRAQUAGQEFBNEBBgAXAQUE0gEGABcBBATTAQYAFgEFBNMBBQAXAQQE1AEFABYBBQTUAQUAFQEFBNUBBAAWAQQE1QEFABUBBQTVAQUAFAEFBNYBBg==","scale":1}
squint:{"type":"canvas","size":[244,239],"pos":[168,143],"locked":1,"image":"%%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nAEFBE8BBACcAQQEUAEEAJwBBARQAQQAnAEEBFABBACbAQUEUAEEAJsBBARRAQQAmwEEBFEBBACaAQUEUQEEAJoBBARSAQQAmgEEBFIBBACZAQUEUgEEAJkBBARTAQQAmAEFBFMBBACYAQQEVAEEAJgBBARUAQQAlwEFBFQBBACXAQQEVQEEAJYBBQRVAQQAlQEFBFYBBACVAQQEVgEFAJQBBQRWAQQAlQEEBFcBBACUAQUEVwEEAJMBBQRYAQQAkwEEBFkBBACTAQQEWQEEAJIBBQRZAQQAkgEEBFkBBQCRAQUEWQEEAJIBBARaAQQAkQEFBFoBBACQAQYEWgEEAJABBQRbAQQAkAEEBFwBBACPAQUEXAEEAI4BBgRcAQUAjQEFBF4BBACMAQUEXwEEAIwBBARgAQQAiwEFBGABBQCJAQUEYgEEAIgBBgRiAQUAhwEFBGQBBACGAQUEZQEFAIUBBARmAQUAhAEFBGcBBACDAQUEaAEFAIIBBARqAQUAgAEFBGsBBQB+AQUEbQEEAH4BBARuAQUAfAEFBG4BBwB5AQUEcAEHAHgBBQRyAQYAdwEEBHQBBgB1AQUEdgEHAHIBBAR4AQcAcQEEBHkBBwBvAQUEegEIAG0BBAR9AQcAbAEEBH4BBwBqAQUEgAEGAGkBBASDAQUAaAEEBIQBBQBmAQUEhQEFAGUBBASHAQYAYwEEBIgBBgBiAQQEiQEGAGEBBASKAQYAXwEFBIwBBgBdAQQEjgEGAFsBBQSPAQYAWgEEBJEBBgBZAQQEkwEFAFgBBASUAQUAVgEFBJUBBQBVAQQElwEEAFUBBASXAQYAUwEEBJgBBgBRAQUEmAESAEUBBASaARcAPwEEBJsBGwA6AQQEnAEcADgBBASqARAANgEEBLABDAA0AQQEtQEIADMBBAS3AQcAMgEEBLkBBwAwAQQEuwEGAC8BBAS8AQcALQEEBL0BBwAsAQQEvwEHACoBBATAAQcAKQEEBMIBBgAoAQQEwwEGACcBBATEAQYAJgEEBMYBBQAlAQUExgEEACYBBATGAQUAJQEEBMcBBAAlAQQExwEFACQBBQTHAQkAIAEEBMcBDAAdAQQEyAEMABwBBQTIAQwAHAEEBM4BBwAbAQQE0QEFABoBBQTRAQYAGAEFBNIBBgAYAQQE0wEGABcBBQTTAQUAGAEEBNQBBQAXAQUE1AEFABYBBQTVAQQAFwEEBNUBBQAWAQUE1QEFABUBBQTWAQY=","scale":1}

{card:pippi}
{widgets}
neutral:{"type":"canvas","size":[248,162],"pos":[11,30],"locked":1,"border":1,"image":"%%IMG2APgAogBNAQMACAEDAOkBBQAGAQUA5wEHAAUBBgAIAQEA3QEDIAEBAwAFAQcABgEIANcBAyABAQMABAEDIAIBAwAGAQsA1AEDIAIBAwADAQMgAgEDAAYBDADTAQMgAgEDAAMBAyADAQMABQENANIBAyADAQMAAgEDIAMBAwAFAQMgAwEIANEBAyADAQMAAgEDIAMBAwAFAQMgBwEFANABAyAEAQMAAQEDIAMBAwAFAQMgCAEFAM8BAyAEAQMAAQEDIAQBAwAEAQMgCQEFAM4BAyAFAQYgBAEDAAQBAyAJAQUAzgEDIAUBBiAEAQMABAEDIAoBBADOAQMgBgEFIAQBAwAEAQMgCgEFAM0BAyAHAQUgBAEDAAMBAyALAQUAoQEkAAcBAyAIAQQgBAEDAAMBAyALAQoAlwEtAAMBBCAIAQMgBQEDAAIBAyAMAQsAkgE3IAkBAyAEAQMAAgEDIA0BCwCOATogCQEDIAQBAwACAQMgDQEMAIoBDw0iAQ0gCAEDIAUBAwABAQMgDQEFIAIBBQCIAQ0NGgEZIAkBASAGAQMAAQEDIA4BAyAEAQQAhgELDR0BGyAQAQYgFQEEAIUBCQ0eAQkNEQEDIBEBBSAVAQQAgwEJDR8BCA0OAQggEgEEIBUBBQCAAQgNIQEGDRABCSATAQMgFgEEAH8BCA0hAQYNEAEJIBUBASAXAQQAfgEHDSIBBA0TAQMgMwEEAHwBBw0jAQQNEwEDIDQBBQB6AQcNIwEEDRQBAyA1AQQAeQEGDSQBBA0UAQQgNQEFAHcBBg0kAQQNFQEOICwBBQB2AQUNJAEEDRYBHCAfAQUAdAEFDSQBBA0XASAgHAEGAHEBBQ0kAQQNGQEEDQkBFSAaAQYAcAEEDSQBBQ0aAQINGAEJIBkBBwBuAQQNIwEFDTkBByAYAQgAbAEDDSQBBA09AQYgFwEKAGkBAw0jAQUNPwEFIBgBDQBkAQINIwEFDUIBBSAYAQ0AYgECDSIBBQ1FAQYgFgENAGEBAg0iAQQNRwEGIBkBCQBhAQENIgEFDUkBBSAcAQUAYQ0iAQUNTQEDIBwBBABhDSEBBQ1OAQQgGwEFAGANIAEFDVABBCAbAQUAXw0gAQQNUgEEIBsBBABfDR8BBQ1UAQMgGgEEAF8NHwEEDVYBBCAYAQUAXg0eAQUNVwEEIBcBBgBdDR4BBA1ZAQQgFgEIAFsNHgEEDT8BCg0SAQMgFQELAFgNHgEEDTIBGw0PAQMgFQELAFcNHQEFDS4BIg0NAQMgFQEMAFUNGQEJDSkBKQ0MAQMgFgEMAFMNGAEJDSkBGCAIAQsNDAEDIBkBCgBRDRcBCQ0oAQcgAQEFIBkBCQ0KAQMgGwELAE4NFgEIDSkBBSAfAQQgAgEHDQoBAyAbAQwATA0VAQYNKgEFICABBiADAQYNAgELIBoBDQBLDRUBBQ0qAQQgEQEGIAwBBiADARMgGgEOAEkNFQEEDSoBBCAPAQ8gCQEEIAMBEyAaAQQNAwEIAEcNFAEFDSkBAyAOARUgBwEEIAMBEiAaAQQNBAEIAEYNFAEEDSoBAyANARkgBgEBIAYBBSAFAQggBAECIAgBByADAQQNBQEIAEUNFAEEDSkBAyAOARogFwEIIAIBBSAFAQogAQEEDQcBCQBCDRQBBA0oAQMgDwEDIAMBFyAVAQkAAQEHIAMBDg0KAQsAPQ0TAQUNKAEDIA8BAyADARggFQEKAAEBBiACAQMgAwEJDQoBDgA5DRMBBA0oAQQgDwEDIAMBGSAVAQMgAgEGAAEBAyACAQQgBgEIDQkBEAA2DRMBBA0oAQMgEAEDIAMBGiAaAQYgBQEDIAoBBg0KAQ8ANQ0SAQUNKAEDIBABBCACARkgHgELIA0BBQ0OAQoANA0SAQQNKQEGIA4BAyACARggIQEIIA8BBQ0RAQgAMg0SAQQNKgEGIA0BAyACARcgIwEGIBEBBQ0TAQYAMQ0SAQQNLAEGIAsBAyADARYgPQEFDREBBwAvDRIBBA0uAQYgCQEEIAMBFCA/AQUNEQEHAC4NEgEEDS8BBiAJAQQgAwESIEEBBQ0SAQYALQ0SAQQNMQEFIAoBBCACARAgRAEEDRIBBwArDRIBBA0vAQcgCwEUIEcBAw0TAQYAKg0SAQQNLQEIIA0BEiBJAQMNEwEHACgNEgEEDSkBCSARAQ0gBQEDIEUBAw0UAQcAJw0SAQQNJwEIICUBBSAfAQ4gGAEDDRUBBwAlDRIBBA0mAQcgHAEPIB0BGyAOAQMNFgEHACQNEgEEDSYBBCAeAQ4gHAEkIAgBBA0XAQcAIg0SAQQNJQEDICEBCyAdAQggDQEVIAQBAw0YAQcAIQ0SAQQNJAEEIEgBBiAZARMNGgEGACANEgEEDSQBBCBJAQEgGQEXDRsBBgAfDRIBBQ0jAQQgXQEdDR0BBQAeDRIBBQ0iAQUgUgEhDQQBAg0fAQUAHQ0TAQMNIwEEIFEBHQ0sAQUAHA05AQQgTgEBIAEBHQ0uAQUAGw05AQQgTQEHIAsBDA0xAQUAGg05AQQgTQEFIA4BCg0zAQUAGQ05AQQgSQEJIA8BBQ04AQUAGA05AQQgSAELIA4BBQ05AQUAFw05AQUgRgEGIAMBBCAOAQQNOgEFABYNOQEFIEcBAiAHAQQgDQEFDToBBAAWDToBBSAnAQYgIwEEIA0BBQ05AQUAFQ07AQQgJgEIICMBBCAMAQUNOgEEABUNOwEFICQBCiAkAQMgDAEEDToBBQAUDTwBBCAjAQQNBAEDICUBAyALAQQNOwEFABMNPAEFICEBAw0GAQMgJgEDIAoBBA08AQUAEg09AQUgHwEDDQcBAyAnAQMgCQEEDT0BBQARDT4BBiAcAQMNCAEDICgBAyAIAQQNPgEEABENPwEGIBsBAw0IAQMgKAEDIAgBBA0+AQUAEA1AAQYgGgEDDQgBAyApAQMgAwEIDT8BBQAPDUEBByAYAQMNCQEDICgBDg1AAQUADg1DAQYgFwEDDQkBAyAoAQ0NQgEFAA0NRAEHIBQBBA0KAQMgJwEMDUQBBAANDUUBCyAPAQQNCgEDICcBCw1FAQUADA1HAQ4gCgEEDQkBBSAmAQkNSAEFAAsNSAEOIAkBBA0JAQcgCgECIBgBBw1LAQQACw1KAQwgCQEEDQkBCCAFAQcgFwEFDU0BBAALDU8BCCAHAQUNCgEUIBYBBQ1NAQQACw1TAQUgBQEFDQ0BEyATAQcNTQEFAAoNUwEPDQ4BEiASAQcNTwEEAAoNVAENDRABEiAPAQgNUAEFAAkNVQELDRIBCw0BAQcgCwEKDVEBBAAJDVYBCQ0gAQkgBgELDVIBBQAIDYEBCSACAQsNVQEEAAgNggEUDVYBBAAIDYMBEg1XAQQACA2HAQwNWQEFAAcNiQEHDV0BBAAHDe0BBAAHDe0BBAAHDe0BBAAHDe0BBAAHDe0BBAAHDe0BBAAHDe0BBAAHDe0BBAAHDe0BBAAHDewBBQAHDewBBAAIDewBBAAIDewBBAAIDewBBAAIDewBBAAIDesBBQAIDesBBAAJDeoBBQAJDeoBCwADDekBDQACDekBDQACDeoBDQABDfMBBAABDfMBBAABDfMBBAABDfMBBAABDfMBBAABDfMBBAABDfMBBQ30AQQN9AEEDfQBBA30AQQN9AEEDfQBBA30AQQN9AEEDfQBBA30AQQN9AEEDfMBBQ3zAQQAAQ==","scale":1}
squint:{"type":"canvas","size":[248,162],"pos":[8,169],"locked":1,"image":"%%IMG2APgAogBNAQMACAEDAOkBBQAGAQUA5wEHAAUBBgAIAQEA3QEDIAEBAwAFAQcABgEIANcBAyABAQMABAEDIAIBAwAGAQsA1AEDIAIBAwADAQMgAgEDAAYBDADTAQMgAgEDAAMBAyADAQMABQENANIBAyADAQMAAgEDIAMBAwAFAQMgAwEIANEBAyADAQMAAgEDIAMBAwAFAQMgBwEFANABAyAEAQMAAQEDIAMBAwAFAQMgCAEFAM8BAyAEAQMAAQEDIAQBAwAEAQMgCQEFAM4BAyAFAQYgBAEDAAQBAyAJAQUAzgEDIAUBBiAEAQMABAEDIAoBBADOAQMgBgEFIAQBAwAEAQMgCgEFAM0BAyAHAQUgBAEDAAMBAyALAQUAoQEkAAcBAyAIAQQgBAEDAAMBAyALAQoAlwEtAAMBBCAIAQMgBQEDAAIBAyAMAQsAkgE3IAkBAyAEAQMAAgEDIA0BCwCOATogCQEDIAQBAwACAQMgDQEMAIoBDw0iAQ0gCAEDIAUBAwABAQMgDQEFIAIBBQCIAQ0NGgEZIAkBASAGAQMAAQEDIA4BAyAEAQQAhgELDR0BGyAQAQYgFQEEAIUBCQ0eAQkNEQEDIBEBBSAVAQQAgwEJDR8BCA0OAQggEgEEIBUBBQCAAQgNIQEGDRABCSATAQMgFgEEAH8BCA0hAQYNEAEJIBUBASAXAQQAfgEHDSIBBA0TAQMgMwEEAHwBBw0jAQQNEwEDIDQBBQB6AQcNIwEEDRQBAyA1AQQAeQEGDSQBBA0UAQQgNQEFAHcBBg0kAQQNFQEOICwBBQB2AQUNJAEEDRYBHCAfAQUAdAEFDSQBBA0XASAgHAEGAHEBBQ0kAQQNGQEEDQkBFSAaAQYAcAEEDSQBBQ0aAQINGAEJIBkBBwBuAQQNIwEFDTkBByAYAQgAbAEDDSQBBA09AQYgFwEKAGkBAw0jAQUNPwEFIBgBDQBkAQINIwEFDUIBBSAYAQ0AYgECDSIBBQ1FAQYgFgENAGEBAg0iAQQNRwEGIBkBCQBhAQENIgEFDUkBBSAcAQUAYQ0iAQUNTQEDIBwBBABhDSEBBQ1OAQQgGwEFAGANIAEFDVABBCAbAQUAXw0gAQQNUgEEIBsBBABfDR8BBQ1UAQMgGgEEAF8NHwEEDVYBBCAYAQUAXg0eAQUNVwEEIBcBBgBdDR4BBA1ZAQQgFgEIAFsNHgEEDT8BCg0SAQMgFQELAFgNHgEEDTIBGw0PAQMgFQELAFcNHQEFDS4BIg0NAQMgFQEMAFUNGQEJDSkBKQ0MAQMgFgEMAFMNGAEJDSkBGCAIAQsNDAEDIBkBCgBRDRcBCQ0oAQcgAQEFIBkBCQ0KAQMgGwELAE4NFgEIDSkBBSAfAQQgAgEHDQoBAyAbAQwATA0VAQYNKgEFICABBiADAQYNAgELIBoBDQBLDRUBBQ0qAQQgIwEGIAMBEyAaAQ4ASQ0VAQQNKgEEICcBBCADARMgGgEEDQMBCABHDRQBBQ0pAQMgKgEEIAMBEiAaAQQNBAEIAEYNFAEEDSoBAyAsAQEgBgEFIAUBCCAEAQIgCAEHIAMBBA0FAQgARQ0UAQQNKQEDID8BCCACAQUgBQEKIAEBBA0HAQkAQg0UAQQNKAEDIEEBCQABAQcgAwEODQoBCwA9DRMBBQ0oAQMgQgEKAAEBBiACAQMgAwEJDQoBDgA5DRMBBA0oAQQgQwEDIAIBBgABAQMgAgEEIAYBCA0JARAANg0TAQQNKAEDIBMBASAaAQEgGwEGIAUBAyAKAQYNCgEPADUNEgEFDSgBAyASAQQgFwEDIB0BCyANAQUNDgEKADQNEgEEDSkBBiAQAQYgFAEEIB4BCCAPAQUNEQEIADINEgEEDSoBBiAQAQkgEQEEIB4BBiARAQUNEwEGADENEgEEDSwBBiAQAR0gNwEFDREBBwAvDRIBBA0uAQYgEAEbIDgBBQ0RAQcALg0SAQQNLwEGIBQBFSA6AQUNEgEGAC0NEgEEDTEBBSBkAQQNEgEHACsNEgEEDS8BByBmAQMNEwEGACoNEgEEDS0BCCBoAQMNEwEHACgNEgEEDSkBCSAjAQMgRQEDDRQBBwAnDRIBBA0nAQggJQEFIB8BDiAYAQMNFQEHACUNEgEEDSYBByAcAQ8gHQEbIA4BAw0WAQcAJA0SAQQNJgEEIB4BDiAcASQgCAEEDRcBBwAiDRIBBA0lAQMgIQELIB0BKiAEAQMNGAEHACENEgEEDSQBBCBIAQYgBwElDRoBBgAgDRIBBA0kAQQgSQEBIBkBFw0bAQYAHw0SAQUNIwEEIF0BHQ0dAQUAHg0SAQUNIgEFIFIBIQ0EAQINHwEFAB0NEwEDDSMBBCBRAR0NLAEFABwNOQEEIE4BASABAR0NLgEFABsNOQEEIE0BByALAQwNMQEFABoNOQEEIE0BBSAOAQoNMwEFABkNOQEEIEkBCSAPAQUNOAEFABgNOQEEIEgBCyAOAQUNOQEFABcNOQEFIEYBBiADAQQgDgEEDToBBQAWDTkBBSBHAQIgBwEEIA0BBQ06AQQAFg06AQUgJwEGICMBBCANAQUNOQEFABUNOwEEICYBCCAjAQQgDAEFDToBBAAVDTsBBSAkAQogJAEDIAwBBA06AQUAFA08AQQgIwEEDQQBAyAlAQMgCwEEDTsBBQATDTwBBSAhAQMNBgEDICYBAyAKAQQNPAEFABINPQEFIB8BAw0HAQMgJwEDIAkBBA09AQUAEQ0+AQYgHAEDDQgBAyAoAQMgCAEEDT4BBAARDT8BBiAbAQMNCAEDICgBAyAIAQQNPgEFABANQAEGIBoBAw0IAQMgKQEDIAMBCA0/AQUADw1BAQcgGAEDDQkBAyAoAQ4NQAEFAA4NQwEGIBcBAw0JAQMgKAENDUIBBQANDUQBByAUAQQNCgEDICcBDA1EAQQADQ1FAQsgDwEEDQoBAyAnAQsNRQEFAAwNRwEOIAoBBA0JAQUgJgEJDUgBBQALDUgBDiAJAQQNCQEHIAoBAiAYAQcNSwEEAAsNSgEMIAkBBA0JAQggBQEHIBcBBQ1NAQQACw1PAQggBwEFDQoBFCAWAQUNTQEEAAsNUwEFIAUBBQ0NARMgEwEHDU0BBQAKDVMBDw0OARIgEgEHDU8BBAAKDVQBDQ0QARIgDwEIDVABBQAJDVUBCw0SAQsNAQEHIAsBCg1RAQQACQ1WAQkNIAEJIAYBCw1SAQUACA2BAQkgAgELDVUBBAAIDYIBFA1WAQQACA2DARINVwEEAAgNhwEMDVkBBQAHDYkBBw1dAQQABw3tAQQABw3tAQQABw3tAQQABw3tAQQABw3tAQQABw3tAQQABw3tAQQABw3tAQQABw3tAQQABw3sAQUABw3sAQQACA3sAQQACA3sAQQACA3sAQQACA3sAQQACA3rAQUACA3rAQQACQ3qAQUACQ3qAQsAAw3pAQ0AAg3pAQ0AAg3qAQ0AAQ3zAQQAAQ3zAQQAAQ3zAQQAAQ3zAQQAAQ3zAQQAAQ3zAQQAAQ3zAQUN9AEEDfQBBA30AQQN9AEEDfQBBA30AQQN9AEEDfQBBA30AQQN9AEEDfQBBA3zAQUN8wEEAAE=","scale":1}
alert:{"type":"canvas","size":[225,293],"pos":[303,44],"locked":1,"image":"%%[encoded data, 5012 characters]","scale":1}
up:{"type":"canvas","size":[248,162],"pos":[204,172],"locked":1,"image":"%%IMG2APgAogBNAQMACAEDAOkBBQAGAQUA5wEHAAUBBgAIAQEA3QEDIAEBAwAFAQcABgEIANcBAyABAQMABAEDIAIBAwAGAQsA1AEDIAIBAwADAQMgAgEDAAYBDADTAQMgAgEDAAMBAyADAQMABQENANIBAyADAQMAAgEDIAMBAwAFAQMgAwEIANEBAyADAQMAAgEDIAMBAwAFAQMgBwEFANABAyAEAQMAAQEDIAMBAwAFAQMgCAEFAM8BAyAEAQMAAQEDIAQBAwAEAQMgCQEFAM4BAyAFAQYgBAEDAAQBAyAJAQUAzgEDIAUBBiAEAQMABAEDIAoBBADOAQMgBgEFIAQBAwAEAQMgCgEFAM0BAyAHAQUgBAEDAAMBAyALAQUAoQEkAAcBAyAIAQQgBAEDAAMBAyALAQoAlwEtAAMBBCAIAQMgBQEDAAIBAyAMAQsAkgE3IAkBAyAEAQMAAgEDIA0BCwCOATogCQEDIAQBAwACAQMgDQEMAIoBDw0iAQ0gCAEDIAUBAwABAQMgDQEFIAIBBQCIAQ0NGgEZIAkBASAGAQMAAQEDIA4BAyAEAQQAhgELDR0BGyAQAQYgFQEEAIUBCQ0eAQkNEQEDIBEBBSAVAQQAgwEJDR8BCA0OAQggEgEEIBUBBQCAAQgNIQEGDRABCSATAQMgFgEEAH8BCA0hAQYNEAEJIBUBASAXAQQAfgEHDSIBBA0TAQMgMwEEAHwBBw0jAQQNEwEDIDQBBQB6AQcNIwEEDRQBAyA1AQQAeQEGDSQBBA0UAQQgNQEFAHcBBg0kAQQNFQEOICwBBQB2AQUNJAEEDRYBHCAfAQUAdAEFDSQBBA0XASAgHAEGAHEBBQ0kAQQNGQEEDQkBFSAaAQYAcAEEDSQBBQ0aAQINGAEJIBkBBwBuAQQNIwEFDTkBByAYAQgAbAEDDSQBBA09AQYgFwEKAGkBAw0jAQUNPwEFIBgBDQBkAQINIwEFDUIBBSAYAQ0AYgECDSIBBQ1FAQYgFgENAGEBAg0iAQQNRwEGIBkBCQBhAQENIgEFDUkBBSAcAQUAYQ0iAQUNTQEDIBwBBABhDSEBBQ1OAQQgGwEFAGANIAEFDVABBCAbAQUAXw0gAQQNUgEEIBsBBABfDR8BBQ1UAQMgGgEEAF8NHwEEDVYBBCAYAQUAXg0eAQUNVwEEIBcBBgBdDR4BBA1ZAQQgFgEIAFsNHgEEDT8BCg0SAQMgFQELAFgNHgEEDTIBGw0PAQMgFQELAFcNHQEFDS4BIg0NAQMgFQEMAFUNGQEJDSkBKQ0MAQMgFgEMAFMNGAEJDSkBGCAIAQsNDAEDIBkBCgBRDRcBCQ0oAQcgAQEFIBkBCQ0KAQMgGwELAE4NFgEIDSkBBSAfAQQgAgEHDQoBAyAbAQwATA0VAQYNKgEFICABBiADAQYNAgELIBoBDQBLDRUBBQ0qAQQgEQEGIAwBBiADARMgGgEOAEkNFQEEDSoBBCAPAQ8gCQEEIAMBEyAaAQQNAwEIAEcNFAEFDSkBAyAOARUgBwEEIAMBEiAaAQQNBAEIAEYNFAEEDSoBAyANARkgBgEBIAYBBSAFAQggBAECIAgBByADAQQNBQEIAEUNFAEEDSkBAyAOAQYgBQEEIAMBCCAXAQggAgEFIAUBCiABAQQNBwEJAEINFAEEDSgBAyAPAQMgCAEEIAYBCCAVAQkgAQEHIAMBDg0KAQsAPQ0TAQUNKAEDIA8BAyAJAQIgCAEIIBUBCiABAQYgAgEDIAMBCQ0KAQ4AOQ0TAQQNKAEEIA8BAyAWAQYgFQEDIAIBBiABAQMgAgEEIAYBCA0JARAANg0TAQQNKAEDIBABAyAYAQUgGgEGIAUBAyAKAQYNCgEPADUNEgEFDSgBAyAQAQMgGQEEIB0BCyANAQUNDgEKADQNEgEEDSkBBiANAQMgGgEDIB8BCCAPAQUNEQEIADINEgEEDSoBBiAMAQMgGQEDICEBBiARAQUNEwEGADENEgEEDSwBBiAGAQEgAwEEIBcBAyA8AQUNEQEHAC8NEgEEDS4BBiADAQMgAgEFIBUBAyA+AQUNEQEHAC4NEgEEDS8BBiACAQMgAwEFIBMBBCA/AQUNEgEGAC0NEgEEDTEBBSABAQMgBAEEIBIBBCBCAQQNEgEHACsNEgEEDS8BByACAQMgBAEEIBABBCBFAQMNEwEGACoNEgEEDS0BCCADAQQgBAEFIA0BBCBHAQMNEwEHACgNEgEEDSkBCSAHAQQgAwEHIAcBByBIAQMNFAEHACcNEgEEDScBCCALAQIgBQEIIAMBCCAkAQ4gGAEDDRUBBwAlDRIBBA0mAQcgFgEOICQBGyAOAQMNFgEHACQNEgEEDSYBBCAcAQkgIwEkIAgBBA0XAQcAIg0SAQQNJQEDICEBBCAJAQMgGAEIIA0BFSAEAQMNGAEHACENEgEEDSQBBCAtAQUgFgEGIBkBEw0aAQYAIA0SAQQNJAEEICIBDyAYAQEgGQEXDRsBBgAfDRIBBQ0jAQQgIQEOIC4BHQ0dAQUAHg0SAQUNIgEFICIBCyAlASENBAECDR8BBQAdDRMBAw0jAQQgUQEdDSwBBQAcDTkBBCBOAQEgAQEdDS4BBQAbDTkBBCBNAQcgCwEMDTEBBQAaDTkBBCBNAQUgDgEKDTMBBQAZDTkBBCBJAQkgDwEFDTgBBQAYDTkBBCBIAQsgDgEFDTkBBQAXDTkBBSBGAQYgAwEEIA4BBA06AQUAFg05AQUgRwECIAcBBCANAQUNOgEEABYNOgEFICcBBiAjAQQgDQEFDTkBBQAVDTsBBCAmAQggIwEEIAwBBQ06AQQAFQ07AQUgJAEKICQBAyAMAQQNOgEFABQNPAEEICMBBA0EAQMgJQEDIAsBBA07AQUAEw08AQUgIQEDDQYBAyAmAQMgCgEEDTwBBQASDT0BBSAfAQMNBwEDICcBAyAJAQQNPQEFABENPgEGIBwBAw0IAQMgKAEDIAgBBA0+AQQAEQ0/AQYgGwEDDQgBAyAoAQMgCAEEDT4BBQAQDUABBiAaAQMNCAEDICkBAyADAQgNPwEFAA8NQQEHIBgBAw0JAQMgKAEODUABBQAODUMBBiAXAQMNCQEDICgBDQ1CAQUADQ1EAQcgFAEEDQoBAyAnAQwNRAEEAA0NRQELIA8BBA0KAQMgJwELDUUBBQAMDUcBDiAKAQQNCQEFICYBCQ1IAQUACw1IAQ4gCQEEDQkBByAKAQIgGAEHDUsBBAALDUoBDCAJAQQNCQEIIAUBByAXAQUNTQEEAAsNTwEIIAcBBQ0KARQgFgEFDU0BBAALDVMBBSAFAQUNDQETIBMBBw1NAQUACg1TAQ8NDgESIBIBBw1PAQQACg1UAQ0NEAESIA8BCA1QAQUACQ1VAQsNEgELDQEBByALAQoNUQEEAAkNVgEJDSABCSAGAQsNUgEFAAgNgQEJIAIBCw1VAQQACA2CARQNVgEEAAgNgwESDVcBBAAIDYcBDA1ZAQUABw2JAQcNXQEEAAcN7QEEAAcN7QEEAAcN7QEEAAcN7QEEAAcN7QEEAAcN7QEEAAcN7QEEAAcN7QEEAAcN7QEEAAcN7AEFAAcN7AEEAAgN7AEEAAgN7AEEAAgN7AEEAAgN7AEEAAgN6wEFAAgN6wEEAAkN6gEFAAkN6gELAAMN6QENAAIN6QENAAIN6gENAAEN8wEEAAEN8wEEAAEN8wEEAAEN8wEEAAEN8wEEAAEN8wEEAAEN8wEFDfQBBA30AQQN9AEEDfQBBA30AQQN9AEEDfQBBA30AQQN9AEEDfQBBA30AQQN8wEFDfMBBAAB","scale":1}
neutral_blink:{"type":"canvas","size":[248,162],"pos":[140,41],"locked":1,"image":"%%IMG2APgAogBNAQMACAEDAOkBBQAGAQUA5wEHAAUBBgAIAQEA3QEDIAEBAwAFAQcABgEIANcBAyABAQMABAEDIAIBAwAGAQsA1AEDIAIBAwADAQMgAgEDAAYBDADTAQMgAgEDAAMBAyADAQMABQENANIBAyADAQMAAgEDIAMBAwAFAQMgAwEIANEBAyADAQMAAgEDIAMBAwAFAQMgBwEFANABAyAEAQMAAQEDIAMBAwAFAQMgCAEFAM8BAyAEAQMAAQEDIAQBAwAEAQMgCQEFAM4BAyAFAQYgBAEDAAQBAyAJAQUAzgEDIAUBBiAEAQMABAEDIAoBBADOAQMgBgEFIAQBAwAEAQMgCgEFAM0BAyAHAQUgBAEDAAMBAyALAQUAoQEkAAcBAyAIAQQgBAEDAAMBAyALAQoAlwEtAAMBBCAIAQMgBQEDAAIBAyAMAQsAkgE3IAkBAyAEAQMAAgEDIA0BCwCOATogCQEDIAQBAwACAQMgDQEMAIoBDw0iAQ0gCAEDIAUBAwABAQMgDQEFIAIBBQCIAQ0NGgEZIAkBASAGAQMAAQEDIA4BAyAEAQQAhgELDR0BGyAQAQYgFQEEAIUBCQ0eAQkNEQEDIBEBBSAVAQQAgwEJDR8BCA0OAQggEgEEIBUBBQCAAQgNIQEGDRABCSATAQMgFgEEAH8BCA0hAQYNEAEJIBUBASAXAQQAfgEHDSIBBA0TAQMgMwEEAHwBBw0jAQQNEwEDIDQBBQB6AQcNIwEEDRQBAyA1AQQAeQEGDSQBBA0UAQQgNQEFAHcBBg0kAQQNFQEOICwBBQB2AQUNJAEEDRYBHCAfAQUAdAEFDSQBBA0XASAgHAEGAHEBBQ0kAQQNGQEEDQkBFSAaAQYAcAEEDSQBBQ0aAQINGAEJIBkBBwBuAQQNIwEFDTkBByAYAQgAbAEDDSQBBA09AQYgFwEKAGkBAw0jAQUNPwEFIBgBDQBkAQINIwEFDUIBBSAYAQ0AYgECDSIBBQ1FAQYgFgENAGEBAg0iAQQNRwEGIBkBCQBhAQENIgEFDUkBBSAcAQUAYQ0iAQUNTQEDIBwBBABhDSEBBQ1OAQQgGwEFAGANIAEFDVABBCAbAQUAXw0gAQQNUgEEIBsBBABfDR8BBQ1UAQMgGgEEAF8NHwEEDVYBBCAYAQUAXg0eAQUNVwEEIBcBBgBdDR4BBA1ZAQQgFgEIAFsNHgEEDT8BCg0SAQMgFQELAFgNHgEEDTIBGw0PAQMgFQELAFcNHQEFDS4BIg0NAQMgFQEMAFUNGQEJDSkBKQ0MAQMgFgEMAFMNGAEJDSkBGCAIAQsNDAEDIBkBCgBRDRcBCQ0oAQcgAQEFIBkBCQ0KAQMgGwELAE4NFgEIDSkBBSAfAQQgAgEHDQoBAyAbAQwATA0VAQYNKgEFICABBiADAQYNAgELIBoBDQBLDRUBBQ0qAQQgIwEGIAMBEyAaAQ4ASQ0VAQQNKgEEIA8BCSAPAQQgAwETIBoBBA0DAQgARw0UAQUNKQEDIA4BFSAHAQQgAwESIBoBBA0EAQgARg0UAQQNKgEDIA0BGSAGAQEgBgEFIAUBCCAEAQIgCAEHIAMBBA0FAQgARQ0UAQQNKQEDIA4BBiABARMgFwEIIAIBBSAFAQogAQEEDQcBCQBCDRQBBA0oAQMgDwEDIAIBASAPAQggFQEJAAEBByADAQ4NCgELAD0NEwEFDSgBAyAPAQMgAgEBIBMBBSAVAQoAAQEGIAIBAyADAQkNCgEOADkNEwEEDSgBBCAPAQMgAgEBIBQBBSAVAQMgAgEGAAEBAyACAQQgBgEIDQkBEAA2DRMBBA0oAQMgEAEDIAIBASAVAQUgGgEGIAUBAyAKAQYNCgEPADUNEgEFDSgBAyAQAQQgAgEBIBMBBCAfAQsgDQEFDQ4BCgA0DRIBBA0pAQYgDgEDIAIBASATAQMgIgEIIA8BBQ0RAQgAMg0SAQQNKgEGIA0BAyADAQEgEQEEICMBBiARAQUNEwEGADENEgEEDSwBBiALAQQgAwEBIA8BBCA+AQUNEQEHAC8NEgEEDS4BBiAKAQQgAwEBIAwBBSBAAQUNEQEHAC4NEgEEDS8BBiALAQQgAgEBIAkBBiBCAQUNEgEGAC0NEgEEDTEBBSALAQggBAEIIEUBBA0SAQcAKw0SAQQNLwEHIAwBEiBIAQMNEwEGACoNEgEEDS0BCCAOAQ0gTQEDDRMBBwAoDRIBBA0pAQkgIwEDIEUBAw0UAQcAJw0SAQQNJwEIICUBBSAfAQ4gGAEDDRUBBwAlDRIBBA0mAQcgHAEPIB0BGyAOAQMNFgEHACQNEgEEDSYBBCAeAQ4gHAEkIAgBBA0XAQcAIg0SAQQNJQEDICEBCyAdAQggDQEVIAQBAw0YAQcAIQ0SAQQNJAEEIEgBBiAZARMNGgEGACANEgEEDSQBBCBJAQEgGQEXDRsBBgAfDRIBBQ0jAQQgXQEdDR0BBQAeDRIBBQ0iAQUgUgEhDQQBAg0fAQUAHQ0TAQMNIwEEIFEBHQ0sAQUAHA05AQQgTgEBIAEBHQ0uAQUAGw05AQQgTQEHIAsBDA0xAQUAGg05AQQgTQEFIA4BCg0zAQUAGQ05AQQgSQEJIA8BBQ04AQUAGA05AQQgSAELIA4BBQ05AQUAFw05AQUgRgEGIAMBBCAOAQQNOgEFABYNOQEFIEcBAiAHAQQgDQEFDToBBAAWDToBBSAnAQYgIwEEIA0BBQ05AQUAFQ07AQQgJgEIICMBBCAMAQUNOgEEABUNOwEFICQBCiAkAQMgDAEEDToBBQAUDTwBBCAjAQQNBAEDICUBAyALAQQNOwEFABMNPAEFICEBAw0GAQMgJgEDIAoBBA08AQUAEg09AQUgHwEDDQcBAyAnAQMgCQEEDT0BBQARDT4BBiAcAQMNCAEDICgBAyAIAQQNPgEEABENPwEGIBsBAw0IAQMgKAEDIAgBBA0+AQUAEA1AAQYgGgEDDQgBAyApAQMgAwEIDT8BBQAPDUEBByAYAQMNCQEDICgBDg1AAQUADg1DAQYgFwEDDQkBAyAoAQ0NQgEFAA0NRAEHIBQBBA0KAQMgJwEMDUQBBAANDUUBCyAPAQQNCgEDICcBCw1FAQUADA1HAQ4gCgEEDQkBBSAmAQkNSAEFAAsNSAEOIAkBBA0JAQcgCgECIBgBBw1LAQQACw1KAQwgCQEEDQkBCCAFAQcgFwEFDU0BBAALDU8BCCAHAQUNCgEUIBYBBQ1NAQQACw1TAQUgBQEFDQ0BEyATAQcNTQEFAAoNUwEPDQ4BEiASAQcNTwEEAAoNVAENDRABEiAPAQgNUAEFAAkNVQELDRIBCw0BAQcgCwEKDVEBBAAJDVYBCQ0gAQkgBgELDVIBBQAIDYEBCSACAQsNVQEEAAgNggEUDVYBBAAIDYMBEg1XAQQACA2HAQwNWQEFAAcNiQEHDV0BBAAHDe0BBAAHDe0BBAAHDe0BBAAHDe0BBAAHDe0BBAAHDe0BBAAHDe0BBAAHDe0BBAAHDe0BBAAHDewBBQAHDewBBAAIDewBBAAIDewBBAAIDewBBAAIDewBBAAIDesBBQAIDesBBAAJDeoBBQAJDeoBCwADDekBDQACDekBDQACDeoBDQABDfMBBAABDfMBBAABDfMBBAABDfMBBAABDfMBBAABDfMBBAABDfMBBQ30AQQN9AEEDfQBBA30AQQN9AEEDfQBBA30AQQN9AEEDfQBBA30AQQN9AEEDfMBBQ3zAQQAAQ==","scale":1}

{card:eggbug}
image:"%%[encoded data, 4132 characters]"
{widgets}
buggo1:{"type":"contraption","size":[154,140],"pos":[22,37],"def":"buggo","widgets":{"lwing":{"image":"%%IMG2AHoAegD/AP8A/wD/AHgBBABtARAAAQECAGMBGgBfAQYADgEIAF0BBAAWAQUAWwEEABcBBQBZAQQAGgEEAFgBAwAcAQQAVwECAB4BAwBWAQMAHgEEAFUBAwAfAQMAVQEDAB8BAwBVAQMAIAEDAFQBAwAgAQMAVAEEAB8BAwBUAQQAHwEDAFUBAwAfAQMAVQEEAB4BAwBWAQMAHwEDAFYBAwAgAQMAVAEEAB8BAwBVAQMAHwEDAFYBAwAeAQMAVgEDAB4BAwBWAQQAHQEDAFcBAwAdAQMAVwEDABwBBABXAQQAGwEDAFkBBAAaAQMAWgEEABkBAwBaAQQAGQEDAFsBBAAYAQMAWwEEABgBAwBdAQMAFwEDAF0BBAAWAQMAXgEDABYBAwBgAQMAFgEDAF4BBAAUAQMAYQEDABMBAwBhAQQAEgEDAGIBBAAQAQQAYwEDABABAwBkAQMAEAEDAGQBBAAPAQMAZQEDAA4BAwBmAQQADQEDAGcBAwANAQMAaAEDAA0BAQBpAQQAdwEEAHcBAwB4AQMAdwEEAHcBAgD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AIA="},"body":{},"rwing":{"image":"%%IMG2AHoAegD/AP8A/wD/AP8A/wD/AP8A/wD/AOABAwB0AQ0AagETAGUBCQACAQsAYwEHAAwBBgBfAQUAAQEBABABBQBdAQUAFQEDAFwBBAAYAQQAWAEGABoBAwBWAQYAGwEEAFUBAwAfAQQAUgEDACEBBABRAQMAIwEEAE4BBAAmAQIATgEDACcBAwBNAQMAKAEDAEwBAwAoAQMASwEEACcBBABLAQMAKAEDAEsBBAAoAQMASwEEACgBAwBKAQQAKQEDAEoBAwApAQQASgEDACkBBABJAQMAKQEEAEgBAwApAQQASQEDACoBAwBKAQMAKQEEAEoBAwAnAQEAAQEDAEoBAwAmAQYASwEDACMBCABMAQMAIQEHAE8BAwAgAQYAUQEDAB4BBgBSAQMAGwEBAAEBBwBTAQMAGQEIAFYBAwAXAQkAWAEBABQBAQABAQYAAQECAGwBCgBrAQIAAQEKAGcBAQACAQ4AZgEPAGoBCgACAQIAbQEHAP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD8"},"rw":{},"lw":{},"legs":{"image":"%%IMG2AHAAIADRAQYAaQEJAGgBCQBsAQUAbQEEAG0BBABuAQMAUwEFABUBBAAIAQIARwEHABUBAwAGAQUARwEHABUBAQAGAQUATAEEABoBBQBPAQMAGAEEAFEBBAAXAQMAUwEEABYBAwBUAQMAFgEDAFQBBAAVAQMANwEDABsBAwAWAQEANwEFABoBAwBPAQUAGQEDAFEBBAAYAQMAUgEEABgBAQBUAQQAbQEEAG0BBABtAQMAbQEDAG4BAwBtAQMAbQEDAG4BAQCa"},"lg":{},"face":{},"emote":{"value":"neutral"},"faces":{}}}

{card:stage}
image:"%%[encoded data, 29196 characters]"

{module:pt}
description:"Display and animate sprites for visual novels."
version:1.1
{script}

local FRONT:999999  # foremost (reasonable) widget index
local DELAY:30      # default delay in frames
local host  :0      # the deck
local target:0      # the (current) target card
local talk_enable:0 # should we be animating 'talking' puppets currently?

on eval_snippet x do eval[x () 1] end
on tween a b t    do (b*t)+(a*1-t) end
on blink_interval do 150+random[150] end

#######################################
#
#  State Management
#
#######################################

on get_charsheet name do
 host.cards[name]
end

on get_state_name name do
 "%s_pstate" format name
end

on puppet_names do
 extract where target.widgets @ get_state_name @ value from keys target.widgets
end

on init_puppet name do
 sheet:get_charsheet[name]
 if !name in target.widgets
  if "contraption"~typeof first sheet.widgets
   pc:first target.paste[sheet.copy[first sheet.widgets]]
   pc.name:name
  else
   pc:target.add["canvas" name]
   pc.border:0
   pc.locked:1
   pc.animated:1
   pc.script:"
    on view do
     pt.animate[deck me.name]
    end
   "
  end
  pc.show:"transparent"
  target.widgets.dd_overlay.index:FRONT
 end
 sname:get_state_name[name]
 if !sname in target.widgets
  ps:target.add["field" sname]
  ps.show:"none"
  s:()
  s.emote:first keys sheet.widgets
  s.hflip:0
  s.pos:"center"
  s.blink:blink_interval[]
  ps.data:s
 end
end

on get_puppet name do
 init_puppet[name]
 r:target.widgets[get_state_name[name]].data
 r.wid:target.widgets[name]
 r.name:name
 r
end

on set_puppet state do
 init_puppet[state.name]
 target.widgets[get_state_name[state.name]].data:("wid","name") drop state
end

#######################################
#
#  Presentation
#
#                                offtop
#               +------------------------------------------+
#    offtopleft | topleft          top            topright | offtopright
#               |                                          |
# offcenterleft | centerleft      center       centerright | offcenterright
#               |                                          |
#       offleft | left            bottom             right | offright
#               +------------------------------------------+
#                 offbottomleft  offbottom  offbottomright
#
#######################################

positions:raze insert key value with
 "center"         on center         c do .5*target.size-c.size end
 "offcenterleft"  on offcenterleft  c do (first -c.size           ),(.5*last target.size-c.size) end
 "centerleft"     on centerleft     c do (0                       ),(.5*last target.size-c.size) end
 "centerright"    on centerright    c do (first target.size-c.size),(.5*last target.size-c.size) end
 "offcenterright" on offcenterright c do (first target.size       ),(.5*last target.size-c.size) end
 "offtopleft"     on offtopleft     c do (first -c.size    ),0 end
 "offtopright"    on offtopright    c do (first target.size),0 end
 "topleft"        on topleft        c do (0                          ),0 end
 "offtop"         on offtop         c do (.5*first target.size-c.size),(last -c.size) end
 "top"            on top            c do (.5*first target.size-c.size),0 end
 "topright"       on topright       c do (   first target.size-c.size),0 end
 "offleft"        on offleft        c do (   first            -c.size),(last target.size-c.size) end
 "left"           on left           c do (0                          ),(last target.size-c.size) end
 "bottom"         on bottom         c do (.5*first target.size-c.size),(last target.size-c.size) end
 "right"          on right          c do (   first target.size-c.size),(last target.size-c.size) end
 "offright"       on offright       c do (   first target.size       ),(last target.size-c.size) end
 "offbottomleft"  on offbottomleft  c do (0                          ),(last target.size       ) end
 "offbottom"      on offbottom      c do (.5*first target.size-c.size),(last target.size       ) end
 "offbottomright" on offbottomright c do (   first target.size-c.size),(last target.size       ) end
end

on get_pos canv pos do
 if pos in positions # predefined position
  positions[pos][canv]
 elseif pos in target.widgets # custom position (centered)
  wid:target.widgets[pos]
  (wid.pos+.5*wid.size)-.5*canv.size
 else
  positions.bottom[canv]
 end
end

skews:raze insert key value with
 "offcenterleft" (-1, 0)
 "centerleft"    (-1, 0)
 "center"        ( 0, 0)
 "centerright"   ( 1, 0)
 "offcenterright"( 1, 0)
 "offtopleft"    (-1,-1)
 "offtopright"   ( 1,-1)
 "topleft"       (-1,-1)
 "offtop"        ( 0,-1)
 "top"           ( 0,-1)
 "topright"      ( 1,-1)
 "offleft"       (-1, 1)
 "left"          (-1, 1)
 "bottom"        ( 0, 1)
 "right"         ( 1, 1)
 "offright"      ( 1, 1)
 "offbottomleft" (-1, 1)
 "offbottom"     ( 0, 1)
 "offbottomright"( 1, 1)
end

on paint_puppet state do
 if "contraption"~typeof state.wid
  if !"none"~state.wid.show state.wid.animate[] end
 else
  sheet:get_charsheet[state.name]
  face:sheet.widgets[state.emote]
  if state.talking&talk_enable
   faces:face,extract value where (key like ("%s_open*" format state.emote))&!(key like "*_blink") from sheet.widgets
   face:faces[(count faces)%floor sys.frame/6]
  elseif state.blink
   face:face unless sheet.widgets["%s_blink" format state.emote]
  end
  canv:state.wid
  canv.size:face.size
  if !"none"~canv.show
   img:if state.hflip face.copy[].transform["horiz"] else face.copy[] end
   canv.clear[]
   if state.anim~"breathe"
    skew:skews[state.pos]
    m:3
    n:m*1+sin(pi+.1*canv.index)*(sys.frame)/120
    p:(n+2*m*skew[0]),0
    s:(canv.size[0]-2*n),canv.size[1]
    canv.paste[img p,s]
   else
    canv.paste[img]
   end
  end
 end
end

on move_puppet state do
 canv:state.wid
 canv.pos:if state.steps
  tween[get_pos[canv state.gpos] get_pos[canv state.pos] state.steps/state.delay]
 else
  get_pos[canv state.pos]
 end
 skew:skews[state.pos]
 if state.anim~"bob"
  m:10&0.1*canv.size[1]
  n:m*sin(pi+.1*canv.index)*sys.frame/60
  canv.pos:canv.pos + 0,(n+m*skew[1])
 end
 if state.anim~"shake"
  m:.05*canv.size[0]
  n:m*cos(pi+.1*canv.index)*sys.frame/5
  canv.pos:canv.pos + (n+m*skew[0]),0
 end
end

on exec_anim state do
 pending_paint:0
 pending_move :0
 # blinking
 state.blink_delay:0|state.blink_delay-1
 if !state.blink_delay
  state.blink:4 # blink for 4 frames!
  state.blink_delay:blink_interval[]
  pending_paint:1
 elseif state.blink
  state.blink:0|state.blink-1
  if !state.blink pending_paint:1 end
 end
 if state.talking&talk_enable pending_paint:1 end
 # movement tweening
 if state.steps
  state.steps:0|state.steps-1
  if !state.steps state.pos:state.gpos end
  pending_move:1
 end
 # idle animations
 if state.anim~"breathe" pending_paint:1 end
 if state.anim in "bob","shake" pending_move:1 end
 # wrap up
 if "contraption"~typeof state.wid pending_paint:1 end
 if pending_paint              paint_puppet[state] end
 if pending_paint|pending_move move_puppet[state] end
 set_puppet[state]
end

#######################################
#
#  Commands
#
#  show  NAME               # default emote, pos is center OR kept as-is
#  show  NAME EMOTE         # pos is center
#  show  NAME EMOTE POS
#  hide  NAME
#  flip  NAME 1|0           # flip sprite image horizontal
#  order NAME front|back    # change sprite order
#  move  NAME POS DELAY     # interpolated; delay is in frames @ 60fps
#  anim  NAME TYPE          # (none, bob, shake, breathe)
#  wait                     # blocking wait for all in-progress anims to finish
#  wait DELAY               # blocking wait for exactly N frames
#  shake XMAG YMAG DELAY    # screen shake for N frames with horizontal/vertical intensity
#  talk NAME...             # select 0 or more 'talking' puppets by name
#  lil ANYTHING             # execute a lil snippet
#  clear                    # remove all puppets
#
#######################################

commands.show:on cmd_show x do
 if count x
  state:get_puppet[first x]
  if x[1] state.emote:x[1] state.wid.emote:x[1] end
  if x[2] state.pos  :x[2] end
  state.wid.show:"transparent"
  paint_puppet[state]
  move_puppet[state]
  set_puppet[state]
 else explode["error: missing puppet name for !show"] end
end

commands.hide:on cmd_hide x do
 if count x
  get_puppet[(first x)].wid.show:"none"
 else alert["error: missing puppet name for !hide"] end
end

commands.flip:on cmd_flip x do
 if count x 
  state:get_puppet[first x]
  state.hflip:0+if 1<count x x[1] else !state.hflip end
  state.wid.flip:state.hflip
  paint_puppet[state]
  set_puppet[state]
 else alert["error: missing puppet name for !flip"] end
end

commands.order:on cmd_order x do
 if count x
  get_puppet[(first x)].wid.index:if "back"~x[1] -1 else FRONT end
  target.widgets.dd_overlay.index:FRONT
 else alert["error: missing puppet name for !order"] end
end

commands.move:on cmd_move x do
 if count x
  dest:x[1]
  delay:DELAY unless 0+x[2]
  state:get_puppet[first x]
  state.gpos:dest
  state.delay:delay
  state.steps:delay
  move_puppet[state]
  set_puppet[state]
 else alert["error: missing puppet name for !move"] end
end

commands.anim:on cmd_anim x do
 if count x
  state:get_puppet[first x]
  state.anim:x[1] state.wid.anim:state.anim
  set_puppet[state]
 else alert["error: missing puppet name for !anim"] end
end

commands.wait:on cmd_wait x do
 local ol:target.widgets.dd_overlay
 local sh:ol.show
 ol.show:"none"
 on tick do target.event["animate"] sleep[] end
 if first x
  each in range 0+first x tick[] end
 else
  while max (get_puppet @ puppet_names[])..steps tick[] end
 end
 ol.show:sh
end

local shake_mag:30,30
local shake_dur:15
commands.shake:on cmd_shake x do
 if 1<count x shake_mag:0|0+2 take x end
 if 2<count x shake_dur:1|0+x[2] end
 local ol:target.widgets.dd_overlay
 local sh:ol.show
 ol.show:"none"
 go[host.card on shake_trans c a b t do
  local m:shake_mag*1-t
  c.pattern:1
  c.rect[0,0 c.size]
  c.paste[a (random@2*m)-m]
 end shake_dur]
 ol.show:sh
end

commands.talk:on cmd_talk x do
 each name in puppet_names[]
  state:get_puppet[name]
  state.talking:name in x
  set_puppet[state]
 end
end

commands.clear:on cmd_clear do
 clear[target]
end

on exec_command text do
 if "lil"~3 limit text
  eval_snippet[3 drop text]
 else
  f:extract where count@value from " " split text
  (commands[first f])[1 drop f]
 end
end

#######################################
#
#  Public API
#
#######################################

module.setup:on setup deck card commands do
 host:deck
 target:card
 # accept list of commands OR a single string with newlines,
 # with or without a leading '!'
 each line in "\n" split "\n" fuse (),commands
  if "!"~first line line:1 drop line end
  exec_command[line]
 end
end

module.command:on command deck commands do
 setup[deck deck.card commands]
end

module.animate:on animate deck puppet do
 host:deck
 target:deck.card
 if puppet
  exec_anim[get_puppet[puppet]]
 else
  each name in puppet_names[]
   exec_anim[get_puppet[name]]
  end
 end
end

module.clear:on clear card do
 target:host.card unless card
 each name in puppet_names[]
  target.remove[target.widgets[name]]
  target.remove[target.widgets[get_state_name[name]]]
 end
end

module.talk:on talk enable do
 talk_enable:enable
 each name in puppet_names[]
  state:get_puppet[name]
  state.wid.talk:enable
  set_puppet[state]
  paint_puppet[state]
 end
end

{end}

{module:dd}
description:"Display sequential, styled modal dialogs for visual novels."
version:1.4
{script}
# state/constants:
local host:0
local canvas:0
local padding:10
local margin:20
local arrow:image["%%IMG0AAsABv/gf8A/gB8ADgAEAA=="]

# config:
local tfont:"body"
local bfont:"body"
local align:"left"
local balign:"center"
local fcolor:32
local bcolor:1
local next:arrow
local speed:0
local names:() dict ()
local border:0
local bborder:0
local pad:()
local bpad:()
local osound:"" # open box
local nsound:"" # advance to next box
local asound:"" # make a choice
local tsound:"" # talk
local dsize:(0,0)
local dpos:0

on ifmt x do x format names end
on fmt x do update text:ifmt @ text from rtext.cat[x] end
on tween a b t do a+(b-a)*0|1&t end
on rin x pos size do min(x>pos),(x<pos+size) end
on tick do host.card.event["animate"] sleep[] end

on sfx x do
 play[if "list"~typeof x random[x] else x end]
end

on draw_border do
 canvas.clear[]
 if border.type~"image"
  canvas.segment[border 0,0,canvas.size (range pad)]
 else
  canvas.pattern:bcolor
  canvas.rect[0,0 canvas.size]
  canvas.pattern:fcolor
  canvas.box[0,0 canvas.size]
 end
end

on repos pos size do
 if dpos~"center"
  .5*host.card.size-size
 elseif dpos in host.card.widgets
  t:host.card.widgets[dpos]
  t.pos+.5*t.size-size
 else pos
 end
end

on resize height do
 cs0:canvas.size
 cs1:((host.card.size[0]-2*margin) unless dsize[0]),height
 cp0:canvas.pos
 cp1:repos[(.5*host.card.size[0]-cs1[0]),host.card.size[1]-cs1[1]+margin cs1]
 each t in .2*range 6
  canvas.size:tween[cs0 cs1 t]
  canvas.pos :tween[cp0 cp1 t]
  draw_border[]
  tick[]
 end
end

module.open:on open deck etc do
 if canvas & canvas.show~"transparent" close[] end
 host:deck
 canvas:host.card.add["canvas" "dd_overlay"]
 style[etc]
 canvas.size:((host.card.size[0]-2*margin) unless dsize[0]),0
 canvas.pos:repos[(.5*host.card.size[0]-canvas.size[0]),host.card.size[1]-margin canvas.size]
 canvas.show:"transparent"
 canvas.border:0
 sfx[osound]
end

module.style:on style etc do
 fcolor:if "fcolor" in etc etc.fcolor else 32       end
 bcolor:if "bcolor" in etc etc.bcolor else 1        end
 tfont :if "tfont"  in etc etc.tfont  else "body"   end
 bfont :if "bfont"  in etc etc.bfont  else "body"   end
 align :if "align"  in etc etc.align  else "left"   end
 balign:if "balign" in etc etc.balign else "center" end
 names :if "names"  in etc etc.names  else ()dict() end
 next  :if "next"   in etc etc.next   else arrow    end
 speed :if "speed"  in etc etc.speed  else 0        end
 osound:if "osound" in etc etc.osound else ""       end
 nsound:if "nsound" in etc etc.nsound else ""       end
 asound:if "asound" in etc etc.asound else ""       end
 tsound:if "tsound" in etc etc.tsound else ""       end
 dsize: if "size"   in etc etc.size   else (0,0)    end
 dpos:  if "pos"    in etc etc.pos    else 0        end
 border:etc.border.image.copy[]
 pad:"ltrb" dict 4 take if !0~etc.border.margin etc.border.margin else padding end
 bborder:etc.bborder.image.copy[]
 bpad:"ltrb" dict 4 take if !0~etc.bborder.margin etc.bborder.margin else (2,10,2,10) end
 if balign~"left"  balign:"center_left"  end
 if balign~"right" balign:"center_right" end
end

module.getstyle:on getstyle do
 raze insert k v with
  "fcolor"  fcolor
  "bcolor"  bcolor
  "tfont"   tfont
  "bfont"   bfont
  "align"   align
  "balign"  (("center_left","center_right","center") dict ("left","right","center"))[balign]
  "names"   names
  "next"    next
  "speed"   speed
  "osound"  osound
  "nsound"  nsound
  "asound"  asound
  "tsound"  tsound
  "size"    dsize
  "pos"     dpos
  "border"  (("image","margin")dict((list  border),(list range  pad)))
  "bborder" (("image","margin")dict((list bborder),(list range bpad)))
 end
end

module.show:on show x do
 canvas.toggle["transparent" x]
end

module.close:on close do
 if canvas & canvas.show~"transparent" resize[0] end
 host.card.remove[canvas]
 host:canvas:0
end

module.say:on say text do
 text:fmt @ rtext.split["\n\n" text]
 canvas.font:tfont
 each seg i in text
  t:rtext.string[seg]
  if t[0]~"!"
   host.card.event["command" (1 drop t)]
  else
   dim:canvas.textsize[seg (canvas.size[0] unless dsize[0])-(pad.l+pad.r)]
   szh:dim[1]+(pad.t+pad.b)+next.size[1]
   if dsize[0] dim[0]:dsize[0]-pad.l+pad.r end
   resize[szh unless dsize[1]]
   canvas.pattern:fcolor
   if speed
    host.modules.pt.value.talk[1]
    splits: extract index,1+count t where value in (" ","\n") from "" split t
    si:0 db:0 while si<count splits
     sfx[tsound]
     each in range speed
      if pointer.down si:-1+count splits db:1 end
      tick[]
     end
     draw_border[]
     canvas.pattern:fcolor
     canvas.text[rtext.span[seg 0,splits[si]] pad.l,pad.t,dim ("top_%s" format align)]
     si:si+1
    end
    host.modules.pt.value.talk[0]
    if db
     while pointer.held|pointer.down tick[] end
    end
   else
    canvas.text[seg pad.l,pad.t,dim ("top_%s" format align)]
   end
   a:next.copy[].map[1 dict fcolor]
   p:canvas.size-(pad.r,pad.b)+next.size
   on wait do
    if 2%floor sys.frame/10
     canvas.paste[a p 1]
    else
     canvas.pattern:bcolor
     canvas.rect[p a.size]
    end
    tick[]
   end
   while !pointer.held|pointer.down wait[] end
   sfx[nsound]
   while  pointer.held|pointer.up   wait[] end
  end
 end
end

module.ask:on ask text choices do
 seg:fmt[text]
 canvas.font:tfont
 dim:canvas.textsize[seg (canvas.size[0] unless dsize[0])-(pad.l+pad.r)]
 if (1>count choices)|0~choices choices:list "error: empty choice list for dd.ask!" end
 segs:fmt @ choices
 canvas.font:bfont
 dims:each choice in segs
  canvas.textsize[choice (canvas.size[0] unless dsize[0])-(bpad.t+bpad.b)+(pad.t+pad.b)][1]+(bpad.t+bpad.b)
 end
 szh:dim[1]+(pad.t+pad.b)+(sum dims)+(padding*count dims)
 if dsize[0] dim[0]:dsize[0]-pad.l+pad.r end
 resize[szh unless dsize[1]]
 local r:-1 while -1~r
  draw_border[]
  canvas.font:tfont
  canvas.pattern:fcolor
  canvas.text[seg (pad.l,pad.t),dim ("top_%s" format align)]
  c:dim[1]+pad.t+padding
  ow:canvas.size[0]-(pad.l+pad.r)
  each choice i in segs
   local rpos:pad.l,c
   local rsize:ow,dims[i]
   local tpos:rpos+bpad.l,bpad.t
   local tsize:rsize-((bpad.l+bpad.r),(bpad.t+bpad.b))
   # active background (invert label)
   canvas.pattern:fcolor
   if (pointer.held|pointer.down|pointer.up)&rin[pointer.pos-canvas.pos rpos rsize]
    if bborder.type~"image"
     canvas.rect[rpos rsize]
    else
     canvas.rect[rpos+2 rsize-4]
    end
    if pointer.up r:i sfx[asound] end
    canvas.pattern:bcolor
   end
   # label
   canvas.font:bfont
   canvas.text[choice tpos,tsize balign]
   # border
   if bborder.type~"image"
    canvas.segment[bborder rpos,rsize (range bpad)]
   else
    canvas.pattern:fcolor
    canvas.box[rpos rsize]
   end
   c:c+padding+dims[i]
  end
  tick[]
 end
 r
end

module.chat:on chat text choices do
 r:0
 st:getstyle[]
 while count choices
  k:keys choices
  style[st]
  v:ask[text k]
  vv:choices[k[v]]
  if "number"~typeof vv
   choices:()
   r:vv
  else
   choices:k[v] drop choices
   say[vv]
  end
 end
 r
end
{end}

{contraption:enum}
size:[100,25]
resizable:1
margin:[5,5,5,5]
description:"select from among enumerated string values."
script:"enum.0p"
template:"on change val do\n \nend"
attributes:{"name":["options"],"label":["Options"],"type":["code"]}
{widgets}
s:{"type":"slider","size":[100,25],"pos":[0,0],"interval":[0,100],"style":"compact"}
o:{"type":"field","size":[100,20],"pos":[0,-30],"locked":1,"style":"plain"}

{script:enum.0p}
on get_options   do o.text end
on get_value     do ("\n" split o.text)[s.value] end
on set_options x do o.text:x s.value:0 view[] end

on set_value x do
 v:"\n" split o.text
 d:v dict range count v
 s.interval:0,(count v)-1
 s.value:v[0] unless d[x]
 s.format:v[s.value]
 s.font:card.font
 s.show:card.show
 s.locked:card.locked
end

on change do
 view[]
 card.event["change" get_value[]]
end

on view do
 v:"\n" split o.text
 s.interval:0,(count v)-1
 s.format:v[s.value]
 s.font:card.font
 s.show:card.show
 s.locked:card.locked
end

{end}

{contraption:buggo}
size:[154,140]
margin:[0,0,0,0]
description:"it's an egg; it's a bug"
script:"buggo.0p"
{widgets}
lwing:{"type":"canvas","size":[122,122],"pos":[2,-2],"locked":1,"show":"transparent","border":0,"image":"%%IMG2AHoAegD/AP8A/wD/AHkBAwBwAQ0AAgEBAGIBGQBhAQgABgEBAAMBCABfAQMAEwEHAFwBAwAXAQUAWgEDABoBBABZAQQAHAEEAFYBAwAeAQMAVQEDAB8BBABUAQMAIAEDAFUBAwAfAQMAVQEDACABAwBUAQMAIAEDAFQBAwAgAQMAVAEEAB8BAwBVAQMAHwEDAFUBBAAeAQMAVQEEAB8BAwBVAQMAHwEDAFUBBAAeAQMAVQEEAB4BAwBXAQMAHwEDAFUBAwAfAQMAVQEEAB4BAwBVAQEAAQEDAB0BAwBXAQMAHAEEAFcBBAAbAQMAWQEDABsBAwBaAQMAGgEDAFoBBAAZAQMAWwEDABkBAwBbAQQAGAEDAFwBBAAXAQMAXQEEABYBAwBdAQQAFgEDAF4BBAAVAQMAYAEEABQBAwBgAQMAFAEDAGEBBAASAQMAYgEDABEBBABjAQMAEAEDAGQBAwAQAQMAZAEEAA8BAwBlAQMADgEDAGYBBAANAQMAZwEDAA0BAwBnAQQADQEBAGkBBAB3AQQAdwEDAHgBAwB3AQQAdwECAP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AgA==","scale":1}
body:{"type":"canvas","size":[123,92],"pos":[15,34],"locked":1,"animated":1,"show":"transparent","border":0,"image":"%%IMG2AHsAXABADRYAYQ0cAFsNJABSDS0ASw0yAEYNNwBCDTsAPQ1BADgNRAA1DUgAMg1KAC8NTQAsDVAAKg1SACcNVQAkDVgAIg1aAB8NXQAdDV8AGw1gABoNYgAYDWQAFQ1mABMNaAARDWoAEA1sAA4NbQANDW4ADA1wAAsNcQAJDXIACQ1yAAgNcwAIDXMABw10AAYNdgAFDXYABA13AAMNeAACDXkAAg15AAINeQACDXkAAQ16AAENegABDf8NcAABDQ4BBA1oAAENDAEIDWYAAQ0LAQoNZAACDQsBBwABAQINZAACDQoBBwADAQINEQEEDU4AAg0KAQgAAQEDDQ8BCA1MAAINCgEMDQ4BBwABAQINSgADDQoBDA0OAQYAAwEBDUoAAw0LAQoNDgEIAAEBAw1IAAQNCwEKDQ4BDA1HAAUNDAEIDQ8BDA1HAAUNDgEEDREBDA1GAAcNIwEKDUYACA0jAQoNRgAIDRMBAQ0QAQgNRgAJDRIBAw0EAQENDAEEDUcACg0SAQQNAgEDDVYACg0TAQkNBAECDU4ADA0TAQ8NTAANDRQBBA0BAQgNTAAODRoBBQ1NABANagASDWgAEw1mABYNZAAYDWIAGQ1fAB0NXQAfDVsAIg1XACUNVQAnDVIAKg1OAC4NTAAwDUkAMw1EADgNQAA9DTwAQg01AEgNMABODSkAVg0iAF0NGgBkDRMAQg==","scale":1}
rwing:{"type":"canvas","size":[122,122],"pos":[22,1],"locked":1,"show":"transparent","border":0,"image":"%%IMG2AHoAegD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AWQECAAEBBQBwAREAZQEBAAIBEwBjAQcAAgECAAQBCQBgAQcAEQEEAF0BBgATAQUAXAEDABcBBQBYAQYAGAEEAFcBBgAbAQMAVgEEAB4BAwBUAQMAIQEDAFMBAwAhAQQAUQEDACMBBABOAQMAJgEDAE0BAwAnAQQATAEDACgBAwBLAQQAKAEDAEsBAwApAQMASgEEACkBAwBKAQQAKQEDAEkBBAApAQMASgEEACkBAwBKAQMAKQEEAEkBAwAqAQMASgEDACkBBABJAQMAKQEEAEgBAwApAQQASgEDACkBBABJAQMAKAEFAEoBAwAkAQEAAQEGAEsBAwAjAQcATQEDACEBCABOAQMAIAEEAAEBAQBQAQMAHQEHAFMBAwAbAQgAVAEDABcBCgBXAQEAFgEJAAEBAQBqAQIAAQEIAGoBAQACAQoAAQEBAGgBDgBmAQ8AAQECAGcBCgABAQMAbQEHAHYBAQD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AhQ==","scale":1}
rw:{"type":"canvas","size":[122,122],"pos":[188,-68],"locked":1,"show":"none","border":0,"image":"%%IMG2AHoAegD/AP8A/wD/AP8A/wD/AP8A/wBtAQ0AagERAGcBFQBkAQcACwEFAGEBBgAQAQUAXgEFABMBBQBbAQUAFwEEAFkBBQAZAQQAWAEDABwBBABWAQQAHQEEAFMBBQAgAQMAUQEEACIBBABQAQMAJAEDAE8BAwAlAQMATwEDACUBAwBOAQMAJgEDAE0BAwAnAQMATQEDACcBAwBNAQMAJwEDAE0BAwAmAQQATAEDACcBAwBNAQMAJgEEAEwBBAAlAQQATQEDACYBAwBNAQQAJQEEAE0BAwAmAQMATgEDACQBBABOAQMAIwEFAE8BAwAhAQYATwEDACEBBgBQAQMAIAEFAFIBAwAfAQQAUwEDAB4BBQBUAQMAHAEGAFUBAwAaAQYAVwEDABgBBwBYAQMAFgEHAFkBAwAVAQYAXAEDABMBBwBdAQMAEAEIAGABAQAPAQgAbwEJAG4BCQBuAQoAbQEJAHABCABzAQQA/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8=","scale":1}
lw:{"type":"canvas","size":[122,122],"pos":[197,-59],"locked":1,"show":"none","border":0,"image":"%%IMG2AHoAegD/AP8A/wD1ARIAZwEWAGMBBAAMAQoAXwEEABEBBwBdAQQAFQEFAFwBAwAYAQUAWQEDABoBBQBYAQMAHAEEAFcBAwAdAQQAVgEDAB4BAwBWAQMAHgEEAFUBAwAfAQMAVQEEAB4BAwBWAQMAHwEDAFUBAwAfAQMAVQEEAB4BAwBWAQMAHgEDAFYBAwAeAQMAVgEEAB0BAwBXAQMAHgEDAFYBAwAeAQMAVgEDAB4BAwBWAQQAHQEDAFcBAwAdAQMAVwEDAB0BAwBXAQQAHAEDAFgBAwAcAQMAWQEDABoBBABZAQQAGQEDAFsBAwAZAQMAWwEEABgBAwBcAQMAGAEDAF0BAwAXAQMAXQEEABYBAwBeAQMAFgEDAF8BAwAVAQMAXwEEABQBAwBgAQMAFAEDAGABBAASAQMAYgEDABIBAwBjAQMAEQEDAGMBAwAQAQQAYwEDABABAwBlAQMADwEDAGUBAwAPAQMAZgEDAA0BAwBnAQMADQEDAGgBAwAMAQMAaAEEAAwBAQBqAQQAdwEDAHgBAwB3AQQAdwECAP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A+g==","scale":1}
legs:{"type":"canvas","size":[112,32],"pos":[16,102],"locked":1,"show":"transparent","border":0,"image":"%%IMG2AHAAIADRAQMAbAEFAGwBBQBsAQQAbQEEAG0BAwBuAQMAWQEFAA8BAwAPAQIARwEHAA4BAwANAQUARwEHAA0BAwAMAQUATAEEAAwBAwALAQUATwEDAAwBAQALAQQAUQEEABcBAwBTAQQAFgEDAFQBAwAWAQMAVAEEABUBAwA3AQMAGwEDABYBAQA3AQUAGgEDAE8BBQAZAQMAUQEEABgBAwBSAQQAGAEBAFQBBABtAQQAbQEEAG0BAwBtAQMAbgEDAG0BAwBtAQMAbgEBAJo=","scale":1}
lg:{"type":"field","size":[128,34],"pos":[192,80],"show":"none","value":{"text":["","i","i","\n","i","\n","i"],"font":["","","","","","",""],"arg":["","%%IMG2AHAAIADRAQYAaQEJAGgBCQBsAQUAbQEEAG0BBABuAQMAUwEFABUBBAAIAQIARwEHABUBAwAGAQUARwEHABUBAQAGAQUATAEEABoBBQBPAQMAGAEEAFEBBAAXAQMAUwEEABYBAwBUAQMAFgEDAFQBBAAVAQMANwEDABsBAwAWAQEANwEFABoBAwBPAQUAGQEDAFEBBAAYAQMAUgEEABgBAQBUAQQAbQEEAG0BBABtAQMAbQEDAG4BAwBtAQMAbQEDAG4BAQCa","%%IMG2AHAAIADRAQYAaQEJAGgBCQBsAQUAbQEEAG0BBABuAQMAUwEFABUBBAAIAQIARwEHABUBAwAHAQQARwEHABUBAQAIAQMATAEEABwBBABOAQMAGwEEAE4BBAAaAQMAUAEEABkBAwBRAQMAGgEDAFABBAAZAQMAMwEDABsBAwAZAQQAMQEFABoBAwAaAQQAMQEEABoBAwAbAQIAMwEDABoBAwBQAQQAGgEBAFIBAwBtAQMAbQEDAGwBAwBtAQMAbQEDAG0BAwBsAQQAawEEAG0BAgAy","","%%IMG2AHAAIADRAQYAaQEJAGgBCQBsAQUAbQEEAG0BBABuAQMAUgEDABgBBAAIAQIARgEEABkBAwAGAQUARgEEABkBAQAGAQUASAEDAB8BBQBJAQMAHgEEAEwBAwAdAQMATQEDAB0BAwBNAQMAHQEDAE0BAwAdAQMANwEDABMBAwAeAQEANwEFABEBAwBYAQUADwEEAFoBBAANAQQAXAEEAA0BAgBeAQQAbQEEAG0BBABtAQMAbQEDAG4BAwBtAQMAbQEDAG4BAQCa","","%%IMG2AHAAIADRAQMAbAEFAGwBBQBsAQQAbQEEAG0BAwBuAQMAWQEFAA8BAwAPAQIARwEHAA4BAwANAQUARwEHAA0BAwAMAQUATAEEAAwBAwALAQUATwEDAAwBAQALAQQAUQEEABcBAwBTAQQAFgEDAFQBAwAWAQMAVAEEABUBAwA3AQMAGwEDABYBAQA3AQUAGgEDAE8BBQAZAQMAUQEEABgBAwBSAQQAGAEBAFQBBABtAQQAbQEEAG0BAwBtAQMAbgEDAG0BAwBtAQMAbgEBAJo="]}}
face:{"type":"canvas","size":[48,32],"pos":[23,79],"locked":1,"show":"transparent","border":0,"scale":1}
emote:{"type":"field","size":[100,20],"pos":[-135,-9],"show":"none"}
faces:{"type":"grid","size":[100,50],"pos":[-136,25],"show":"none","value":{"name":["mad","open"],"value":["%%IMG2ADAAIAAJAQEALgEEACwBBQAsAQQALgEEAC0BBQAsAQUALQEEABABCAAVAQQACQEPABUBAgAFARMAHAEMACUBBQD/AP8A/wDW","%%IMG2ADAAIAD/AP8A/wDTAQMALAEHACoBBwApAQcAKQEGACsBBAD/ADw="]}}

{script:buggo.0p}

on set_anim  x do app.show["set buggo anim" x] end
on set_flip  x do app.show["set buggo flip" x] end
on set_talk  x do app.show["set buggo talk" x] end
on set_emote x do emote.text:x end

on view do
 lwing.paste[lw.copy[].rotate[-(pi/14)*sin 0.1*sys.frame]]
 rwing.paste[rw.copy[].rotate[ (pi/12)*sin 0.1*sys.frame]] 
 lf:lg.value@(0,0,0,0,0,1,2,3)
 legs.paste[lf[(count lf)%floor sys.frame/10]]
 ff:(faces.value.name dict faces.value.value)
 face.clear[]
 face.paste[image[ff[emote.text]]]
end

on get_animate do
 on animate do view[] end
end
{end}

