Пример #1
0
int CCLuaEngine::executeNodeEvent(CCNode* pNode, int nAction)
{
    int ret = 0;
    do 
    {
        int nScriptHandler = pNode->getScriptHandler();
        CC_BREAK_IF(0 == nScriptHandler);

        cleanStack();
        CCLuaValueDict dict;
        if (nAction == kCCNodeOnEnter)
        {
            dict["name"] = CCLuaValue::stringValue("enter");
            pushCCLuaValueDict(dict);
            ret = executeFunctionByHandler(nScriptHandler, 1);
        }
        else if (nAction == kCCNodeOnExit)
        {
            dict["name"] = CCLuaValue::stringValue("exit");
            pushCCLuaValueDict(dict);
            ret = executeFunctionByHandler(nScriptHandler, 1);
        }
    } while (0);
    return ret;
}
Пример #2
0
int CCLuaEngine::executeLayerTouchesEvent(CCLayer* pLayer, int eventType, CCSet *pTouches)
{
    int ret = 0;
    do 
    {
        CCTouchScriptHandlerEntry* pScriptHandlerEntry = pLayer->getScriptTouchHandlerEntry();
        CC_BREAK_IF(NULL == pScriptHandlerEntry);
        int nScriptHandler = pScriptHandlerEntry->getHandler();
        CC_BREAK_IF(0 == nScriptHandler);
        
        cleanStack();
        lua_pushinteger(m_state, eventType);
        lua_newtable(m_state);

        CCDirector* pDirector = CCDirector::sharedDirector();
        CCSetIterator it = pTouches->begin();
        CCTouch* pTouch;
        int n = 1;
        while (it != pTouches->end())
        {
            pTouch = (CCTouch*)*it;
            CCPoint pt = pDirector->convertToGL(pTouch->getLocationInView());
            lua_pushnumber(m_state, pt.x);
            lua_rawseti(m_state, -2, n++);
            lua_pushnumber(m_state, pt.y);
            lua_rawseti(m_state, -2, n++);
            ++it;
        }

        ret = executeFunctionByHandler(nScriptHandler, 2);
    } while (0);

    return ret;
}
Пример #3
0
int CCLuaEngine::executeSchedule(CCTimer* pTimer, float dt, CCNode* pNode/* = NULL*/)
{
    int ret = 0;
    do 
    {
        int nScriptHandler = pTimer->getScriptHandler();
        CC_BREAK_IF(0 == nScriptHandler);

        cleanStack();
        pushFloat(dt);
        ret = executeFunctionByHandler(nScriptHandler, 1);
    } while (0);
    return ret;
}
Пример #4
0
int CCLuaEngine::executeNotificationEvent(CCNotificationCenter* pNotificationCenter, const char* pszName)
{
    int ret = 0;
    do 
    {
        int nScriptHandler = pNotificationCenter->getScriptHandler();
        CC_BREAK_IF(0 == nScriptHandler);
        
        cleanStack();
        pushString(pszName);
        ret = executeFunctionByHandler(nScriptHandler, 1);
    } while (0);
    return ret;
}
Пример #5
0
int CCLuaEngine::executeMenuItemEvent(CCMenuItem* pMenuItem)
{
    int ret = 0;
    do 
    {
        int nScriptHandler = pMenuItem->getScriptTapHandler();
        CC_BREAK_IF(0 == nScriptHandler);
        
        cleanStack();
        pushInt(pMenuItem->getTag());
        ret = executeFunctionByHandler(nScriptHandler, 1);
    } while (0);
    return ret;
}
Пример #6
0
int CCLuaEngine::executeLayerKeypadEvent(CCLayer* pLayer, int eventType)
{
    int ret = 0;
    do
    {
        CCScriptHandlerEntry* pScriptHandlerEntry = pLayer->getScriptKeypadHandlerEntry();
        CC_BREAK_IF(NULL == pScriptHandlerEntry);
        int nScriptHandler = pScriptHandlerEntry->getHandler();
        CC_BREAK_IF(0 == nScriptHandler);
        
        cleanStack();
        lua_newtable(m_state);
        lua_pushinteger(m_state, eventType);
        ret = executeFunctionByHandler(nScriptHandler, 1);
    } while (0);
    return ret;
}
Пример #7
0
// functions for excute touch event
int CCLuaEngine::executeLayerTouchEvent(int nScriptHandler, int eventType, CCTouch *pTouch)
{
    int ret = 0;
    do 
    {
        CC_BREAK_IF(0 == nScriptHandler);
        
        cleanStack();
		lua_pushinteger(m_state, eventType);
		
		CCPoint pt = (pTouch != 0) ? CCDirector::sharedDirector()->convertToGL(pTouch->getLocationInView()) : ccp(0,0);
        lua_pushnumber(m_state, pt.x);
        lua_pushnumber(m_state, pt.y);
        ret = executeFunctionByHandler(nScriptHandler, 3);
    } while (0);
    return ret;
}
Пример #8
0
// functions for excute touch event
int CCLuaEngine::executeLayerTouchEvent(CCLayer* pLayer, int eventType, CCTouch *pTouch)
{
    int ret = 0;
    do 
    {
        CCTouchScriptHandlerEntry* pScriptHandlerEntry = pLayer->getScriptTouchHandlerEntry();
        CC_BREAK_IF(NULL == pScriptHandlerEntry);
        int nScriptHandler = pScriptHandlerEntry->getHandler();
        CC_BREAK_IF(0 == nScriptHandler);
        
        cleanStack();
        CCPoint pt = CCDirector::sharedDirector()->convertToGL(pTouch->getLocationInView());
        lua_pushinteger(m_state, eventType);
        lua_pushnumber(m_state, pt.x);
        lua_pushnumber(m_state, pt.y);
        ret = executeFunctionByHandler(nScriptHandler, 3);
    } while (0);
    return ret;
}
Пример #9
0
int CCLuaEngine::executeAccelerometerEvent(CCLayer* pLayer, CCAcceleration* pAccelerationValue)
{
    int ret = 0;
    do
    {
        CCScriptHandlerEntry* pScriptHandlerEntry = pLayer->getScriptAccelerateHandlerEntry();
        CC_BREAK_IF(NULL == pScriptHandlerEntry);
        int nScriptHandler = pScriptHandlerEntry->getHandler();
        CC_BREAK_IF(0 == nScriptHandler);
        
        cleanStack();
        lua_newtable(m_state);
        lua_pushnumber(m_state, pAccelerationValue->x);
        lua_pushnumber(m_state, pAccelerationValue->y);
        lua_pushnumber(m_state, pAccelerationValue->z);
        lua_pushnumber(m_state, pAccelerationValue->timestamp);
        ret = executeFunctionByHandler(nScriptHandler, 4);
    } while (0);
    return ret;
}
Пример #10
0
int CCLuaEngine::executeCallFuncActionEvent(CCCallFunc* pAction, CCObject* pTarget/* = NULL*/)
{
    int ret = 0;
    do 
    {
        int nScriptHandler = pAction->getScriptHandler();
        CC_BREAK_IF(0 == nScriptHandler);
        
        cleanStack();
        if (pTarget != NULL)
        {
            pushCCObject(pTarget, "CCNode");
        }
        else
        {
            pushNil();
        }
        ret = executeFunctionByHandler(nScriptHandler, 1);
    } while (0);
    return ret;
}
Пример #11
0
//print stack.  You have to print from the stack. You can not call a print function from dlinklist
void printStack(struct stack *s)
{
//	struct data* tDta = NULL;
	struct stack *tS = createStack();

	while(!isEmptyStack(s))
	{
		struct data* tDta = top(s);
		printData(tDta);
		pushStack(tS,createData(tDta->v1,tDta->v2));
		popStack(s);
	}

	while(!isEmptyStack(tS))
	{
		struct data* tDta = top(tS);
		pushStack(s,createData(tDta->v1,tDta->v2));
                popStack(tS);
	}
	cleanStack(tS);
}
Пример #12
0
TokenBase* calculator::calculate(const TokenQueue_t& rpn, TokenMap scope,
                                 const opMap_t& opMap) {
  evaluationData data(rpn, scope, opMap);

  // Evaluate the expression in RPN form.
  std::stack<TokenBase*> evaluation;
  while (!data.rpn.empty()) {
    TokenBase* base = data.rpn.front()->clone();
    data.rpn.pop();

    // Operator:
    if (base->type == OP) {
      data.op = static_cast<Token<std::string>*>(base)->val;
      delete base;

      /* * * * * Resolve operands Values and References: * * * * */

      if (evaluation.size() < 2) {
        cleanStack(evaluation);
        throw std::domain_error("Invalid equation.");
      }
      TokenBase* b_right = evaluation.top(); evaluation.pop();
      TokenBase* b_left  = evaluation.top(); evaluation.pop();

      if (b_right->type == VAR) {
        std::string var_name = static_cast<Token<std::string>*>(b_right)->val;
        delete b_right;
        delete resolve_reference(b_left);
        cleanStack(evaluation);
        throw std::domain_error("Unable to find the variable '" + var_name + "'.");
      } else {
        b_right = resolve_reference(b_right, &data.scope);
      }

      packToken r_left;
      packToken m_left;
      if (b_left->type & REF) {
        RefToken* left = static_cast<RefToken*>(b_left);
        r_left = left->key;
        m_left = left->source;
        b_left = resolve_reference(left, &data.scope);
      } else if (b_left->type == VAR) {
        r_left = static_cast<Token<std::string>*>(b_left)->val;
      }

      /* * * * * Resolve Asign Operation * * * * */

      if (!data.op.compare("=")) {
        delete b_left;

        // If the left operand has a variable name:
        if (r_left->type == STR) {
          if (m_left->type == MAP) {
            TokenMap& map = m_left.asMap();
            std::string& key = r_left.asString();
            map[key] = packToken(b_right->clone());
          } else {
            TokenMap* map = data.scope.findMap(r_left.asString());
            if (!map || *map == TokenMap::default_global()) {
              // Assign on the local scope.
              // The user should not be able to implicitly overwrite
              // variables he did not declare, since it's error prone.
              data.scope[r_left.asString()] = packToken(b_right->clone());
            } else {
              (*map)[r_left.asString()] = packToken(b_right->clone());
            }
          }

          evaluation.push(b_right);
        // If the left operand has an index number:
        } else if (r_left->type & NUM) {
          if (m_left->type == LIST) {
            TokenList& list = m_left.asList();
            size_t index = r_left.asInt();
            list[index] = packToken(b_right->clone());
          } else {
            delete b_right;
            cleanStack(evaluation);
            throw std::domain_error("Left operand of assignment is not a list!");
          }

          evaluation.push(b_right);
        } else {
          packToken p_right(b_right->clone());
          delete b_right;

          cleanStack(evaluation);
          throw undefined_operation(data.op, r_left, p_right);
        }
      } else if (b_left->type == FUNC && data.op == "()") {
        Function* f_left = static_cast<Function*>(b_left);

        if (!data.op.compare("()")) {
          // Collect the parameter tuple:
          Tuple right;
          if (b_right->type == TUPLE) {
            right = *static_cast<Tuple*>(b_right);
          } else {
            right = Tuple(b_right);
          }
          delete b_right;

          packToken _this;
          if (m_left->type != NONE) {
            _this = m_left;
          } else {
            _this = data.scope;
          }

          // Execute the function:
          packToken ret;
          try {
            ret = Function::call(_this, f_left, &right, data.scope);
          } catch (...) {
            cleanStack(evaluation);
            delete f_left;
            throw;
          }

          delete f_left;

          evaluation.push(ret->clone());
        } else {
          packToken p_right(b_right->clone());
          packToken p_left(b_left->clone());
          delete b_right;

          cleanStack(evaluation);
          throw undefined_operation(data.op, p_left, p_right);
        }
      } else {
        data.opID = Operation::build_mask(b_left->type, b_right->type);
        packToken p_left(b_left);
        packToken p_right(b_right);
        TokenBase* result = 0;

        try {
          // Resolve the operation:
          result = exec_operation(p_left, p_right, &data, data.op);
          if (!result) {
            result = exec_operation(p_left, p_right, &data, ANY_OP);
          }
        } catch (...) {
          cleanStack(evaluation);
          throw;
        }

        if (result) {
          evaluation.push(result);
        } else {
          cleanStack(evaluation);
          throw undefined_operation(data.op, p_left, p_right);
        }
      }
    } else if (base->type == VAR) {  // Variable
      packToken* value = NULL;
      std::string key = static_cast<Token<std::string>*>(base)->val;

      value = data.scope.find(key);

      if (value) {
        TokenBase* copy = (*value)->clone();
        evaluation.push(new RefToken(key, copy));
        delete base;
      } else {
        evaluation.push(base);
      }
    } else {
      evaluation.push(base);
    }
  }

  return evaluation.top();
}
Пример #13
0
int CCLuaEngine::executeSchedule(int nHandler, float dt, CCNode* pNode/* = NULL*/)
{
    cleanStack();
    pushFloat(dt);
    return executeFunctionByHandler(nHandler, 1);
}