www.pudn.com > FlashFormat.rar > FAction.cpp
// Copyright © 1999 Middlesoft, Inc. All rights reserved.
// First Created By Lee Thomason.
// First Created On 09/08/1999.
// Last Modified On 11/09/1999.
/****************************************************************************************
File Summary: FAction.cpp
This source file contains the definition for the low-level action-related functions,
grouped by classes, which are all derived from class FAction (except FActionCondition):
Class Member Function
FActionGetURL FActionGetURL(FString*, FString*);
~FActionGetURL();
void WriteToSWFStream(FSWFStream*);
FActionGetURL2 FActionGetURL2(U8);
void WriteToSWFStream(FSWFStream*);
FActionGotoFrame FActionGotoFrame(U16);
void WriteToSWFStream(FSWFStream*);
FActionGotoFrame2 FActionGotoFrame2(U8);
void WriteToSWFStream(FSWFStream*);
FActionGotoLabel FActionGotoLabel(FString*);
~FActionGotoLabel();
void WriteToSWFStream(FSWFStream*);
FActionIf FActionIf(S16);
void WriteToSWFStream(FSWFStream*);
FActionJump FActionJump(S16);
void WriteToSWFStream(FSWFStream*);
FActionPush FActionPush(FString*);
FActionPush(FLOAT);
void WriteToSWFStream(FSWFStream*);
FActionSetTarget FActionSetTarget(FString*);
~FActionSetTarget();
void WriteToSWFStream(FSWFStream*);
FActionWaitForFrame FActionWaitForFrame(U16, U16);
void WriteToSWFStream(FSWFStream*);
FActionWaitForFrame2 FActionWaitForFrame2(U8);
void WriteToSWFStream(FSWFStream*);
FActionCondition FActionCondition();
~FActionCondition();
Clear();
AddActionRecord(FActionRecord*);
AddKeyCode(U32);
AddCondition(U16);
void WriteToSWFStream(FSWFStream*);
void WriteToSWFStream(FSWFStream*, int);
Functions of these classes have not been implemented yet:
class FActionAdd;
class FActionAnd;
class FActionAsciiToChar;
class FActionCall;
class FActionCharToAscii;
class FActionCloneSprite;
class FActionDivide;
class FActionEndDrag;
class FActionEquals;
class FActionGetProperty;
class FActionGetTime;
class FActionGetVariable;
class FActionLess;
class FActionMBAsciiToChar;
class FActionMBCharToAscii;
class FActionMBStringExtract;
class FActionMBStringLength;
class FActionMultiply;
class FActionNextFrame;
class FActionNot;
class FActionOr;
class FActionPlay;
class FActionPop;
class FActionPrevFrame;
class FActionRandomNumber;
class FActionRemoveSprite;
class FActionSetProperty;
class FActionSetTarget2;
class FActionSetVariable;
class FActionStartDrag;
class FActionStop;
class FActionStopSounds;
class FActionStringAdd;
class FActionStringEquals;
class FActionStringExtract;
class FActionStringLength;
class FActionStringLess;
class FActionSubtract;
class FActionToggleQuality;
class FActionToInteger;
class FActionTrace.
****************************************************************************************/
#include "FAction.h"
#include "FPrimitive.h"
//////////////////////////////////////////////////////////////////////////////////////
// -------- FActionGetURL ----------------------------------------------------------
FActionGetURL::FActionGetURL(FString *_url, FString *_window)
{
url = _url;
window = _window;
}
FActionGetURL::~FActionGetURL()
{
delete url;
delete window;
}
void FActionGetURL::WriteToSWFStream(FSWFStream* _SWFStream)
{
FSWFStream body;
url->WriteToSWFStream(&body, true);
window->WriteToSWFStream(&body, true);
_SWFStream->WriteByte(sactionGetURL);
_SWFStream->WriteWord(body.Size());
_SWFStream->Append( &body );
}
//////////////////////////////////////////////////////////////////////////////////////
// -------- FActionGetURL2 ---------------------------------------------------------
FActionGetURL2::FActionGetURL2(U8 _method)
{
method = _method;
}
void FActionGetURL2::WriteToSWFStream(FSWFStream* _SWFStream){
//sactionEquals: enumerated in "Macromedia.h"
_SWFStream->WriteByte(sactionGetURL2);
//write the length since the high bit is set in the action tag
_SWFStream->WriteWord(1);
//write the method
_SWFStream->WriteByte(method);
}
//////////////////////////////////////////////////////////////////////////////////////
// -------- FActionGotoFrame -------------------------------------------------------
FActionGotoFrame::FActionGotoFrame(U16 _frameIndex)
{
frameIndex = _frameIndex;
}
void FActionGotoFrame::WriteToSWFStream(FSWFStream* _SWFStream){
//enumerated constant (see "Macromedia.h")
_SWFStream->WriteByte(sactionGotoFrame);
_SWFStream->WriteWord(2);
_SWFStream->WriteWord( (U32) frameIndex);
}
//////////////////////////////////////////////////////////////////////////////////////
// -------- FActionGotoFrame2 ------------------------------------------------------
// Constructor takes in play flag.
FActionGotoFrame2::FActionGotoFrame2(U8 _play){
play = _play;
}
void FActionGotoFrame2::WriteToSWFStream(FSWFStream* _SWFStream){
//sactionGotoFrame2: enumerated in "Macromedia.h"
_SWFStream->WriteByte(sactionGotoFrame2 );
//write the length since the high bit is set in the action tag
_SWFStream->WriteWord(1);
//write the play flag
_SWFStream->WriteByte(play);
}
//////////////////////////////////////////////////////////////////////////////////////
// -------- FActionGotoLabel -------------------------------------------------------
FActionGotoLabel::FActionGotoLabel(FString* _label){
label = _label;
}
FActionGotoLabel::~FActionGotoLabel(){
delete label;
}
void FActionGotoLabel::WriteToSWFStream(FSWFStream* _SWFStream){
//enumerated type (see "Macromedia.h")
_SWFStream->WriteByte(sactionGotoLabel);
label->WriteToSWFStream(_SWFStream, true);
}
///////////////////////////////////////////////////////////////////////////////
// -------- FActionIf -------------------------------------------------------
// Constructor records the branch offset.
FActionIf::FActionIf(S16 _branchOffset){
branchOffset = _branchOffset;
}
void FActionIf::WriteToSWFStream(FSWFStream* _SWFStream){
//enumerations in "Macromedia.h"
_SWFStream->WriteByte(sactionIf);
//write the length since the high bit is set in the action tag
_SWFStream->WriteWord(2);
//write the offset
_SWFStream->WriteWord((U32)branchOffset);
}
//////////////////////////////////////////////////////////////////////////////////////
// -------- FActionJump -------------------------------------------------------
// Constructor records the branch offset.
FActionJump::FActionJump(S16 _branchOffset){
branchOffset = _branchOffset;
}
void FActionJump::WriteToSWFStream(FSWFStream* _SWFStream){
//enumerations in "Macromedia.h"
_SWFStream->WriteByte(sactionJump);
//write the length since the high bit is set in the action tag
_SWFStream->WriteWord(2);
//write the offset
_SWFStream->WriteWord((U32)branchOffset);
}
//////////////////////////////////////////////////////////////////////////////////////
// -------- FActionPush -------------------------------------------------------
// Constructor for string push.
FActionPush::FActionPush(FString* _string){
string = _string;
number = 0;
type = 0;
}
// Constructor for float push.
FActionPush::FActionPush(FLOAT _number){
number = _number;
string = 0;
type = 1;
}
// Writes to the given FSWFStream.
void FActionPush::WriteToSWFStream(FSWFStream *_SWFStream){
//sactionPush: enumerated in "Macromedia.h"
_SWFStream->WriteByte(sactionPush);
//since tag's high bit is set, must write the length
if ( type == 0 ) {
_SWFStream->WriteWord( (U32)string->Length() + 1 );
} else {
_SWFStream->WriteWord( 2 );
}
//write the type
_SWFStream->WriteByte((U32)type);
//write the object to be pushed
if ( type == 0 ) {
string->WriteToSWFStream(_SWFStream, true);
} else {
_SWFStream->WriteDWord( (U32)number );
}
}
//////////////////////////////////////////////////////////////////////////////////////
// -------- FActionSetTarget -------------------------------------------------------
FActionSetTarget::FActionSetTarget(FString* _targetName)
{
targetName = _targetName;
}
FActionSetTarget::~FActionSetTarget()
{
delete targetName;
}
void FActionSetTarget::WriteToSWFStream(FSWFStream* _SWFStream)
{
_SWFStream->WriteByte(sactionSetTarget);
targetName->WriteToSWFStream(_SWFStream, true);
}
//////////////////////////////////////////////////////////////////////////////////////
// -------- FActionWaitForFrame ----------------------------------------------------
FActionWaitForFrame::FActionWaitForFrame(U16 index, U16 count){
frameIndex = frameIndex;
skipCount = skipCount;
}
void FActionWaitForFrame::WriteToSWFStream(FSWFStream* _SWFStream){
// enumerations in "Macromedia.h"
_SWFStream->WriteByte( sactionWaitForFrame);
_SWFStream->WriteWord( 3);
_SWFStream->WriteWord( (U32)frameIndex);
_SWFStream->WriteByte( (U32)skipCount);
}
///////////////////////////////////////////////////////////////////////////////////////
// -------- FActionWaitForFrame2 ----------------------------------------------------
FActionWaitForFrame2::FActionWaitForFrame2(U8 _skipCount){
skipCount = _skipCount;
}
void FActionWaitForFrame2::WriteToSWFStream(FSWFStream* _SWFStream){
// enumerations in "Macromedia.h"
_SWFStream->WriteByte( sactionWaitForFrame2);
//write the length since high bit in tag id is set
_SWFStream->WriteWord(1);
//write the skip count
_SWFStream->WriteByte(skipCount);
}
// Constructor. Initially, there are no actions or conditions so the conditions flag
// equals zero, and the action record list is empty.
FActionCondition::FActionCondition(){
conditionFlags = 0;
}
// Deletes all of the action records in the action record list.
FActionCondition::~FActionCondition(){
while (!actionRecordList.empty()){
delete actionRecordList.front();
actionRecordList.pop_front();
}
}
void FActionCondition::Clear()
{
while (!actionRecordList.empty()){
delete actionRecordList.front();
actionRecordList.pop_front();
}
}
// Adds an action record to the action record list
void FActionCondition::AddActionRecord(FActionRecord* _ActionRecord){
actionRecordList.push_back(_ActionRecord);
}
// Adds the key code information to the action condition (Flash 4).
void FActionCondition::AddKeyCode(U32 keyCode){
conditionFlags |= (keyCode << 9);
}
// Adds a condition to the list of conditions for which the actions in the action record list
// will be taken. Sees what condition is passed, and sets the bit which corresponds to the
// condition in the conditionFlags field to 1.
void FActionCondition::AddCondition(U16 _condition){
switch (_condition)
{
case OverDownToIdle:
conditionFlags = conditionFlags | 256; //this bitwise OR has the same effect as making the 8th bit a "1"
break;
case IdleToOverDown:
conditionFlags = conditionFlags | 128; //makes 9th bit a "1" ... etc.
break;
case OutDownToIdle:
conditionFlags = conditionFlags | 64;
break;
case OutDownToOverDown:
conditionFlags = conditionFlags | 32;
break;
case OverDownToOutDown:
conditionFlags = conditionFlags | 16;
break;
case OverDownToOverUp:
conditionFlags = conditionFlags | 8;
break;
case OverUpToOverDown:
conditionFlags = conditionFlags | 4;
break;
case OverUpToIdle:
conditionFlags = conditionFlags | 2;
break;
case IdleToOverUp:
conditionFlags = conditionFlags | 1;
}
}
// Writes the action condition to the given FSWFStream. Since the action condition contains
// an offset field to the next action condition, the body of the action condition must first
// be written to a temporary stream so that size can be calculated for the offset.
void FActionCondition::WriteToSWFStream(FSWFStream* _SWFStream){
FSWFStream temp;
temp.WriteWord((U32) conditionFlags);
std::list::iterator cursor;
for (cursor = actionRecordList.begin(); cursor != actionRecordList.end(); cursor++){
(*cursor)->WriteToSWFStream(&temp);
}
temp.WriteByte( 0 );
//add 2 to the size because the offset is actually to the beginning of the
//next action condition's conditionFlags
_SWFStream->WriteWord( 2+temp.Size() );
_SWFStream->Append( &temp );
}
// Writes the action condition to the given stream. The lastFlag indicates that this is the
// last action condition so the offset is set to 0 by default.
void FActionCondition::WriteToSWFStream(FSWFStream* _SWFStream, int lastFlag){
_SWFStream->WriteWord(0);//the offset
_SWFStream->WriteWord((U32) conditionFlags);
std::list::iterator cursor;
for (cursor = actionRecordList.begin(); cursor != actionRecordList.end(); cursor++){
(*cursor)->WriteToSWFStream(_SWFStream);
}
_SWFStream->FlushBits();
_SWFStream->WriteByte((U32) 0);
}
/*
FActionConditionList::FActionConditionList(){
}
FActionConditionList::~FActionConditionList(){
while (!conditionList.empty()){
delete conditionList.front();
conditionList.pop_front();
}
}
void FActionConditionList::AddActionCondition(FActionCondition* _ActionCondition){
conditionList.push_back(_ActionCondition);
}
U32 FActionConditionList::Size(){
return conditionList.size();
}
void FActionConditionList::WriteToSWFStream(FSWFStream* _SWFStream){
std::list::iterator cursor;
std::list::iterator cursor2;
cursor2 = (conditionList.end());
cursor2--;
for (cursor = conditionList.begin(); cursor != cursor2; cursor++) {
(*cursor)->WriteToSWFStream(_SWFStream);
}
(*cursor)->WriteToSWFStream(_SWFStream, 1); //flag indicating it is the last action condition
}
*/