OSDN Git Service

switch を if に分割した時の条件を少し細かくした (Add 等の計算と、SetVariable と Push に最適化)
authorYoshihiro Yamazaki <yoya@awm.jp>
Mon, 10 Dec 2012 17:10:00 +0000 (02:10 +0900)
committerYoshihiro Yamazaki <yoya@awm.jp>
Mon, 10 Dec 2012 17:10:00 +0000 (02:10 +0900)
src/action.js

index bb09166..ae95a54 100644 (file)
@@ -19,69 +19,77 @@ FlappAction.exec = function(tag, movieClip, rootMovieClip) {
     while (code = actionsBit.ui8()) {
        console.debug("FlappAction code:0x"+code.toString(16));
         if (code < 0x80) { // No Operand
-            if (code < 0x17) { // 0x17(Pop)
-               switch (code) {
-               case 0x06: // Play
-                    movieClip.play();
-                    break;
-               case 0x07: // Stop
-                    movieClip.stop();
-                    break;
-               default:
-                    console.debug("FlappActiom: not implemented yet. code=0x%02x", code);
-                    break;
-               }
-           } else { // 0x17(Pop)<=code
-               switch (code) {
-               case 0x0a: // Add
-                   var a = stack.pop();
-                   var b = stack.pop();
-                   a = (typeof a === 'number')?a:0;
-                   b = (typeof b === 'number')?b:0;
-                   stack.push(a + b);
-                   break;
-               case 0x0b: // Subtract
-                   var a = stack.pop();
-                   var b = stack.pop();
-                   a = (typeof a === 'number')?a:0;
-                   b = (typeof b === 'number')?b:0;
-                   stack.push(b - a);
-                   break;
-               case 0x0c: // Multiply
-                   var a = stack.pop();
-                   var b = stack.pop();
-                   a = (typeof a === 'number')?a:0;
-                   b = (typeof b === 'number')?b:0;
-                   stack.push(a * b);
-                   break;
-               case 0x0c: // Devide
-                   var a = stack.pop();
-                   var b = stack.pop();
-                   a = (typeof a === 'number')?a:0;
-                   b = (typeof b === 'number')?b:0;
-                   if (a === 0) {
-                       stack.push('#ERROR#'); // SWF4
-                       // Note: For SWF5, Infinity or -Infinity is pushed.
-                   } else {
-                       stack.push(b / a);
+            if (code < 0x1d) { // 0x1d(SetVariables)
+               if (code < 0x0a) { // 0x0a(Add)
+                   switch (code) {
+                   case 0x06: // Play
+                       movieClip.play();
+                       break;
+                   case 0x07: // Stop
+                       movieClip.stop();
+                       break;
+                   default:
+                       console.debug("FlappActiom: not implemented yet. code=0x%02x", code);
+                       break;
                    }
-                   break;
-               case 0x0e: // Equals
-                   var a = stack.pop();
-                   var b = stack.pop();
-                   a = (typeof a === 'number')?a:0;
-                   b = (typeof b === 'number')?b:0;
-                   if (a === b) {
-                       stack.push(1); // SWF4
-                       // Note: For SWF5, true is pushed.
-                   } else {
-                       stack.push(0);
-                       // Note: For SWF5, false is pushed.
+               } else { // 0x0a(Add)<=code
+                   switch (code) {
+                   case 0x0a: // Add
+                       var a = stack.pop();
+                       var b = stack.pop();
+                       a = (typeof a === 'number')?a:0;
+                       b = (typeof b === 'number')?b:0;
+                       stack.push(a + b);
+                       break;
+                   case 0x0b: // Subtract
+                       var a = stack.pop();
+                       var b = stack.pop();
+                       a = (typeof a === 'number')?a:0;
+                       b = (typeof b === 'number')?b:0;
+                       stack.push(b - a);
+                       break;
+                   case 0x0c: // Multiply
+                       var a = stack.pop();
+                       var b = stack.pop();
+                       a = (typeof a === 'number')?a:0;
+                       b = (typeof b === 'number')?b:0;
+                       stack.push(a * b);
+                       break;
+                   case 0x0c: // Devide
+                       var a = stack.pop();
+                       var b = stack.pop();
+                       a = (typeof a === 'number')?a:0;
+                       b = (typeof b === 'number')?b:0;
+                       if (a === 0) {
+                           stack.push('#ERROR#'); // SWF4
+                           // Note: For SWF5, Infinity or -Infinity is pushed.
+                       } else {
+                           stack.push(b / a);
+                       }
+                       break;
+                   case 0x0e: // Equals
+                       var a = stack.pop();
+                       var b = stack.pop();
+                       a = (typeof a === 'number')?a:0;
+                       b = (typeof b === 'number')?b:0;
+                       if (a === b) {
+                           stack.push(1); // SWF4
+                           // Note: For SWF5, true is pushed.
+                       } else {
+                           stack.push(0);
+                           // Note: For SWF5, false is pushed.
+                       }
+                       break;
+                   case 0x17: // Pop
+                       stack.pop(); // discards the value
+                       break;
+                   default:
+                       console.debug("FlappActiom: not implemented yet. code=0x%02x", code);
+                       break;
                    }
-                   break;
-               case 0x17: // Pop
-                   stack.pop(); // discards the value
-                   break;
+               }
+           } else {
+               switch (code) {
                case 0x1d: // SetVariables
                     movieClip.setVariable(stack.pop(), stack.pop());
                     break;