⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 movieclip_class.c

📁 flirt 一款纯c的flash解码程序。
💻 C
📖 第 1 页 / 共 3 页
字号:
		case PROPERTY_TARGET:
		case PROPERTY_DROPTARGET:
		case PROPERTY_URL:
		case PROPERTY_XMOUSE:
		case PROPERTY_YMOUSE:
		case PROPERTY_FOCUSRECT:
			/* read-only */
			dd_warn("Setting a read-only property: %i", num);
			break;

		default:
			dd_warn("Unknown getProperty type: %i", num);
			break;
	}
}


ddActionMovieClip*
dd_newActionMovieClip(ddPlayer* player, ddDrawClip* clip)
{
	ddActionMovieClip* actionclip = dd_malloc(sizeof(ddActionMovieClip));
	ddActionObject_init((ddActionObject*)actionclip);

	ddActionObject_setClass((ddActionObject*)actionclip, ddActionMovieClipClass);
	
	if ( clip == NULL )
		dd_warn("dd_newActionMovieClip: clip == NULL");
	
	actionclip->movieClip = clip;
	actionclip->name = NULL;

	if ( player->playclip != NULL )
		actionclip->rootClip = player->playclip->actionClip;
	else
		actionclip->rootClip = actionclip;
	
	/* XXX - ifdef DEBUG here? */
	if ( ddActionMovieClipClass == NULL )
		dd_error("dd_newActionMovieClip called before dd_initMovieClipObject!");

	return actionclip;
}


void
ddActionMovieClip_releaseMovieClip(ddActionMovieClip* clip)
{
	clip->movieClip = NULL;
}


ddDrawClip*
ddActionMovieClip_getDrawClip(ddActionMovieClip* clip)
{
	return clip->movieClip;
}


ddActionMovieClip*
ddActionMovieClip_duplicate(ddPlayer* player, ddActionMovieClip* clip)
{
	ddDrawClip* newclip;
	
	if ( clip->movieClip == NULL ) 
		return NULL;
	
	newclip = ddDrawClip_duplicate(player, clip->movieClip);
	
	return newclip->actionClip;
}


void
ddActionMovieClip_setName(ddActionMovieClip* clip, char* name)
{
	clip->name = name;
}


char*
ddActionMovieClip_getName(ddActionMovieClip* clip)
{
	return clip->name;
}


void
ddActionMovieClip_addChild(ddActionMovieClip* parent, ddActionMovieClip* child)
{
	child->rootClip = parent->rootClip;

	dd_log("%8p (\"%s\") adding child %8p (\"%s\")", parent, parent->name, child, child->name);

	ddActionHash_addValue(((ddActionObject*)parent)->properties, strdup(child->name),
					   dd_newActionValue_object((ddActionObject*)child));
}


void
ddActionMovieClip_removeChild(ddActionMovieClip* parent, ddActionMovieClip* child)
{
	ddActionHash_removeValue(((ddActionObject*)parent)->properties, child->name);
}


void
ddActionMovieClip_addTextField(ddActionMovieClip* clip, ddDrawTextField* field)
{
	ddActionValue val;

	val.type = VALUE_TEXTFIELD;
	val.data.textFieldValue = field;

	ddActionHash_addValue(((ddActionObject*)clip)->properties,
					   strdup(field->textfield->varname), val);

	if ( clip->movieClip != NULL )
		ddDrawTextField_setParentClip(field, clip->movieClip);
}


void
ddActionMovieClip_removeTextField(ddActionMovieClip* clip, ddDrawTextField* field)
{
	ddActionHash_removeValue(((ddActionObject*)clip)->properties,
					   field->textfield->varname);
}


void
ddActionMovieClip_gotoFrameLabel(ddActionContext* context,
								 ddActionMovieClip* clip, char* label, boolean play)
{
	char* p = strchr(label, ':');

	if ( p != NULL )
	{
		ddActionObject* object = context->object;
		ddActionValue val;
		
		*p = '\0';

		context->object = (ddActionObject*)clip;
		val = getSlashPath(context, label);
		clip = (ddActionMovieClip*)ddActionValue_getObjectValue(val); // XXX
		ddActionValue_release(val);
		context->object = object;

		if ( clip == NULL )
			return; // XXX
		
		label = p + 1;
	}
	
	if ( clip->movieClip == NULL )
		return;
	
	ddDrawClip_gotoFrameLabel(context->player, clip->movieClip, label);

	if ( play )
		ddDrawClip_play(context->player, clip->movieClip);
	else
		ddDrawClip_stop(context->player, clip->movieClip);
}


ddActionValue
ddActionMovieClip_gotoAndPlay(ddActionObject* object, ddActionContext* context, int nargs)
{
	ddActionMovieClip* clip = (ddActionMovieClip*)object;
	ddActionValue val = ddActionStack_pop(&context->stack);
	int frame = ddActionValue_getIntValue(val);

	ddActionValue_release(val);

	if ( !ddActionObject_isKindOfClass(object, ddActionMovieClipClass) )
		return ddUndefValue;
	
	if ( clip->movieClip != NULL )
	{
		ddDrawClip_gotoFrame(context->player, clip->movieClip, frame - 1);
		ddDrawClip_play(context->player, clip->movieClip);
	}

	return ddNullValue;
}


ddActionValue
ddActionMovieClip_gotoAndStop(ddActionObject* object, ddActionContext* context, int nargs)
{
	ddActionMovieClip* clip = (ddActionMovieClip*)object;
	ddActionValue val = ddActionStack_pop(&context->stack);
	int frame = ddActionValue_getIntValue(val);

	ddActionValue_release(val);

	if ( !ddActionObject_isKindOfClass(object, ddActionMovieClipClass) )
		return ddUndefValue;
	
	if ( clip->movieClip != NULL )
	{
		ddDrawClip_gotoFrame(context->player, clip->movieClip, frame - 1);
		ddDrawClip_stop(context->player, clip->movieClip);
	}

	return ddNullValue;
}


ddActionValue
ddActionMovieClip_nextFrame(ddActionObject* object, ddActionContext* context, int nargs)
{
	ddActionMovieClip* clip = (ddActionMovieClip*)object;

	if ( !ddActionObject_isKindOfClass(object, ddActionMovieClipClass) )
		return ddUndefValue;
	
	if ( clip->movieClip != NULL )
		ddDrawClip_nextFrame(context->player, clip->movieClip);

	return ddNullValue;
}


ddActionValue
ddActionMovieClip_prevFrame(ddActionObject* object, ddActionContext* context, int nargs)
{
	ddActionMovieClip* clip = (ddActionMovieClip*)object;

	if ( !ddActionObject_isKindOfClass(object, ddActionMovieClipClass) )
		return ddUndefValue;
	
	if ( clip->movieClip != NULL )
		ddDrawClip_prevFrame(context->player, clip->movieClip);

	return ddNullValue;
}


ddActionValue
ddActionMovieClip_play(ddActionObject* object, ddActionContext* context, int nargs)
{
	ddActionMovieClip* clip = (ddActionMovieClip*)object;

	if ( !ddActionObject_isKindOfClass(object, ddActionMovieClipClass) )
		return ddUndefValue;
	
	if ( clip->movieClip != NULL )
		ddDrawClip_play(context->player, clip->movieClip);

	return ddNullValue;
}


ddActionValue
ddActionMovieClip_stop(ddActionObject* object, ddActionContext* context, int nargs)
{
	ddActionMovieClip* clip = (ddActionMovieClip*)object;

	if ( !ddActionObject_isKindOfClass(object, ddActionMovieClipClass) )
		return ddUndefValue;
	
	if ( clip->movieClip != NULL )
		ddDrawClip_stop(context->player, clip->movieClip);

	return ddNullValue;
}


static ddActionValue
ddActionMovieClip_getBounds(ddActionObject* object, ddActionContext* context, int nargs)
{
	// XXX - one arg: parent coordinate space (clip)
	
	ddActionMovieClip* clip = (ddActionMovieClip*)object;
	ddActionObject* bounds;
	ddRect rect;

	if ( !ddActionObject_isKindOfClass(object, ddActionMovieClipClass) )
		return ddUndefValue;
	
	if ( clip->movieClip == NULL )
		return ddNullValue;

	rect = clip->movieClip->parent.bounds;

	if ( !RECT_VALID(rect) )
		return ddNullValue;

	bounds = dd_newActionObject();

	ddActionHash_addValue(bounds->properties, strdup("xMin"),
					   dd_newActionValue_double(DOUBLE_F(rect.left)));

	ddActionHash_addValue(bounds->properties, strdup("xMax"),
					   dd_newActionValue_double(DOUBLE_F(rect.right)));

	ddActionHash_addValue(bounds->properties, strdup("yMin"),
					   dd_newActionValue_double(DOUBLE_F(rect.top)));

	ddActionHash_addValue(bounds->properties, strdup("yMax"),
					   dd_newActionValue_double(DOUBLE_F(rect.bottom)));

	return dd_newActionValue_object(bounds);
}


static ddActionValue
ddActionMovieClip_getBytesLoaded(ddActionObject* object, ddActionContext* context, int nargs)
{
	ddActionMovieClip* clip = (ddActionMovieClip*)object;

	if ( !ddActionObject_isKindOfClass(object, ddActionMovieClipClass) )
		return ddUndefValue;
	
	if ( clip->movieClip == NULL )
		return ddNullValue;

	return dd_newActionValue_int(ddDrawClip_getBytesLoaded(clip->movieClip));
}


static ddActionValue
ddActionMovieClip_getBytesTotal(ddActionObject* object, ddActionContext* context, int nargs)
{
	ddActionMovieClip* clip = (ddActionMovieClip*)object;

	if ( !ddActionObject_isKindOfClass(object, ddActionMovieClipClass) )
		return ddUndefValue;
	
	if ( clip->movieClip == NULL )
		return ddNullValue;

	return dd_newActionValue_int(ddDrawClip_getBytesTotal(clip->movieClip));
}


static ddActionValue
ddActionMovieClip_attachMovie(ddActionObject* object, ddActionContext* context, int nargs)
{
	ddActionMovieClip* clip = (ddActionMovieClip*)object;
	
	ddActionValue idval;
	ddActionValue nameval;
	ddActionValue depthval;
	ddActionValue initval = ddNullValue;

	ddCharacter* c;
	ddDrawable* d;
	ddActionFunction* ctor;
	
	if ( nargs < 3 )
	{
		while ( nargs-- > 0 )
			ddActionValue_release(ddActionStack_pop(&context->stack));
		
		return ddNullValue;
	}
	
	idval = ddActionStack_pop(&context->stack);
	nameval = ddActionStack_pop(&context->stack);
	depthval = ddActionStack_pop(&context->stack);
	
	if ( nargs > 3 )
		initval = ddActionStack_pop(&context->stack);
	
	while ( nargs-- > 4 )
		ddActionValue_release(ddActionStack_pop(&context->stack));

	if ( clip->movieClip != NULL &&
		 ddMovieClip_findLibrarySymbol(clip->rootClip->movieClip->clip,
									   ddActionValue_getStringValue(context, idval), &c, &ctor) )
	{
		d = ddDrawClip_addDisplayItem(context->player, clip->movieClip, c,
								ddActionValue_getIntValue(depthval),
								ddActionValue_getStringValue(context, nameval), -1);

		if ( ctor != NULL )
		{
			ddActionMovieClip* newclip = ((ddDrawClip*)d)->actionClip;
			ddActionObject* clipobj = (ddActionObject*)newclip;
			ddActionObject* initobject = ddActionValue_getObjectValue(initval);
			ddActionContext* tmpcontext;
			ddActionValue val;
			
			ddActionObject_setPrototype(clipobj, ctor->prototype);
			
			if ( initobject != NULL )
				ddActionObject_copyProperties(clipobj, initobject);
			
			// invoke ctor on newclip w/ no args

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -