X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fswfc.c;h=b993199029931af09d2e94f17a9b5ce8cd4f6c5d;hb=ecdb4acdd5735e33b7ae86b18a8d5bba50766a58;hp=aa413076cbec093f84be7df2ae8d7ad6bb58db7c;hpb=d399ebd64610bd41a09c2e4845d1d6988254ac6f;p=swftools.git diff --git a/src/swfc.c b/src/swfc.c index aa41307..b993199 100644 --- a/src/swfc.c +++ b/src/swfc.c @@ -476,6 +476,11 @@ void s_buttonput(char*character, char*as, parameters_t p) 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); } @@ -485,30 +490,42 @@ void s_buttonput(char*character, char*as, parameters_t p) 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; @@ -537,12 +554,13 @@ void s_buttonaction(int flags, char*action) 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; @@ -1093,6 +1111,27 @@ void s_action(const char*text) 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; @@ -1122,12 +1161,12 @@ void s_outline(char*name, char*format, char*source) 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 @@ -1136,6 +1175,7 @@ void s_playsound(char*name, int loops, int nomultiple, int stop) info.loops = loops; info.nomultiple = nomultiple; swf_SetSoundInfo(tag, &info); + return 1; } void s_includeswf(char*name, char*filename) @@ -1773,7 +1813,7 @@ static int c_point(map_t*args) } 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; @@ -1782,14 +1822,46 @@ static int c_play(map_t*args) 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; } @@ -2200,6 +2272,7 @@ static int current_button_flags = 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")) { @@ -2208,7 +2281,6 @@ static int c_on_press(map_t*args) } 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; @@ -2222,6 +2294,7 @@ static int c_on_press(map_t*args) 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")) { @@ -2229,7 +2302,6 @@ static int c_on_release(map_t*args) } 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; @@ -2243,6 +2315,7 @@ static int c_on_release(map_t*args) 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")) { @@ -2250,7 +2323,6 @@ static int c_on_move_in(map_t*args) } 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; @@ -2264,6 +2336,7 @@ static int c_on_move_in(map_t*args) 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")) { @@ -2271,7 +2344,6 @@ static int c_on_move_out(map_t*args) } 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; @@ -2285,6 +2357,7 @@ static int c_on_move_out(map_t*args) static int c_on_key(map_t*args) { char*key = lu(args, "key"); + char*action = ""; if(strlen(key)==1) { /* ascii */ if(key[0]>=32) { @@ -2301,7 +2374,6 @@ static int c_on_key(map_t*args) */ syntaxerror("invalid key: %s",key); } - char*action = ""; readToken(); if(type == RAWDATA) { action = text; @@ -2374,8 +2446,10 @@ static struct { {"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, " x=0 y=0 red=+0 green=+0 blue=+0 alpha=+0 luminance= scale= scalex= scaley= pivot= pin= shear= rotate= ratio= above= below="},