+typedef struct _button
+{
+ int endofshapes;
+ int shapes[4];
+ int nr_actions;
+} button_t;
+
+static button_t mybutton;
+
+void s_button(char*name)
+{
+ tag = swf_InsertTag(tag, ST_DEFINEBUTTON2);
+ swf_SetU16(tag, id); //id
+ swf_ButtonSetFlags(tag, 0); //menu=no
+
+ mybutton.endofshapes = 0;
+ mybutton.shapes[0] = mybutton.shapes[1] = mybutton.shapes[2] = mybutton.shapes[3] = 0;
+ mybutton.nr_actions = 0;
+
+ memset(&stack[stackpos], 0, sizeof(stack[0]));
+ stack[stackpos].type = 3;
+ stack[stackpos].tag = tag;
+ stack[stackpos].id = id;
+ stack[stackpos].name = strdup(name);
+ stack[stackpos].oldrect = currentrect;
+ memset(¤trect, 0, sizeof(currentrect));
+
+ stackpos++;
+ incrementid();
+}
+void s_buttonput(char*character, char*as, parameters_t p)
+{
+ character_t* c = dictionary_lookup(&characters, character);
+ MATRIX m;
+ int flags = 0;
+ if(!c) {
+ syntaxerror("character %s not known (in .shape %s)", character, character);
+ }
+ if(strstr(as, "idle")) {flags |= BS_UP;mybutton.shapes[0]=c->id;}
+ if(strstr(as, "hover")) {flags |= BS_OVER;mybutton.shapes[1]=c->id;}
+ if(strstr(as, "pressed")) {flags |= BS_DOWN;mybutton.shapes[2]=c->id;}
+ if(strstr(as, "area")) {flags |= BS_HIT;mybutton.shapes[3]=c->id;}
+ if(!flags)
+ flags = BS_HIT;
+
+ if(mybutton.endofshapes) {
+ syntaxerror("a .do may not precede a .show", character, character);
+ }
+
+ m = s_instancepos(c->size, &p);
+
+ swf_ButtonSetRecord(stack[stackpos-1].tag,flags,c->id,1,&m,&p.cxform);
+}
+void s_buttonaction(int flags, char*action)
+{
+ ActionTAG* a = 0;
+ if(flags==0) {
+ return;
+ }
+ if(!mybutton.endofshapes) {
+ swf_SetU8(stack[stackpos-1].tag,0); // end of button records
+ mybutton.endofshapes = 1;
+ }
+
+
+ a = swf_ActionCompile(text, stack[0].swf->fileVersion);
+ if(!a) {
+ syntaxerror("Couldn't compile ActionScript");
+ }
+
+ swf_ButtonSetCondition(stack[stackpos-1].tag, flags);
+ swf_ActionSet(stack[stackpos-1].tag, a);
+ mybutton.nr_actions++;
+
+ swf_ActionFree(a);
+}
+
+static void s_endButton()
+{
+ stackpos--;
+ if(!mybutton.endofshapes) {
+ swf_SetU8(stack[stackpos].tag,0); // end of button records
+ mybutton.endofshapes = 1;
+ }
+ /* end of actions */
+
+ swf_ButtonPostProcess(stack[stackpos].tag, mybutton.nr_actions);
+
+ SRECT r = currentrect;
+
+ tag = stack[stackpos].tag;
+ currentrect = stack[stackpos].oldrect;
+
+ s_addcharacter(stack[stackpos].name, stack[stackpos].id, stack[stackpos].tag, r);
+ free(stack[stackpos].name);
+}
+