package com.uxebu.swfparser.dump.generators;
import com.jswiff.swfrecords.ClipActionRecord;
import com.jswiff.swfrecords.ClipEventFlags;
import com.jswiff.swfrecords.actions.ActionBlockReader;
import com.jswiff.swfrecords.tags.DefineSprite;
import com.jswiff.swfrecords.tags.PlaceObject2;
import com.uxebu.swfparser.dump.actions.ClipActionFlag;
import com.uxebu.swfparser.dump.actions.ClipActionFlagMapper;
import com.uxebu.swfparser.dump.output.Writer;
import org.swfparser.ActionBlockContext;
import org.swfparser.CodeUtil;
import org.swfparser.ExecutionContext;
import org.swfparser.Operation;
import org.swfparser.StatementBlock;
import org.swfparser.exception.StatementBlockException;
import org.swfparser.operation.ByteCodeOperation;
import java.util.ArrayList;
import java.util.List;
public class PlaceObject2Generator implements CodeGenerator
{
private Writer writer;
private PlaceObject2 placeObject2;
private int frameNo;
public PlaceObject2Generator(Writer writer)
{
this.writer = writer;
}
@Override
public void generate(ActionBlockContext context)
{
placeObject2 = (PlaceObject2) context.getTag();
frameNo = context.getFrameNum();
if (placeObject2.getClipActions() != null)
{
List<ClipActionRecord> actionRecords = placeObject2.getClipActions().getClipActionRecords();
context.setActionBlockNum(0);
for (ClipActionRecord record : actionRecords)
{
processActions(context, record.getActions());
context.setActionBlockNum(context.getActionBlockNum() + 1);
}
context.setActionBlockNum(ActionBlockContext.NO_ACTION_BLOCK_NUM);
}
}
protected void processActions(ActionBlockContext context, ActionBlockReader actionBlock)
{
StatementBlock statementBlock = CodeUtil.getStatementBlockReader();
ExecutionContext executionContext = CodeUtil.getExecutionContext();
executionContext.setTag(context.getTag());
executionContext.setFrameNumber(context.getFrameNum());
statementBlock.setExecutionContext(executionContext);
List<Operation> operations;
try
{
statementBlock.read(actionBlock.getActions());
operations = statementBlock.getOperations();
}
catch (StatementBlockException e)
{
operations = new ArrayList<Operation>();
operations.add(new ByteCodeOperation(actionBlock.getData()));
}
processOperations(context, operations);
}
protected void processOperations(ActionBlockContext context, List<Operation> operations)
{
StringBuffer block = new StringBuffer();
// block.append(context.getDumpString());
// block.append("\n");
for (Operation op : operations)
{
String endOfStatement = CodeUtil.endOfStatement(op);
String writeOp = op.getStringValue(0) + endOfStatement + "\n";
block.append(writeOp);
}
if (operations.size() > 0)
{
ClipActionRecord clipActionRecord = (ClipActionRecord) placeObject2.getClipActions().getClipActionRecords().get(context.getActionBlockNum());
ClipEventFlags eventFlags = clipActionRecord.getEventFlags();
ClipActionFlagMapper mapper = new ClipActionFlagMapper(eventFlags);
for (ClipActionFlag flag : mapper.map())
{
if (context.getParentContext() != null && context.getParentContext().getTag() instanceof DefineSprite)
{
DefineSprite parentTag = (DefineSprite) context.getParentContext().getTag();
writer.addSpriteClipAction(parentTag.getCharacterId(), frameNo, placeObject2.getDepth(), flag, block.toString());
}
else
{
writer.addRootMovieClipAction(frameNo, placeObject2.getDepth(), flag, block.toString());
}
}
}
}
}