resize(0);
}
+ T* operator[](size_t id)
+ {
+ return (T*)(_pool + id);
+ }
+
void clear(void)
{
_free = _pool;
_free = li;
}
- size_t size(void)
+ list_item<T>* pool(void)
{
- return _size;
+ return _pool;
}
};
_free_alloc = is_free;
}
- list_allocator<T>* get_allocator(void)
+ list_allocator<T>* allocator(void)
{
return _alloc;
}
po = reg->addParameter();
po->set(0, PARAM_STRING, "name");
- // actionRef
- reg = addTagType("actionRef");
+ // callAction
+ reg = addTagType("callAction");
po = reg->addParameter();
po->set(0, PARAM_TEXT);
+ po = reg->addParameter();
+ po->set(1, PARAM_TEXT, "target");
+
+ // callEvent
+ reg = addTagType("callEvent");
+ po = reg->addParameter();
+ po->set(0, PARAM_TEXT);
+ po = reg->addParameter();
+ po->set(1, PARAM_TEXT, "target");
// include
reg = addTagType("include");
return LML_CMDRTN_NEXT;
}
- LML_CMDFUNC(actionRef)
+ LML_CMDFUNC(callAction)
{
#ifdef DEBUG
- printf("actionRef: %s\n", param.getText(0));
+ printf("callAction: %s\n", param.getText(0));
#endif
- // local
- if (!param.obj->setActionByName(param.getText(0)))
+ LMLObject *obj;
+ if (param.has(1))
{
- // global
+ obj = param.runner->getActorObject(param.getInteger(1));
+ }
+ else
+ {
+ obj = param.obj;
+ }
+
+ if (!obj->setAction(param.getText(0)))
+ {
+ ActionParser *ap = param.runner->parser->actionContainer[param.getText(0)];
+ obj->setAction(ap);
+ }
+
+ return LML_CMDRTN_STOP | LML_CMDRTN_NEXT | LML_CMDRTN_REACTION;
+ }
+
+ LML_CMDFUNC(callEvent)
+ {
#ifdef DEBUG
- printf("search in global\n");
+ printf("callEvent: %s\n", param.getText(0));
#endif
- ActionParser *ap = param.runner->parser->actionContainer[param.getText(0)];
- param.obj->setAction(ap);
+ LMLObject *obj;
+ if (param.has(1))
+ {
+ obj = param.runner->getActorObject(param.getInteger(1));
+ }
+ else
+ {
+ obj = param.obj;
+ }
+
+ if (¶m.obj->activeActionStack == param.actionStack)
+ {
+ param.runner->callEvent(*obj, param.getText(0));
+ return LML_CMDRTN_NEXT;
}
+ obj->setEvent(param.getText(0));
+
return LML_CMDRTN_STOP | LML_CMDRTN_NEXT | LML_CMDRTN_REACTION;
}
}
// registerCommand("if", lmlCommand::rif);
registerCommand("wait", lmlCommand::wait);
registerCommand("val", lmlCommand::val);
- registerCommand("actionRef", lmlCommand::actionRef);
+ registerCommand("callAction", lmlCommand::callAction);
+ registerCommand("callEvent", lmlCommand::callEvent);
#ifdef DEBUG
printf("LiveMLRunner::LiveMLRunner() end.\n");
#endif
return result;
}
+void LiveMLRunner::callEvent(LMLObject &obj, const char *name)
+{
+ callEvent(obj, (event_type)parser->eventTypeContainer.getId(name));
+}
+
void LiveMLRunner::callEvent(LMLObject &obj, event_type id)
{
+ obj.activeEventStack.clear();
if (!obj.setEvent(id)) return;
do
return running;
}
+LMLActorObject* LiveMLRunner::getActorObject(size_t id)
+{
+ return (*_actorList.allocator())[id];
+}
+
+size_t LiveMLRunner::getActorObjectId(LMLActorObject &obj)
+{
+ return ((char*)&obj - (char*)_actorList.allocator()->pool()) / sizeof(list_item<LMLActorObject>);
+}
+
void LiveMLRunner::setMaxActors(size_t size)
{
_actorList.resize(size);
ActiveAction *aa = activeActionStack.add();
aa->action = action;
- aa->variable.numericList.allocator(variable.numericList.get_allocator());
+ aa->variable.numericList.allocator(variable.numericList.allocator());
aa->tag = action->tag;
#ifdef DEBUG
printf("LMLObject::setAction(ActionParser*) end.\n");
#endif
return true;
}
- bool setActionByName(const char *name)
+ bool setAction(const char *name)
{
#ifdef DEBUG
printf("LMLObject::setActionByName(%s)\n", name);
#endif
if (event == NULL) return false;
- activeEventStack.clear();
ActiveAction *aa = activeEventStack.add();
aa->action = (ActionParser*)event;
- aa->variable.numericList.allocator(variable.numericList.get_allocator());
+ aa->variable.numericList.allocator(variable.numericList.allocator());
aa->tag = event->tag;
#ifdef DEBUG
printf("LMLObject::setEvent(EventParser*) end.\n");
#endif
return setEvent(event);
}
+
+ bool setEvent(const char *name)
+ {
+#ifdef DEBUG
+ printf("LMLObject::setActionByName(%s)\n", name);
+#endif
+ return setEvent(parser->eventContainer[name]);
+ }
+
};
struct LMLSceneObject : public LMLObject
void setMaxActors(size_t);
LMLSceneObject* setScene(const char*);
+ LMLSceneObject* getScene(void) { return &_scene; };
LMLActorObject* addActor(const char*);
void setCurrentActor(LMLActorObject *obj) { _currentActor = obj; }
LML_CMDRTN runCommand(LMLParameter&, Tag*);
LML_CMDRTN runAction(LMLParameter&);
void callEvent(LMLObject&, event_type);
+ void callEvent(LMLObject&, const char*);
void callEvent(event_type);
bool runActiveActions(LMLObject&);
bool runObject(LMLObject&);
bool run(void);
+ LMLActorObject* getActorObject(size_t);
+ size_t getActorObjectId(LMLActorObject&);
static fixed_float variableNumericDecoder(variable_size, void*);
static const char* variableStringDecoder(variable_size, void*);
<!-- Local Actions -->
<action name="1">
<active>actor</active>
- <actionRef>g1</actionRef>
+ <callAction>g1</callAction>
</action>
<action name="2">
<print>call[action 2]</print>
- <actionRef>g2</actionRef>
+ <callAction>g2</callAction>
</action>
</scene>
- <!--Global Actions -->
- <action name="g1">
- <print>call[global action 1]</print>
- <actionRef>2</actionRef>
- </action>
- <action name="g2">
- <print>call[global action 2]</print>
- </action>
-
<actor name="actor">
<event type="init">
<print>call[init]</print>
<print>roop[actor]</print>
<wait>1</wait>
</repeat>
+ <callEvent>release</callEvent>
</action>
</actor>
-<!--
- <actor type="spritebox" name="actor1">
- <event type="init">
- <image>image1</image>
- <pos name="x" type="absolute">0</pos>
- <pos name="y" type="absolute">0</pos>
- <pos name="z" type="absolute">0</pos>
- <scale name="x" type="absolute">1</scale>
- <scale name="y" type="absolute">1</scale>
- <create type="actor" relation="child" src="render1"></create>
- <width type="absolute">100</width>
- <height type="absolute">100</height>
- </event>
- <event type="focus-on">
- </event>
- <event type="focus-off">
- </event>
- <action name="action1">
- <print>actor1 action1</print>
- </action>
- <action name="action2">
- <repeat count="5">
- <wait>1</wait>
- </repeat>
- </action>
- </actor>
-
- <actor type="render" name="render1">
- <event type="init">
- <vertex name="x" id="0" type="absolute">0</vertex>
- <vertex name="y" id="0" type="absolute">0</vertex>
- <color name="r" type="absolute">255</color>
- <color name="g" type="absolute">255</color>
- <color name="b" type="absolute">255</color>
- </event>
- <action name="action">
- <render type="2d" />
- </action>
- </actor>
--->
+ <!--Global Actions -->
+ <action name="g1">
+ <print>call[global action 1]</print>
+ <callAction>2</callAction>
+ </action>
+ <action name="g2">
+ <print>call[global action 2]</print>
+ </action>
</liveml>