Search code examples
actionscript-3flashactionscriptswfobject

patching actionscript without constantly rebuilding swf


How can I patch actionscript without constantly rebuilding sfw? There is a fairly large actionscript project that I need to modify and resulting swf is used on a live site. The problem I have is that I need to make quick small updates to the swf and it's not acceptable to update the swf on live site ten time a day (I don't control that part, I need to ask another person to put the result on live site). What options do I have to workaround that issue? I'm a complete noob when it comes to actionscript and all flash related stuff and I'm not even sure what is possible and what isn't. I'm thinking about the following approaches, which ones are possible/acceptable?

Imagine that live site is on www.livesite.com/game.html and this page loads www.livesite.com/flashgame.swf. In that flashgame.swf among many others there is a class com/livesite/Magic.as that gets instantiated and instance of that class has a member variable xxx123 of class com/livesite/MagicWork.as. I only need to modify this MagicWork class. Now, I simply modify it, build and ask to put updated flashgame.swf live. So, I want to avoid that manual step.

All my ideas can be split in two basic approaches: 1) keep flashgame.swf totally unmodified and then load flashgame.mod.swf that contains alternative implementation of that MagicWork class, then using javascript access internals of instance of that Magic class and update its xxx123 member to be an instance of MagicWork class from flashgame.mode.swf. I'd need to modify game.html to load my javascript so that my js file would load flashgame.mod.swf and patch code inside flashgame.swf. By patching I mean javascript-style overwriting of Magic.xxx123 to a new value. flashgame.mode.swf would ideally reside on my own host that I control. Is that kind of stuff possible, if not what's not possible? 2) I could make one-time change in flashgame.swf so that it would effectively load itself my own code at runtime and patch it's xxx123 member. Is that possible?


Solution

  • I had already written a note about loading runtime shared libraries previously. I'll put the most essential parts of the process here, and add a link to the full article at the end.

    You need to tag your main application entry point in the following manner.

    [Frame(factoryClass="Preloader")]
    public class Main extends Sprite
    {
    
    }
    

    Then create a class called Preloader.

    public class Preloader
    {
    
        public function Preloader()
        {
            var loader:Loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, this.loader_completeHandler);
            loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, this.loader_ioErrorHandler);
            var request:URLRequest = new URLRequest("math.swf");
            var context:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
            loader.load(request, context);
        }
    
        private function loader_completeHandler(event:Event):void
        {
            var mainClass:Class = getDefinitionByName("Main") as Class;
            var mainInstance:Main = new mainClass();
            this.addChild(mainInstance);
        }
    }
    

    The full implementation of the Main class is like this.

    [Frame(factoryClass="Preloader")]
    public function Main()
    {
        var integer:IntegerArithmetic = new IntegerArithmetic(); // Type declared in math.swf
        var operand1:int = 10;
        var operand2:int = 10;
        var result:int = integer.add(operand1, operand2);
    }
    

    Deploying Runtime Shared Libraries

    The confusing bit about using a runtime shared library is realizing that the SWF has to be extracted from the SWC at the time of deploying the application. This was not immediately obvious and I ended up spending days placing a compiled SWC file in various locations and wondering why the application was unable to load it at runtime. An obscure article on the Adobe website made explicit this particular step and set things straight.

    The full article along with the same example is available at http://www.notadesigner.com/runtime-shared-libraries-with-plain-actionscript/.