📄 fad.actions.c
字号:
/** * libFAD is the legal property of its developers, whose names are too numerous * to list here. Please refer to the COPYRIGHT file distributed with this * source distribution. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * $Id: fad.actions.c,v 1.6 2006/02/25 02:47:23 wrxzzj Exp $ */#include"fad.actions.h"typedef struct { s32_t (* actioncode_exec)(fad_actions_context_t *fac, bits_t *bits); const char *name; /**action code readable name*/} actioncode_item_t;static actioncode_item_t g_ac_array[] = { { NULL , "UNUSED ACTIONCODE" }, /**0x00 UNUSED ACTIONCODE*/ { NULL , "UNUSED ACTIONCODE" }, /**0x01 UNUSED ACTIONCODE*/ { NULL , "UNUSED ACTIONCODE" }, /**0x02 UNUSED ACTIONCODE*/ { NULL , "UNUSED ACTIONCODE" }, /**0x03 UNUSED ACTIONCODE*/ { actions_v3_exec , "FAD_ACTION3_NEXT_FRAME" }, /**0x04 FAD_ACTION3_NEXT_FRAME*/ { actions_v3_exec , "FAD_ACTION3_PREV_FRAME" }, /**0x05 FAD_ACTION3_PREV_FRAME*/ { actions_v3_exec , "FAD_ACTION3_PLAY" }, /**0x06 FAD_ACTION3_PLAY*/ { actions_v3_exec , "FAD_ACTION3_STOP" }, /**0x07 FAD_ACTION3_STOP*/ { actions_v3_exec , "FAD_ACTION3_TOGGLE_QUALITY" }, /**0x08 FAD_ACTION3_TOGGLE_QUALITY*/ { actions_v3_exec , "FAD_ACTION3_STOP_SOUNDS" }, /**0x09 FAD_ACTION3_STOP_SOUNDS*/ { actions_v4_arithmetic_exec , "FAD_ACTION4_ADD" }, /**0x0a FAD_ACTION4_ADD*/ { actions_v4_arithmetic_exec , "FAD_ACTION4_SUBTRACT" }, /**0x0b FAD_ACTION4_SUBTRACT*/ { actions_v4_arithmetic_exec , "FAD_ACTION4_MULTIPLY" }, /**0x0c FAD_ACTION4_MULTIPLY*/ { actions_v4_arithmetic_exec , "FAD_ACTION4_DIVIDE" }, /**0x0d FAD_ACTION4_DIVIDE*/ { actions_v4_numerical_exec , "FAD_ACTION4_EQUALS" }, /**0x0e FAD_ACTION4_EQUALS*/ { actions_v4_numerical_exec , "FAD_ACTION4_LESS" }, /**0x0f FAD_ACTION4_LESS*/ { actions_v4_logical_exec , "FAD_ACTION4_AND" }, /**0x10 FAD_ACTION4_AND*/ { actions_v4_logical_exec , "FAD_ACTION4_OR" }, /**0x11 FAD_ACTION4_OR*/ { actions_v4_logical_exec , "FAD_ACTION4_NOT" }, /**0x12 FAD_ACTION4_NOT*/ { actions_v4_string_exec , "FAD_ACTION4_STRING_EQUALS" }, /**0x13 FAD_ACTION4_STRING_EQUALS*/ { actions_v4_string_exec , "FAD_ACTION4_STRING_LENGTH" }, /**0x14 FAD_ACTION4_STRING_LENGTH*/ { actions_v4_string_exec , "FAD_ACTION4_STRING_EXTRACT" }, /**0x15 FAD_ACTION4_STRING_EXTRACT*/ { NULL , "UNUSED ACTIONCODE" }, /**0x16 UNUSED ACTIONCODE*/ { actions_v4_stack_exec , "FAD_ACTION4_POP" }, /**0x17 FAD_ACTION4_POP*/ { actions_v4_type_exec , "FAD_ACTION4_TO_INTEGER" }, /**0x18 FAD_ACTION4_TO_INTEGER*/ { NULL , "UNUSED ACTIONCODE" }, /**0x19 UNUSED ACTIONCODE*/ { NULL , "UNUSED ACTIONCODE" }, /**0x1a UNUSED ACTIONCODE*/ { NULL , "UNUSED ACTIONCODE" }, /**0x1b UNUSED ACTIONCODE*/ { actions_v4_variable_exec , "FAD_ACTION4_GET_VARIABLE" }, /**0x1c, FAD_ACTION4_GET_VARIABLE*/ { actions_v4_variable_exec , "FAD_ACTION4_SET_VARIABLE" }, /**0x1d, FAD_ACTION4_SET_VARIABLE*/ { NULL , "UNUSED ACTIONCODE" }, /**0x1e UNUSED ACTIONCODE*/ { NULL , "UNUSED ACTIONCODE" }, /**0x1f UNUSED ACTIONCODE*/ { actions_v4_movie_ctrl_exec, "FAD_ACTION4_SET_TARGET2" }, /**0x20, FAD_ACTION4_SET_TARGET2*/ { actions_v4_string_exec , "FAD_ACTION4_STRING_ADD" }, /**0x21 FAD_ACTION4_STRING_ADD*/ { actions_v4_movie_ctrl_exec, "FAD_ACTION4_GET_PROPERTY" }, /**0x22, FAD_ACTION4_GET_PROPERTY*/ { actions_v4_movie_ctrl_exec, "FAD_ACTION4_SET_PROPERTY" }, /**0x23, FAD_ACTION4_SET_PROPERTY*/ { actions_v4_movie_ctrl_exec, "FAD_ACTION4_CLONE_SPRITE" }, /**0x24, FAD_ACTION4_CLONE_SPRITE*/ { actions_v4_movie_ctrl_exec, "FAD_ACTION4_REMOVE_SPRITE" }, /**0x25, FAD_ACTION4_REMOVE_SPRITE*/ { actions_v4_utils_exec, "FAD_ACTION4_TRACE" }, /**0x26, FAD_ACTION4_TRACE*/ { actions_v4_movie_ctrl_exec, "FAD_ACTION4_START_DRAG" }, /**0x27, FAD_ACTION4_START_DRAG*/ { actions_v4_movie_ctrl_exec, "FAD_ACTION4_END_DRAG" }, /**0x28, FAD_ACTION4_END_DRAG*/ { actions_v4_string_exec , "FAD_ACTION4_STRING_LESS" }, /**0x29 FAD_ACTION4_STRING_LESS*/ { actions_v7_exec , "FAD_ACTION7_THROW" }, /**0x2a FAD_ACTION7_THROW*/ { actions_v7_exec , "FAD_ACTION7_CASTOP" }, /**0x2b FAD_ACTION7_CASTOP*/ { actions_v7_exec , "FAD_ACTION7_IMPLEMENTSOP" }, /**0x2c FAD_ACTION7_IMPLEMENTSOP*/ { NULL , "UNUSED ACTIONCODE" }, /**0x2d UNUSED ACTIONCODE*/ { NULL , "UNUSED ACTIONCODE" }, /**0x2e UNUSED ACTIONCODE*/ { NULL , "UNUSED ACTIONCODE" }, /**0x2f UNUSED ACTIONCODE*/ { actions_v4_utils_exec, "FAD_ACTION4_RANDOM_NUMBER" }, /**0x30, FAD_ACTION4_RANDOM_NUMBER*/ { actions_v4_string_exec , "FAD_ACTION4_MBSTRING_LENGTH" }, /**0x31 FAD_ACTION4_MBSTRING_LENGTH*/ { actions_v4_type_exec , "FAD_ACTION4_CHAR_TO_ASCII" }, /**0x32 FAD_ACTION4_CHAR_TO_ASCII*/ { actions_v4_type_exec , "FAD_ACTION4_ASCII_TO_CHAR" }, /**0x33 FAD_ACTION4_ASCII_TO_CHAR*/ { actions_v4_utils_exec, "FAD_ACTION4_GET_TIME" }, /**0x34, FAD_ACTION4_GET_TIME*/ { actions_v4_string_exec , "FAD_ACTION4_MBSTRING_EXTRACT" }, /**0x35 FAD_ACTION4_MBSTRING_EXTRACT*/ { actions_v4_string_exec , "FAD_ACTION4_MBCHAR_TO_ASCII" }, /**0x36 FAD_ACTION4_MBCHAR_TO_ASCII*/ { actions_v4_string_exec , "FAD_ACTION4_MBASCII_TO_CHAR" }, /**0x37 FAD_ACTION4_MBASCII_TO_CHAR*/ { actions_v5_script_object_exec, "FAD_ACTION5_DELETE" }, /**0x3a*/ { actions_v5_script_object_exec, "FAD_ACTION5_DELETE2" }, /**0x3b*/ { actions_v5_script_object_exec, "FAD_ACTION5_DEFINE_LOCALE" }, /**0x3c*/ { actions_v5_script_object_exec, "FAD_ACTION5_CALL_FUNCTION" }, /**0x3d*/ { actions_v5_script_object_exec, "FAD_ACTION5_DEFINE_LOCALE2" }, /**0x3c*/ { actions_v5_script_object_exec, "FAD_ACTION5_NEW_OBJECT" }, /**0x40*/ { actions_v5_script_object_exec, "FAD_ACTION5_INIT_ARRAY" }, /**0x42*/ { actions_v5_script_object_exec, "FAD_ACTION5_INIT_OBJECT" }, /**0x43*/ { actions_v5_script_object_exec, "FAD_ACTION5_TARGET_PATH" }, /**0x45*/ { actions_v5_script_object_exec, "FAD_ACTION5_ENUMERATE" }, /**0x46*/ { actions_v5_script_object_exec, "FAD_ACTION5_EQUEAL2" }, /**0x49*/ { actions_v5_script_object_exec, "FAD_ACTION5_GET_MEMBER" }, /**0x4e*/ { actions_v5_script_object_exec, "FAD_ACTION5_SET_MEMBER" }, /**0x4f*/ { actions_v5_script_object_exec, "FAD_ACTION5_CALL_METHOD" }, /**0x52*/ { actions_v5_script_object_exec, "FAD_ACTION5_NEW_METHOD" }, /**0x53*/ { actions_v5_script_object_exec, "FAD_ACTION5_CONSTANT_POOL" }, /**0x88*/ { actions_v5_script_object_exec, "FAD_ACTION5_WITH" }, /**0x94*/ { actions_v5_script_object_exec, "FAD_ACTION5_DEFINE_FUNCTION" }, /**0x98*/};void fad_actions_stack_init(fad_actions_stack_t *fas) { fas->hdr = fas->curr = calloc(1, sizeof(fad_stack_chunk_t)); fas->top = -1;}#define TOP2IDX(top) (top&0x4ff)as_object_t* fad_actions_stack_pop(fad_actions_stack_t *fas) { as_object_t *obj = NULL; fas->top--; if(fas->top >= 0) { obj = fas->curr->objs[TOP2IDX(fas->top)]; if(TOP2IDX(fas->top) == 0) { fas->curr = fas->curr->next; } } return obj;}static s32_t _fad_actions_get_object(bits_t *bits, as_object_t *obj) { s32_t ret = 0; obj->type = bits_get_u8(bits); switch(obj->type) { case 0: obj->val.str = strdup(bits_tell(bits)); break; case 1: obj->val.f = bits_get_u32(bits); break; case 4: obj->val.reg = bits_get_u8(bits); break; case 5: obj->val.b = bits_get_u8(bits); break; case 6: obj->val.d = bits_get_u32(bits); break; case 7: obj->val.i = bits_get_u32(bits); break; case 8: obj->val.c8 = bits_get_u8(bits); break; case 9: obj->val.c9 = bits_get_u16(bits); break; default: DEBUG("unknow AS value type = %x\n", obj->type); ret = -1; break; } return ret;}void fad_actions_stack_push(fad_actions_stack_t *fas, bits_t *bits) { as_object_t *obj = NULL; fas->top++; if(TOP2IDX(fas->top) == 0x4ff) { fad_stack_chunk_t *fsc = NULL; if(fas->curr->prev) { fas->curr = fas->curr->prev; } else { fsc = calloc(1, sizeof(fad_stack_chunk_t)); fas->hdr->prev = fsc; fsc->next = fas->hdr; fsc->prev = NULL; fas->hdr = fsc; fas->curr = fsc; } } obj = &(fas->curr->objs[TOP2IDX(fas->top)]); _fad_actions_get_object(bits, obj);}void fad_actions_stack_finish(fad_actions_stack_t *fas) { as_object_t *obj = NULL, *ptr = NULL; if(fas != NULL) { for(obj = fas->hdr; obj != NULL; ) { ptr = obj; obj = obj->next; free(ptr); } }}static s32_t actions_v3_exec(fad_actions_context_t *fac, bits_t *bits) { s32_t ret = 0; switch(code) { case FAD_ACTION3_GOTO_FRAME: { s16_t idx; bits_seek_nbytes(bits, 2); idx = bits_get_u16(bits); fad_frame_seek(fac->frame, fac->stream, idx); } break; case FAD_ACTION3_NEXT_FRAME: fad_frame_seek(fac->frame, fac->stream, fac->frame->output_frame+1); break; case FAD_ACTION3_PREV_FRAME: fad_frame_seek(fac->frame, fac->stream, fac->frame->output_frame-1); break; case FAD_ACTION3_PLAY: fac->frame->sta = FAD_STA_DOTAG; break; case FAD_ACTION3_STOP: fac->frame->sta = FAD_STA_STOP; break; case FAD_ACTION3_STOP_SOUNDS: break; case FAD_ACTION3_TOGGLE_QUALITY: break; default: ret = -1; break; } return ret;}static float as_object_to_float(as_object_t *obj) { switch(obj->type) { case 1: return obj->val.f; case 5: return (float)(obj->val.b); case 6: return (float)(obj->val.d); case 7: return (float)(obj->val.i); default: return 0; }}static s32_t fad_actions_v4_do_exec(fad_actions_context_t *fac, u8_t code) { float a = 0.0, b = 0.0; as_object_t *obj = NULL; switch(code) { case FAD_ACTION4_MBASCII_TO_CHAR: case FAD_ACTION4_MBCHAR_TO_ASCII: case FAD_ACTION4_ASCII_TO_CHAR: case FAD_ACTION4_CHAR_TO_ASCII: case FAD_ACTION4_NOT: case FAD_ACTION4_TO_INTEGER: case FAD_ACTION4_STRING_LENGTH: case FAD_ACTION4_IF: case FAD_ACTION4_GET_VARIABLE: case FAD_ACTION4_REMOVE_SPRITE: case FAD_ACTION4_TRACE: case FAD_ACTION4_RANDOM_NUMBER: obj = fad_actions_stack_pop(&fac->fas); a = as_object_to_float(obj); break; default: obj = fad_actions_stack_pop(&fac->fas); a = as_object_to_float(obj); obj = fad_actions_stack_pop(&fac->fas); b = as_object_to_float(obj); break; } return ret;}void fad_actions_context_init(fad_actions_context_t *fac, fad_frame_t *frame, fad_stream_t *stream) { fad_actions_stack_init(&fac->fas, stream); fac->pc = 0; fac->bc = frame->asr;}void fad_actions_context_finish(fad_actions_context_t *fac) { fad_actions_stack_finish(&fac->fas);}s32_t action_script_decode(fad_frame_t* frame, fad_stream_t* s) { /**just save AS record address*/ frame->asr = bits_tell(&s->bits); return -1;}void action_script_exec(fad_actions_context_t *fac, u8_t *asr) { bits_t bits; u8_t code; s32_t ret = 0; s32_t (* as2_exec_func)(fad_actions_context_t *fac, bits_t *bits); bits_init(&bits); while(code=bits_get_u8(&bits)) { len = bits_get_u16(&bits); if(as2_exec_func = g_ac_array[code]) { ret = (* as2_exec_func)(fac, &bits); } else { ret = (code>=0x80 ? -1 : 0); } if(ret < 0) bits_seek_nbytes(&bits, len); } bits_finish(&bits);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -