public override IAstNode Visit(ElementAccess node) { var name = node.Target as SimpleName; if (name != null && name.Name == "Variables" && node.Indices.Count == 1) { var index = node.Indices[0] as IntegerLiteralExpression; if (index != null) { if (KnownVariables.ContainsKey(index.Value)) { return(new SimpleName(KnownVariables[index.Value])); } } } return(new ElementAccess((Expression)node.Target.Accept(this), node.Indices.Select(idx => (Expression)idx.Accept(this)))); }
Statement ActorOps() { var convertTable = new byte[] { 1, 0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 20 }; Expression actor = new ElementAccess("Actors", GetVarOrDirectByte(OpCodeParameter.Param1)); while ((_opCode = ReadByte()) != 0xFF) { if (Game.Version < 5) { _opCode = ((_opCode & 0xE0) | convertTable[(_opCode & 0x1F) - 1]); } switch (_opCode & 0x1F) { case 0: { /* dummy case */ var dummy = GetVarOrDirectByte(OpCodeParameter.Param1); actor = new MethodInvocation( new MemberAccess(actor, "ActorOpUnk0")) .AddArgument(dummy); break; } case 1: { // SO_COSTUME var cost = GetVarOrDirectByte(OpCodeParameter.Param1); actor = new MethodInvocation(new MemberAccess(actor, "Costume")).AddArgument(cost); } break; case 2: { // SO_STEP_DIST var i = GetVarOrDirectByte(OpCodeParameter.Param1); var j = GetVarOrDirectByte(OpCodeParameter.Param2); actor = new MethodInvocation(new MemberAccess(actor, "SetWalkSpeed")).AddArguments(i, j); } break; case 3: { // SOSound var sound = GetVarOrDirectByte(OpCodeParameter.Param1); actor = new MethodInvocation(new MemberAccess(actor, "SetSound")).AddArgument(sound); } break; case 4: { // SO_WALK_ANIMATION var walkFrame = GetVarOrDirectByte(OpCodeParameter.Param1); actor = new MethodInvocation(new MemberAccess(actor, "SetWalkAnimation")).AddArgument(walkFrame); } break; case 5: { // SO_TALK_ANIMATION var talkStartFrame = GetVarOrDirectByte(OpCodeParameter.Param1); var talkStopFrame = GetVarOrDirectByte(OpCodeParameter.Param2); actor = new MethodInvocation(new MemberAccess(actor, "SetTalkAnimation")).AddArguments(talkStartFrame, talkStopFrame); } break; case 6: { // SO_STAND_ANIMATION var standFrame = GetVarOrDirectByte(OpCodeParameter.Param1); actor = new MethodInvocation(new MemberAccess(actor, "SetStandAnimation")).AddArgument(standFrame); } break; case 7: { // SO_ANIMATION var i = GetVarOrDirectByte(OpCodeParameter.Param1); var j = GetVarOrDirectByte(OpCodeParameter.Param2); var k = GetVarOrDirectByte(OpCodeParameter.Param3); actor = new MethodInvocation(new MemberAccess(actor, "SetAnimation")).AddArguments(i, j, k); } break; case 8: // SO_DEFAULT actor = new MethodInvocation(new MemberAccess(actor, "SetDefaultAnimation")); break; case 9: { // SO_ELEVATION var elevation = GetVarOrDirectWord(OpCodeParameter.Param1); actor = new MethodInvocation(new MemberAccess(actor, "SetElevation")).AddArgument(elevation); } break; case 10: // SO_ANIMATION_DEFAULT actor = new MethodInvocation(new MemberAccess(actor, "ResetAnimation")); break; case 11: { // SO_PALETTE var i = GetVarOrDirectByte(OpCodeParameter.Param1); var j = GetVarOrDirectByte(OpCodeParameter.Param2); actor = new MethodInvocation(new MemberAccess(actor, "SetPalette")).AddArguments(i, j); } break; case 12: { // SO_TALK_COLOR var talkColor = GetVarOrDirectByte(OpCodeParameter.Param1); actor = new MethodInvocation(new MemberAccess(actor, "SetTalkColor")).AddArgument(talkColor); } break; case 13: { // SO_ACTOR_NAME var name = ReadCharacters(); actor = new MethodInvocation(new MemberAccess(actor, "SetName")).AddArgument(name); } break; case 14: { // SO_INIT_ANIMATION var initFrame = GetVarOrDirectByte(OpCodeParameter.Param1); actor = new MethodInvocation(new MemberAccess(actor, "SetInitAnimation")).AddArgument(initFrame); } break; case 16: { // SO_ACTOR_WIDTH var width = GetVarOrDirectByte(OpCodeParameter.Param1); actor = new MethodInvocation(new MemberAccess(actor, "Width")).AddArgument(width); } break; case 17: { // SO_ACTOR_SCALE var args = new List <Expression>(); if (Game.Version == 4) { var arg = GetVarOrDirectByte(OpCodeParameter.Param1); args.Add(arg); args.Add(arg); } else { args.Add(GetVarOrDirectByte(OpCodeParameter.Param1)); args.Add(GetVarOrDirectByte(OpCodeParameter.Param2)); } actor = new MethodInvocation(new MemberAccess(actor, "Scale")).AddArguments(args); } break; case 18: { // SO_NEVER_ZCLIP actor = new MethodInvocation(new MemberAccess(actor, "NeverZClip")); } break; case 19: { // SO_ALWAYS_ZCLIP var clip = GetVarOrDirectByte(OpCodeParameter.Param1); actor = new MethodInvocation(new MemberAccess(actor, "ForceCLip")).AddArgument(clip); } break; case 20: // SO_IGNORE_BOXES case 21: { // SO_FOLLOW_BOXES var ignoreBoxes = (_opCode & 1) == 0; actor = new MethodInvocation(new MemberAccess(actor, "IgnoreBoxes")).AddArgument(ignoreBoxes.ToLiteral()); } break; case 22: { // SO_ANIMATION_SPEED var animSpeed = GetVarOrDirectByte(OpCodeParameter.Param1); actor = new MethodInvocation(new MemberAccess(actor, "AnimationSpeed")).AddArgument(animSpeed); } break; case 23: { // SO_SHADOW var shadowMode = GetVarOrDirectByte(OpCodeParameter.Param1); actor = new MethodInvocation(new MemberAccess(actor, "ShadowMode")).AddArgument(shadowMode); } break; default: throw new NotImplementedException(string.Format("ActorOps #{0} is not yet implemented, sorry :(", _opCode & 0x1F)); } } return(actor.ToStatement()); }
public override string Visit(ElementAccess node) { var indices = string.Join(", ", node.Indices.Select(index => index.Accept(this))); return(string.Format("{0}[{1}]", node.Target.Accept(this), indices)); }
Statement VerbOps() { Expression verb = new ElementAccess("Verbs", GetVarOrDirectByte(OpCodeParameter.Param1)); while ((_opCode = ReadByte()) != 0xFF) { switch (_opCode & 0x1F) { case 1: // SO_VERB_IMAGE { var a = GetVarOrDirectWord(OpCodeParameter.Param1); verb = new MethodInvocation(new MemberAccess(verb, "SetImage")).AddArgument(a); } break; case 2: // SO_VERB_NAME var text = ReadCharacters(); verb = new MethodInvocation(new MemberAccess(verb, "SetName")).AddArgument(text); break; case 3: // SO_VERB_COLOR { var color = GetVarOrDirectByte(OpCodeParameter.Param1); verb = new MethodInvocation(new MemberAccess(verb, "SetColor")).AddArgument(color); } break; case 4: // SO_VERB_HICOLOR var hiColor = GetVarOrDirectByte(OpCodeParameter.Param1); verb = new MethodInvocation(new MemberAccess(verb, "SetHiColor")).AddArgument(hiColor); break; case 5: // SO_VERB_AT var left = GetVarOrDirectWord(OpCodeParameter.Param1); var top = GetVarOrDirectWord(OpCodeParameter.Param2); verb = new MethodInvocation(new MemberAccess(verb, "At")).AddArguments(left, top); break; case 6: // SO_VERB_ON verb = new MethodInvocation(new MemberAccess(verb, "On")); break; case 7: // SO_VERB_OFF verb = new MethodInvocation(new MemberAccess(verb, "Off")); break; case 8: // SO_VERB_DELETE verb = new MethodInvocation(new MemberAccess(verb, "Delete")); break; case 9: { // SO_VERB_NEW verb = new MethodInvocation(new MemberAccess(verb, "New")); break; } case 16: // SO_VERB_DIMCOLOR { var color = GetVarOrDirectByte(OpCodeParameter.Param1); verb = new MethodInvocation(new MemberAccess(verb, "SetDimColor")).AddArgument(color); } break; case 17: // SO_VERB_DIM verb = new MethodInvocation(new MemberAccess(verb, "Dim")); break; case 18: // SO_VERB_KEY var key = GetVarOrDirectByte(OpCodeParameter.Param1); verb = new MethodInvocation(new MemberAccess(verb, "SetKey")).AddArgument(key); break; case 19: // SO_VERB_CENTER verb = new MethodInvocation(new MemberAccess(verb, "Center")); break; case 20: // SO_VERB_NAME_STR var index = GetVarOrDirectWord(OpCodeParameter.Param1); verb = new MethodInvocation(new MemberAccess(verb, "SetText")).AddArgument(new ElementAccess("Strings", index)); break; case 22: // assign object { var a = GetVarOrDirectWord(OpCodeParameter.Param1); var b = GetVarOrDirectByte(OpCodeParameter.Param2); verb = new MethodInvocation(new MemberAccess(verb, "SetVerbObject")).AddArguments(a, b); } break; case 23: // Set Back Color { var color = GetVarOrDirectByte(OpCodeParameter.Param1); verb = new MethodInvocation(new MemberAccess(verb, "SetBackColor")).AddArgument(color); } break; default: throw new NotImplementedException(string.Format("VerbOps #{0} is not yet implemented.", _opCode & 0x1F)); } } return(verb.ToStatement()); }
public override IAstNode Visit(ElementAccess node) { return(new ElementAccess((Expression)node.Target.Accept(this), node.Indices.Select(idx => (Expression)idx.Accept(this)))); }