uox3/source/SEFunctions.cpp
2003-01-20 16:26:42 +00:00

4405 lines
No EOL
122 KiB
C++

// Here are the functions that are exposed to the Script Engine
#include "uox3.h"
#include "cdice.h"
#include "SEFunctions.h"
#ifndef va_start
#include <cstdarg>
//using namespace std;
#endif
#define __EXTREMELY_VERBOSE__
#ifdef __EXTREMELY_VERBOSE__
void DoSEErrorMessage( char *txt, ... )
{
va_list argptr;
char msg[512];
#ifdef __NONANSI_VASTART__
va_start( argptr );
#else
va_start( argptr, txt );
#endif
vsprintf( msg, txt, argptr );
va_end( argptr );
Console.Error( 2, msg );
}
#else
void DoSEErrorMessage( char *txt, ... )
{
return;
}
#endif
JSBool SE_ConsoleMessage( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "ConsoleMessage: Invalid number of arguments (takes 1)" );
return JS_FALSE;
}
char *test = JS_GetStringBytes( JS_ValueToString( cx, argv[0] ) );
// print the string to the console
if( test != NULL )
Console << test;
return JS_TRUE;
}
JSBool ScriptPrintNumber( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "ScriptPrintNumber: Invalid number of arguments (takes 1)" );
return JS_FALSE;
}
long test = JSVAL_TO_INT( argv[0] );
// print the string to the console
Console << (SI32)test;
return JS_TRUE;
}
JSBool SetShowLayer( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "SetShowLayer: Invalid number of arguments (takes 1)" );
return JS_FALSE;
}
showlayer = ( JSVAL_TO_BOOLEAN( argv[0] ) == JS_TRUE );
if( showlayer )
Console << "Layer display enabled" << myendl;
else
Console << "Layer display disabled" << myendl;
return JS_TRUE;
}
JSBool GetShowLayer( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
*rval = BOOLEAN_TO_JSVAL( showlayer );
return JS_TRUE;
}
JSBool SE_CalcSockFromChar( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "CalcSockFromChar: Invalid number of arguments (takes 1, character)" );
return JS_FALSE;
}
CHARACTER targChar = (CHARACTER)JSVAL_TO_INT( argv[0] );
if( targChar == INVALIDSERIAL || targChar > cmem )
{
DoSEErrorMessage( "CalcSockFromChar: Invalid argument, invalid character (%i)", targChar );
return JS_FALSE;
}
*rval = INT_TO_JSVAL( calcSocketFromChar( targChar ) );
return JS_TRUE;
}
// Gump related functions
JSBool SE_Gump_CreateGump( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
UI16 mTrig = Trigger->FindObject( obj );
cScript *toGet = Trigger->GetScript( mTrig );
if( toGet != NULL )
*rval = INT_TO_JSVAL( toGet->NewGumpList() );
else
return JS_FALSE;
return JS_TRUE;
}
JSBool SE_Gump_Delete( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "Gump_Delete: Invalid number of arguments (takes 1)" );
return JS_FALSE;
}
SI32 handle = (SI32)JSVAL_TO_INT( argv[0] );
UI16 mTrig = Trigger->FindObject( obj );
cScript *toGet = Trigger->GetScript( mTrig );
if( toGet != NULL )
toGet->RemoveGumpList( handle );
else
return JS_FALSE;
return JS_TRUE;
}
JSBool SE_Gump_AddCheckbox( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 6 )
{
DoSEErrorMessage( "Gump_AddCheckbox: Invalid number of arguments (takes 6)" );
return JS_FALSE;
}
SI32 handle = (SI32)JSVAL_TO_INT( argv[0] );
SI16 tL = (SI16)JSVAL_TO_INT( argv[1] );
SI16 tR = (SI16)JSVAL_TO_INT( argv[2] );
UI16 gImage = (UI16)JSVAL_TO_INT( argv[3] );
SI16 x1 = (SI16)JSVAL_TO_INT( argv[4] );
SI16 x2 = (SI16)JSVAL_TO_INT( argv[5] );
UI16 mTrig = Trigger->FindObject( obj );
cScript *toGet = Trigger->GetScript( mTrig );
if( toGet != NULL )
{
SEGump *gList = toGet->GetGumpList( handle );
if( gList == NULL )
{
DoSEErrorMessage( "Gump_AddCheckbox: Couldn't find gump associated with handle (%i)", handle );
return JS_FALSE;
}
char temp[256];
sprintf( temp, "checkbox %i %i %i %i %i %i", tL, tR, gImage, gImage + 1, x1, x2 );
gList->one->push_back( temp );
}
return JS_TRUE;
}
JSBool SE_Gump_AddButton( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 7 )
{
DoSEErrorMessage( "Gump_AddButton: Invalid number of arguments (takes 7)" );
return JS_FALSE;
}
SI32 handle = (SI32)JSVAL_TO_INT( argv[0] );
SI16 tL = (SI16)JSVAL_TO_INT( argv[1] );
SI16 tR = (SI16)JSVAL_TO_INT( argv[2] );
UI16 gImage = (UI16)JSVAL_TO_INT( argv[3] );
SI16 x1 = (SI16)JSVAL_TO_INT( argv[4] );
SI16 x2 = (SI16)JSVAL_TO_INT( argv[5] );
SI16 x3 = (SI16)JSVAL_TO_INT( argv[6] );
UI16 mTrig = Trigger->FindObject( obj );
cScript *toGet = Trigger->GetScript( mTrig );
if( toGet != NULL )
{
SEGump *gList = toGet->GetGumpList( handle );
if( gList == NULL )
{
DoSEErrorMessage( "Gump_AddButton: Couldn't find gump associated with handle (%i)", handle );
return JS_FALSE;
}
char temp[256];
sprintf( temp, "button %i %i %i %i %i %i %i", tL, tR, gImage, gImage + 1, x1, x2, x3 );
gList->one->push_back( temp );
}
return JS_TRUE;
}
JSBool SE_Gump_AddText( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 6 )
{
DoSEErrorMessage( "Gump_AddText: Invalid number of arguments (takes 6)" );
return JS_FALSE;
}
SI32 handle = (SI32)JSVAL_TO_INT( argv[0] );
SI16 tL = (SI16)JSVAL_TO_INT( argv[1] );
SI16 tR = (SI16)JSVAL_TO_INT( argv[2] );
SI16 x1 = (SI16)JSVAL_TO_INT( argv[3] );
SI16 x2 = (SI16)JSVAL_TO_INT( argv[4] );
char *test = JS_GetStringBytes( JS_ValueToString( cx, argv[5] ) );
if( test == NULL )
{
DoSEErrorMessage( "Gump_AddText: Text is required" );
return JS_FALSE;
}
UI16 mTrig = Trigger->FindObject( obj );
cScript *toGet = Trigger->GetScript( mTrig );
if( toGet != NULL )
{
SEGump *gList = toGet->GetGumpList( handle );
if( gList == NULL )
{
DoSEErrorMessage( "Gump_AddText: Couldn't find gump associated with handle (%i)", handle );
return JS_FALSE;
}
char temp[256];
sprintf( temp, "text %i %i %i %i", tL, tR, x1, x2 );
gList->one->push_back( temp );
gList->two->push_back( test );
}
return JS_TRUE;
}
JSBool SE_Gump_AddTextEntry( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 9 )
{
DoSEErrorMessage( "Gump_AddTextEntry: Invalid number of arguments (takes 9)" );
return JS_FALSE;
}
SI32 handle = (SI32)JSVAL_TO_INT( argv[0] );
SI16 tL = (SI16)JSVAL_TO_INT( argv[1] );
SI16 tR = (SI16)JSVAL_TO_INT( argv[2] );
SI16 x1 = (SI16)JSVAL_TO_INT( argv[3] );
SI16 x2 = (SI16)JSVAL_TO_INT( argv[4] );
SI16 x3 = (SI16)JSVAL_TO_INT( argv[5] );
SI16 x4 = (SI16)JSVAL_TO_INT( argv[6] );
SI16 x5 = (SI16)JSVAL_TO_INT( argv[7] );
char *test = JS_GetStringBytes( JS_ValueToString( cx, argv[8] ) );
if( test == NULL )
{
DoSEErrorMessage( "Gump_AddTextEntry: Text is required" );
return JS_FALSE;
}
UI16 mTrig = Trigger->FindObject( obj );
cScript *toGet = Trigger->GetScript( mTrig );
if( toGet != NULL )
{
SEGump *gList = toGet->GetGumpList( handle );
if( gList == NULL )
{
DoSEErrorMessage( "Gump_AddTextEntry: Couldn't find gump associated with handle (%i)", handle );
return JS_FALSE;
}
char temp[256];
sprintf( temp, "textentry %i %i %i %i %i %i %i", tL, tR, x1, x2, x3, x4, x5 );
gList->one->push_back( temp );
gList->two->push_back( test );
}
return JS_TRUE;
}
JSBool SE_Gump_AddRadio( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 6 )
{
DoSEErrorMessage( "Gump_AddRadio: Invalid number of arguments (takes 6)" );
return JS_FALSE;
}
SI32 handle = (SI32)JSVAL_TO_INT( argv[0] );
SI16 tL = (SI16)JSVAL_TO_INT( argv[1] );
SI16 tR = (SI16)JSVAL_TO_INT( argv[2] );
UI16 gImage = (UI16)JSVAL_TO_INT( argv[3] );
SI16 bL = (SI16)JSVAL_TO_INT( argv[4] );
SI16 bR = (SI16)JSVAL_TO_INT( argv[5] );
UI16 mTrig = Trigger->FindObject( obj );
cScript *toGet = Trigger->GetScript( mTrig );
if( toGet != NULL )
{
SEGump *gList = toGet->GetGumpList( handle );
if( gList == NULL )
{
DoSEErrorMessage( "Gump_AddRadio: Couldn't find gump associated with handle (%i)", handle );
return JS_FALSE;
}
char temp[256];
sprintf( temp, "radio %i %i %i %i %i %i", tL, tR, gImage, gImage + 1, bL, bR );
gList->one->push_back( temp );
}
return JS_TRUE;
}
JSBool SE_Gump_AddPage( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
DoSEErrorMessage( "Gump_AddPage: Invalid number of arguments (takes 2)" );
return JS_FALSE;
}
SI32 handle = (SI32)JSVAL_TO_INT( argv[0] );
SI16 pNum = (SI16)JSVAL_TO_INT( argv[1] );
UI16 mTrig = Trigger->FindObject( obj );
cScript *toGet = Trigger->GetScript( mTrig );
if( toGet != NULL )
{
SEGump *gList = toGet->GetGumpList( handle );
if( gList == NULL )
{
DoSEErrorMessage( "Gump_AddPage: Couldn't find gump associated with handle (%i)", handle );
return JS_FALSE;
}
char temp[256];
sprintf( temp, "page %i", pNum );
gList->one->push_back( temp );
}
return JS_TRUE;
}
JSBool SE_Gump_AddPicture( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 4 )
{
DoSEErrorMessage( "Gump_AddPicture: Invalid number of arguments (takes 4)" );
return JS_FALSE;
}
SI32 handle = (SI32)JSVAL_TO_INT( argv[0] );
SI16 tL = (SI16)JSVAL_TO_INT( argv[1] );
SI16 tR = (SI16)JSVAL_TO_INT( argv[2] );
UI16 gImage = (UI16)JSVAL_TO_INT( argv[3] );
UI16 mTrig = Trigger->FindObject( obj );
cScript *toGet = Trigger->GetScript( mTrig );
if( toGet != NULL )
{
SEGump *gList = toGet->GetGumpList( handle );
if( gList == NULL )
{
DoSEErrorMessage( "Gump_AddPicture: Couldn't find gump associated with handle (%i)", handle );
return JS_FALSE;
}
char temp[256];
sprintf( temp, "tilepic %i %i %i", tL, tR, gImage );
gList->one->push_back( temp );
}
return JS_TRUE;
}
JSBool SE_Gump_AddGump( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 4 )
{
DoSEErrorMessage( "Gump_AddGump: Invalid number of arguments (takes 4)" );
return JS_FALSE;
}
SI32 handle = (SI32)JSVAL_TO_INT( argv[0] );
SI16 tL = (SI16)JSVAL_TO_INT( argv[1] );
SI16 tR = (SI16)JSVAL_TO_INT( argv[2] );
UI16 gImage = (UI16)JSVAL_TO_INT( argv[3] );
UI16 mTrig = Trigger->FindObject( obj );
cScript *toGet = Trigger->GetScript( mTrig );
if( toGet != NULL )
{
SEGump *gList = toGet->GetGumpList( handle );
if( gList == NULL )
{
DoSEErrorMessage( "Gump_AddGump: Couldn't find gump associated with handle (%i)", handle );
return JS_FALSE;
}
char temp[256];
sprintf( temp, "gumppic %i %i %i", tL, tR, gImage );
gList->one->push_back( temp );
}
return JS_TRUE;
}
JSBool SE_Gump_AddBackground( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 6 )
{
DoSEErrorMessage( "Gump_AddBackground: Invalid number of arguments (takes 6)" );
return JS_FALSE;
}
SI32 handle = (SI32)JSVAL_TO_INT( argv[0] );
SI16 tL = (SI16)JSVAL_TO_INT( argv[1] );
SI16 tR = (SI16)JSVAL_TO_INT( argv[2] );
SI16 bL = (SI16)JSVAL_TO_INT( argv[3] );
SI16 bR = (SI16)JSVAL_TO_INT( argv[4] );
UI16 gImage = (UI16)JSVAL_TO_INT( argv[5] );
UI16 mTrig = Trigger->FindObject( obj );
cScript *toGet = Trigger->GetScript( mTrig );
if( toGet != NULL )
{
SEGump *gList = toGet->GetGumpList( handle );
if( gList == NULL )
{
DoSEErrorMessage( "Gump_AddBackground: Couldn't find gump associated with handle (%i)", handle );
return JS_FALSE;
}
char temp[256];
sprintf( temp, "resizepic %i %i %i %i %i", tL, tR, gImage, bL, bR );
gList->one->push_back( temp );
}
return JS_TRUE;
}
JSBool SE_Gump_SendToSocket( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
DoSEErrorMessage( "Gump_SendToSock: Invalid number of arguments (takes 2, index, socket)" );
return JS_FALSE;
}
SI32 index = (SI32)JSVAL_TO_INT( argv[0] );
UOXSOCKET s = (UOXSOCKET)JSVAL_TO_INT( argv[1] );
if( s == -1 || s >= now )
{
DoSEErrorMessage( "Gump_SendToSock: Invalid socket (%i)", s );
return JS_FALSE;
}
UI16 mTrig = Trigger->FindObject( obj );
cScript *toGet = Trigger->GetScript( mTrig );
if( toGet != NULL )
toGet->SendGumpList( index, s );
return JS_TRUE;
}
// Character related functions
JSBool SE_GetTarget( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "GetTarget: Invalid number of arguments (takes 1, character)" );
return JS_FALSE;
}
CHARACTER targChar = (CHARACTER)JSVAL_TO_INT( argv[0] );
if( targChar == INVALIDSERIAL || targChar > cmem )
{
DoSEErrorMessage( "GetTarget: Invalid argument, invalid character (%i)", targChar );
return JS_FALSE;
}
*rval = INT_TO_JSVAL( chars[targChar].GetTarg() );
return JS_TRUE;
}
JSBool SE_RunTo( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 4 )
{
DoSEErrorMessage( "RunTo: Invalid number of arguments (takes 4, character, targ x and y, and maxSteps)" );
return JS_FALSE;
}
CHARACTER cMove = (CHARACTER)JSVAL_TO_INT( argv[0] );
if( cMove == INVALIDSERIAL || cMove >= cmem )
{
return JS_FALSE;
}
UI16 gx = (UI16)JSVAL_TO_INT( argv[1] );
UI16 gy = (UI16)JSVAL_TO_INT( argv[2] );
UI08 maxSteps = (UI08)JSVAL_TO_INT( argv[3] );
Movement->PathFind( &chars[cMove], gx, gy, true, maxSteps );
return JS_TRUE;
}
// Effect related functions
JSBool SE_DoStaticEffect( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc < 5 )
{
DoSEErrorMessage( "DoStaticEffect: Invalid number of arguments (takes 5 as char or 6 as item)" );
return JS_FALSE;
}
UI08 targType = (UI08)JSVAL_TO_INT( argv[4] );
if( ( targType == 0 && argc != 5 ) || ( targType == 1 && argc != 6 ) ) // a char, and not 5 params or an item and not 6
{
DoSEErrorMessage( "DoStaticEffect: Invalid number of arguments (takes 5 as char or 6 as item)" );
return JS_FALSE;
}
UI32 targThing = JSVAL_TO_INT( argv[0] );
if( targType == 0 && ( targThing == INVALIDSERIAL || targThing > cmem ) )
{
DoSEErrorMessage( "DoStaticEffect: Invalid object (character %i)", targThing );
return JS_FALSE;
}
if( targType == 1 && ( targThing == INVALIDSERIAL || targThing > imem ) )
{
DoSEErrorMessage( "DoStaticEffect: Invalid object (item %i)", targThing );
return JS_FALSE;
}
UI16 effectID = (UI16)JSVAL_TO_INT( argv[1] );
UI08 speed = (UI08)JSVAL_TO_INT( argv[2] );
UI08 loop = (UI08)JSVAL_TO_INT( argv[3] );
if( argc == 6 )
{
bool explode = ( JSVAL_TO_BOOLEAN( argv[5] ) == JS_TRUE );
staticeffect( &items[targThing], effectID, speed, loop, explode );
}
else
staticeffect( &chars[targThing], effectID, speed, loop );
return JS_TRUE;
}
JSBool SE_DoTempEffect( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc < 7 )
{
DoSEErrorMessage( "DoTempEffect: Invalid number of arguments (takes 7 or 8)" );
return JS_FALSE;
}
long iType = JSVAL_TO_INT( argv[0] );
long targNum = JSVAL_TO_INT( argv[3] );
UI08 more1 = (UI08)JSVAL_TO_INT( argv[4] );
UI08 more2 = (UI08)JSVAL_TO_INT( argv[5] );
UI08 more3 = (UI08)JSVAL_TO_INT( argv[6] );
JSObject *myitemptr = NULL;
CItem *myItemPtr = NULL;
ITEM itemPtr = INVALIDSERIAL;
if( argc == 8 )
{
myitemptr = JSVAL_TO_OBJECT( argv[7] );
myItemPtr = (CItem *)JS_GetPrivate( cx, myitemptr );
if( myItemPtr != NULL )
itemPtr = calcItemFromSer( myItemPtr->GetSerial() );
}
JSObject *mysrc = JSVAL_TO_OBJECT( argv[1] );
CChar *mysrcChar = (CChar*)JS_GetPrivate( cx, mysrc );
if( mysrcChar == NULL )
{
DoSEErrorMessage( "DoTempEffect: Invalid src" );
return JS_FALSE;
}
if( iType == 0 ) // character
{
JSObject *mydestc = JSVAL_TO_OBJECT( argv[2] );
CChar *mydestChar = (CChar*)JS_GetPrivate( cx, mydestc );
if( mydestChar == NULL )
{
DoSEErrorMessage( "DoTempEffect: Invalid target " );
return JS_FALSE;
}
if( argc == 8 )
tempeffect( mysrcChar, mydestChar, targNum, more1, more2, more3, itemPtr );
else
tempeffect( mysrcChar, mydestChar, targNum, more1, more2, more3 );
}
else
{
JSObject *mydesti = JSVAL_TO_OBJECT( argv[2] );
CItem *mydestItem = (CItem *)JS_GetPrivate( cx, mydesti );
if( mydestItem == NULL )
{
DoSEErrorMessage( "DoTempEffect: Invalid target " );
return JS_FALSE;
}
if( argc == 8 )
tempeffect( mysrcChar, mydestItem, targNum, more1, more2, more3, itemPtr );
else
tempeffect( mysrcChar, mydestItem, targNum, more1, more2, more3 );
}
return JS_TRUE;
}
// Magic related functions
JSBool SE_CastSpell( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
DoSEErrorMessage( "CastSpell: Invalid number of arguments (takes 2)" );
return JS_FALSE;
}
UI32 iObject = JSVAL_TO_INT( argv[0] );
if( iObject == INVALIDSERIAL || iObject > cmem )
{
DoSEErrorMessage( "CastSpell: Invalid character (%i)", iObject );
return JS_FALSE;
}
SI08 spellCast = (SI08)JSVAL_TO_INT( argv[1] );
if( chars[iObject].IsNpc() )
{
chars[iObject].SetSpellCast( spellCast );
Magic->CastSpell( NULL, &chars[iObject] );
}
else
{
cSocket *sock = calcSocketObjFromChar( iObject );
Magic->SelectSpell( sock, spellCast );
}
return JS_TRUE;
}
void JSSpeech( cBaseObject &speaker, char *message, SpeechType sType, COLOUR sColour = 0x005A, FontType fType = FNT_NORMAL, SpeechTarget spTrg = SPTRG_PCNPC )
{
//Reactivate when a better way of doing this is found... Atm you cannot speak more than one line in TEN seconds" )
/*if( speaker.GetObjType() == OT_CHAR )
{
if( static_cast< CChar & >(speaker).GetAntiSpamTimer() < uiCurrentTime )
static_cast< CChar & >(speaker).SetAntiSpamTimer( BuildTimeValue( 10.0f ) );
else
return;
}*/
CSpeechEntry *toAdd = SpeechSys->Add();
toAdd->Font( fType );
toAdd->Speech( message );
toAdd->Speaker( speaker.GetSerial() );
toAdd->Type( sType );
toAdd->At( uiCurrentTime );
toAdd->TargType( spTrg );
toAdd->Colour( sColour );
}
// Speech related functions
JSBool SE_BroadcastMessage( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "BroadcastMessage: Invalid number of arguments (takes 1)" );
return JS_FALSE;
}
JSString *targMessage = JS_ValueToString( cx, argv[0] );
char *trgMessage = JS_GetStringBytes( targMessage );
if( trgMessage == NULL )
{
DoSEErrorMessage( "BroadcastMessage: Invalid string (%s)", trgMessage );
return JS_FALSE;
}
sysbroadcast( trgMessage );
return JS_TRUE;
}
JSBool SE_YellMessage( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
DoSEErrorMessage( "YellMessage: Invalid number of arguments (takes 2)" );
return JS_FALSE;
}
CHARACTER targChar = (CHARACTER)JSVAL_TO_INT( argv[0] );
JSString *targMessage = JS_ValueToString( cx, argv[1] );
char *trgMessage = JS_GetStringBytes( targMessage );
if( targChar == INVALIDSERIAL || targChar >= cmem || trgMessage == NULL )
{
DoSEErrorMessage( "YellMessage: Invalid character (%i) or speech (%s)", targChar, trgMessage );
return JS_FALSE;
}
JSSpeech( chars[targChar], trgMessage, YELL, chars[targChar].GetSayColour(), (FontType)chars[targChar].GetFontType() );
return JS_TRUE;
}
JSBool SE_WhisperMessage( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
DoSEErrorMessage( "WhisperMessage: Invalid number of arguments (takes 2)" );
return JS_FALSE;
}
CHARACTER targChar = (CHARACTER)JSVAL_TO_INT( argv[0] );
JSString *targMessage = JS_ValueToString( cx, argv[1] );
char *trgMessage = JS_GetStringBytes( targMessage );
if( targChar == INVALIDSERIAL || targChar >= cmem || trgMessage == NULL )
{
DoSEErrorMessage( "WhisperMessage: Invalid character (%i) or speech (%s)", targChar, trgMessage );
return JS_FALSE;
}
JSSpeech( chars[targChar], trgMessage, WHISPER, chars[targChar].GetSayColour(), (FontType)chars[targChar].GetFontType() );
return JS_TRUE;
}
// Attack related functions
JSBool SE_AttackTarget( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "AttackTarget: Invalid number of arguments (takes 1, CHARACTER)" );
return JS_FALSE;
}
CHARACTER attacking = (CHARACTER)JSVAL_TO_INT( argv[0] );
if( attacking == INVALIDSERIAL || attacking >= cmem )
{
DoSEErrorMessage( "AttackTarget: Invalid character (%i)", attacking );
return JS_FALSE;
}
npcAttackTarget( &chars[chars[attacking].GetTarg()], &chars[attacking] );
return JS_TRUE;
}
JSBool SE_Attack( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
DoSEErrorMessage( "Attack: Invalid number of arguments (takes 2, both CHARACTERs)" );
return JS_FALSE;
}
CHARACTER attacking = (CHARACTER)JSVAL_TO_INT( argv[0] );
CHARACTER toAttack = (CHARACTER)JSVAL_TO_INT( argv[1] );
if( attacking == INVALIDSERIAL || attacking >= cmem || toAttack == INVALIDSERIAL || toAttack >= cmem )
{
DoSEErrorMessage( "Attack: Invalid attacker (%i) or target (%i)", attacking, toAttack );
return JS_FALSE;
}
npcAttackTarget( &chars[toAttack], &chars[attacking] );
return JS_TRUE;
}
JSBool SE_FindNearestTarget( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "FindNearestTarget: Invalid number of arguments (takes 1, CHARACTER)" );
return JS_FALSE;
}
CHARACTER toCheck = (CHARACTER)JSVAL_TO_INT( argv[0] );
if( toCheck == INVALIDSERIAL || toCheck >= cmem )
{
DoSEErrorMessage( "FindNearestTarget: Invalid character (%i)", toCheck );
return JS_FALSE;
}
cBaseObject *src = &chars[toCheck];
cBaseObject *nearest = NULL;
R32 distance = 0;
int xOffset = MapRegion->GetGridX( src->GetX() );
int yOffset = MapRegion->GetGridY( src->GetY() );
UI08 worldNumber = src->WorldNumber();
for( SI08 counter1 = -1; counter1 <= 1; counter1++ )
{
for( SI08 counter2 = -1; counter2 <= 1; counter2++ )
{
SubRegion *MapArea = MapRegion->GetGrid( xOffset + counter1, yOffset+counter2, worldNumber ); // check 3 cols... do we really NEED to?
if( MapArea == NULL ) // no valid region
continue;
MapArea->PushChar();
for( CChar *tempChar = MapArea->FirstChar(); !MapArea->FinishedChars(); tempChar = MapArea->GetNextChar() )
{
if( tempChar == NULL )
continue;
if( nearest == NULL && tempChar != src )
{
nearest = tempChar;
distance = fabs( (tempChar->GetLocation() - src->GetLocation()).MagSquared() );
}
else if( tempChar != src )
{
R32 nextDistance = fabs( (tempChar->GetLocation() - src->GetLocation()).MagSquared() );
if( nextDistance < distance )
{
distance = nextDistance;
nearest = tempChar;
}
}
}
MapArea->PopChar();
}
}
if( nearest == NULL )
*rval = INT_TO_JSVAL( INVALIDSERIAL );
else
*rval = INT_TO_JSVAL( calcCharFromSer( nearest->GetSerial() ) );
return JS_TRUE;
}
JSBool SE_FindStrongestTarget( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "FindStrongestTarget: Invalid number of arguments (takes 1, CHARACTER)" );
return JS_FALSE;
}
CHARACTER toCheck = (CHARACTER)JSVAL_TO_INT( argv[0] );
if( toCheck == INVALIDSERIAL || toCheck >= cmem )
{
DoSEErrorMessage( "FindStrongestTarget: Invalid character (%i)", toCheck );
return JS_FALSE;
}
cBaseObject *src = &chars[toCheck];
cBaseObject *nearest = NULL;
int strength = 0;
int xOffset = MapRegion->GetGridX( src->GetX() );
int yOffset = MapRegion->GetGridY( src->GetY() );
UI08 worldNumber = src->WorldNumber();
for( SI08 counter1 = -1; counter1 <= 1; counter1++ )
{
for( SI08 counter2 = -1; counter2 <= 1; counter2++ )
{
SubRegion *MapArea = MapRegion->GetGrid( xOffset + counter1, yOffset + counter2, worldNumber ); // check 3 cols... do we really NEED to?
if( MapArea == NULL ) // no valid region
continue;
MapArea->PushChar();
for( CChar *tempChar = MapArea->FirstChar(); !MapArea->FinishedChars(); tempChar = MapArea->GetNextChar() )
{
if( tempChar == NULL )
continue;
if( nearest == NULL && tempChar != src )
{
nearest = tempChar;
strength = tempChar->GetStrength();
}
else if( tempChar != src )
{
int nextStrength = tempChar->GetStrength();
if( nextStrength > strength )
{
strength = nextStrength;
nearest = tempChar;
}
}
}
MapArea->PopChar();
}
}
if( nearest == NULL )
*rval = INT_TO_JSVAL( INVALIDSERIAL );
else
*rval = INT_TO_JSVAL( calcCharFromSer( nearest->GetSerial() ) );
return JS_TRUE;
}
JSBool SE_FindWeakestTarget( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "FindWeakestTarget: Invalid number of arguments (takes 1, CHARACTER)" );
return JS_FALSE;
}
CHARACTER toCheck = (CHARACTER)JSVAL_TO_INT( argv[0] );
if( toCheck == INVALIDSERIAL || toCheck >= cmem )
{
DoSEErrorMessage( "FindWeakestTarget: Invalid character (%i)", toCheck );
return JS_FALSE;
}
cBaseObject *src = &chars[toCheck];
cBaseObject *nearest = NULL;
int strength = 0;
int xOffset = MapRegion->GetGridX( src->GetX() );
int yOffset = MapRegion->GetGridY( src->GetY() );
UI08 worldNumber = src->WorldNumber();
for( SI08 counter1 = -1; counter1 <= 1; counter1++ )
{
for( SI08 counter2 = -1; counter2 <= 1; counter2++ )
{
SubRegion *MapArea = MapRegion->GetGrid( xOffset + counter1, yOffset + counter2, worldNumber ); // check 3 cols... do we really NEED to?
if( MapArea == NULL ) // no valid region
continue;
MapArea->PushChar();
for( CChar *tempChar = MapArea->FirstChar(); !MapArea->FinishedChars(); tempChar = MapArea->GetNextChar() )
{
if( tempChar == NULL )
continue;
if( nearest == NULL && tempChar != src )
{
nearest = tempChar;
strength = tempChar->GetStrength();
}
else if( tempChar != src )
{
int nextStrength = tempChar->GetStrength();
if( nextStrength < strength )
{
strength = nextStrength;
nearest = tempChar;
}
}
}
MapArea->PopChar();
}
}
if( nearest == NULL )
*rval = INT_TO_JSVAL( INVALIDSERIAL );
else
*rval = INT_TO_JSVAL( calcCharFromSer( nearest->GetSerial() ) );
return JS_TRUE;
}
JSBool SE_FindFirstTarget( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "FindFirstTarget: Invalid number of arguments (takes 1, CHARACTER)" );
return JS_FALSE;
}
CHARACTER toCheck = (CHARACTER)JSVAL_TO_INT( argv[0] );
if( toCheck == INVALIDSERIAL || toCheck >= cmem )
{
DoSEErrorMessage( "FindFirstTarget: Invalid character (%i)", toCheck );
return JS_FALSE;
}
cBaseObject *src = &chars[toCheck];
int xOffset = MapRegion->GetGridX( src->GetX() );
int yOffset = MapRegion->GetGridY( src->GetY() );
UI08 worldNumber = src->WorldNumber();
for( SI08 counter1 = -1; counter1 <= 1; counter1++ )
{
for( SI08 counter2 = -1; counter2 <= 1; counter2++ )
{
SubRegion *MapArea = MapRegion->GetGrid( xOffset + counter1, yOffset + counter2, worldNumber ); // check 3 cols... do we really NEED to?
if( MapArea == NULL ) // no valid region
continue;
MapArea->PushChar();
for( CChar *tempChar = MapArea->FirstChar(); !MapArea->FinishedChars(); tempChar = MapArea->GetNextChar() )
{
if( tempChar == NULL )
continue;
if( tempChar != src )
{
*rval = INT_TO_JSVAL( calcCharFromSer( tempChar->GetSerial() ) );
MapArea->PopChar();
return JS_TRUE;
}
}
MapArea->PopChar();
}
}
*rval = INT_TO_JSVAL( INVALIDSERIAL );
return JS_TRUE;
}
JSBool SE_FindLastTarget( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "FindLastTarget: Invalid number of arguments (takes 1)" );
return JS_FALSE;
}
CHARACTER toCheck = (CHARACTER)JSVAL_TO_INT( argv[0] );
if( toCheck == INVALIDSERIAL || toCheck >= cmem )
{
DoSEErrorMessage( "FindLastTarget: Invalid character (%i)", toCheck );
return JS_FALSE;
}
cBaseObject *src = &chars[toCheck];
cBaseObject *nearest = NULL;
int xOffset = MapRegion->GetGridX( src->GetX() );
int yOffset = MapRegion->GetGridY( src->GetY() );
UI08 worldNumber = src->WorldNumber();
for( SI08 counter1 = -1; counter1 <= 1; counter1++ )
{
for( SI08 counter2 = -1; counter2 <= 1; counter2++ )
{
SubRegion *MapArea = MapRegion->GetGrid( xOffset + counter1, yOffset + counter2, worldNumber ); // check 3 cols... do we really NEED to?
if( MapArea == NULL ) // no valid region
continue;
MapArea->PushChar();
for( CChar *tempChar = MapArea->FirstChar(); !MapArea->FinishedChars(); tempChar = MapArea->GetNextChar() )
{
if( tempChar == NULL )
continue;
nearest = tempChar;
}
MapArea->PopChar();
}
}
if( nearest != NULL )
*rval = INT_TO_JSVAL( calcCharFromSer( nearest->GetSerial() ) );
else
*rval = INT_TO_JSVAL( INVALIDSERIAL );
return JS_TRUE;
}
JSBool SE_FindSmartestTarget( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "FindSmartestTarget: Invalid number of arguments (takes 1)" );
return JS_FALSE;
}
CHARACTER toCheck = (CHARACTER)JSVAL_TO_INT( argv[0] );
if( toCheck == INVALIDSERIAL || toCheck >= cmem )
{
DoSEErrorMessage( "FindSmartestTarget: Invalid character (%i)", toCheck );
return JS_FALSE;
}
cBaseObject *src = &chars[toCheck];
cBaseObject *nearest = NULL;
int strength = 0;
int xOffset = MapRegion->GetGridX( src->GetX() );
int yOffset = MapRegion->GetGridY( src->GetY() );
UI08 worldNumber = src->WorldNumber();
for( SI08 counter1 = -1; counter1 <= 1; counter1++ )
{
for( SI08 counter2 = -1; counter2 <= 1; counter2++ )
{
SubRegion *MapArea = MapRegion->GetGrid( xOffset + counter1, yOffset + counter2, worldNumber ); // check 3 cols... do we really NEED to?
if( MapArea == NULL ) // no valid region
continue;
MapArea->PushChar();
for( CChar *tempChar = MapArea->FirstChar(); !MapArea->FinishedChars(); tempChar = MapArea->GetNextChar() )
{
if( tempChar == NULL )
continue;
if( nearest == NULL && tempChar != src )
{
nearest = tempChar;
strength = tempChar->GetIntelligence();
}
else if( tempChar != src )
{
int nextStrength = tempChar->GetIntelligence();
if( nextStrength > strength )
{
strength = nextStrength;
nearest = tempChar;
}
}
}
MapArea->PopChar();
}
}
if( nearest == NULL )
*rval = INT_TO_JSVAL( INVALIDSERIAL );
else
*rval = INT_TO_JSVAL( calcCharFromSer( nearest->GetSerial() ) );
return JS_TRUE;
return JS_TRUE;
}
JSBool SE_FindDumbestTarget( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "FindDumbestTarget: Invalid number of arguments (takes 1)" );
return JS_FALSE;
}
CHARACTER toCheck = (CHARACTER)JSVAL_TO_INT( argv[0] );
if( toCheck == INVALIDSERIAL || toCheck >= cmem )
{
DoSEErrorMessage( "FindDumbestTarget: Invalid character (%i)", toCheck );
return JS_FALSE;
}
cBaseObject *src = &chars[toCheck];
cBaseObject *nearest = NULL;
int strength = 0;
int xOffset = MapRegion->GetGridX( src->GetX() );
int yOffset = MapRegion->GetGridY( src->GetY() );
UI08 worldNumber = src->WorldNumber();
for( SI08 counter1 = -1; counter1 <= 1; counter1++ )
{
for( SI08 counter2 = -1; counter2 <= 1; counter2++ )
{
SubRegion *MapArea = MapRegion->GetGrid( xOffset + counter1, yOffset + counter2, worldNumber ); // check 3 cols... do we really NEED to?
if( MapArea == NULL ) // no valid region
continue;
MapArea->PushChar();
for( CChar *tempChar = MapArea->FirstChar(); !MapArea->FinishedChars(); tempChar = MapArea->GetNextChar() )
{
if( tempChar == NULL )
continue;
if( nearest == NULL && tempChar != src )
{
nearest = tempChar;
strength = tempChar->GetIntelligence();
}
else if( tempChar != src )
{
int nextStrength = tempChar->GetIntelligence();
if( nextStrength < strength )
{
strength = nextStrength;
nearest = tempChar;
}
}
}
MapArea->PopChar();
}
}
if( nearest == NULL )
*rval = INT_TO_JSVAL( INVALIDSERIAL );
else
*rval = INT_TO_JSVAL( calcCharFromSer( nearest->GetSerial() ) );
return JS_TRUE;
return JS_TRUE;
}
JSBool SE_FindQuickestTarget( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "FindQuickestTarget: Invalid number of arguments (takes 1)" );
return JS_FALSE;
}
CHARACTER toCheck = (CHARACTER)JSVAL_TO_INT( argv[0] );
if( toCheck == INVALIDSERIAL || toCheck >= cmem )
{
DoSEErrorMessage( "FindQuickestTarget: Invalid character (%i)", toCheck );
return JS_FALSE;
}
cBaseObject *src = &chars[toCheck];
cBaseObject *nearest = NULL;
int strength = 0;
int xOffset = MapRegion->GetGridX( src->GetX() );
int yOffset = MapRegion->GetGridY( src->GetY() );
UI08 worldNumber = src->WorldNumber();
for( SI08 counter1 = -1; counter1 <= 1; counter1++ )
{
for( SI08 counter2 = -1; counter2 <= 1; counter2++ )
{
SubRegion *MapArea = MapRegion->GetGrid( xOffset + counter1, yOffset + counter2, worldNumber ); // check 3 cols... do we really NEED to?
if( MapArea == NULL ) // no valid region
continue;
MapArea->PushChar();
for( CChar *tempChar = MapArea->FirstChar(); !MapArea->FinishedChars(); tempChar = MapArea->GetNextChar() )
{
if( tempChar == NULL )
continue;
if( nearest == NULL && tempChar != src )
{
nearest = tempChar;
strength = tempChar->GetDexterity();
}
else if( tempChar != src )
{
int nextStrength = tempChar->GetDexterity();
if( nextStrength > strength )
{
strength = nextStrength;
nearest = tempChar;
}
}
}
MapArea->PopChar();
}
}
if( nearest == NULL )
*rval = INT_TO_JSVAL( INVALIDSERIAL );
else
*rval = INT_TO_JSVAL( calcCharFromSer( nearest->GetSerial() ) );
return JS_TRUE;
return JS_TRUE;
}
JSBool SE_FindSlowestTarget( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "FindSlowestTarget: Invalid number of arguments (takes 1)" );
return JS_FALSE;
}
CHARACTER toCheck = (CHARACTER)JSVAL_TO_INT( argv[0] );
if( toCheck == INVALIDSERIAL || toCheck >= cmem )
{
DoSEErrorMessage( "FindSlowestTarget: Invalid character (%i)", toCheck );
return JS_FALSE;
}
cBaseObject *src = &chars[toCheck];
cBaseObject *nearest = NULL;
int strength = 0;
int xOffset = MapRegion->GetGridX( src->GetX() );
int yOffset = MapRegion->GetGridY( src->GetY() );
UI08 worldNumber = src->WorldNumber();
for( SI08 counter1 = -1; counter1 <= 1; counter1++ )
{
for( SI08 counter2 = -1; counter2 <= 1; counter2++ )
{
SubRegion *MapArea = MapRegion->GetGrid( xOffset + counter1, yOffset + counter2, worldNumber ); // check 3 cols... do we really NEED to?
if( MapArea == NULL ) // no valid region
continue;
MapArea->PushChar();
for( CChar *tempChar = MapArea->FirstChar(); !MapArea->FinishedChars(); tempChar = MapArea->GetNextChar() )
{
if( tempChar == NULL )
continue;
if( nearest == NULL && tempChar != src )
{
nearest = tempChar;
strength = tempChar->GetDexterity();
}
else if( tempChar != src )
{
int nextStrength = tempChar->GetDexterity();
if( nextStrength < strength )
{
strength = nextStrength;
nearest = tempChar;
}
}
}
MapArea->PopChar();
}
}
if( nearest == NULL )
*rval = INT_TO_JSVAL( INVALIDSERIAL );
else
*rval = INT_TO_JSVAL( calcCharFromSer( nearest->GetSerial() ) );
return JS_TRUE;
return JS_TRUE;
}
JSBool SE_GetName2( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
DoSEErrorMessage( "GetName2: Invalid number of arguments (takes 2, object and object type)" );
return JS_FALSE;
}
UI32 targChar = JSVAL_TO_INT( argv[0] );
if( targChar == INVALIDSERIAL || targChar > imem )
{
DoSEErrorMessage( "GetName2: Invalid object (%i)", targChar );
return JS_FALSE;
}
JSString *strSpeech = NULL;
strSpeech = JS_NewStringCopyZ( cx, items[targChar].GetName2() );
*rval = STRING_TO_JSVAL( strSpeech );
return JS_TRUE;
}
JSBool SE_SetName2( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 3 )
{
DoSEErrorMessage( "SetName2: Invalid number of arguments (takes 3, object, new name and object type)" );
return JS_FALSE;
}
UI32 targChar = JSVAL_TO_INT( argv[0] );
char *test = JS_GetStringBytes( JS_ValueToString( cx, argv[1] ) );
if( test == NULL )
{
DoSEErrorMessage( "SetName2: No name!" );
return JS_FALSE;
}
if( targChar == INVALIDSERIAL || targChar > imem )
{
DoSEErrorMessage( "SetName2: Invalid object (%i)", targChar );
return JS_FALSE;
}
items[targChar].SetName2( test );
return JS_TRUE;
}
JSBool SE_GetTag( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 3 )
{
DoSEErrorMessage( "GetTag: Invalid number of arguments (takes 3, object, object type, and tag name)" );
return JS_FALSE;
}
UI32 targChar = JSVAL_TO_INT( argv[0] );
UI08 targType = (UI08)JSVAL_TO_INT( argv[1] );
char *tagname = JS_GetStringBytes( JS_ValueToString( cx, argv[2] ) );
if( targChar == INVALIDSERIAL || ( targType == 0 && targChar > cmem ) || ( targType && targChar > imem ) )
{
DoSEErrorMessage( "GetTag: Invalid object (%i) or object type (%i)", targChar, targType );
return JS_FALSE;
}
jsval strSpeech;
if( targType )
{
strSpeech = items[targChar].GetTag( tagname );
}
else
{
strSpeech = chars[targChar].GetTag( tagname );
}
*rval = strSpeech;
return JS_TRUE;
}
JSBool SE_SetTag( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 4 )
{
DoSEErrorMessage( "SetTag: Invalid number of arguments (takes 4, object, object type, tag name, and new tag value.)" );
return JS_FALSE;
}
UI32 targChar = JSVAL_TO_INT( argv[0] );
UI08 targType = (UI08)JSVAL_TO_INT( argv[1] );
char *tagname = JS_GetStringBytes( JS_ValueToString( cx, argv[2] ) );
jsval tagval = argv[3];
if( tagname == NULL )
{
DoSEErrorMessage( "SetTag: No tag name!" );
return JS_FALSE;
}
if( targChar == INVALIDSERIAL || ( targType == 0 && targChar > cmem ) || ( targType && targChar > imem ) )
{
DoSEErrorMessage( "SetTag: Invalid object (%i) or object type (%i)", targChar, targType );
return JS_FALSE;
}
if( targType )
{
items[targChar].SetTag( tagname, tagval );
}
else
{
chars[targChar].SetTag( tagname, tagval );
}
return JS_TRUE;
}
JSBool SE_GetNumTags( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
DoSEErrorMessage( "GetNumTags: Invalid number of arguments (takes 2, object and object type, and tag name)" );
return JS_FALSE;
}
UI32 targChar = JSVAL_TO_INT( argv[0] );
UI08 targType = (UI08)JSVAL_TO_INT( argv[1] );
if( targChar == INVALIDSERIAL || ( targType == 0 && targChar > cmem ) || ( targType && targChar > imem ) )
{
DoSEErrorMessage( "GetNumTags: Invalid object (%i) or object type (%i)", targChar, targType );
return JS_FALSE;
}
jsval strSpeech = 0;
if( targType )
{
strSpeech = INT_TO_JSVAL( items[targChar].GetNumTags() );
}
else
{
strSpeech = INT_TO_JSVAL( chars[targChar].GetNumTags() );
}
*rval = strSpeech;
return JS_TRUE;
}
JSBool SE_GetCharPack( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "GetCharPack: Invalid number of arguments (takes 1, character)" );
return JS_FALSE;
}
CHARACTER targChar = (CHARACTER)JSVAL_TO_INT( argv[0] );
if( targChar == INVALIDSERIAL || targChar > cmem )
{
DoSEErrorMessage( "GetCharPack: Invalid character (%i)", targChar );
return JS_FALSE;
}
*rval = INT_TO_JSVAL( getPack( &chars[targChar] ) );
return JS_TRUE;
}
JSBool SE_GetLowDamage( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "GetLowDamage: Invalid number of arguments (takes 1, item)" );
return JS_FALSE;
}
UI32 targItem = (UI32)JSVAL_TO_INT( argv[0] );
UI08 targType = (UI08)JSVAL_TO_INT( argv[1] );
if( targItem == INVALIDSERIAL || ( targType && targItem > imem ) || ( !targType && targItem > cmem ) )
{
DoSEErrorMessage( "GetLowDamage: Invalid object (%i) or type ", targItem, targType );
return JS_FALSE;
}
if( targType )
*rval = INT_TO_JSVAL( items[targItem].GetLoDamage() );
else
*rval = INT_TO_JSVAL( chars[targItem].GetLoDamage() );
return JS_TRUE;
}
JSBool SE_GetHiDamage( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "GetHiDamage: Invalid number of arguments (takes 1, item)" );
return JS_FALSE;
}
UI32 targItem = (UI32)JSVAL_TO_INT( argv[0] );
UI08 targType = (UI08)JSVAL_TO_INT( argv[1] );
if( targItem == INVALIDSERIAL || ( targType && targItem > imem ) || ( !targType && targItem > cmem ) )
{
DoSEErrorMessage( "GetHiDamage: Invalid object (%i) or type ", targItem, targType );
return JS_FALSE;
}
if( targType )
*rval = INT_TO_JSVAL( items[targItem].GetHiDamage() );
else
*rval = INT_TO_JSVAL( chars[targItem].GetHiDamage() );
return JS_TRUE;
}
JSBool SE_GetDef( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "GetDef: Invalid number of arguments (takes 1, item)" );
return JS_FALSE;
}
ITEM targItem = (ITEM)JSVAL_TO_INT( argv[0] );
if( targItem == INVALIDSERIAL || targItem > imem )
{
DoSEErrorMessage( "GetDef: Invalid item (%i)", targItem );
return JS_FALSE;
}
*rval = INT_TO_JSVAL( items[targItem].GetDef() );
return JS_TRUE;
}
JSBool SE_CalcItemFromSer( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 && argc != 4 )
{
DoSEErrorMessage( "CalcItemFromSer: Invalid number of arguments (takes 1 or 4)" );
return JS_FALSE;
}
SERIAL targSerial;
if( argc == 1 )
targSerial = (SERIAL)JSVAL_TO_INT( argv[0] );
else
targSerial = calcserial( (UI08)JSVAL_TO_INT( argv[0] ), (UI08)JSVAL_TO_INT( argv[1] ), (UI08)JSVAL_TO_INT( argv[2] ), (UI08)JSVAL_TO_INT( argv[3] ) );
CItem *newItem = calcItemObjFromSer( targSerial );
UI16 myScpTrig = Trigger->FindObject( JS_GetGlobalObject( cx ) );
cScript *myScript = Trigger->GetScript( myScpTrig );
JSObject *myObj = myScript->AcquireObject( IUE_ITEM );
JS_SetPrivate( cx, myObj, newItem );
*rval = OBJECT_TO_JSVAL( myObj );
return JS_TRUE;
}
JSBool SE_CalcCharFromSer( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 && argc != 4 )
{
DoSEErrorMessage( "CalcCharFromSer: Invalid number of arguments (takes 1 or 4)" );
return JS_FALSE;
}
SERIAL targSerial;
if( argc == 1 )
targSerial = (SERIAL)JSVAL_TO_INT( argv[0] );
else
targSerial = calcserial( (UI08)JSVAL_TO_INT( argv[0] ), (UI08)JSVAL_TO_INT( argv[1] ), (UI08)JSVAL_TO_INT( argv[2] ), (UI08)JSVAL_TO_INT( argv[3] ) );
*rval = INT_TO_JSVAL( calcCharFromSer( targSerial ) );
return JS_TRUE;
}
JSBool SE_DistanceTo( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 4 )
{
DoSEErrorMessage( "DistanceTo: Invalid number of arguments (takes 4, object, object, object type, object type)" );
return JS_FALSE;
}
UI32 objects[2];
long objTypes[2];
objects[0] = JSVAL_TO_INT( argv[0] );
objects[1] = JSVAL_TO_INT( argv[1] );
objTypes[0] = JSVAL_TO_INT( argv[2] );
objTypes[1] = JSVAL_TO_INT( argv[3] );
for( UI08 iCounter = 0; iCounter <= 1; iCounter++ )
if( objects[iCounter] == INVALIDSERIAL || ( objTypes[iCounter] == 0 && objects[iCounter]> cmem ) || ( objTypes[iCounter] && objects[iCounter]> imem ) )
{
DoSEErrorMessage( "DistanceTo: Invalid object (%i) or object type (%i)", objects[iCounter], objTypes[iCounter] );
return JS_FALSE;
}
cBaseObject *objPointers[2];
for( UI08 oCounter = 0; oCounter <= 1; oCounter++ )
{
if( objTypes[oCounter] == 0 )
objPointers[oCounter] = &chars[objects[oCounter]];
else
objPointers[oCounter] = &items[objects[oCounter]];
}
*rval = INT_TO_JSVAL( getDist( objPointers[0], objPointers[1] ) );
return JS_TRUE;
}
JSBool SE_DoDamage( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 3 )
{
DoSEErrorMessage( "DoDamage: Invalid number of arguments (takes 3, object, damage, object type)" );
return JS_FALSE;
}
UI32 targChar = JSVAL_TO_INT( argv[0] );
UI08 targType = (UI08)JSVAL_TO_INT( argv[2] );
if( targChar == INVALIDSERIAL || ( targType == 0 && targChar > cmem ) || ( targType && targChar > imem ) )
{
DoSEErrorMessage( "DoDamage: Invalid object (%i) or object type (%i)", targChar, targType );
return JS_FALSE;
}
SI16 targDamage = (SI16)JSVAL_TO_INT( argv[1] );
if( targType )
items[targChar].IncHP( -targDamage );
else
chars[targChar].IncHP( -targDamage );
return JS_TRUE;
}
JSBool SE_SetSerial( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 3 )
{
DoSEErrorMessage( "SetSerial: Invalid number of arguments (takes 3, object, serial, object type)" );
return JS_FALSE;
}
UI32 targChar = JSVAL_TO_INT( argv[0] );
SERIAL targSerial = (SERIAL)JSVAL_TO_INT( argv[1] );
UI08 targType = (UI08)JSVAL_TO_INT( argv[2] );
if( targChar == INVALIDSERIAL || ( targType == 0 && targChar > cmem ) || ( targType && targChar > imem ) )
{
DoSEErrorMessage( "SetSerial: Invalid object (%i) or object type (%i)", targChar, targType );
return JS_FALSE;
}
if( targType )
items[targChar].SetSerial( targSerial, targChar );
else
chars[targChar].SetSerial( targSerial, targChar );
return JS_TRUE;
}
JSBool SE_SetTarget( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
DoSEErrorMessage( "SetTarget: Invalid number of arguments (takes 2, character, target)" );
return JS_FALSE;
}
CHARACTER targChar = (CHARACTER)JSVAL_TO_INT( argv[0] );
CHARACTER target = (CHARACTER)JSVAL_TO_INT( argv[1] );
if( targChar == INVALIDSERIAL || targChar > cmem )
{
DoSEErrorMessage( "SetTarget: Invalid character (%i)", targChar );
return JS_FALSE;
}
chars[targChar].SetTarg( target );
return JS_TRUE;
}
JSBool SE_CalcDefense( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "CalcDefense: Invalid number of arguments (takes 1, character)" );
return JS_FALSE;
}
CHARACTER targChar = (CHARACTER)JSVAL_TO_INT( argv[0] );
if( targChar == INVALIDSERIAL || targChar > cmem )
{
DoSEErrorMessage( "CalcDefense: Invalid character (%i)", targChar );
return JS_FALSE;
}
*rval = INT_TO_JSVAL( Combat->calcDef( &chars[targChar], 0, true ) );
return JS_TRUE;
}
JSBool SE_CalcAttack( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "CalcAttack: Invalid number of arguments (takes 1)" );
return JS_FALSE;
}
CHARACTER targChar = (CHARACTER)JSVAL_TO_INT( argv[0] );
if( targChar == INVALIDSERIAL || targChar > cmem )
{
DoSEErrorMessage( "CalcAttack: Invalid character (%i)", targChar );
return JS_FALSE;
}
*rval = INT_TO_JSVAL( Combat->calcAtt( &chars[targChar] ) );
return JS_TRUE;
}
JSBool SE_OpenBank( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
DoSEErrorMessage( "OpenBank: Invalid number of arguments (takes 2)" );
return JS_FALSE;
}
CHARACTER targChar = (CHARACTER)JSVAL_TO_INT( argv[0] );
UOXSOCKET targSock = (UOXSOCKET)JSVAL_TO_INT( argv[1] );
if( targChar == INVALIDSERIAL || targChar > cmem )
{
DoSEErrorMessage( "OpenBank: Invalid character (%i)", targChar );
return JS_FALSE;
}
openBank( calcSocketObjFromSock( targSock ), &chars[targChar] );
return JS_TRUE;
}
JSBool SE_DoMovingEffect( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc < 8 )
{
DoSEErrorMessage( "DoMovingEffect: Invalid number of arguments (takes 8 or 9)" );
return JS_FALSE;
}
UI08 speed, loop;
UI16 effect;
bool explode;
UI32 srcObj;
long objType;
if( argc == 9 )
{ // Location moving effect
UI16 targX, targY;
SI08 targZ;
srcObj = JSVAL_TO_INT( argv[0] );
objType = JSVAL_TO_INT( argv[1] );
if( srcObj == INVALIDSERIAL || ( objType == 1 && srcObj > imem ) || ( objType == 0 && srcObj > cmem ) )
{
DoSEErrorMessage( "DoMovingEffect: Invalid source object (%i) of type (%i)", srcObj, objType );
return JS_FALSE;
}
targX = (UI16)JSVAL_TO_INT( argv[2] );
targY = (UI16)JSVAL_TO_INT( argv[3] );
targZ = (SI08)JSVAL_TO_INT( argv[4] );
effect = (UI16)JSVAL_TO_INT( argv[5] );
speed = (UI08)JSVAL_TO_INT( argv[6] );
loop = (UI08)JSVAL_TO_INT( argv[7] );
explode = ( JSVAL_TO_BOOLEAN( argv[8] ) == JS_TRUE );
if( objType )
movingeffect( &items[srcObj], targX, targY, targZ, effect, speed, loop, explode );
else
movingeffect( &chars[srcObj], targX, targY, targZ, effect, speed, loop, explode );
}
else
{
srcObj = JSVAL_TO_INT( argv[0] );
objType = JSVAL_TO_INT( argv[1] );
if( srcObj == INVALIDSERIAL || ( objType == 1 && srcObj > imem ) || ( objType == 0 && srcObj > cmem ) )
{
DoSEErrorMessage( "DoMovingEffect: Invalid source object (%i) of type (%i)", srcObj, objType );
return JS_FALSE;
}
UI32 trgObj = JSVAL_TO_INT( argv[2] );
long trgObjType = JSVAL_TO_INT( argv[3] );
if( trgObj == INVALIDSERIAL || ( trgObjType == 1 && trgObj > imem ) || ( trgObjType == 0 && trgObj > cmem ) )
{
DoSEErrorMessage( "DoMovingEffect: Invalid target object (%i) of type (%i)", trgObj, trgObjType );
return JS_FALSE;
}
effect = (UI16)JSVAL_TO_INT( argv[4] );
speed = (UI08)JSVAL_TO_INT( argv[5] );
loop = (UI08)JSVAL_TO_INT( argv[6] );
explode = ( JSVAL_TO_BOOLEAN( argv[7] ) == JS_TRUE );
cBaseObject *src, *trg;
if( objType )
src = &items[srcObj];
else
src = &chars[srcObj];
if( trgObjType )
trg = &items[trgObj];
else
trg = &chars[trgObj];
movingeffect( src, trg, effect, speed, loop, explode );
}
return JS_TRUE;
}
JSBool SE_SetAtt( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 3 )
{
DoSEErrorMessage( "SetAtt: Invalid number of arguments (takes 3)" );
return JS_FALSE;
}
ITEM targItem = (ITEM)JSVAL_TO_INT( argv[0] );
SI16 minAtt = (SI16)JSVAL_TO_INT( argv[1] );
SI16 maxAtt = (SI16)JSVAL_TO_INT( argv[2] );
if( targItem == INVALIDSERIAL || targItem > imem )
{
DoSEErrorMessage( "SetAtt: Invalid item (%i)", targItem );
return JS_FALSE;
}
items[targItem].SetLoDamage( minAtt );
items[targItem].SetHiDamage( maxAtt );
return JS_TRUE;
}
JSBool SE_SetDef( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
DoSEErrorMessage( "SetDef: Invalid number of arguments (takes 2)" );
return JS_FALSE;
}
ITEM targItem = (ITEM)JSVAL_TO_INT( argv[0] );
UI16 targDef = (UI16)JSVAL_TO_INT( argv[1] );
if( targItem == INVALIDSERIAL || targItem > imem )
{
DoSEErrorMessage( "SetDef: Invalid item (%i)", targItem );
return JS_FALSE;
}
items[targItem].SetDef( targDef );
return JS_TRUE;
}
JSBool SE_RandomNumber( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
DoSEErrorMessage( "RandomNumber: Invalid number of arguments (takes 2)" );
return JS_FALSE;
}
long loNum = JSVAL_TO_INT( argv[0] );
long hiNum = JSVAL_TO_INT( argv[1] );
*rval = INT_TO_JSVAL( RandomNum( loNum, hiNum ) );
return JS_TRUE;
}
JSBool SE_GetString( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 && argc != 3 )
{
DoSEErrorMessage( "GetString: Invalid number of arguments (takes 2 or 3)" );
return JS_FALSE;
}
int length = -1;
UOXSOCKET sock = JSVAL_TO_INT( argv[0] );
int offset = JSVAL_TO_INT( argv[1] );
if( argc == 3 )
length = JSVAL_TO_INT( argv[2] );
if( sock == -1 || sock >= now )
{
DoSEErrorMessage( "GetString: invalid socket (%i)", sock );
return JS_FALSE;
}
char toReturn[128];
cSocket *mSock = calcSocketObjFromSock( sock );
if( length != -1 )
{
strncpy( toReturn, (char *)&(mSock->Buffer())[offset], length );
toReturn[length] = 0;
}
else
strcpy( toReturn, (char *)&(mSock->Buffer())[offset] );
JSString *strSpeech = NULL;
strSpeech = JS_NewStringCopyZ( cx, toReturn );
*rval = STRING_TO_JSVAL( strSpeech );
return JS_TRUE;
}
JSBool SE_GetByte( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
DoSEErrorMessage( "GetByte: Invalid number of arguments (takes 2)" );
return JS_FALSE;
}
UOXSOCKET sock = JSVAL_TO_INT( argv[0] );
if( sock == -1 || sock >= now )
{
DoSEErrorMessage( "GetByte: invalid socket (%i)", sock );
return JS_FALSE;
}
cSocket *mSock = calcSocketObjFromSock( sock );
int offset = JSVAL_TO_INT( argv[1] );
*rval = INT_TO_JSVAL( mSock->GetByte( offset ) );
return JS_TRUE;
}
JSBool SE_GetWord( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
DoSEErrorMessage( "GetWord: Invalid number of arguments (takes 2)" );
return JS_FALSE;
}
UOXSOCKET sock = JSVAL_TO_INT( argv[0] );
if( sock == -1 || sock >= now )
{
DoSEErrorMessage( "GetWord: invalid socket (%i)", sock );
return JS_FALSE;
}
int offset = JSVAL_TO_INT( argv[1] );
cSocket *mSock = calcSocketObjFromSock( sock );
int retVal = mSock->GetWord( offset );
*rval = INT_TO_JSVAL( retVal );
return JS_TRUE;
}
JSBool SE_GetDWord( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
DoSEErrorMessage( "GetDWord: Invalid number of arguments (takes 2)" );
return JS_FALSE;
}
UOXSOCKET sock = JSVAL_TO_INT( argv[0] );
if( sock == -1 || sock >= now )
{
DoSEErrorMessage( "GetDWord: invalid socket (%i)", sock );
return JS_FALSE;
}
int offset = JSVAL_TO_INT( argv[1] );
cSocket *mSock = calcSocketObjFromSock( sock );
*rval = INT_TO_JSVAL( mSock->GetDWord( offset ) );
return JS_TRUE;
}
JSBool SE_CreateBuffer( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
return JS_TRUE;
}
JSBool SE_DestroyBuffer( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
return JS_TRUE;
}
JSBool SE_SendBuffer( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
return JS_TRUE;
}
JSBool SE_SetByte( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 3 )
{
DoSEErrorMessage( "SetByte: Invalid number of arguments (takes 3)" );
return JS_FALSE;
}
UOXSOCKET sock = JSVAL_TO_INT( argv[0] );
if( sock == -1 || sock >= now )
{
DoSEErrorMessage( "SetByte: invalid socket (%i)", sock );
return JS_FALSE;
}
int offset = JSVAL_TO_INT( argv[1] );
UI08 byteToSet = (UI08)JSVAL_TO_INT( argv[2] );
cSocket *mSock = calcSocketObjFromSock( sock );
mSock->SetByte( offset, byteToSet );
return JS_TRUE;
}
JSBool SE_SetWord( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 3 )
{
DoSEErrorMessage( "SetWord: Invalid number of arguments (takes 3)" );
return JS_FALSE;
}
UOXSOCKET sock = JSVAL_TO_INT( argv[0] );
if( sock == -1 || sock >= now )
{
DoSEErrorMessage( "SetWord: invalid socket (%i)", sock );
return JS_FALSE;
}
int offset = JSVAL_TO_INT( argv[1] );
short byteToSet = (short)JSVAL_TO_INT( argv[2] );
cSocket *mSock = calcSocketObjFromSock( sock );
mSock->SetWord( offset, byteToSet );
return JS_TRUE;
}
JSBool SE_SetDWord( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 3 )
{
DoSEErrorMessage( "SetDWord: Invalid number of arguments (takes 3)" );
return JS_FALSE;
}
UOXSOCKET sock = JSVAL_TO_INT( argv[0] );
if( sock == -1 || sock >= now )
{
DoSEErrorMessage( "SetDWord: invalid socket (%i)", sock );
return JS_FALSE;
}
int offset = JSVAL_TO_INT( argv[1] );
long byteToSet = JSVAL_TO_INT( argv[2] );
cSocket *mSock = calcSocketObjFromSock( sock );
mSock->SetDWord( offset, byteToSet );
return JS_TRUE;
}
JSBool SE_SetString( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 3 )
{
DoSEErrorMessage( "SetString: Invalid number of arguments (takes 3)" );
return JS_FALSE;
}
UOXSOCKET sock = JSVAL_TO_INT( argv[0] );
if( sock == -1 || sock >= now )
{
DoSEErrorMessage( "SetString: invalid socket (%i)", sock );
return JS_FALSE;
}
int offset = JSVAL_TO_INT( argv[1] );
char *trgMessage = JS_GetStringBytes( JS_ValueToString( cx, argv[2] ) );
if( trgMessage == NULL )
{
DoSEErrorMessage( "SetString: No string to set" );
return JS_FALSE;
}
cSocket *mSock = calcSocketObjFromSock( sock );
strcpy( (char *)&(mSock->Buffer())[offset], trgMessage );
return JS_TRUE;
}
JSBool SE_ReadBytes( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
DoSEErrorMessage( "ReadBytes: Invalid number of arguments (takes 2)" );
return JS_FALSE;
}
UOXSOCKET sock = JSVAL_TO_INT( argv[0] );
if( sock == -1 || sock >= now )
{
DoSEErrorMessage( "ReadBytes: invalid socket (%i)", sock );
return JS_FALSE;
}
int bCount = JSVAL_TO_INT( argv[1] );
cSocket *nSock = calcSocketObjFromSock( sock );
if( nSock != NULL )
nSock->Receive( bCount );
return JS_TRUE;
}
const UI08 reagASH = 0;
const UI08 reagDRAKE = 1;
const UI08 reagSHADE = 2;
const UI08 reagMOSS = 3;
const UI08 reagSILK = 4;
const UI08 reagGINSENG = 5;
const UI08 reagGARLIC = 6;
const UI08 reagPEARL = 7;
JSBool SE_UseReagant( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 3 )
{
DoSEErrorMessage( "UseReagant: Invalid number of arguments (takes 3)" );
return JS_FALSE;
}
CHARACTER player = JSVAL_TO_INT( argv[0] );
UI08 reagID = (UI08)JSVAL_TO_INT( argv[1] );
UI16 amount = (UI16)JSVAL_TO_INT( argv[2] );
if( player == INVALIDSERIAL || player > cmem )
{
DoSEErrorMessage( "UseReagant: invalid character (%i)", player );
return JS_FALSE;
}
UI16 realID = 0;
switch( reagID )
{
case reagASH: realID = 0x0F8C; break;
case reagDRAKE: realID = 0x0F86; break;
case reagSHADE: realID = 0x0F88; break;
case reagMOSS: realID = 0x0F7B; break;
case reagSILK: realID = 0x0F8D; break;
case reagGINSENG: realID = 0x0F85; break;
case reagGARLIC: realID = 0x0F84; break;
case reagPEARL: realID = 0x0F7A; break;
}
if( realID != 0 )
{
int foundAmount = getAmount( &chars[player], realID );
if( foundAmount >= amount )
{
deleQuan( &chars[player], realID, amount );
*rval = JS_TRUE;
}
else
*rval = JS_FALSE;
}
else
*rval = JS_FALSE;
return JS_TRUE;
}
JSBool SE_UseReagants( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 9 )
{
DoSEErrorMessage( "UseReagants: Invalid number of arguments (takes 9)" );
return JS_FALSE;
}
CHARACTER player = JSVAL_TO_INT( argv[0] );
if( player == INVALIDSERIAL || player > cmem )
{
DoSEErrorMessage( "UseReagants: Invalid character (%i)", player );
return JS_FALSE;
}
UI08 reqAmount;
reag_st reqReags;
for( UI08 iCounter = 0; iCounter < 8; iCounter++ )
{
reqAmount = (UI08)JSVAL_TO_INT( argv[1+iCounter] );
if( reqAmount == 0 )
continue;
switch( iCounter )
{
case reagASH: reqReags.ash = reqAmount; break;
case reagDRAKE: reqReags.drake = reqAmount; break;
case reagSHADE: reqReags.shade = reqAmount; break;
case reagMOSS: reqReags.moss = reqAmount; break;
case reagSILK: reqReags.silk = reqAmount; break;
case reagGINSENG: reqReags.ginseng = reqAmount; break;
case reagGARLIC: reqReags.garlic = reqAmount; break;
case reagPEARL: reqReags.pearl = reqAmount; break;
}
}
if( !Magic->CheckReagents( &chars[player], &reqReags ) )
*rval = JS_FALSE;
else
{
Magic->DelReagents( &chars[player], reqReags );
*rval = JS_TRUE;
}
return JS_TRUE;
}
JSBool SE_AddSpell( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
DoSEErrorMessage( "AddSpell: Invalid number of arguments (takes 2)" );
return JS_FALSE;
}
CHARACTER player = JSVAL_TO_INT( argv[0] );
if( player == INVALIDSERIAL || player > cmem )
{
DoSEErrorMessage( "AddSpell: Invalid character (%i)", player );
return JS_FALSE;
}
UI08 spellNum = (UI08)JSVAL_TO_INT( argv[1] );
CItem *sBook = FindItemOfType( &chars[player], 9 );
if( sBook != NULL )
Magic->AddSpell( sBook, spellNum );
return JS_TRUE;
}
JSBool SE_RemoveSpell( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
DoSEErrorMessage( "RemoveSpell: Invalid number of arguments (takes 2)" );
return JS_FALSE;
}
CHARACTER player = JSVAL_TO_INT( argv[0] );
if( player == INVALIDSERIAL || player > cmem )
{
DoSEErrorMessage( "RemoveSpell: Invalid character (%i)", player );
return JS_FALSE;
}
UI08 spellNum = (UI08)JSVAL_TO_INT( argv[1] );
CItem *sBook = FindItemOfType( &chars[player], 9 );
if( sBook != NULL )
Magic->RemoveSpell( sBook, spellNum );
return JS_TRUE;
}
JSBool SE_SpellFail( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
DoSEErrorMessage( "SpellFail: Invalid number of arguments (takes 2)" );
return JS_FALSE;
}
UOXSOCKET socket = JSVAL_TO_INT( argv[0] );
CHARACTER player = JSVAL_TO_INT( argv[1] );
if( player == INVALIDSERIAL || player > cmem )
{
DoSEErrorMessage( "SpellFail: Invalid character (%i)", player );
return JS_FALSE;
}
// can't use the magic subsystem stuff, it deletes reags :<
staticeffect( &chars[player], 0x3735, 0, 30 );
soundeffect( &chars[player], 0x005C );
if( socket != -1 )
npcEmote( calcSocketObjFromSock( socket ), &chars[player], 771, false );
return JS_TRUE;
}
JSBool SE_GlowItem( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
return JS_TRUE;
}
JSBool SE_MakeMenu( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
DoSEErrorMessage( "MakeMenu: Invalid number of arguments (takes 2)" );
return JS_FALSE;
}
JSObject *mSock = JSVAL_TO_OBJECT( argv[0] );
cSocket *mySock = (cSocket *)JS_GetPrivate( cx, mSock );
if( mySock == NULL )
{
DoSEErrorMessage( "MakeMenu: invalid socket" );
return JS_FALSE;
}
int menu = JSVAL_TO_INT( argv[1] );
Skills->NewMakeMenu( mySock, menu, 0 );
return JS_TRUE;
}
JSBool SE_MakeItem( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 3 )
{
DoSEErrorMessage( "MakeItem: Invalid number of arguments (takes 3)" );
return JS_FALSE;
}
JSObject *mSock = JSVAL_TO_OBJECT( argv[0] );
cSocket *sock = (cSocket *)JS_GetPrivate( cx, mSock );
JSObject *mChar = JSVAL_TO_OBJECT( argv[1] );
CChar *player = (CChar *)JS_GetPrivate( cx, mChar );
if( player == NULL )
{
DoSEErrorMessage( "MakeItem: Invalid character" );
return JS_FALSE;
}
UI16 itemMenu = (UI16)JSVAL_TO_INT( argv[2] );
createEntry *toFind = Skills->FindItem( itemMenu );
if( toFind == NULL )
{
DoSEErrorMessage( "MakeItem: Invalid make item (%i)", itemMenu );
return JS_FALSE;
}
Skills->MakeItem( *toFind, player, sock, itemMenu );
return JS_TRUE;
}
JSBool SE_CalcRank( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 5 )
{
DoSEErrorMessage( "CalcRank: Invalid number of arguments (takes 5)" );
return JS_FALSE;
}
CHARACTER player = JSVAL_TO_INT( argv[4] );
if( player == INVALIDSERIAL || player > cmem )
{
DoSEErrorMessage( "CalcRank: Invalid character (%i)", player );
return JS_FALSE;
}
int minRank = JSVAL_TO_INT( argv[0] );
int maxRank = JSVAL_TO_INT( argv[1] );
int minSkill = JSVAL_TO_INT( argv[2] );
int skillNum = JSVAL_TO_INT( argv[3] );
int rk_range, rank, randnum;
R32 sk_range, randnum1;
rk_range = maxRank - minRank;
sk_range = (R32) 50.00 + chars[player].GetSkill( skillNum ) - minSkill;
if( sk_range <= 0 )
rank = minRank;
else if( sk_range >= 1000 )
rank = maxRank;
randnum = RandomNum( 0, 1000 );
if( randnum <= sk_range )
rank = maxRank;
else
{
randnum1 = (R32)( RandomNum( 0, 1000 ) ) - (( randnum - sk_range ) / ( 11 - cwmWorldState->ServerData()->GetSkillLevel() ) );
rank = (int)( randnum1*rk_range)/1000;
rank += minRank - 1;
if( rank > maxRank )
rank = maxRank;
if( rank < minRank )
rank = minRank;
}
*rval = INT_TO_JSVAL( rank );
return JS_TRUE;
}
JSBool SE_CalcCharFromSock( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "CalcCharFromSock: Invalid number of arguments (takes 1)" );
return JS_FALSE;
}
UOXSOCKET sock = JSVAL_TO_INT( argv[0] );
if( sock == -1 || sock > now )
{
DoSEErrorMessage( "CalcCharFromSock: invalid socket (%i)", sock );
*rval = INT_TO_JSVAL( INVALIDSERIAL );
return JS_TRUE;
}
cSocket *mSock = calcSocketObjFromSock( sock );
*rval = INT_TO_JSVAL( mSock->Currchar() );
return JS_TRUE;
}
JSBool SE_ApplyRank( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
DoSEErrorMessage( "ApplyRank: Invalid number of arguments (takes 2)" );
return JS_FALSE;
}
ITEM i = JSVAL_TO_INT( argv[0] );
if( i == INVALIDSERIAL || i > imem )
{
DoSEErrorMessage( "ApplyRank: Invalid item (%i)", i );
return JS_FALSE;
}
int rank = JSVAL_TO_INT( argv[1] );
Skills->ApplyRank( NULL, &items[i], rank );
return JS_TRUE;
}
JSBool SE_ExecuteCommand( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
return JS_TRUE;
}
JSBool SE_CommandLevelReq( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "CommandLevelReq: Invalid number of arguments (takes 1)" );
return JS_FALSE;
}
char *test = JS_GetStringBytes( JS_ValueToString( cx, argv[0] ) );
if( test == NULL )
{
DoSEErrorMessage( "CommandLevelReq: Invalid command name" );
return JS_FALSE;
}
cmdtable_mapentry *details = Commands->CommandDetails( test );
if( details == NULL )
*rval = INT_TO_JSVAL( 255 );
else
*rval = INT_TO_JSVAL( details->cmdLevelReq );
return JS_TRUE;
}
JSBool SE_CommandExists( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "CommandExists: Invalid number of arguments (takes 1)" );
return JS_FALSE;
}
char *test = JS_GetStringBytes( JS_ValueToString( cx, argv[0] ) );
if( test == NULL )
{
DoSEErrorMessage( "CommandExists: Invalid command name" );
return JS_FALSE;
}
*rval = BOOLEAN_TO_JSVAL( Commands->CommandExists( test ) );
return JS_TRUE;
}
JSBool SE_FirstCommand( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
const char *tVal = Commands->FirstCommand();
JSString *strSpeech = NULL;
if( tVal == NULL )
strSpeech = JS_NewStringCopyZ( cx, "" );
else
strSpeech = JS_NewStringCopyZ( cx, tVal );
*rval = STRING_TO_JSVAL( strSpeech );
return JS_TRUE;
}
JSBool SE_NextCommand( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
const char *tVal = Commands->NextCommand();
JSString *strSpeech = NULL;
if( tVal == NULL )
strSpeech = JS_NewStringCopyZ( cx, "" );
else
strSpeech = JS_NewStringCopyZ( cx, tVal );
*rval = STRING_TO_JSVAL( strSpeech );
return JS_TRUE;
}
JSBool SE_FinishedCommandList( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
*rval = BOOLEAN_TO_JSVAL( Commands->FinishedCommandList() );
return JS_TRUE;
}
JSBool SE_RegisterCommand( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
return JS_TRUE;
}
JSBool SE_UnregisterCommand( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
return JS_TRUE;
}
JSBool SE_RegisterKey( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
return JS_TRUE;
}
JSBool SE_UnregisterKey( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
return JS_TRUE;
}
JSBool SE_RegisterPacketHandler( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
return JS_TRUE;
}
JSBool SE_UnregisterPacketHandler( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
return JS_TRUE;
}
JSBool SE_GetHour( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
bool ampm = cwmWorldState->ServerData()->GetServerTimeAMPM();
UI08 hour = cwmWorldState->ServerData()->GetServerTimeHours();
if( ampm )
*rval = INT_TO_JSVAL( hour + 12 );
else
*rval = INT_TO_JSVAL( hour );
return JS_TRUE;
}
JSBool SE_GetMinute( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
UI08 minute = cwmWorldState->ServerData()->GetServerTimeMinutes();
*rval = INT_TO_JSVAL( minute );
return JS_TRUE;
}
JSBool SE_GetDay( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
short day = cwmWorldState->ServerData()->GetServerTimeDay();
*rval = INT_TO_JSVAL( day );
return JS_TRUE;
}
JSBool SE_GetSecondsPerUOMinute( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
*rval = INT_TO_JSVAL( secondsperuominute );
return JS_TRUE;
}
JSBool SE_GetLightLevel( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "GetLightLevel: Invalid number of arguments (takes 1)" );
return JS_FALSE;
}
CHARACTER toCheck = (CHARACTER)JSVAL_TO_INT( argv[0] );
if( toCheck == INVALIDSERIAL || toCheck >= cmem )
{
DoSEErrorMessage( "GetLightLevel: Invalid character (%i)", toCheck );
return JS_FALSE;
}
if( chars[toCheck].GetFixedLight() != 255 )
*rval = INT_TO_JSVAL( chars[toCheck].GetFixedLight() );
else
{
UI08 charRegion = chars[toCheck].GetRegion();
weathID toExamine = region[charRegion]->GetWeather();
if( toExamine != 255 )
{
CWeather *weathCheck = Weather->Weather( toExamine );
if( weathCheck == NULL )
*rval = INT_TO_JSVAL( cwmWorldState->ServerData()->GetWorldLightCurrentLevel() );
else
*rval = INT_TO_JSVAL( weathCheck->CurrentLight() );
}
else
*rval = INT_TO_JSVAL( cwmWorldState->ServerData()->GetWorldLightCurrentLevel() );
}
return JS_TRUE;
}
JSBool SE_GetCurrentClock( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
*rval = INT_TO_JSVAL( uiCurrentTime );
return JS_TRUE;
}
JSBool SE_WalkTo( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 4 )
{
DoSEErrorMessage( "WalkTo: Invalid number of arguments (takes 4)" );
return JS_FALSE;
}
CHARACTER cMove = (CHARACTER)JSVAL_TO_INT( argv[0] );
if( cMove == INVALIDSERIAL || cMove >= cmem )
{
DoSEErrorMessage( "WalkTo: Invalid character (%i)", cMove );
return JS_FALSE;
}
UI16 gx = (UI16)JSVAL_TO_INT( argv[1] );
UI16 gy = (UI16)JSVAL_TO_INT( argv[2] );
UI08 maxSteps = (UI08)JSVAL_TO_INT( argv[3] );
Movement->PathFind( &chars[cMove], gx, gy, false, maxSteps );
return JS_TRUE;
}
JSBool SE_SpawnNPC( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 4 && argc != 6 )
{
DoSEErrorMessage( "SpawnNPC: Invalid number of arguments (takes 4 or 6)" );
return JS_FALSE;
}
CChar *cMade = NULL;
if( argc == 4 )
{
UOXSOCKET bpSocket = (UOXSOCKET)JSVAL_TO_INT( argv[0] );
int region = (int)JSVAL_TO_INT( argv[1] );
cSpawnRegion *spawnReg = NULL;
if( region != -1 )
spawnReg = spawnregion[region];
char *npcNum = JS_GetStringBytes( JS_ValueToString( cx, argv[2] ) );;
cSocket *s = calcSocketObjFromSock( bpSocket );
UI08 worldNumber = (UI08)JSVAL_TO_INT( argv[3] );
cMade = Npcs->AddNPC(s,spawnReg,npcNum,worldNumber);
//*rval = INT_TO_JSVAL( Npcs->AddNPC( s, spawnReg, npcNum, worldNumber ) );
}
else
{
UOXSOCKET Socket = (UOXSOCKET)JSVAL_TO_INT( argv[0] );
char *nnpcNum=JS_GetStringBytes(JS_ValueToString(cx,argv[1]));
//int nnpcNum = (int)JSVAL_TO_INT( argv[1] );
UI16 x = (UI16)JSVAL_TO_INT( argv[2] );
UI16 y = (UI16)JSVAL_TO_INT( argv[3] );
SI08 z = (SI08)JSVAL_TO_INT( argv[4] );
UI08 wrld = (UI08)JSVAL_TO_INT( argv[5] );
cSocket *s = calcSocketObjFromSock( Socket );
#pragma note( "DEPENDENT ON NUMERIC NPC SECTION" )
cMade = Npcs->AddNPCxyz(s,nnpcNum,x,y,z,wrld);
//*rval = INT_TO_JSVAL( Npcs->AddNPCxyz( s, nnpcNum, x, y, z, wrld ) );
}
if(cMade!=NULL)
{
UI16 myScpTrig = Trigger->FindObject(JS_GetGlobalObject(cx));
cScript *myScript = Trigger->GetScript(myScpTrig);
JSObject *myobj = myScript->AcquireObject(IUE_CHAR);
JS_SetPrivate(cx,myobj,cMade);
*rval = OBJECT_TO_JSVAL(myobj);
}
return JS_TRUE;
}
JSBool SE_SpawnItem( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 4 && argc != 9 )
{
DoSEErrorMessage( "SpawnItem: Invalid number of arguments (takes 4 or 9)" );
return JS_FALSE;
}
CItem *newItem = NULL;
JSObject *mSock = JSVAL_TO_OBJECT( argv[0] );
JSObject *mChar = JSVAL_TO_OBJECT( argv[1] );
cSocket *mySock = (cSocket *)JS_GetPrivate( cx, mSock );
CChar *myChar = (CChar *)JS_GetPrivate( cx, mChar );
if( argc == 4 )
{
char *bpSectNumber = JS_GetStringBytes( JS_ValueToString( cx, argv[2] ) );
bool bpRandValue = ( JSVAL_TO_BOOLEAN( argv[3] ) == JS_TRUE );
newItem = Items->SpawnItemToPack( mySock, myChar, bpSectNumber, bpRandValue );
}
else
{
int amount = (int)JSVAL_TO_INT( argv[2] );
char *itemName = JS_GetStringBytes( JS_ValueToString( cx, argv[3] ) );
bool stackable = ( JSVAL_TO_BOOLEAN( argv[4] ) == JS_TRUE );
UI16 itemID = (UI16)JSVAL_TO_INT( argv[5] );
UI16 colour = (UI16)JSVAL_TO_INT( argv[6] );
bool inPack = ( JSVAL_TO_BOOLEAN( argv[7] ) == JS_TRUE );
bool bSend = ( JSVAL_TO_BOOLEAN( argv[8] ) == JS_TRUE );
newItem = Items->SpawnItem( mySock, myChar, amount, itemName, stackable, itemID, colour, inPack, bSend );
}
if( newItem != NULL )
{
UI16 myScpTrig = Trigger->FindObject( JS_GetGlobalObject( cx ) );
cScript *myScript = Trigger->GetScript( myScpTrig );
JSObject *myObj = myScript->AcquireObject( IUE_ITEM );
JS_SetPrivate( cx, myObj, newItem );
*rval = OBJECT_TO_JSVAL( myObj );
}
else
*rval = JSVAL_NULL;
return JS_TRUE;
}
JSBool SE_PopUpTarget( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 3 ) // 3 parameters
{
DoSEErrorMessage( "PopUpTarget: Invalid number of arguments (takes 3)" );
return JS_FALSE;
}
UOXSOCKET tSock = JSVAL_TO_INT( argv[0] );
if( tSock >= now || tSock == -1 )
{
DoSEErrorMessage( "PopUpTarget: Invalid socket (%i)", tSock );
return JS_FALSE;
}
UI08 tNum = (UI08)JSVAL_TO_INT( argv[1] );
char *toSay = JS_GetStringBytes( JS_ValueToString( cx, argv[2] ) );
target( calcSocketObjFromSock( tSock ), 0, 1, 0, tNum, toSay );
return JS_TRUE;
}
JSBool SE_SubStringSearch( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
DoSEErrorMessage( "SubStringSearch: Invalid number of arguments (takes 2)" );
return JS_FALSE;
}
char *ssSearching = JS_GetStringBytes( JS_ValueToString( cx, argv[0] ) );
char *ssSearch = JS_GetStringBytes( JS_ValueToString( cx, argv[1] ) );
if( ssSearching == NULL || ssSearch == NULL ) // no valid search string, or string to search
{
DoSEErrorMessage( "SubStringSearch: Invalid search or sub string" );
return JS_FALSE;
}
const long ingLength = strlen( ssSearching );
const long chLength = strlen( ssSearch );
char *uSearching = new char[ingLength + 1];
char *uSearch = new char[chLength + 1];
strcpy( uSearching, ssSearching );
strupr( uSearching );
strcpy( uSearch, ssSearch );
strupr( uSearch );
*rval = BOOLEAN_TO_JSVAL( strstr( uSearching, uSearch ) != NULL );
delete [] uSearching;
delete [] uSearch;
return JS_TRUE;
}
JSBool SE_IsCriminal( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "IsCriminal: Invalid number of arguments (takes 1)" );
return JS_FALSE;
}
CHARACTER player = JSVAL_TO_INT( argv[0] );
if( player == INVALIDSERIAL || player > cmem )
{
DoSEErrorMessage( "IsCriminal: Invalid character (%i)", player );
return JS_FALSE;
}
*rval = BOOLEAN_TO_JSVAL( chars[player].IsCriminal() );
return JS_TRUE;
}
JSBool SE_IsMurderer( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "IsMurderer: Invalid number of arguments (takes 1)" );
return JS_FALSE;
}
CHARACTER player = JSVAL_TO_INT( argv[0] );
if( player == INVALIDSERIAL || player > cmem )
{
DoSEErrorMessage( "IsMurderer: Invalid character (%i)", player );
return JS_FALSE;
}
*rval = BOOLEAN_TO_JSVAL( chars[player].IsMurderer() );
return JS_TRUE;
}
JSBool SE_IsInnocent( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "IsInnocent: Invalid number of arguments (takes 1)" );
return JS_FALSE;
}
CHARACTER player = JSVAL_TO_INT( argv[0] );
if( player == INVALIDSERIAL || player > cmem )
{
DoSEErrorMessage( "IsInnocent: Invalid character (%i)", player );
return JS_FALSE;
}
*rval = BOOLEAN_TO_JSVAL( chars[player].IsInnocent() );
return JS_TRUE;
}
JSBool SE_GetFlag( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "GetFlag: Invalid number of arguments (takes 1)" );
return JS_FALSE;
}
CHARACTER player = JSVAL_TO_INT( argv[0] );
if( player == INVALIDSERIAL || player > cmem )
{
DoSEErrorMessage( "GetFlag: Invalid character (%i)", player );
return JS_FALSE;
}
*rval = INT_TO_JSVAL( chars[player].GetFlag() );
return JS_TRUE;
}
JSBool SE_MakeCriminal( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "MakeCriminal: Invalid number of arguments (takes 1)" );
return JS_FALSE;
}
CHARACTER player = JSVAL_TO_INT( argv[0] );
if( player == INVALIDSERIAL || player > cmem )
{
DoSEErrorMessage( "MakeCriminal: Invalid character (%i)", player );
return JS_FALSE;
}
criminal( &chars[player] );
return JS_TRUE;
}
JSBool SE_MakeInnocent( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "MakeInnocent: Invalid number of arguments (takes 1)" );
return JS_FALSE;
}
CHARACTER player = JSVAL_TO_INT( argv[0] );
if( player == INVALIDSERIAL || player > cmem )
{
DoSEErrorMessage( "MakeInnocent: Invalid character (%i)", player );
return JS_FALSE;
}
chars[player].SetCrimFlag( -1 );
setcharflag( &chars[player] );
return JS_TRUE;
}
JSBool SE_GetMurderThreshold( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
*rval = INT_TO_JSVAL( cwmWorldState->ServerData()->GetRepMaxKills() );
return JS_TRUE;
}
JSBool SE_GetGender( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "GetGender: Invalid number of arguments (takes 1)" );
return JS_FALSE;
}
CHARACTER player = JSVAL_TO_INT( argv[0] );
if( player == INVALIDSERIAL || player > cmem )
{
DoSEErrorMessage( "GetGender: Invalid character (%i)", player );
return JS_FALSE;
}
UI16 plID = chars[player].GetID();
switch( plID )
{
case 0x0190:
case 0x0192:
*rval = INT_TO_JSVAL( 0 );
break;
case 0x0191:
case 0x0193:
*rval = INT_TO_JSVAL( 1 );
break;
default:
*rval = INT_TO_JSVAL( 2 );
break;
}
return JS_TRUE;
}
JSBool SE_SetGender( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
DoSEErrorMessage( "SetGender: Invalid number of arguments (takes 2)" );
return JS_FALSE;
}
CHARACTER player = JSVAL_TO_INT( argv[0] );
UI08 gender = (UI08)JSVAL_TO_INT( argv[1] );
if( player == INVALIDSERIAL || player > cmem )
{
DoSEErrorMessage( "SetGender: Invalid character (%i)", player );
return JS_FALSE;
}
switch( gender )
{
case 0: // male
if( !chars[player].IsDead() )
chars[player].SetID( 0x0190 );
else
chars[player].SetID( 0x0192 );
chars[player].Teleport();
break;
case 1: // female
if( !chars[player].IsDead() )
chars[player].SetID( 0x0191 );
else
chars[player].SetID( 0x0193 );
chars[player].Teleport();
break;
default: // can't do
break;
}
return JS_TRUE;
}
JSBool SE_RollDice( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc < 3 )
{
DoSEErrorMessage( "RollDice: Invalid number of arguments (takes 3)" );
return JS_FALSE;
}
long numDice = JSVAL_TO_INT( argv[0] );
long numFace = JSVAL_TO_INT( argv[1] );
long numAdd = JSVAL_TO_INT( argv[2] );
cDice toRoll( numDice, numFace, numAdd );
*rval = INT_TO_JSVAL( toRoll.roll() );
return JS_TRUE;
}
JSBool SE_StartTimer( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 4 )
{
DoSEErrorMessage( "StartTimer: Invalid number of arguments (takes 4)" );
return JS_FALSE;
}
CHARACTER tChar = JSVAL_TO_INT( argv[0] );
char numSecs = (char)JSVAL_TO_INT( argv[1] );
char numHundredthsOfSec = (char)JSVAL_TO_INT( argv[2] );
char timerID = (char)JSVAL_TO_INT( argv[3] );
tempeffect( &chars[tChar], &chars[tChar], 40, numSecs, numHundredthsOfSec, timerID, INVALIDSERIAL );
return JS_TRUE;
}
JSBool SE_TurnToward( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 3 )
{
DoSEErrorMessage( "TurnToward: Invalid number of arguments (takes 3)" );
return JS_FALSE;
}
CHARACTER tChar = (CHARACTER)JSVAL_TO_INT( argv[0] );
SI16 xLoc = (SI16)JSVAL_TO_INT( argv[1] );
SI16 yLoc = (SI16)JSVAL_TO_INT( argv[2] );
UI08 newDir = getCharDir( &chars[tChar], xLoc, yLoc );
chars[tChar].SetDir( newDir );
chars[tChar].Update();
return JS_TRUE;
}
JSBool SE_DirectionTo( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 3 )
{
DoSEErrorMessage( "DirectionTo: Invalid number of arguments (takes 3)" );
return JS_FALSE;
}
CHARACTER tChar = JSVAL_TO_INT( argv[0] );
SI16 xLoc = (SI16)JSVAL_TO_INT( argv[1] );
SI16 yLoc = (SI16)JSVAL_TO_INT( argv[2] );
*rval = INT_TO_JSVAL( getCharDir( &chars[tChar], xLoc, yLoc ) );
return JS_TRUE;
}
JSBool SE_RaceCompare( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
return JS_FALSE;
}
CHARACTER char0 = JSVAL_TO_INT( argv[0] );
CHARACTER char1 = JSVAL_TO_INT( argv[1] );
if( char0 == INVALIDSERIAL || char1 == INVALIDSERIAL || char0 >= cmem || char1 >= cmem )
{
return JS_FALSE;
}
*rval = INT_TO_JSVAL( Races->Compare( char0, char1 ) );
return JS_TRUE;
}
JSBool SE_RaceCompareByRace( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
return JS_FALSE;
}
RACEID r0 = (RACEID)JSVAL_TO_INT( argv[0] );
RACEID r1 = (RACEID)JSVAL_TO_INT( argv[1] );
*rval = INT_TO_JSVAL( Races->CompareByRace( r0, r1 ) );
return JS_TRUE;
}
JSBool SE_FindItemOnLayer( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
return JS_FALSE;
}
CHARACTER player = JSVAL_TO_INT( argv[0] );
UI08 layerNum = (UI08)JSVAL_TO_INT( argv[1] );
if( player == INVALIDSERIAL || player >= cmem )
{
return JS_FALSE;
}
CItem *tItem = FindItemOnLayer( calcCharObjFromSer( chars[player].GetSerial() ), layerNum );
*rval = INT_TO_JSVAL( calcItemFromSer( tItem->GetSerial() ) );
return JS_TRUE;
}
JSBool SE_FindMulti( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 4 && argc != 1 )
{
DoSEErrorMessage( "FindMulti: Invalid number of parameters (1 or 4)" );
return JS_FALSE;
}
SI16 xLoc = 0, yLoc = 0;
SI08 zLoc = 0;
UI08 worldNumber = 0;
if( argc == 1 )
{
JSObject *myitemptr = JSVAL_TO_OBJECT( argv[0] );
cBaseObject *myItemPtr = (cBaseObject *)JS_GetPrivate( cx, myitemptr );
if( myItemPtr != NULL )
{
xLoc = myItemPtr->GetX();
yLoc = myItemPtr->GetY();
zLoc = myItemPtr->GetZ();
worldNumber = myItemPtr->WorldNumber();
}
else
{
DoSEErrorMessage( "FindMulti: Invalid object type" );
return JS_FALSE;
}
}
else
{
xLoc = (SI16)JSVAL_TO_INT( argv[0] );
yLoc = (SI16)JSVAL_TO_INT( argv[1] );
zLoc = (SI08)JSVAL_TO_INT( argv[2] );
worldNumber = (UI08)JSVAL_TO_INT( argv[3] );
}
CMultiObj *multi = findMulti( xLoc, yLoc, zLoc, worldNumber );
if( multi != NULL )
{
UI16 myScpTrig = Trigger->FindObject( JS_GetGlobalObject( cx ) );
cScript *myScript = Trigger->GetScript( myScpTrig );
JSObject *myObj = myScript->AcquireObject( IUE_ITEM );
JS_SetPrivate( cx, myObj, multi );
*rval = OBJECT_TO_JSVAL( myObj );
}
else
*rval = JSVAL_NULL;
return JS_TRUE;
}
JSBool SE_GetTown( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
return JS_FALSE;
CHARACTER toCheck = JSVAL_TO_INT( argv[0] );
if( toCheck == INVALIDSERIAL || toCheck >= cmem )
return JS_FALSE;
*rval = INT_TO_JSVAL( chars[toCheck].GetTown() );
return JS_TRUE;
}
JSBool SE_SetTown( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
return JS_FALSE;
CHARACTER toCheck = JSVAL_TO_INT( argv[0] );
if( toCheck == INVALIDSERIAL || toCheck >= cmem )
return JS_FALSE;
UI08 tRegion = (UI08)JSVAL_TO_INT( argv[1] );
UI08 cRegion = chars[toCheck].GetTown();
region[cRegion]->RemoveTownMember( chars[toCheck] );
region[tRegion]->AddAsTownMember( chars[toCheck] );
return JS_TRUE;
}
JSBool SE_GetRegion( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
return JS_FALSE;
CHARACTER toCheck = JSVAL_TO_INT( argv[0] );
if( toCheck == INVALIDSERIAL || toCheck >= cmem )
return JS_FALSE;
*rval = INT_TO_JSVAL( chars[toCheck].GetRegion() );
return JS_TRUE;
}
JSBool SE_SetRegion( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
return JS_FALSE;
CHARACTER toCheck = JSVAL_TO_INT( argv[0] );
if( toCheck == INVALIDSERIAL || toCheck >= cmem )
return JS_FALSE;
UI08 tRegion = (UI08)JSVAL_TO_INT( argv[1] );
chars[toCheck].SetRegion( tRegion );
return JS_TRUE;
}
JSBool SE_IsRegionGuarded( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
return JS_FALSE;
UI08 toCheck = (UI08)JSVAL_TO_INT( argv[0] );
*rval = BOOLEAN_TO_JSVAL( region[toCheck]->IsGuarded() );
return JS_TRUE;
}
JSBool SE_CanMarkInRegion( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
return JS_FALSE;
}
UI08 toCheck = (UI08)JSVAL_TO_INT( argv[0] );
*rval = BOOLEAN_TO_JSVAL( region[toCheck]->CanMark() );
return JS_TRUE;
}
JSBool SE_CanRecallInRegion( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
return JS_FALSE;
}
UI08 toCheck = (UI08)JSVAL_TO_INT( argv[0] );
*rval = BOOLEAN_TO_JSVAL( region[toCheck]->CanRecall() );
return JS_TRUE;
}
JSBool SE_CanGateInRegion( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
return JS_FALSE;
}
UI08 toCheck = (UI08)JSVAL_TO_INT( argv[0] );
*rval = BOOLEAN_TO_JSVAL( region[toCheck]->CanGate() );
return JS_TRUE;
}
JSBool SE_GetGuildType( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
return JS_FALSE;
}
GuildID toCheck = (GuildID)JSVAL_TO_INT( argv[0] );
CGuild *mGuild = GuildSys->Guild( toCheck );
if( mGuild == NULL )
*rval = INT_TO_JSVAL( GT_STANDARD );
else
*rval = INT_TO_JSVAL( mGuild->Type() );
return JS_TRUE;
}
JSBool SE_GetGuildName( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
return JS_FALSE;
}
GuildID toCheck = (GuildID)JSVAL_TO_INT( argv[0] );
CGuild *mGuild = GuildSys->Guild( toCheck );
if( mGuild == NULL )
{
return JS_FALSE;
}
JSString *strSpeech = NULL;
strSpeech = JS_NewStringCopyZ( cx, mGuild->Name() );
*rval = STRING_TO_JSVAL( strSpeech );
return JS_TRUE;
}
JSBool SE_GetGuildMaster( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
return JS_FALSE;
}
GuildID toCheck = (GuildID)JSVAL_TO_INT( argv[0] );
CGuild *mGuild = GuildSys->Guild( toCheck );
if( mGuild == NULL )
*rval = INT_TO_JSVAL( INVALIDSERIAL );
else
*rval = INT_TO_JSVAL( calcCharFromSer( mGuild->Master() ) );
return JS_TRUE;
}
JSBool SE_SetGuildType( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
return JS_FALSE;
}
GuildID toCheck = (GuildID)JSVAL_TO_INT( argv[0] );
CGuild *mGuild = GuildSys->Guild( toCheck );
if( mGuild == NULL )
{
return JS_FALSE;
}
SI08 newType = (SI08)JSVAL_TO_INT( argv[1] );
if( newType < GT_STANDARD || newType > GT_COUNT )
newType = GT_UNKNOWN;
mGuild->Type( (GuildType)newType );
return JS_TRUE;
}
JSBool SE_SetGuildName( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
return JS_FALSE;
}
GuildID targGuild = (GuildID)JSVAL_TO_INT( argv[0] );
CGuild *mGuild = GuildSys->Guild( targGuild );
if( mGuild == NULL )
{
return JS_FALSE;
}
char *test = JS_GetStringBytes( JS_ValueToString( cx, argv[1] ) );
if( test == NULL )
{
return JS_FALSE;
}
mGuild->Name( test );
return JS_TRUE;
}
JSBool SE_SetGuildMaster( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
return JS_FALSE;
}
GuildID toCheck = (GuildID)JSVAL_TO_INT( argv[0] );
CGuild *mGuild = GuildSys->Guild( toCheck );
if( mGuild == NULL )
{
return JS_FALSE;
}
mGuild->Master( JSVAL_TO_INT( argv[1] ) );
return JS_TRUE;
}
JSBool SE_GetNumGuildMembers( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
return JS_FALSE;
}
GuildID toCheck = (GuildID)JSVAL_TO_INT( argv[0] );
UI08 memberType = (UI08)JSVAL_TO_INT( argv[1] );
if( memberType != 0 && memberType != 1 )
memberType = 0;
CGuild *mGuild = GuildSys->Guild( toCheck );
if( mGuild == NULL )
*rval = INT_TO_JSVAL( 0 );
else if( memberType == 0 )
*rval = INT_TO_JSVAL( mGuild->NumMembers() );
else if( memberType == 1 )
*rval = INT_TO_JSVAL( mGuild->NumRecruits() );
else
*rval = INT_TO_JSVAL( mGuild->NumRecruits() + mGuild->NumMembers() );
return JS_TRUE;
}
JSBool SE_AddToGuild( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 3 )
{
return JS_FALSE;
}
GuildID toCheck = (GuildID)JSVAL_TO_INT( argv[0] );
CHARACTER toAdd = (CHARACTER)JSVAL_TO_INT( argv[1] );
SI08 nType = (SI08)JSVAL_TO_INT( argv[2] );
if( toAdd == INVALIDSERIAL || toAdd > cmem || toCheck == -1 || ( nType != 0 && nType != 1 ) )
{
return JS_FALSE;
}
CGuild *mGuild = GuildSys->Guild( toCheck );
if( mGuild == NULL )
{
return JS_FALSE;
}
if( nType == 0 )
{
mGuild->NewMember( chars[toAdd] );
chars[toAdd].SetGuildNumber( toCheck );
}
else if( nType == 1 )
mGuild->NewRecruit( chars[toAdd] );
return JS_TRUE;
}
JSBool SE_RemoveFromGuild( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
return JS_FALSE;
}
GuildID toCheck = (GuildID)JSVAL_TO_INT( argv[0] );
CHARACTER toAdd = (CHARACTER)JSVAL_TO_INT( argv[1] );
SI08 nType = (SI08)JSVAL_TO_INT( argv[2] );
if( toAdd == INVALIDSERIAL || toAdd > cmem || toCheck == -1 || ( nType != 0 && nType != 1 ) )
{
return JS_FALSE;
}
CGuild *mGuild = GuildSys->Guild( toCheck );
if( mGuild == NULL )
{
return JS_FALSE;
}
if( nType == 0 )
{
mGuild->RemoveMember( chars[toAdd] );
chars[toAdd].SetGuildNumber( -1 );
}
else if( nType == 1 )
mGuild->RemoveRecruit( chars[toAdd] );
return JS_TRUE;
}
JSBool SE_CompareGuild( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
return JS_FALSE;
}
CHARACTER toCheck = (CHARACTER)JSVAL_TO_INT( argv[0] );
CHARACTER toCheck2 = (CHARACTER)JSVAL_TO_INT( argv[1] );
if( toCheck == INVALIDSERIAL || toCheck2 == INVALIDSERIAL || toCheck > cmem || toCheck2 > cmem )
*rval = INT_TO_JSVAL( GR_UNKNOWN );
else
*rval = INT_TO_JSVAL( GuildSys->Compare( &chars[toCheck], &chars[toCheck2] ) );
return JS_TRUE;
}
JSBool SE_CompareGuildByGuild( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
return JS_FALSE;
}
GuildID toCheck = (GuildID)JSVAL_TO_INT( argv[0] );
GuildID toCheck2 = (GuildID)JSVAL_TO_INT( argv[1] );
*rval = INT_TO_JSVAL( GuildSys->Compare( toCheck, toCheck2 ) );
return JS_TRUE;
}
JSBool SE_GetGuildStone( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
return JS_FALSE;
}
GuildID toCheck = (GuildID)JSVAL_TO_INT( argv[0] );
CGuild *mGuild = GuildSys->Guild( toCheck );
if( mGuild == NULL )
*rval = INT_TO_JSVAL( INVALIDSERIAL );
else
*rval = INT_TO_JSVAL( mGuild->Stone() );
return JS_TRUE;
}
JSBool SE_IsMemberOfTown( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
return JS_FALSE;
}
*rval = JS_FALSE;
CHARACTER mChar = JSVAL_TO_INT( argv[0] );
if( mChar == INVALIDSERIAL || mChar >= cmem )
return JS_TRUE;
UI08 town = (UI08)JSVAL_TO_INT( argv[1] );
*rval = BOOLEAN_TO_JSVAL( region[town]->IsMemberOfTown( &chars[mChar] ) );
return JS_TRUE;
}
JSBool SE_GetTownMayor( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
return JS_FALSE;
}
UI08 town = (UI08)JSVAL_TO_INT( argv[0] );
*rval = INT_TO_JSVAL( region[town]->GetMayor() );
return JS_TRUE;
}
JSBool SE_GetTownRace( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
return JS_FALSE;
}
UI08 town = (UI08)JSVAL_TO_INT( argv[0] );
*rval = INT_TO_JSVAL( region[town]->GetRace() );
return JS_TRUE;
}
JSBool SE_SetTownRace( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
return JS_FALSE;
}
UI08 town = (UI08)JSVAL_TO_INT( argv[0] );
RACEID nRace = (RACEID)JSVAL_TO_INT( argv[1] );
region[town]->SetRace( nRace );
return JS_TRUE;
}
JSBool SE_PossessTown( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
return JS_FALSE;
}
UI08 town = (UI08)JSVAL_TO_INT( argv[0] );
UI08 sTown = (UI08)JSVAL_TO_INT( argv[1] );
region[town]->Possess( sTown );
return JS_TRUE;
}
JSBool SE_GetTownTax( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
return JS_TRUE;
}
JSBool SE_GetTownTaxResource( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
return JS_FALSE;
}
UI08 town = (UI08)JSVAL_TO_INT( argv[0] );
*rval = INT_TO_JSVAL( region[town]->GetResourceID() );
return JS_TRUE;
}
JSBool SE_SetTownTax( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
return JS_TRUE;
}
JSBool SE_SetTownTaxResource( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
return JS_TRUE;
}
JSBool SE_GetRaceName( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
return JS_FALSE;
}
RACEID race = (RACEID)JSVAL_TO_INT( argv[0] );
JSString *strName = NULL;
strName = JS_NewStringCopyZ( cx, Races->Name( race ) );
*rval = STRING_TO_JSVAL( strName );
return JS_TRUE;
}
JSBool SE_SetRaceName( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc < 2 )
{
return JS_FALSE;
}
RACEID rNew = (RACEID)JSVAL_TO_INT( argv[0] );
if( rNew >= Races->Count() )
{
return JS_FALSE;
}
CRace *mRace = Races->Race( rNew );
if( mRace == NULL )
{
return JS_FALSE;
}
char *newName = JS_GetStringBytes(JS_ValueToString(cx, argv[1]));
if( newName == NULL )
{
return JS_FALSE;
}
mRace->Name( newName );
return JS_TRUE;
}
JSBool SE_IsRaceWeakToWeather( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
return JS_FALSE;
}
RACEID race = (RACEID)JSVAL_TO_INT( argv[0] );
weathID toCheck = (weathID)JSVAL_TO_INT( argv[1] );
CRace *tRace = Races->Race( race );
if( tRace == NULL )
{
return JS_FALSE;
}
switch( toCheck )
{
case LIGHT: *rval = BOOLEAN_TO_JSVAL( tRace->AffectedByLight() ); break;
case RAIN: *rval = BOOLEAN_TO_JSVAL( tRace->AffectedByRain() ); break;
case COLD: *rval = BOOLEAN_TO_JSVAL( tRace->AffectedByCold() ); break;
case HEAT: *rval = BOOLEAN_TO_JSVAL( tRace->AffectedByHeat() ); break;
case LIGHTNING: *rval = BOOLEAN_TO_JSVAL( tRace->AffectedByLightning() ); break;
case SNOW: *rval = BOOLEAN_TO_JSVAL( tRace->AffectedBySnow() ); break;
default:
return JS_FALSE;
};
return JS_TRUE;
}
JSBool SE_RaceRequiresBeard( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
return JS_FALSE;
}
RACEID race = (RACEID)JSVAL_TO_INT( argv[0] );
*rval = BOOLEAN_TO_JSVAL( Races->RequireBeard( race ) );
return JS_TRUE;
}
JSBool SE_RaceRequiresNoBeard( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
return JS_FALSE;
}
RACEID race = (RACEID)JSVAL_TO_INT( argv[0] );
*rval = BOOLEAN_TO_JSVAL( Races->NoBeard( race ) );
return JS_TRUE;
}
JSBool SE_IsPlayerRace( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
return JS_FALSE;
}
RACEID race = (RACEID)JSVAL_TO_INT( argv[0] );
*rval = BOOLEAN_TO_JSVAL( Races->IsPlayerRace( race ) );
return JS_TRUE;
}
JSBool SE_GetRacialGenderRestrict( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
return JS_FALSE;
}
RACEID race = (RACEID)JSVAL_TO_INT( argv[0] );
*rval = INT_TO_JSVAL( Races->GenderRestrict( race ) );
return JS_TRUE;
}
JSBool SE_GetRacialArmourClass( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
return JS_FALSE;
}
RACEID race = (RACEID)JSVAL_TO_INT( argv[0] );
*rval = INT_TO_JSVAL( Races->ArmorRestrict( race ) );
return JS_TRUE;
}
JSBool SE_CanRaceWearArmour( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
return JS_FALSE;
}
RACEID race = (RACEID)JSVAL_TO_INT( argv[0] );
ITEM tItem = (ITEM)JSVAL_TO_INT( argv[1] );
if( tItem == INVALIDSERIAL || tItem >= cmem )
{
return JS_FALSE;
}
ARMORCLASS srcClass = Races->ArmorRestrict( race );
ARMORCLASS trgClass = items[tItem].GetArmourClass();
*rval = BOOLEAN_TO_JSVAL( ( trgClass == 0 ) || ( ( srcClass & trgClass ) != 0 ) ); // they have a matching class
return JS_TRUE;
}
JSBool SE_GetRaceLanguageSkill( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
return JS_FALSE;
}
RACEID race = (RACEID)JSVAL_TO_INT( argv[0] );
*rval = INT_TO_JSVAL( Races->LanguageMin( race ) );
return JS_TRUE;
}
JSBool SE_GetRaceSkillAdjustment( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
return JS_FALSE;
}
RACEID race = (RACEID)JSVAL_TO_INT( argv[0] );
int skill = JSVAL_TO_INT( argv[1] );
*rval = INT_TO_JSVAL( Races->DamageFromSkill( skill, race ) );
return JS_TRUE;
}
JSBool SE_GetRacePoisonResistance( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
return JS_FALSE;
}
RACEID race = (RACEID)JSVAL_TO_INT( argv[0] );
CRace *tRace = Races->Race( race );
if( tRace == NULL )
{
return JS_FALSE;
}
*rval = DOUBLE_TO_JSVAL( tRace->PoisonResistance() );
return JS_TRUE;
}
JSBool SE_GetRaceMagicResistance( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
return JS_FALSE;
}
RACEID race = (RACEID)JSVAL_TO_INT( argv[0] );
CRace *tRace = Races->Race( race );
if( tRace == NULL )
{
return JS_FALSE;
}
*rval = DOUBLE_TO_JSVAL( tRace->MagicResistance() );
return JS_TRUE;
}
JSBool SE_GetRaceVisibleDistance( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
return JS_FALSE;
}
RACEID race = (RACEID)JSVAL_TO_INT( argv[0] );
CRace *tRace = Races->Race( race );
if( tRace == NULL )
{
return JS_FALSE;
}
*rval = INT_TO_JSVAL( tRace->VisibilityRange() );
return JS_TRUE;
}
JSBool SE_GetRaceNightVision( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
return JS_FALSE;
}
RACEID race = (RACEID)JSVAL_TO_INT( argv[1] );
CRace *tRace = Races->Race( race );
if( tRace == NULL )
{
return JS_FALSE;
}
*rval = INT_TO_JSVAL( tRace->NightVision() );
return JS_TRUE;
}
JSBool SE_IsValidRaceHairColour( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
return JS_FALSE;
}
RACEID race = (RACEID)JSVAL_TO_INT( argv[0] );
COLOUR colour = (COLOUR)JSVAL_TO_INT( argv[1] );
CRace *tRace = Races->Race( race );
if( tRace == NULL )
{
return JS_FALSE;
}
*rval = BOOLEAN_TO_JSVAL( tRace->IsValidHair( colour ) );
return JS_TRUE;
}
JSBool SE_IsValidRaceSkinColour( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
return JS_FALSE;
}
RACEID race = (RACEID)JSVAL_TO_INT( argv[0] );
COLOUR colour = (COLOUR)JSVAL_TO_INT( argv[1] );
CRace *tRace = Races->Race( race );
if( tRace == NULL )
{
return JS_FALSE;
}
*rval = BOOLEAN_TO_JSVAL( tRace->IsValidSkin( colour ) );
return JS_TRUE;
}
JSBool SE_IsValidRaceBeardColour( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
return JS_FALSE;
}
RACEID race = (RACEID)JSVAL_TO_INT( argv[0] );
COLOUR colour = (COLOUR)JSVAL_TO_INT( argv[1] );
CRace *tRace = Races->Race( race );
if( tRace == NULL )
{
return JS_FALSE;
}
*rval = BOOLEAN_TO_JSVAL( tRace->IsValidBeard( colour ) );
return JS_TRUE;
}
JSBool SE_GetClosestTown( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
return JS_FALSE;
}
JSBool SE_FirstItemInCont( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
return JS_FALSE;
}
UI32 item = JSVAL_TO_INT( argv[0] );
if( item == INVALIDSERIAL || item >= imem )
{
return JS_FALSE;
}
*rval = INT_TO_JSVAL( items[item].FirstItem() );
return JS_TRUE;
}
JSBool SE_NextItemInCont( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
return JS_FALSE;
}
UI32 item = JSVAL_TO_INT( argv[0] );
if( item == INVALIDSERIAL || item >= imem )
{
return JS_FALSE;
}
*rval = INT_TO_JSVAL( items[item].NextItem() );
return JS_TRUE;
}
JSBool SE_FinishedItemInCont( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
return JS_FALSE;
}
UI32 item = JSVAL_TO_INT( argv[0] );
if( item == INVALIDSERIAL || item >= imem )
{
return JS_FALSE;
}
*rval = BOOLEAN_TO_JSVAL( items[item].FinishedItems() );
return JS_TRUE;
}
JSBool SE_UseDoor( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
DoSEErrorMessage( "UseDoor: Invalid number of arguments (takes 2)" );
return JS_FALSE;
}
UOXSOCKET iSock = (UOXSOCKET)JSVAL_TO_INT( argv[0] );
ITEM iDoor = (ITEM)JSVAL_TO_INT( argv[1] );
if( iDoor == INVALIDSERIAL || iDoor >= imem )
{
DoSEErrorMessage( "UseDoor: Invalid door (%i)", iDoor );
return JS_FALSE;
}
cSocket *tSock = calcSocketObjFromSock( iSock );
useDoor( tSock, &items[iDoor] );
return JS_TRUE;
}
JSBool SE_VendorSell( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
DoSEErrorMessage( "VendorSell: Invalid number of arguments (takes 2)" );
return JS_FALSE;
}
UOXSOCKET sock = (UOXSOCKET)JSVAL_TO_INT( argv[0] );
CHARACTER npc = (CHARACTER)JSVAL_TO_INT( argv[1] );
if( sock == -1 || sock >= now )
{
DoSEErrorMessage( "VendorSell: Invalid socket (%i)", sock );
return JS_FALSE;
}
if( npc == INVALIDSERIAL || npc >= cmem )
{
DoSEErrorMessage( "VendorSell: Invalid character (%i)", npc );
return JS_FALSE;
}
chars[npc].SetNpcMoveTime( BuildTimeValue( 60.0f ) );
sendSellStuff( calcSocketObjFromSock( sock ), &chars[npc] );
return JS_TRUE;
}
JSBool SE_VendorBuy( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
DoSEErrorMessage( "VendorBuy: Invalid number of arguments (takes 2)" );
return JS_FALSE;
}
UOXSOCKET sock = (UOXSOCKET)JSVAL_TO_INT( argv[0] );
CHARACTER npc = (CHARACTER)JSVAL_TO_INT( argv[1] );
if( sock == -1 || sock >= now )
{
DoSEErrorMessage( "VendorBuy: Invalid socket (%i)", sock );
return JS_FALSE;
}
if( npc == INVALIDSERIAL || npc >= cmem )
{
DoSEErrorMessage( "VendorBuy: Invalid character (%i)", npc );
return JS_FALSE;
}
cSocket *mSock = calcSocketObjFromSock( sock );
if( mSock == NULL )
{
DoSEErrorMessage( "VendorBuy: Invalid socket (%i)", sock );
return JS_FALSE;
}
if( chars[npc].GetNPCAiType() == 17 )
{
mSock->AddX( npc );
npcTalk( calcSocketObjFromSock( sock ), &chars[npc], 772, false );
target( mSock, 0, 1, 0, 224, " ");
}
else
Targ->BuyShop( mSock, &chars[npc] );
return JS_TRUE;
}
JSBool SE_TriggerEvent( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
// Takes at least 2 parameters, which is the script number to trigger and the function name to call
// Any extra parameters are extra parameters to the JS event
if( argc < 2 )
{
return JS_FALSE;
}
UI16 scriptNumberToFire = (UI16)JSVAL_TO_INT( argv[0] );
char *eventToFire = JS_GetStringBytes( JS_ValueToString( cx, argv[1] ) );
cScript *toExecute = Trigger->GetScript( scriptNumberToFire );
if( toExecute == NULL || eventToFire == NULL )
return JS_FALSE;
if( toExecute->CallParticularEvent( eventToFire, &argv[2], argc - 2 ) )
return JS_TRUE;
else
return JS_FALSE;
}
JSBool SE_GetGuild( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "GetGuild: Invalid number of arguments (takes 1)" );
return JS_FALSE;
}
CHARACTER mChar = (CHARACTER)JSVAL_TO_INT( argv[0] );
if( mChar == INVALIDSERIAL || mChar >= cmem )
{
DoSEErrorMessage( "GetGuild: Invalid character (%i)", mChar );
return JS_FALSE;
}
*rval = INT_TO_JSVAL( chars[mChar].GetGuildNumber() );
return JS_TRUE;
}
JSBool SE_SkillBeingUsed( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
DoSEErrorMessage( "SkillBeingUsed: Invalid number of arguments (takes 2)" );
return JS_FALSE;
}
CHARACTER mChar = (CHARACTER)JSVAL_TO_INT( argv[0] );
if( mChar == INVALIDSERIAL || mChar >= cmem )
{
DoSEErrorMessage( "SkillBeingUsed: Invalid character (%i)", mChar );
return JS_FALSE;
}
UI08 skillUsed = (UI08)JSVAL_TO_INT( argv[1] );
*rval = BOOLEAN_TO_JSVAL( chars[mChar].SkillUsed( skillUsed ) );
return JS_TRUE;
}
JSBool SE_SetSkillUse( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 3 )
{
DoSEErrorMessage( "SetSkillUse: Invalid number of arguments (takes 3)" );
return JS_FALSE;
}
CHARACTER mChar = (CHARACTER)JSVAL_TO_INT( argv[0] );
if( mChar == INVALIDSERIAL || mChar >= cmem )
{
DoSEErrorMessage( "SetSkillUse: Invalid character (%i)", mChar );
return JS_FALSE;
}
UI08 skillUsed = (UI08)JSVAL_TO_INT( argv[1] );
bool skillStatus = ( JSVAL_TO_BOOLEAN( argv[2] ) == JS_TRUE );
chars[mChar].SkillUsed( skillStatus, skillUsed );
return JS_TRUE;
}
JSBool SE_GetPrivateBit( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 4 )
{
DoSEErrorMessage( "GetPrivateBit: Invalid number of arguments (takes 4)" );
return JS_FALSE;
}
UI32 mCheck = JSVAL_TO_INT( argv[0] );
int mType = JSVAL_TO_INT( argv[1] );
if( mCheck == INVALIDSERIAL || (mType == 0 && mCheck > cmem) || (mType == 1 && mCheck > imem) )
{
DoSEErrorMessage( "GetPrivateBit: Invalid object (%i) of type (%i)", mCheck, mType );
return JS_FALSE;
}
UI08 mWord = (UI08)JSVAL_TO_INT( argv[2] );
UI08 mBit = (UI08)JSVAL_TO_INT( argv[3] );
if( mType == 0 )
*rval = BOOLEAN_TO_JSVAL( chars[mCheck].GetBit( mWord, mBit ) );
else
*rval = BOOLEAN_TO_JSVAL( items[mCheck].GetBit( mWord, mBit ) );
return JS_TRUE;
}
JSBool SE_SetPrivateBit( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 5 )
{
DoSEErrorMessage( "SetPrivateBit: Invalid number of arguments (takes 5)" );
return JS_FALSE;
}
UI32 mCheck = JSVAL_TO_INT( argv[0] );
int mType = JSVAL_TO_INT( argv[1] );
if( mCheck == INVALIDSERIAL || (mType == 0 && mCheck > cmem) || (mType == 1 && mCheck > imem) )
{
DoSEErrorMessage( "SetPrivateBit: Invalid object (%i) of type (%i)", mCheck, mType );
return JS_FALSE;
}
UI08 mWord = (UI08)JSVAL_TO_INT( argv[2] );
UI08 mBit = (UI08)JSVAL_TO_INT( argv[3] );
bool bVal = ( JSVAL_TO_BOOLEAN( argv[4] ) == JS_TRUE );
if( mType == 0 )
chars[mCheck].SetBit( mWord, mBit, bVal );
else
items[mCheck].SetBit( mWord, mBit, bVal );
return JS_TRUE;
}
JSBool SE_GetPrivateWord( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 3 )
{
DoSEErrorMessage( "GetPrivateWord: Invalid number of arguments (takes 3)" );
return JS_FALSE;
}
UI32 mCheck = JSVAL_TO_INT( argv[0] );
int mType = JSVAL_TO_INT( argv[1] );
if( mCheck == INVALIDSERIAL || (mType == 0 && mCheck > cmem) || (mType == 1 && mCheck > imem) )
{
DoSEErrorMessage( "GetPrivateWord: Invalid object (%i) of type (%i)", mCheck, mType );
return JS_FALSE;
}
UI08 mWord = (UI08)JSVAL_TO_INT( argv[2] );
if( mType == 0 )
*rval = INT_TO_JSVAL( chars[mCheck].GetWord( mWord ) );
else
*rval = INT_TO_JSVAL( items[mCheck].GetWord( mWord ) );
return JS_TRUE;
}
JSBool SE_SetPrivateWord( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 4 )
{
DoSEErrorMessage( "SetPrivateWord: Invalid number of arguments (takes 4)" );
return JS_FALSE;
}
UI32 mCheck = JSVAL_TO_INT( argv[0] );
int mType = JSVAL_TO_INT( argv[1] );
if( mCheck == INVALIDSERIAL || (mType == 0 && mCheck > cmem) || (mType == 1 && mCheck > imem) )
{
DoSEErrorMessage( "SetPrivateWord: Invalid object (%i) of type (%i)", mCheck, mType );
return JS_FALSE;
}
UI08 mWord = (UI08)JSVAL_TO_INT( argv[2] );
UI08 mVal = (UI08)JSVAL_TO_INT( argv[3] );
if( mType == 0 )
chars[mCheck].SetWord( mWord, mVal );
else
items[mCheck].SetWord( mWord, mVal );
return JS_TRUE;
}
JSBool SE_GetPrivateBitRange( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 5 )
{
DoSEErrorMessage( "GetPrivateBitRange: Invalid number of arguments (takes 5)" );
return JS_FALSE;
}
UI32 mCheck = JSVAL_TO_INT( argv[0] );
int mType = JSVAL_TO_INT( argv[1] );
if( mCheck == INVALIDSERIAL || (mType == 0 && mCheck > cmem) || (mType == 1 && mCheck > imem) )
{
DoSEErrorMessage( "GetPrivateBitRange: Invalid object (%i) of type (%i)", mCheck, mType );
return JS_FALSE;
}
UI08 mWord = (UI08)JSVAL_TO_INT( argv[2] );
UI08 mLow = (UI08)JSVAL_TO_INT( argv[3] );
UI08 mHigh = (UI08)JSVAL_TO_INT( argv[4] );
if( mType == 0 )
*rval = INT_TO_JSVAL( chars[mCheck].GetBitRange( mWord, mLow, mHigh ) );
else
*rval = INT_TO_JSVAL( items[mCheck].GetBitRange( mWord, mLow, mHigh ) );
return JS_TRUE;
}
JSBool SE_SetPrivateBitRange( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 6 )
{
DoSEErrorMessage( "SetPrivateBitRange: Invalid number of arguments (takes 6)" );
return JS_FALSE;
}
UI32 mCheck = JSVAL_TO_INT( argv[0] );
int mType = JSVAL_TO_INT( argv[1] );
if( mCheck == INVALIDSERIAL || (mType == 0 && mCheck > cmem) || (mType == 1 && mCheck > imem) )
{
DoSEErrorMessage( "SetPrivateBitRange: Invalid object (%i) of type (%i)", mCheck, mType );
return JS_FALSE;
}
UI08 mWord = (UI08)JSVAL_TO_INT( argv[2] );
UI08 mLow = (UI08)JSVAL_TO_INT( argv[3] );
UI08 mHigh = (UI08)JSVAL_TO_INT( argv[4] );
UI32 mVal = (UI32)JSVAL_TO_INT( argv[5] );
if( mType == 0 )
chars[mCheck].SetBitRange( mWord, mLow, mHigh, mVal );
else
items[mCheck].SetBitRange( mWord, mLow, mHigh, mVal );
return JS_TRUE;
}
JSBool SE_GetPackOwner( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
DoSEErrorMessage( "GetPackOwner: Invalid number of arguments (takes 2)" );
return JS_FALSE;
}
UI08 mType = (UI08)JSVAL_TO_INT( argv[1] );
CChar *pOwner = NULL;
if( mType == 0 ) // item
{
JSObject *mItem = JSVAL_TO_OBJECT( argv[0] );
CItem *myItem = (CItem *)JS_GetPrivate( cx, mItem );
pOwner = getPackOwner( myItem );
}
else // serial
{
SI32 mSerItem = JSVAL_TO_INT( argv[0] );
pOwner = getPackOwner( calcItemObjFromSer( mSerItem ) );
}
if( pOwner != NULL )
{
UI16 myScpTrig = Trigger->FindObject( JS_GetGlobalObject( cx ) );
cScript *myScript = Trigger->GetScript( myScpTrig );
JSObject *myObj = myScript->AcquireObject( IUE_CHAR );
JS_SetPrivate( cx, myObj, pOwner );
*rval = OBJECT_TO_JSVAL( myObj );
}
else
*rval = JSVAL_NULL;
return JS_TRUE;
}
JSBool SE_CalcTargetedItem( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "CalcTargetedItem: Invalid number of arguments (takes 1)" );
return JS_FALSE;
}
JSObject *mysockptr = JSVAL_TO_OBJECT( argv[0] );
cSocket *sChar = (cSocket *)JS_GetPrivate( cx, mysockptr );
if( sChar == NULL )
{
DoSEErrorMessage( "CalcTargetedItem: Invalid socket" );
return JS_FALSE;
}
CItem *calcedItem = calcItemObjFromSer( sChar->GetDWord( 7 ) );
if( calcedItem == NULL )
{
*rval = JSVAL_NULL;
}
else
{
UI16 myScpTrig = Trigger->FindObject( JS_GetGlobalObject( cx ) );
cScript *myScript = Trigger->GetScript( myScpTrig );
JSObject *myObj = myScript->AcquireObject( IUE_ITEM );
JS_SetPrivate( cx, myObj, calcedItem );
*rval = OBJECT_TO_JSVAL( myObj );
}
return JS_TRUE;
}
JSBool SE_CalcTargetedChar( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "CalcTargetedChar: Invalid number of arguments (takes 1)" );
return JS_FALSE;
}
UOXSOCKET sChar = (UOXSOCKET)JSVAL_TO_INT( argv[0] );
if( sChar == -1 || sChar >= now )
{
DoSEErrorMessage( "CalcTargetedChar: Invalid socket (%i)", sChar );
return JS_FALSE;
}
cSocket *mSock = calcSocketObjFromSock( sChar );
if( mSock == NULL )
{
DoSEErrorMessage( "CalcTargetedChar: Invalid socket (%i)", sChar );
return JS_FALSE;
}
*rval = INT_TO_JSVAL( calcCharFromSer( mSock->GetDWord( 7 ) ) );
return JS_TRUE;
}
JSBool SE_GetTileIDAtMapCoord( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 3 )
{
DoSEErrorMessage( "GetTileIDAtMapCoord: Invalid number of arguments (takes 2)" );
return JS_FALSE;
}
UI16 xLoc = (UI16)JSVAL_TO_INT( argv[0] );
UI16 yLoc = (UI16)JSVAL_TO_INT( argv[1] );
UI08 wrldNumber = (UI08)JSVAL_TO_INT( argv[2] );
map_st mMap = Map->SeekMap0( xLoc, yLoc, wrldNumber );
*rval = INT_TO_JSVAL( mMap.id );
return JS_TRUE;
}
JSBool SE_GetClientVersion( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "GetClientVersion: Invalid number of arguments (takes 1, socket)" );
return JS_FALSE;
}
UOXSOCKET tSock = (UOXSOCKET)JSVAL_TO_INT( argv[0] );
cSocket *mSock = calcSocketObjFromSock( tSock );
if( mSock == NULL )
{
DoSEErrorMessage( "GetClientVersion: Invalid socket (%i)", tSock );
return JS_FALSE;
}
*rval = INT_TO_JSVAL( mSock->ClientVersion() );
return JS_TRUE;
}
JSBool SE_GetClientType( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "GetClientType: Invalid number of arguments (takes 1, socket)" );
return JS_FALSE;
}
UOXSOCKET tSock = (UOXSOCKET)JSVAL_TO_INT( argv[0] );
cSocket *mSock = calcSocketObjFromSock( tSock );
if( mSock == NULL )
{
DoSEErrorMessage( "GetClientType: Invalid socket (%i)", tSock );
return JS_FALSE;
}
*rval = INT_TO_JSVAL( mSock->ClientType() );
return JS_TRUE;
}
JSBool SE_FileOpen( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
char *filename, *mode;
if( argc != 2 )
{
DoSEErrorMessage( "FileOpen: Invalid number of arguments (takes 2)" );
return JS_FALSE;
}
filename = JS_GetStringBytes( JSVAL_TO_STRING( argv[0] ) );
mode = JS_GetStringBytes( JSVAL_TO_STRING( argv[1] ) );
strlwr( mode );
if( mode[0] != 'r' && mode[0] != 'w' && mode[0] != 'a' )
{
DoSEErrorMessage( "FileOpen: Invalid mode must be \"read\", \"write\", or \"append\"!" );
return JS_FALSE;
}
if( strstr( filename, ".." ) || strstr( filename, "\\" ) || strstr( filename, "/" ) )
{
DoSEErrorMessage( "FileOpen: file names may not contain \"..\", \"\\\", or \"/\"." );
return JS_FALSE;
}
mode[1] = 0;
*rval = INT_TO_JSVAL( (int)(fopen( filename, mode )) );
return JS_TRUE;
}
JSBool SE_FileClose( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "FileClose: Invalid number of arguments (takes 1)" );
return JS_FALSE;
}
FILE *fp = (FILE *)JSVAL_TO_INT( argv[0] );
if( !fp )
return JS_TRUE;
fclose( fp );
return JS_TRUE;
}
JSBool SE_Write( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
DoSEErrorMessage( "Write: Invalid number of arguments (takes 2)" );
return JS_FALSE;
}
FILE *fp = (FILE *)JSVAL_TO_INT( argv[0] );
if( !fp || feof( fp ) )
{
DoSEErrorMessage( "Write: Error writing to file, file was not opened sucessfully!" );
return JS_FALSE;
}
else if( ftell( fp ) > 1049600 )
{
DoSEErrorMessage( "Write: Error writing to file. File my not exceed 1mb." );
return JS_FALSE;
}
char *str = JS_GetStringBytes( JSVAL_TO_STRING( argv[1] ) );
fprintf( fp, str );
return JS_TRUE;
}
JSBool SE_ReadUntil( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
DoSEErrorMessage( "ReadUntil: Invalid number of arguments (takes 2)" );
return JS_FALSE;
}
FILE *fp = (FILE *)(JSVAL_TO_INT(argv[0]));
if( !fp || feof( fp ) )
{
DoSEErrorMessage( "ReadUntil: Error reading file, is not opened or has reached EOF" );
return JS_FALSE;
}
char *until = JS_GetStringBytes( JSVAL_TO_STRING( argv[1] ) );
char line[512];
int c;
if( until[0] == '\\' && strlen( until ) > 1 )
{
switch (until[1])
{
case '\\': until[0] = '\\'; break;
case '\'': until[0] = '\''; break;
case '\"': until[0] = '\"'; break;
case 'n': until[0] = '\n'; break;
default: DoSEErrorMessage( "ReadUntil: Unsupported character escape sequence %s", until );
}
}
for( c = 0; c < 512 && !feof( fp ); c++ )
{
line[c] = fgetc( fp );
if( line[c] == until[0] || line[c] == '\n' )
break;
}
line[c<512 ? c : 511] = 0;
*rval = STRING_TO_JSVAL( JS_NewStringCopyZ( cx, line ) );
return JS_TRUE;
}
JSBool SE_Read( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
DoSEErrorMessage( "Read: Invalid number of arguments (takes 2)" );
return JS_FALSE;
}
FILE *fp = (FILE *)(JSVAL_TO_INT(argv[0]));
if( !fp || feof( fp ) )
{
DoSEErrorMessage( "Read: Error reading file, is not opened or has reached EOF" );
return JS_FALSE;
}
int bytes = JSVAL_TO_INT( argv[1] );
char data[512];
if( bytes > 512 || bytes < 1 )
{
DoSEErrorMessage( "Read: Invalid byte count, must be from 1 to 512!" );
return JS_FALSE;
}
fread( data, 1, bytes, fp );
*rval = STRING_TO_JSVAL( JS_NewStringCopyZ( cx, data ) );
return JS_TRUE;
}
JSBool SE_EndOfFile( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "EndOfFile: Invalid number of arguments (takes 1)" );
return JS_FALSE;
}
FILE *fp = (FILE *)JSVAL_TO_INT( argv[0] );
if( fp )
*rval = feof( fp );
else *
rval = 1;
return JS_TRUE;
}
JSBool SE_StringToNum( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "StringToNum: Invalid number of arguments (takes 1)" );
return JS_FALSE;
}
char *str = JS_GetStringBytes( JSVAL_TO_STRING( argv[0] ) );
*rval = INT_TO_JSVAL( makeNum( str ) );
return JS_TRUE;
}
JSBool SE_NumToString( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "NumToString: Invalid number of arguments (takes 1)" );
return JS_FALSE;
}
int num = JSVAL_TO_INT( argv[0] );
char str[32];
numtostr( num, str );
*rval = STRING_TO_JSVAL( JS_NewStringCopyZ( cx, str ) );
return JS_TRUE;
}
JSBool SE_SetDecayTime( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
DoSEErrorMessage( "SetDecayTime: Invalid number of arguments (takes 2, item and decay time)" );
return JS_FALSE;
}
UI32 targChar = JSVAL_TO_INT( argv[0] );
if( targChar == INVALIDSERIAL || ( targChar > imem ) )
{
DoSEErrorMessage( "SetDecayTime: Invalid object (%i)", targChar );
return JS_FALSE;
}
UI32 decaytime = (UI32)JSVAL_TO_INT( argv[1] );
items[targChar].SetDecayTime( decaytime );
return JS_TRUE;
}
JSBool SE_GetDecayTime( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "GetDecayTime: Invalid number of arguments (takes 1, item)" );
return JS_FALSE;
}
UI32 targChar = JSVAL_TO_INT( argv[0] );
if( targChar == INVALIDSERIAL || ( targChar > imem ) )
{
DoSEErrorMessage( "GetDecayTime: Invalid type (%i) ", targChar);
return JS_FALSE;
}
*rval = INT_TO_JSVAL( items[targChar].GetDecayTime() );
return JS_TRUE;
}
JSBool SE_SetDecayable( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 2 )
{
DoSEErrorMessage( "SetDecayable: Invalid number of arguments (takes 2, item and decayable)" );
return JS_FALSE;
}
UI32 targChar = JSVAL_TO_INT( argv[0] );
if( targChar == INVALIDSERIAL || ( targChar > imem ) )
{
DoSEErrorMessage( "SetDecayTime: Invalid object (%i)", targChar );
return JS_FALSE;
}
bool decayable = ( JSVAL_TO_BOOLEAN( argv[1] ) == JS_TRUE );
items[targChar].SetDecayable( decayable );
return JS_TRUE;
}
JSBool SE_IsDecayable( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "IsDecayable: Invalid number of arguments (takes 1, item)" );
return JS_FALSE;
}
UI32 targChar = JSVAL_TO_INT( argv[0] );
if( targChar == INVALIDSERIAL || ( targChar > imem ) )
{
DoSEErrorMessage( "IsDecayable: Invalid type (%i) ", targChar);
return JS_FALSE;
}
*rval = BOOLEAN_TO_JSVAL( items[targChar].isDecayable() );
return JS_TRUE;
}
//o--------------------------------------------------------------------------
//| Function - JSBool SE_GetRaceCount( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
//| Date - November 9, 2001
//| Programmer - DarkStorm
//| Modified -
//o--------------------------------------------------------------------------
//| Purpose - Returns the total number of races found in the server
//o--------------------------------------------------------------------------
JSBool SE_GetRaceCount( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 0 )
{
DoSEErrorMessage( "GetRaceCount: Invalid number of arguments (takes 0)" );
return JS_FALSE;
}
*rval = INT_TO_JSVAL( Races->Count() );
return JS_TRUE;
}
//o--------------------------------------------------------------------------o
//| Function - JSBool SE_GetCommand( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
//| Date - 1/13/2003 11:09:39 PM
//| Developers - Brakhtus
//| Organization - Forum Submission
//| Status - Currently under development
//o--------------------------------------------------------------------------o
//| Description - Extend the UOX# JSE implementation to support scriptable
//| commands that players, and daminstration for a shard may
//| use to performs specialized tasks.
//o--------------------------------------------------------------------------o
//| Modifications -
//o--------------------------------------------------------------------------o
JSBool SE_GetCommand( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 1 )
{
DoSEErrorMessage( "GetCommand: needs an argument" );
return JS_FALSE;
}
short idx = (JSVAL_TO_INT( argv[0] ));
if (idx>=tnum)
{
DoSEErrorMessage( "GetCommand: Index exeeds the commando-array!" );
return JS_FALSE;
}
*rval = STRING_TO_JSVAL( JS_NewStringCopyZ( cx, comm[idx] ) );
return JS_TRUE;
}
//o--------------------------------------------------------------------------o
//| Function - JSBool SE_GetCommandSize( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
//| Date - 1/13/2003 11:11:46 PM
//| Developers - Brakhtus
//| Organization - Forum Submission
//| Status - Currently under development
//o--------------------------------------------------------------------------o
//| Description -
//o--------------------------------------------------------------------------o
//| Modifications -
//o--------------------------------------------------------------------------o
JSBool SE_GetCommandSize( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval )
{
if( argc != 0 )
{
DoSEErrorMessage( "GetCommandSize: doesnt need any argument!" );
return JS_FALSE;
}
*rval = INT_TO_JSVAL( tnum );
return JS_TRUE;
}