nickarthur
11/25/2013 - 3:30 AM

Direct Messaging scripts for Self-Registering Game Object --updated to include degault prefab name in case the game designer fails to regist

Direct Messaging scripts for Self-Registering Game Object --updated to include degault prefab name in case the game designer fails to register it DM Asset may be placed in multiple game assets so the DM Master( game controller ) can locate and communictate with serveral assets. This is a demo setup to show how assets can discover they are no longer registered to recieve work requests-- leading them to re-register.

var gameObjects = {};
var trackedAssetCount = getParam('Tracked Asset Count');

var running = false;
var retry;


function getGameObjects(globalStateData) {
  //error('In getAssets: globalStateData = ' + stringify(globalStateData, { newline: false, indent: false }));
  //error('In getAssets: TOTAL TRACKED ASSETS SETTING = ' + trackedAssetCount);
  error('GetGameObjects: TOTAL ASSETS FOUND IS: ' +keys(gameObjects).length);
  gameObjects = globalStateData.gameObjects;

  if (globalStateData.polled) {
    if (keys(gameObjects).length < trackedAssetCount) {
      error('getGameObjects: All assets don\'t exist. Continuing to poll...');
      pollEntity();
    } else {
      timerDestroy('pollEntity');
      error('getGameObjects: All entities found. Everything seems good.');
    }
  }
}

function pollEntity() {
  error('assets{} length = ' + keys(gameObjects).length);
  //error('Polling Global State...');

  getGlobalState({
    state_key: 'DM Key',
    keys: ['gameObjects'],
    callback: 'getGameObjects',
    callback_data: { polled: true }
  });
}

function checkTaskResponse(messageData) {
  //error('checkTaskResponse: messageData = ' + stringify(messageData, { newline: false, indent: false }));

  if (messageData.err !== undefined) {

    //error('checkTaskResponse: We have an error messageData = ' + stringify(messageData, { newline: false, indent: false }));
    purgeAssetFromDB(messageData.name);


    //error('checkTaskResponse: Starting timer for polled broadcast...');
    timerCreate({ name: 'pollEntity', period: 4 });

  } else {
    timerDestroy('pollEntity');
    error('checkTaskResponse: Entity was found. Everything seems good.');
  }
}

function purgeAssetFromDB(assetName){
  //error('In purgeAssetsFromDB: gameObjects = ' +  stringify(gameObjects, { newline: false, indent: false }));

  //error("In purgeAssetsFromDB: the property name to be deleted is: " + assetName);

  delete gameObjects[assetName];

  var gameObjectsCopy = clone(gameObjects);

  setGlobalState({
    state_key: 'DM Key',
    data: {gameObjects:gameObjectsCopy}
  });

    setGlobalState({
    state_key: 'DM Key',
    data: {gameObjects:gameObjectsCopy}
  });

    error('Entity ( ' + assetName + ' ) not found. Purged old ID. Putting system into Standby mode.');
    //error('After purging, assets now contains: ' + stringify(gameObjectsCopy, { newline: false, indent: false }));
}

 // Registration..

 function register(data) {

   if ( retry !== true || data.err !== undefined ) {
     getGlobalState({
       state_key: 'DM Key',
       keys: ['gameObjects'],
       callback: 'registerYourself'
     });
   } else {
       //error('Updated with ID: ' + getSelfEnt());//done
   }
 }

 function registerYourself(data) {
   //error('In RegisterYourself:  global state has: ' + stringify(data,{ newline: false, indent: false }));
   gameObjects = data.gameObjects;

   var base_gameObjects = clone(gameObjects);

   if (gameObjects === undefined) {
     gameObjects = { };
   }

   var my_name = getParam('Game Object Name');

   gameObjects[my_name] = getSelfEnt();

   retry = true;
   //error('In RegisterYourself:  SETTING global state TO: ' + stringify(gameObjects,{ newline: false, indent: false }));

   setGlobalState({
     state_key: 'DM Key',
     data: { gameObjects: gameObjects },
     check: { gameObjects: base_gameObjects},
     callback: 'register'
   });
 }

function pingAssets() {
  //error('PING: Getting asset ID\'s from database...');

  getGlobalState({
    state_key: 'DM Key',
    keys: ['gameObjects'],
    callback: 'getGameObjects'
  });
}

function triggerGameTask()
{
  if (gameObjects !== "undefined") {
    //error('IN TRIGGER GAME TASK: ' + stringify(gameObjects, { newline: false, indent: false }));

    var assetNames = keys(gameObjects);

    //error('IN TRIGGER GAME TASK the game object keys are: ' + stringify(assetNames, { newline: false, indent: false }));
    //error('TOTAL ASSETS FOUND = ' + assetNames.length);

    if ( assetNames !== "undefined" && assetNames.length !== 0 ) {
      for ( var i = 0 ;i< assetNames.length;i++) {
        //error('Processing Game Asset: ' + assetNames[i] );
        //error('Direct Messaging '+ assetNames[i] + ' via ID [' +  gameObjects[assetNames[i]] + '] to do a task...');

        directMessage({
          ent: gameObjects[assetNames[i]],
          channel: 'dm_channel',
          message: 'task',
          callback: 'checkTaskResponse',
          callback_data: { name: assetNames[i] }
        });
      }
    }
  }

}

  function clickStart() {
    error('TRIGGERING GAME TASK!');
      triggerGameTask();
  }

  function init() {

  retry = false;

  register({});

  handlerCreate({
    name: 'clickStart',
    channel: 'direct',
    message: 'clickStart'
  });

  error('STARTED!');
 // timerCreate({ name: 'pingAssets', period: 10 });
}

init();
 // Register...

var g_myName = getParam('Game Object Name')===''?'prefab'+randomInt(0,70000):getParam('Game Object Name');

//http://wiki.cloudparty.com/wiki/Script_Examples/Scene_Scripts
 // Where are we?

  var retry;

function init(){

  retry = false;

  register({});

  //in case we get purged due to com delays
  timerCreate({name: 'keepAlive', period: 10});

}

function keepAlive() {

     getGlobalState({
       state_key: 'DM Key',
       keys: ['gameObjects'],
       callback: 'reRegister'
     });
}

function reRegister(globalStateData) {

  var keysArray = keys(globalStateData.gameObjects);


  //if my name isn't on the list then re-register, controller purged me
  if ( keysArray !== "undefined" && keysArray.length>0 ) {
    if ( keysArray.indexOf(g_myName) == -1 ) {
      error('CONTROLLER PURGED ME!  RE-REGISTERING: ' + g_myName + ' as : ' + globalStateData.gameObjects[g_myName]);
      retry = false;
      register({});
    }

  }

}
 // Registration..

 function register(data) {

   if ( retry !== true || data.err !== undefined ) {
     getGlobalState({
       state_key: 'DM Key',
       keys: ['gameObjects'],
       callback: 'registerYourself'
     });
   } else {
       error('Updated with ID: ' + getSelfEnt());//done
   }
 }

 function registerYourself(data) {

   var gameObjects = data.gameObjects;

   var base_gameObjects = clone(gameObjects);

   if (gameObjects === undefined) {
     gameObjects = { };
   }



   gameObjects[g_myName] = getSelfEnt();

   retry = true;

   setGlobalState({
     state_key: 'DM Key',
     data: { gameObjects: gameObjects },
     check: { gameObjects: base_gameObjects},
     callback: 'register'
   });
 }

 init();