2004-06-03 20:38:14 +02:00
# include "precompiled.h"
2006-07-13 05:29:33 +02:00
# include "EntityTemplate.h"
# include "EntityTemplateCollection.h"
2006-06-02 04:10:27 +02:00
# include "graphics/ObjectManager.h"
# include "ps/CStr.h"
# include "ps/Player.h"
2004-05-22 01:46:16 +02:00
2005-08-15 01:50:37 +02:00
# include "ps/XML/Xeromyces.h"
2004-05-22 01:46:16 +02:00
2006-06-02 04:10:27 +02:00
# include "ps/CLogger.h"
2004-10-07 21:23:35 +02:00
# define LOG_CATEGORY "entity"
2006-07-13 05:29:33 +02:00
STL_HASH_SET < CStr , CStr_hash_compare > CEntityTemplate : : scriptsLoaded ;
2005-12-29 09:42:44 +01:00
2006-07-13 05:29:33 +02:00
CEntityTemplate : : CEntityTemplate ( CPlayer * player )
2004-05-30 04:18:49 +02:00
{
2006-05-14 00:11:46 +02:00
m_player = player ;
2005-03-30 18:14:19 +02:00
m_base = NULL ;
2006-01-16 11:56:47 +01:00
2004-10-07 21:23:35 +02:00
AddProperty ( L " tag " , & m_Tag , false ) ;
2005-03-30 18:14:19 +02:00
AddProperty ( L " parent " , & m_base , false ) ;
2006-05-14 00:11:46 +02:00
AddProperty ( L " unmodified " , & m_unmodified , false ) ;
2004-10-07 21:23:35 +02:00
for ( int t = 0 ; t < EVENT_LAST ; t + + )
2005-04-22 09:12:55 +02:00
{
AddProperty ( EventNames [ t ] , & m_EventHandlers [ t ] , false ) ;
AddHandler ( t , & m_EventHandlers [ t ] ) ;
}
2004-10-23 16:39:28 +02:00
2004-11-11 08:09:32 +01:00
// Initialize, make life a little easier on the scriptors
2005-05-01 21:09:13 +02:00
m_speed = m_turningRadius = 0.0f ;
2006-07-13 00:24:25 +02:00
//m_extant = true;
2006-02-26 10:55:20 +01:00
m_foundation = CStrW ( ) ;
2006-07-10 01:12:37 +02:00
m_socket = CStrW ( ) ;
2006-05-13 06:07:42 +02:00
m_passThroughAllies = false ;
2006-05-29 05:28:54 +02:00
m_sectorDivs = 4 ;
2004-11-11 08:09:32 +01:00
2006-03-04 02:15:32 +01:00
// Sentinel values for stamina and health (so scripts can check if an entity has no stamina or no HP).
2006-05-04 06:14:48 +02:00
m_speed = 0 ;
2006-03-03 21:57:45 +01:00
m_staminaCurr = 0 ;
m_staminaMax = 0 ;
2006-03-04 02:15:32 +01:00
m_healthCurr = 0 ;
m_healthMax = 0 ;
2006-03-03 21:57:45 +01:00
2004-10-07 21:23:35 +02:00
m_bound_type = CBoundingObject : : BOUND_NONE ;
2004-05-30 04:18:49 +02:00
m_bound_circle = NULL ;
m_bound_box = NULL ;
}
2006-07-13 05:29:33 +02:00
CEntityTemplate : : ~ CEntityTemplate ( )
2004-05-30 03:57:26 +02:00
{
if ( m_bound_box )
delete ( m_bound_box ) ;
if ( m_bound_circle )
delete ( m_bound_circle ) ;
}
2006-07-13 05:29:33 +02:00
void CEntityTemplate : : loadBase ( )
2004-10-07 21:23:35 +02:00
{
// Don't bother if we're providing a replacement.
if ( m_bound_type = = CBoundingObject : : BOUND_NONE )
{
if ( m_base - > m_bound_type = = CBoundingObject : : BOUND_CIRCLE )
{
m_bound_circle = new CBoundingCircle ( ) ;
m_bound_circle - > setRadius ( m_base - > m_bound_circle - > m_radius ) ;
2005-05-10 09:13:25 +02:00
m_bound_circle - > setHeight ( m_base - > m_bound_circle - > m_height ) ;
2004-10-07 21:23:35 +02:00
}
else if ( m_base - > m_bound_type = = CBoundingObject : : BOUND_OABB )
{
m_bound_box = new CBoundingBox ( ) ;
2005-05-10 09:13:25 +02:00
m_bound_box - > setDimensions ( m_base - > m_bound_box - > getWidth ( ) , m_base - > m_bound_box - > getDepth ( ) ) ;
m_bound_box - > setHeight ( m_base - > m_bound_box - > m_height ) ;
2004-10-07 21:23:35 +02:00
}
m_bound_type = m_base - > m_bound_type ;
}
SetBase ( m_base ) ;
2005-05-01 21:09:13 +02:00
m_classes . SetParent ( & ( m_base - > m_classes ) ) ;
2005-04-22 09:12:55 +02:00
SetNextObject ( m_base ) ;
2004-10-07 21:23:35 +02:00
}
2006-07-13 05:29:33 +02:00
jsval CEntityTemplate : : getClassSet ( )
2005-05-01 21:09:13 +02:00
{
STL_HASH_SET < CStrW , CStrW_hash_compare > : : iterator it ;
it = m_classes . m_Set . begin ( ) ;
CStrW result = * ( it + + ) ;
for ( ; it ! = m_classes . m_Set . end ( ) ; it + + )
result + = L " " + * it ;
return ( ToJSVal ( result ) ) ;
}
2006-07-13 05:29:33 +02:00
void CEntityTemplate : : setClassSet ( jsval value )
2005-05-01 21:09:13 +02:00
{
// Get the set that was passed in.
CStr temp = ToPrimitive < CStrW > ( value ) ;
CStr entry ;
m_classes . m_Added . clear ( ) ;
m_classes . m_Removed . clear ( ) ;
while ( true )
{
long brk_sp = temp . Find ( ' ' ) ;
long brk_cm = temp . Find ( ' , ' ) ;
long brk = ( brk_sp = = - 1 ) ? brk_cm : ( brk_cm = = - 1 ) ? brk_sp : ( brk_sp < brk_cm ) ? brk_sp : brk_cm ;
if ( brk = = - 1 )
{
entry = temp ;
}
else
{
entry = temp . GetSubstring ( 0 , brk ) ;
temp = temp . GetSubstring ( brk + 1 , temp . Length ( ) ) ;
}
if ( brk ! = 0 )
{
if ( entry [ 0 ] = = ' - ' )
{
entry = entry . GetSubstring ( 1 , entry . Length ( ) ) ;
if ( entry . Length ( ) )
m_classes . m_Removed . push_back ( entry ) ;
}
else
{
if ( entry [ 0 ] = = ' + ' )
entry = entry . GetSubstring ( 1 , entry . Length ( ) ) ;
if ( entry . Length ( ) )
m_classes . m_Added . push_back ( entry ) ;
}
}
if ( brk = = - 1 ) break ;
}
rebuildClassSet ( ) ;
}
2006-07-13 05:29:33 +02:00
void CEntityTemplate : : rebuildClassSet ( )
2005-05-01 21:09:13 +02:00
{
m_classes . Rebuild ( ) ;
InheritorsList : : iterator it ;
for ( it = m_Inheritors . begin ( ) ; it ! = m_Inheritors . end ( ) ; it + + )
( * it ) - > rebuildClassSet ( ) ;
}
2006-07-13 05:29:33 +02:00
bool CEntityTemplate : : loadXML ( CStr filename )
2004-05-22 01:46:16 +02:00
{
2004-07-08 17:22:09 +02:00
CXeromyces XeroFile ;
2004-07-29 18:17:21 +02:00
if ( XeroFile . Load ( filename ) ! = PSRETURN_OK )
2004-07-17 19:09:33 +02:00
// Fail
2004-07-08 17:22:09 +02:00
return false ;
2004-05-22 01:46:16 +02:00
2004-07-08 17:22:09 +02:00
// Define all the elements and attributes used in the XML file
2004-07-10 22:33:42 +02:00
# define EL(x) int el_##x = XeroFile.getElementID(#x)
# define AT(x) int at_##x = XeroFile.getAttributeID(#x)
2004-10-07 21:23:35 +02:00
// Only the ones we can't load using normal methods.
2004-07-08 17:22:09 +02:00
EL ( entity ) ;
2004-10-07 21:23:35 +02:00
EL ( script ) ;
EL ( event ) ;
2005-12-15 22:59:48 +01:00
EL ( traits ) ;
EL ( footprint ) ;
EL ( depth ) ;
EL ( height ) ;
EL ( radius ) ;
EL ( width ) ;
2004-10-07 21:23:35 +02:00
AT ( parent ) ;
AT ( on ) ;
2005-03-29 22:50:04 +02:00
AT ( file ) ;
2005-04-15 06:23:33 +02:00
AT ( function ) ;
2004-07-08 17:22:09 +02:00
# undef AT
# undef EL
XMBElement Root = XeroFile . getRoot ( ) ;
2004-10-07 21:23:35 +02:00
if ( Root . getNodeName ( ) ! = el_entity )
{
2006-07-13 05:29:33 +02:00
LOG ( ERROR , LOG_CATEGORY , " CEntityTemplate::LoadXML: XML root was not \" Entity \" in file %s. Load failed. " , filename . c_str ( ) ) ;
2004-10-07 21:23:35 +02:00
return ( false ) ;
}
2004-07-08 17:22:09 +02:00
XMBElementList RootChildren = Root . getChildNodes ( ) ;
2005-03-29 22:50:04 +02:00
m_Tag = CStr ( filename ) . AfterLast ( " / " ) . BeforeLast ( " .xml " ) ;
2004-10-07 21:23:35 +02:00
m_Base_Name = Root . getAttributes ( ) . getNamedItem ( at_parent ) ;
2006-07-13 00:24:25 +02:00
// Load our parent, if we have one
if ( m_Base_Name . Length ( ) )
{
2006-07-13 05:29:33 +02:00
CEntityTemplate * base = g_EntityTemplateCollection . getTemplate ( m_Base_Name , m_player ) ;
2006-07-13 00:24:25 +02:00
if ( base )
{
m_base = base ;
loadBase ( ) ;
}
else
{
LOG ( WARNING , LOG_CATEGORY , " Parent template \" %ls \" does not exist in template \" %ls \" " , m_Base_Name . c_str ( ) , m_Tag . c_str ( ) ) ;
// (The requested entity will still be returned, but with no parent.
// Is this a reasonable thing to do?)
}
}
2004-10-07 21:23:35 +02:00
2004-07-08 17:22:09 +02:00
for ( int i = 0 ; i < RootChildren . Count ; + + i )
2004-05-22 01:46:16 +02:00
{
2004-07-08 17:22:09 +02:00
XMBElement Child = RootChildren . item ( i ) ;
2005-08-09 17:55:44 +02:00
int ChildName = Child . getNodeName ( ) ;
2004-10-07 21:23:35 +02:00
if ( ChildName = = el_script )
2004-07-08 17:22:09 +02:00
{
2005-03-29 22:50:04 +02:00
CStr Include = Child . getAttributes ( ) . getNamedItem ( at_file ) ;
2004-10-07 21:23:35 +02:00
2005-12-29 09:42:44 +01:00
if ( Include . Length ( ) & & scriptsLoaded . find ( Include ) = = scriptsLoaded . end ( ) )
{
scriptsLoaded . insert ( Include ) ;
g_ScriptingHost . RunScript ( Include ) ;
}
2004-10-07 21:23:35 +02:00
CStr Inline = Child . getText ( ) ;
if ( Inline . Length ( ) )
2005-12-29 09:42:44 +01:00
{
g_ScriptingHost . RunMemScript ( Inline . c_str ( ) , Inline . Length ( ) , filename . c_str ( ) , Child . getLineNumber ( ) ) ;
}
2004-07-08 17:22:09 +02:00
}
2005-12-15 22:59:48 +01:00
else if ( ChildName = = el_traits )
2004-07-08 17:22:09 +02:00
{
2005-12-15 22:59:48 +01:00
XMBElementList TraitChildren = Child . getChildNodes ( ) ;
for ( int j = 0 ; j < TraitChildren . Count ; + + j )
2004-10-07 21:23:35 +02:00
{
2005-12-15 22:59:48 +01:00
XMBElement TraitChild = TraitChildren . item ( j ) ;
int TraitChildName = TraitChild . getNodeName ( ) ;
if ( TraitChildName = = el_footprint )
{
XMBElementList FootprintChildren = TraitChild . getChildNodes ( ) ;
float radius = 0 , height = 0 , width = 0 , depth = 0 ;
bool hadRadius = false , hadDepth = false ;
for ( int k = 0 ; k < FootprintChildren . Count ; + + k )
{
XMBElement FootprintChild = FootprintChildren . item ( k ) ;
int FootprintChildName = FootprintChild . getNodeName ( ) ;
if ( FootprintChildName = = el_radius )
{
hadRadius = true ;
radius = CStrW ( FootprintChild . getText ( ) ) . ToFloat ( ) ;
}
else if ( FootprintChildName = = el_width )
{
width = CStrW ( FootprintChild . getText ( ) ) . ToFloat ( ) ;
}
else if ( FootprintChildName = = el_height )
{
height = CStrW ( FootprintChild . getText ( ) ) . ToFloat ( ) ;
}
else if ( FootprintChildName = = el_depth )
{
hadDepth = true ;
depth = CStrW ( FootprintChild . getText ( ) ) . ToFloat ( ) ;
}
}
if ( hadRadius )
{
// Specifying a circular footprint
if ( ! m_bound_circle )
m_bound_circle = new CBoundingCircle ( ) ;
m_bound_circle - > setRadius ( radius ) ;
m_bound_circle - > setHeight ( height ) ;
m_bound_type = CBoundingObject : : BOUND_CIRCLE ;
}
else if ( hadDepth )
{
2006-02-26 10:55:20 +01:00
// Specifying a rectangular footprint
2005-12-15 22:59:48 +01:00
if ( ! m_bound_box )
m_bound_box = new CBoundingBox ( ) ;
m_bound_box - > setDimensions ( width , depth ) ;
m_bound_box - > setHeight ( height ) ;
m_bound_type = CBoundingObject : : BOUND_OABB ;
}
2006-02-26 10:55:20 +01:00
// Else, entity has no footprint.
2005-12-15 22:59:48 +01:00
}
2004-10-07 21:23:35 +02:00
}
2005-12-15 22:59:48 +01:00
// important so that scripts can see traits
XMLLoadProperty ( XeroFile , Child , CStrW ( ) ) ;
2004-07-08 17:22:09 +02:00
}
2004-10-07 21:23:35 +02:00
else if ( ChildName = = el_event )
2004-07-08 17:22:09 +02:00
{
2004-10-07 21:23:35 +02:00
// Action...On for consistency with the GUI.
2005-03-29 22:50:04 +02:00
CStrW EventName = L " on " + ( CStrW ) Child . getAttributes ( ) . getNamedItem ( at_on ) ;
2004-10-07 21:23:35 +02:00
2005-03-29 22:50:04 +02:00
CStrW Code ( Child . getText ( ) ) ;
2005-05-18 07:32:09 +02:00
utf16string ExternalFunction = Child . getAttributes ( ) . getNamedItem ( at_function ) ;
2005-04-15 06:23:33 +02:00
2004-10-07 21:23:35 +02:00
// Does a property with this name already exist?
for ( uint eventID = 0 ; eventID < EVENT_LAST ; eventID + + )
{
if ( CStrW ( EventNames [ eventID ] ) = = EventName )
{
2005-05-18 07:32:09 +02:00
if ( ExternalFunction ! = utf16string ( ) )
2005-04-15 06:23:33 +02:00
{
jsval fnval ;
2005-05-18 07:32:09 +02:00
JSBool ret = JS_GetUCProperty ( g_ScriptingHost . GetContext ( ) , g_ScriptingHost . GetGlobalObject ( ) , ExternalFunction . c_str ( ) , ExternalFunction . size ( ) , & fnval ) ;
2005-06-28 06:06:25 +02:00
debug_assert ( ret ) ;
2005-04-15 06:23:33 +02:00
JSFunction * fn = JS_ValueToFunction ( g_ScriptingHost . GetContext ( ) , fnval ) ;
if ( ! fn )
{
2006-07-13 05:29:33 +02:00
LOG ( ERROR , LOG_CATEGORY , " CEntityTemplate::LoadXML: Function does not exist for event %hs in file %s. Load failed. " , EventName . c_str ( ) , filename . c_str ( ) ) ;
2005-04-15 06:23:33 +02:00
break ;
}
m_EventHandlers [ eventID ] . SetFunction ( fn ) ;
}
else
m_EventHandlers [ eventID ] . Compile ( CStrW ( filename ) + L " :: " + EventName + L " ( " + CStrW ( Child . getLineNumber ( ) ) + L " ) " , Code ) ;
2004-10-07 21:23:35 +02:00
HasProperty ( EventName ) - > m_Inherited = false ;
break ;
}
}
2004-07-08 17:22:09 +02:00
}
2004-10-07 21:23:35 +02:00
else
2004-07-08 17:22:09 +02:00
{
2004-10-07 21:23:35 +02:00
XMLLoadProperty ( XeroFile , Child , CStrW ( ) ) ;
2004-07-08 17:22:09 +02:00
}
2004-10-07 21:23:35 +02:00
}
2006-05-14 00:11:46 +02:00
if ( m_player = = 0 )
{
m_unmodified = this ;
}
else
{
m_unmodified = g_EntityTemplateCollection . getTemplate ( m_Tag , 0 ) ;
}
2004-10-07 21:23:35 +02:00
return true ;
}
2006-07-13 05:29:33 +02:00
void CEntityTemplate : : XMLLoadProperty ( const CXeromyces & XeroFile , const XMBElement & Source , CStrW BasePropertyName )
2004-10-07 21:23:35 +02:00
{
// Add a property, put the node text into it.
CStrW PropertyName = BasePropertyName + CStr8 ( XeroFile . getElementString ( Source . getNodeName ( ) ) ) ;
2005-04-22 09:12:55 +02:00
IJSComplexProperty * Existing = HasProperty ( PropertyName ) ;
2004-10-07 21:23:35 +02:00
if ( Existing )
{
if ( ! Existing - > m_Intrinsic )
2006-07-13 05:29:33 +02:00
LOG ( WARNING , LOG_CATEGORY , " CEntityTemplate::XMLAddProperty: %ls already defined for %ls. Property trees will be merged. " , PropertyName . c_str ( ) , m_Tag . c_str ( ) ) ;
2005-03-30 18:14:19 +02:00
Existing - > Set ( this , JSParseString ( Source . getText ( ) ) ) ;
2006-07-13 00:24:25 +02:00
//Existing->m_Inherited = false;
2004-10-07 21:23:35 +02:00
}
else
{
if ( ! Source . getText ( ) . length ( ) )
2004-06-03 15:27:01 +02:00
{
2004-10-07 21:23:35 +02:00
// Arbitrarily say that if a node has no other value, define it to be 'true'.
// Appears to be the most convenient thing to do in most circumstances.
AddProperty ( PropertyName , JSVAL_TRUE ) ;
2004-07-08 17:22:09 +02:00
}
2004-10-07 21:23:35 +02:00
else
2006-02-26 10:55:20 +01:00
{
2004-10-07 21:23:35 +02:00
AddProperty ( PropertyName , Source . getText ( ) ) ;
2006-02-26 10:55:20 +01:00
}
2004-10-07 21:23:35 +02:00
}
2004-06-03 15:27:01 +02:00
2004-10-07 21:23:35 +02:00
PropertyName + = CStrW ( L " . " ) ;
2004-05-22 01:46:16 +02:00
2004-10-07 21:23:35 +02:00
// Retrieve any attributes it has and add them as subproperties.
XMBAttributeList AttributeSet = Source . getAttributes ( ) ;
for ( unsigned int AttributeID = 0 ; AttributeID < ( unsigned int ) AttributeSet . Count ; AttributeID + + )
{
XMBAttribute Attribute = AttributeSet . item ( AttributeID ) ;
CStrW AttributeName = PropertyName + CStr8 ( XeroFile . getAttributeString ( Attribute . Name ) ) ;
Existing = HasProperty ( AttributeName ) ;
2004-11-24 00:56:10 +01:00
2004-10-07 21:23:35 +02:00
if ( Existing )
{
2005-03-30 18:14:19 +02:00
Existing - > Set ( this , JSParseString ( Attribute . Value ) ) ;
2004-10-07 21:23:35 +02:00
Existing - > m_Inherited = false ;
2004-05-22 01:46:16 +02:00
}
2004-10-07 21:23:35 +02:00
else
AddProperty ( AttributeName , Attribute . Value ) ;
}
2004-05-22 01:46:16 +02:00
2004-10-07 21:23:35 +02:00
// Retrieve any child nodes the property has and, similarly, add them as subproperties.
XMBElementList NodeSet = Source . getChildNodes ( ) ;
for ( unsigned int NodeID = 0 ; NodeID < ( unsigned int ) NodeSet . Count ; NodeID + + )
{
XMBElement Node = NodeSet . item ( NodeID ) ;
XMLLoadProperty ( XeroFile , Node , PropertyName ) ;
}
}
/*
Scripting Interface
*/
// Scripting initialization
2006-07-13 05:29:33 +02:00
void CEntityTemplate : : ScriptingInit ( )
2004-10-07 21:23:35 +02:00
{
2006-07-13 05:29:33 +02:00
AddMethod < jsval , & CEntityTemplate : : ToString > ( " toString " , 0 ) ;
2006-07-13 00:24:25 +02:00
2006-07-13 05:29:33 +02:00
AddClassProperty ( L " traits.id.classes " , ( GetFn ) & CEntityTemplate : : getClassSet , ( SetFn ) & CEntityTemplate : : setClassSet ) ;
2006-07-13 00:24:25 +02:00
2006-07-13 05:29:33 +02:00
AddClassProperty ( L " actions.move.speed_curr " , & CEntityTemplate : : m_speed ) ;
AddClassProperty ( L " actions.move.turningradius " , & CEntityTemplate : : m_turningRadius ) ;
AddClassProperty ( L " actions.move.run.speed " , & CEntityTemplate : : m_runSpeed ) ;
AddClassProperty ( L " actions.move.run.rangemin " , & CEntityTemplate : : m_runMinRange ) ;
AddClassProperty ( L " actions.move.run.range " , & CEntityTemplate : : m_runMaxRange ) ;
AddClassProperty ( L " actions.move.run.regen_rate " , & CEntityTemplate : : m_runRegenRate ) ;
AddClassProperty ( L " actions.move.run.decay_rate " , & CEntityTemplate : : m_runDecayRate ) ;
AddClassProperty ( L " actions.move.pass_through_allies " , & CEntityTemplate : : m_passThroughAllies ) ;
AddClassProperty ( L " actor " , & CEntityTemplate : : m_actorName ) ;
AddClassProperty ( L " traits.health.curr " , & CEntityTemplate : : m_healthCurr ) ;
AddClassProperty ( L " traits.health.max " , & CEntityTemplate : : m_healthMax ) ;
AddClassProperty ( L " traits.health.bar_height " , & CEntityTemplate : : m_healthBarHeight ) ;
AddClassProperty ( L " traits.health.bar_size " , & CEntityTemplate : : m_healthBarSize ) ;
AddClassProperty ( L " traits.health.bar_width " , & CEntityTemplate : : m_healthBarWidth ) ;
AddClassProperty ( L " traits.health.border_height " , & CEntityTemplate : : m_healthBorderHeight ) ;
AddClassProperty ( L " traits.health.border_width " , & CEntityTemplate : : m_healthBorderWidth ) ;
AddClassProperty ( L " traits.health.border_name " , & CEntityTemplate : : m_healthBorderName ) ;
AddClassProperty ( L " traits.health.regen_rate " , & CEntityTemplate : : m_healthRegenRate ) ;
AddClassProperty ( L " traits.health.regen_start " , & CEntityTemplate : : m_healthRegenStart ) ;
AddClassProperty ( L " traits.health.decay_rate " , & CEntityTemplate : : m_healthDecayRate ) ;
AddClassProperty ( L " traits.stamina.curr " , & CEntityTemplate : : m_staminaCurr ) ;
AddClassProperty ( L " traits.stamina.max " , & CEntityTemplate : : m_staminaMax ) ;
AddClassProperty ( L " traits.stamina.bar_height " , & CEntityTemplate : : m_staminaBarHeight ) ;
AddClassProperty ( L " traits.stamina.bar_size " , & CEntityTemplate : : m_staminaBarSize ) ;
AddClassProperty ( L " traits.stamina.bar_width " , & CEntityTemplate : : m_staminaBarWidth ) ;
AddClassProperty ( L " traits.stamina.border_height " , & CEntityTemplate : : m_staminaBorderHeight ) ;
AddClassProperty ( L " traits.stamina.border_width " , & CEntityTemplate : : m_staminaBorderWidth ) ;
AddClassProperty ( L " traits.stamina.border_name " , & CEntityTemplate : : m_staminaBorderName ) ;
AddClassProperty ( L " traits.rally.name " , & CEntityTemplate : : m_rallyName ) ;
AddClassProperty ( L " traits.rally.width " , & CEntityTemplate : : m_rallyWidth ) ;
AddClassProperty ( L " traits.rally.height " , & CEntityTemplate : : m_rallyHeight ) ;
AddClassProperty ( L " traits.flank_penalty.sectors " , & CEntityTemplate : : m_sectorDivs ) ;
AddClassProperty ( L " traits.pitch.sectors " , & CEntityTemplate : : m_pitchDivs ) ;
AddClassProperty ( L " traits.rank.width " , & CEntityTemplate : : m_rankWidth ) ;
AddClassProperty ( L " traits.rank.height " , & CEntityTemplate : : m_rankHeight ) ;
AddClassProperty ( L " traits.rank.name " , & CEntityTemplate : : m_rankName ) ;
AddClassProperty ( L " traits.minimap.type " , & CEntityTemplate : : m_minimapType ) ;
AddClassProperty ( L " traits.minimap.red " , & CEntityTemplate : : m_minimapR ) ;
AddClassProperty ( L " traits.minimap.green " , & CEntityTemplate : : m_minimapG ) ;
AddClassProperty ( L " traits.minimap.blue " , & CEntityTemplate : : m_minimapB ) ;
AddClassProperty ( L " traits.anchor.type " , & CEntityTemplate : : m_anchorType ) ;
AddClassProperty ( L " traits.anchor.conformx " , & CEntityTemplate : : m_anchorConformX ) ;
AddClassProperty ( L " traits.anchor.conformz " , & CEntityTemplate : : m_anchorConformZ ) ;
AddClassProperty ( L " traits.vision.los " , & CEntityTemplate : : m_los ) ;
AddClassProperty ( L " traits.vision.permanent " , & CEntityTemplate : : m_permanent ) ;
AddClassProperty ( L " traits.is_territory_centre " , & CEntityTemplate : : m_isTerritoryCentre ) ;
AddClassProperty ( L " traits.foundation " , & CEntityTemplate : : m_foundation ) ;
AddClassProperty ( L " traits.socket " , & CEntityTemplate : : m_socket ) ;
CJSComplex < CEntityTemplate > : : ScriptingInit ( " EntityTemplate " ) ;
2004-05-22 01:46:16 +02:00
}
2004-10-07 21:23:35 +02:00
// Script-bound functions
2006-07-13 05:29:33 +02:00
JSObject * CEntityTemplate : : GetScriptExecContext ( IEventTarget * target )
2005-04-22 09:12:55 +02:00
{
return ( target - > GetScriptExecContext ( target ) ) ;
}
2006-07-13 05:29:33 +02:00
jsval CEntityTemplate : : ToString ( JSContext * cx , uintN UNUSED ( argc ) , jsval * UNUSED ( argv ) )
2004-10-07 21:23:35 +02:00
{
2004-11-07 22:30:47 +01:00
wchar_t buffer [ 256 ] ;
2006-05-14 00:11:46 +02:00
if ( m_player = = 0 )
swprintf ( buffer , 256 , L " [object EntityTemplate: %ls base] " , m_Tag . c_str ( ) ) ;
else
swprintf ( buffer , 256 , L " [object EntityTemplate: %ls for player %d] " , m_Tag . c_str ( ) , m_player - > GetPlayerID ( ) ) ;
2004-10-07 21:23:35 +02:00
buffer [ 255 ] = 0 ;
2004-11-07 22:30:47 +01:00
utf16string str16 ( buffer , buffer + wcslen ( buffer ) ) ;
return ( STRING_TO_JSVAL ( JS_NewUCStringCopyZ ( cx , str16 . c_str ( ) ) ) ) ;
}