character_t* c = dictionary_lookup(&characters, character);
MATRIX m;
int flags = 0;
+ char*o = as,*s = as;
+ buttonrecord_t r;
+ if(!stackpos || (stack[stackpos-1].type != 3)) {
+ syntaxerror(".show may only appear in .button");
+ }
if(!c) {
syntaxerror("character %s not known (in .shape %s)", character, character);
}
m = s_instancepos(c->size, &p);
- buttonrecord_t r;
r.id = c->id;
r.matrix = m;
r.cxform = p.cxform;
r.set = 1;
+
+ while(1) {
+ if(*s==',' || *s==0) {
+ if(!strncmp(o,"idle",s-o)) mybutton.records[0]=r;
+ else if(!strncmp(o,"shape",s-o)) mybutton.records[0]=r;
+ else if(!strncmp(o,"hover",s-o)) mybutton.records[1]=r;
+ else if(!strncmp(o,"pressed",s-o)) mybutton.records[2]=r;
+ else if(!strncmp(o,"area",s-o)) mybutton.records[3]=r;
+ else syntaxerror("unknown \"as\" argument: \"%s\"", strdup_n(o,s-o));
+ }
+ if(!*s)
+ break;
+ s++;
+ }
+ printf("%s\n", as);
+ swf_DumpMatrix(stdout,&mybutton.records[0].matrix);
- if(strstr(as, "idle")) mybutton.records[0]=r;
- if(strstr(as, "hover")) mybutton.records[1]=r;
- if(strstr(as, "pressed")) mybutton.records[2]=r;
- if(strstr(as, "area")) mybutton.records[3]=r;
}
static void setbuttonrecords(TAG*tag)
{
int flags[] = {BS_UP,BS_OVER,BS_DOWN,BS_HIT};
if(!mybutton.endofshapes) {
int t;
-
+
if(!mybutton.records[3].set) {
memcpy(&mybutton.records[3], &mybutton.records[0], sizeof(buttonrecord_t));
}
for(t=0;t<4;t++) {
- if(mybutton.records[t].set)
+ if(mybutton.records[t].set) {
swf_ButtonSetRecord(tag,flags[t],mybutton.records[t].id,1,&mybutton.records[t].matrix,&mybutton.records[t].cxform);
+ }
}
swf_SetU8(tag,0); // end of button records
mybutton.endofshapes = 1;
static void s_endButton()
{
+ SRECT r;
setbuttonrecords(stack[stackpos-1].tag);
stackpos--;
swf_ButtonPostProcess(stack[stackpos].tag, mybutton.nr_actions);
- SRECT r = currentrect;
+ r = currentrect;
tag = stack[stackpos].tag;
currentrect = stack[stackpos].oldrect;
swf_ActionFree(a);
}
+int s_swf3action(char*name, char*action)
+{
+ ActionTAG* a = 0;
+ instance_t* object = dictionary_lookup(&instances, name);
+ if(!object) {
+ return 0;
+ }
+ a = action_SetTarget(0, name);
+ if(!strcmp(action, "nextframe")) a = action_NextFrame(a);
+ else if(!strcmp(action, "previousframe")) a = action_PreviousFrame(a);
+ else if(!strcmp(action, "stop")) a = action_Stop(a);
+ else if(!strcmp(action, "play")) a = action_Play(a);
+ a = action_SetTarget(a, "");
+ a = action_End(a);
+
+ tag = swf_InsertTag(tag, ST_DOACTION);
+ swf_ActionSet(tag, a);
+ swf_ActionFree(a);
+ return 1;
+}
+
void s_outline(char*name, char*format, char*source)
{
outline_t* outline;
dictionary_put2(&outlines, name, outline);
}
-void s_playsound(char*name, int loops, int nomultiple, int stop)
+int s_playsound(char*name, int loops, int nomultiple, int stop)
{
sound_t* sound = dictionary_lookup(&sounds, name);
SOUNDINFO info;
if(!sound)
- syntaxerror("Don't know anything about sound \"%s\"", name);
+ return 0;
tag = swf_InsertTag(tag, ST_STARTSOUND);
swf_SetU16(tag, sound->id); //id
info.loops = loops;
info.nomultiple = nomultiple;
swf_SetSoundInfo(tag, &info);
+ return 1;
}
void s_includeswf(char*name, char*filename)
}
static int c_play(map_t*args)
{
- char*name = lu(args, "sound");
+ char*name = lu(args, "name");
char*loop = lu(args, "loop");
char*nomultiple = lu(args, "nomultiple");
int nm = 0;
else
nm = parseInt(nomultiple);
- s_playsound(name, parseInt(loop), nm, 0);
+ if(s_playsound(name, parseInt(loop), nm, 0)) {
+ return 0;
+ } else if(s_swf3action(name, "play")) {
+ return 0;
+ }
return 0;
}
static int c_stop(map_t*args)
{
- char*name = lu(args, "sound");
- s_playsound(name, 0,0,1);
+ char*name = lu(args, "name");
+
+ if(s_playsound(name, 0,0,1)) {
+ return 0;
+ } else if(s_swf3action(name, "stop")) {
+ return 0;
+ }
+ syntaxerror("I don't know anything about sound/movie \"%s\"", name);
+ return 0;
+}
+
+static int c_nextframe(map_t*args)
+{
+ char*name = lu(args, "name");
+
+ if(s_swf3action(name, "nextframe")) {
+ return 0;
+ }
+ syntaxerror("I don't know anything about movie \"%s\"", name);
+ return 0;
+}
+
+static int c_previousframe(map_t*args)
+{
+ char*name = lu(args, "name");
+
+ if(s_swf3action(name, "previousframe")) {
+ return 0;
+ }
+ syntaxerror("I don't know anything about movie \"%s\"", name);
return 0;
}
static int c_on_press(map_t*args)
{
char*position = lu(args, "position");
+ char*action = "";
if(!strcmp(position, "inside")) {
current_button_flags |= BC_OVERUP_OVERDOWN;
} else if(!strcmp(position, "outside")) {
} else if(!strcmp(position, "anywhere")) {
current_button_flags |= /*BC_IDLE_OUTDOWN|*/BC_OVERUP_OVERDOWN|BC_IDLE_OVERDOWN;
}
- char*action = "";
readToken();
if(type == RAWDATA) {
action = text;
static int c_on_release(map_t*args)
{
char*position = lu(args, "position");
+ char*action = "";
if(!strcmp(position, "inside")) {
current_button_flags |= BC_OVERDOWN_OVERUP;
} else if(!strcmp(position, "outside")) {
} else if(!strcmp(position, "anywhere")) {
current_button_flags |= BC_OVERDOWN_OVERUP|BC_OUTDOWN_IDLE|BC_OVERDOWN_IDLE;
}
- char*action = "";
readToken();
if(type == RAWDATA) {
action = text;
static int c_on_move_in(map_t*args)
{
char*position = lu(args, "state");
+ char*action = "";
if(!strcmp(position, "pressed")) {
current_button_flags |= BC_OUTDOWN_OVERDOWN;
} else if(!strcmp(position, "not_pressed")) {
} else if(!strcmp(position, "any")) {
current_button_flags |= BC_OUTDOWN_OVERDOWN|BC_IDLE_OVERUP|BC_IDLE_OVERDOWN;
}
- char*action = "";
readToken();
if(type == RAWDATA) {
action = text;
static int c_on_move_out(map_t*args)
{
char*position = lu(args, "state");
+ char*action = "";
if(!strcmp(position, "pressed")) {
current_button_flags |= BC_OVERDOWN_OUTDOWN;
} else if(!strcmp(position, "not_pressed")) {
} else if(!strcmp(position, "any")) {
current_button_flags |= BC_OVERDOWN_OUTDOWN|BC_OVERUP_IDLE|BC_OVERDOWN_IDLE;
}
- char*action = "";
readToken();
if(type == RAWDATA) {
action = text;
static int c_on_key(map_t*args)
{
char*key = lu(args, "key");
+ char*action = "";
if(strlen(key)==1) {
/* ascii */
if(key[0]>=32) {
*/
syntaxerror("invalid key: %s",key);
}
- char*action = "";
readToken();
if(type == RAWDATA) {
action = text;
{"on_key", c_on_key, "key=any"},
// control tags
- {"play", c_play, "sound loop=0 @nomultiple=0"},
- {"stop", c_stop, "sound"},
+ {"play", c_play, "name loop=0 @nomultiple=0"},
+ {"stop", c_stop, "name"},
+ {"nextframe", c_nextframe, "name"},
+ {"previousframe", c_previousframe, "name"},
// object placement tags
{"put", c_put, "<i> x=0 y=0 red=+0 green=+0 blue=+0 alpha=+0 luminance= scale= scalex= scaley= pivot= pin= shear= rotate= ratio= above= below="},