bool cPlayer::onTradeStart( P_PLAYER partner, P_ITEM firstitem ) { bool result = false; if (canHandleEvent(EVENT_TRADESTART)) { PyObject* args = Py_BuildValue( "(O&O&O&)", PyGetCharObject, this, PyGetCharObject, partner, PyGetItemObject, firstitem ); result = callEventHandler( EVENT_TRADESTART, args ); Py_DECREF( args ); } return result; }
bool cPlayer::onLogin( void ) { bool result = false; if ( canHandleEvent( EVENT_LOGIN ) ) { PyObject* args = Py_BuildValue( "(O&)", PyGetCharObject, this ); result = callEventHandler( EVENT_LOGIN, args ); Py_DECREF( args ); } return result; }
bool cPlayer::onUse( P_ITEM pItem ) { bool result = false; if ( canHandleEvent(EVENT_USE) ) { PyObject* args = Py_BuildValue( "O&O&", PyGetCharObject, this, PyGetItemObject, pItem ); result = callEventHandler( EVENT_USE, args ); Py_DECREF( args ); } return result; }
bool cPlayer::onCastSpell( unsigned int spell ) { bool result = false; if ( canHandleEvent( EVENT_CASTSPELL ) ) { PyObject* args = Py_BuildValue( "O&i", PyGetCharObject, this, spell ); result = callEventHandler( EVENT_CASTSPELL, args ); Py_DECREF( args ); } return result; }
bool cPlayer::onTrade( unsigned int type, unsigned int buttonstate, SERIAL itemserial ) { bool result = false; if ( canHandleEvent(EVENT_TRADE) ) { PyObject* args = Py_BuildValue( "(O&iii)", PyGetCharObject, this, type, buttonstate, itemserial ); result = callEventHandler(EVENT_TRADE, args ); Py_DECREF( args ); } return result; }
////////////////////////////////////////////////////////////////////////// // high level scripting interface ////////////////////////////////////////////////////////////////////////// bool BaseScriptHolder::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, const char *name) { ////////////////////////////////////////////////////////////////////////// // DEBUG_CrashMe ////////////////////////////////////////////////////////////////////////// if (strcmp(name, "DEBUG_CrashMe") == 0) { stack->correctParams(0); byte *p = 0; *p = 10; stack->pushNULL(); return STATUS_OK; } ////////////////////////////////////////////////////////////////////////// // ApplyEvent ////////////////////////////////////////////////////////////////////////// else if (strcmp(name, "ApplyEvent") == 0) { stack->correctParams(1); ScValue *val = stack->pop(); bool ret; ret = applyEvent(val->getString()); if (DID_SUCCEED(ret)) { stack->pushBool(true); } else { stack->pushBool(false); } return STATUS_OK; } ////////////////////////////////////////////////////////////////////////// // CanHandleEvent ////////////////////////////////////////////////////////////////////////// else if (strcmp(name, "CanHandleEvent") == 0) { stack->correctParams(1); stack->pushBool(canHandleEvent(stack->pop()->getString())); return STATUS_OK; } ////////////////////////////////////////////////////////////////////////// // CanHandleMethod ////////////////////////////////////////////////////////////////////////// else if (strcmp(name, "CanHandleMethod") == 0) { stack->correctParams(1); stack->pushBool(canHandleMethod(stack->pop()->getString())); return STATUS_OK; } ////////////////////////////////////////////////////////////////////////// // AttachScript ////////////////////////////////////////////////////////////////////////// else if (strcmp(name, "AttachScript") == 0) { stack->correctParams(1); stack->pushBool(DID_SUCCEED(addScript(stack->pop()->getString()))); return STATUS_OK; } ////////////////////////////////////////////////////////////////////////// // DetachScript ////////////////////////////////////////////////////////////////////////// else if (strcmp(name, "DetachScript") == 0) { stack->correctParams(2); const char *filename = stack->pop()->getString(); bool killThreads = stack->pop()->getBool(false); bool ret = false; for (uint32 i = 0; i < _scripts.size(); i++) { if (scumm_stricmp(_scripts[i]->_filename, filename) == 0) { _scripts[i]->finish(killThreads); ret = true; break; } } stack->pushBool(ret); return STATUS_OK; } ////////////////////////////////////////////////////////////////////////// // IsScriptRunning ////////////////////////////////////////////////////////////////////////// else if (strcmp(name, "IsScriptRunning") == 0) { stack->correctParams(1); const char *filename = stack->pop()->getString(); bool ret = false; for (uint32 i = 0; i < _scripts.size(); i++) { if (scumm_stricmp(_scripts[i]->_filename, filename) == 0 && _scripts[i]->_state != SCRIPT_FINISHED && _scripts[i]->_state != SCRIPT_ERROR) { ret = true; break; } } stack->pushBool(ret); return STATUS_OK; } else { return BaseScriptable::scCallMethod(script, stack, thisStack, name); } }