/* ==================================================================================================== orderDroid.js v0.1 * Adds orderDroid() function if it's missing * Extends orderDroid() to handle DORDER_DESTRUCT and DORDER_RECYCLE Based on: https://github.com/Warzone2100/warzone2100/blob/master/src/qtscriptfuncs.cpp Ported by: aubergine http://forums.wz2100.net/memberlist.php?mode=viewprofile&u=4994 Home page: https://warzone.atlassian.net/wiki/display/backportjs/orderDroid.js Released under the MIT, BSD, and GPL Licenses. v0.1 - Initial release ==================================================================================================== */ (function() { if (!backport) { throw new Error("Unable to backport orderDroid(): orderDroid.js requires backport.js"); } else { // take control of, or create, orderDroid() backport("orderDroid",function(droid,order) { if (order in orderDroid.DORDER) { return orderDroid.DORDER[order].apply(null,arguments); } else { throw new RangeError("Invalid order: "+order); } }); // create order handler container (you can add your own orders - see below for examples) orderDroid.DORDER = {}; // define DORDER_HOLD if (DORDER_HOLD) orderDroid.DORDER[DORDER_HOLD] = function(droid,order) { if (orderDroid.native) { // DORDER_HOLD supported by original orderDroid() return orderDroid.native(droid,order); } else { // use alternative return orderDroidLoc(droid,order,droid.x,droid.y); } } // define DORDER_RTR // Discrepancy: This just chooses random repair facility, WZ will try and find nearest (free?) repair facility if (DORDER_RTR) orderDroid.DORDER[DORDER_RTR] = function(droid,order) { var obj; if (orderDroid.native) { // DORDER_RTR supported by original orderDroid() return orderDroid.native(droid,order); } else if ((obj = enumStruct(me,"A0RepairCentre3")).length) { // go to random rearm pad return orderDroidObj(droid,order,obj[Math.floor(Math.random()*(obj.length-1))]); } else if (DORDER_RTB) { // DORDER_RTB return orderDroid.DORDER[DORDER_RTB](droid,order); } else { // fail :( return false; } } // define DORDER_STOP if (DORDER_STOP) orderDroid.DORDER[DORDER_STOP] = function(droid,order) { if (orderDroid.native) { // DORDER_STOP supported by original orderDroid() return orderDroid.native(droid,order); } else { // use alternative return orderDroidLoc(droid,order,droid.x,droid.y); } } // define DORDER_RTB // Discrepancy: WZ will send droid to LZ if there is no HQ, but I don't know how to find an LZ. if (DORDER_RTB) orderDroid.DORDER[DORDER_RTB] = function(droid,order) { var pos; if (orderDroid.native) { // DORDER_RTR supported by original orderDroid() return orderDroid.native(droid,order); } else if ((pos = enumStruct(me,"A0CommandCentre")).length) { // return to HQ return orderDroidLoc(droid,order,pos[0].x,pos[0].y); } else if (startPositions) { // return to start position return orderDroidLoc(droid,order,startPositions[me].x,startPositions[me].y); } else if ((pos = enumStruct(me)).length) { // retreat to oldest structure return orderDroidLoc(droid,order,pos[0].x,pos[0].y); } else { // fail :( return false; } } // define DORDER_REARM // Discrepancy: This just chooses random rearm pad, WZ will try and find a free rearm pad. if (DORDER_REARM) orderDroid.DORDER[DORDER_REARM] = function(droid,order) { var obj; if (orderDroid.native) { // DORDER_REARM supported by original orderDroid() return orderDroid.native(droid,order); } else if ((obj = enumStruct(me,"A0VtolPad")).length) { // go to random rearm pad return orderDroidObj(droid,order,obj[Math.floor(Math.random()*(obj.length-1))]); } else if (DORDER_RTB) { // DORDER_RTB return orderDroid.DORDER[DORDER_RTB](droid,order); } else { // fail :( return false; } } // define DORDER_DESTRUCT (custom extension) if (DORDER_DESTRUCT) orderDroid.DORDER[DORDER_DESTRUCT] = function(droid,order) { try { // orderDroid() might support this in future return orderDroid.native(droid,order); } catch(err) { // but it doesn't currently so use alternative return orderDroidLoc(droid,order,droid.x,droid.y); } } // define DORDER_RECYCLE (custom extension) // Discrepancy: WZ chooses factory based on propulsion, this just uses normal factory or gives up if (DORDER_RECYCLE) orderDroid.DORDER[DORDER_RECYCLE] = function(droid,order) { var obj; try { // orderDroid() might support this in future return orderDroid.native(droid,order); } catch(err) { // but it doesn't currently so use alternative if ((obj = enumStruct(me,"A0RepairCentre3")).length) { // use random repair facility return orderDroidObj(droid,order,obj[Math.floor(Math.random()*(obj.length-1))]); } else if ((obj = enumStruct(me,"A0LightFactory")).length) { // use random factory return orderDroidObj(droid,order,obj[Math.floor(Math.random()*(obj.length-1))]); } else if (DORDER_RTB) { // DORDER_RTB return orderDroid.DORDER[DORDER_RTB](droid,order); } else { // fail :( return false; } } } // done! } })();