1
0
Fork 0
mirror of https://github.com/AquariaOSE/Aquaria.git synced 2024-12-25 14:15:46 +00:00

Merge branch 'master' of /home/fg/fgone/Aquaria_fg_clean

This commit is contained in:
fgenesis 2012-03-17 17:50:20 +00:00
commit 3fb9e41349
19 changed files with 112 additions and 239 deletions

View file

@ -4664,8 +4664,6 @@ Avatar::Avatar() : Entity(), ActionMapper()
text = 0; text = 0;
burstBar = 0;
/* /*
chargeGraphic = new Particle; chargeGraphic = new Particle;
{ {
@ -9286,15 +9284,6 @@ void Avatar::onUpdate(float dt)
if (ignoreInputDelay < 0) if (ignoreInputDelay < 0)
ignoreInputDelay = 0; ignoreInputDelay = 0;
} }
if (burstBar && burstBar->alpha == 1)
{
float amount = burst;
if (amount > 1) amount = 1;
if (amount < 0) amount = 0;
burstBar->frame = (19-(amount*19));
}
//checkSpecial();
} }
//fuuugly //fuuugly

View file

@ -22,7 +22,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "../BBGE/Particles.h" #include "../BBGE/Particles.h"
#include "../BBGE/BitmapFont.h" #include "../BBGE/BitmapFont.h"
#include "../BBGE/DFSprite.h"
#include "DSQ.h" #include "DSQ.h"
#include "Hair.h" #include "Hair.h"
@ -156,7 +155,6 @@ public:
bool isCharging(); bool isCharging();
void slowToRest(); void slowToRest();
void debugMsg(const std::string &msg); void debugMsg(const std::string &msg);
DFSprite *burstBar;
void setBlind(float time); void setBlind(float time);
void onBlindTest(); void onBlindTest();

View file

@ -125,12 +125,10 @@ static void Linux_CopyTree(const char *src, const char *dst)
#endif #endif
float titTimer = 0;
const int saveSlotPageSize = 4; const int saveSlotPageSize = 4;
int maxPages = 15; int maxPages = 15;
#ifdef AQUARIA_BUILD_CONSOLE #ifdef AQUARIA_BUILD_CONSOLE
const int MAX_CONSOLELINES = 14; const int MAX_CONSOLELINES = 18;
#endif #endif
DSQ *dsq = 0; DSQ *dsq = 0;
@ -2476,7 +2474,7 @@ void DSQ::clickRingEffect(Vector pos, int type, Vector color, float ut)
} }
} }
Entity *DSQ::getEntityByName(std::string name) Entity *DSQ::getEntityByName(const std::string& name)
{ {
Entity *e = 0; Entity *e = 0;
FOR_ENTITIES(i) FOR_ENTITIES(i)
@ -4737,61 +4735,6 @@ void DSQ::playVisualEffect(int vfx, Vector position, Entity *target)
} }
} }
// get the closest, active, in range element to the vector
/*
Element *DSQ::getElementAtVector(const Vector &vec)
{
Element *returnElement = 0;
int smallestDistance = 9999;
for (int i = 0; i < elements.size(); i++)
{
if (elements[i]->isActive() && elements[i]->getTotalInteractions() > 0)
{
int distanceToElementI = elements[i]->getFakeDistanceFromCenterToVector(vec);
if (elements[i]->isVectorInActivationRange(vec) && distanceToElementI < smallestDistance)
{
smallestDistance = distanceToElementI;
returnElement = elements[i];
}
}
}
return returnElement;
}
*/
Element *DSQ::getElementWithType(Element::Type type)
{
for (int i = 0; i < elements.size(); i++)
{
if (elements[i]->getElementType() == type)
{
return elements[i];
}
}
return 0;
}
/*
Element *DSQ::getClosestElementWithType(Element::Type type, Element *e)
{
Element *returnElement = 0;
long smallestDistance = 999999;
for (int i = 0; i < elements.size(); i++)
{
if (elements[i]->isActive() && elements[i]->getElementType() == type)
{
long distanceToElementI = elements[i]->getFakeDistanceFromCenterToVector(e->position);
if (distanceToElementI < smallestDistance)
{
smallestDistance = distanceToElementI;
returnElement = elements[i];
}
}
}
return returnElement;
}
*/
void DSQ::addElement(Element *e) void DSQ::addElement(Element *e)
{ {
elements.push_back(e); elements.push_back(e);

View file

@ -1307,7 +1307,6 @@ public:
int getNumElements() const {return elements.size();} int getNumElements() const {return elements.size();}
Element *getElement(int idx) const {return elements[idx];} Element *getElement(int idx) const {return elements[idx];}
Element *getFirstElementOnLayer(int layer) const {return layer<0 || layer>15 ? 0 : firstElementOnLayer[layer];} Element *getFirstElementOnLayer(int layer) const {return layer<0 || layer>15 ? 0 : firstElementOnLayer[layer];}
Element *getElementWithType(Element::Type type);
void clearElements(); void clearElements();
// Used only by scene editor: // Used only by scene editor:
void removeElement(int idx); void removeElement(int idx);
@ -1353,7 +1352,7 @@ public:
void toggleInputMode(); void toggleInputMode();
void shakeCamera(float mag, float time); void shakeCamera(float mag, float time);
Vector avStart; Vector avStart;
Entity *getEntityByName(std::string name); Entity *getEntityByName(const std::string &name);
Entity *getEntityByNameNoCase(std::string name); Entity *getEntityByNameNoCase(std::string name);
void doSavePoint(const Vector &position); void doSavePoint(const Vector &position);

View file

@ -22,25 +22,13 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "Game.h" #include "Game.h"
#include "Avatar.h" #include "Avatar.h"
ElementActivationRange::ElementActivationRange() : radius(64), type(CIRCLE) Element::Element() : Quad()
{
}
ElementActivationRange::Type ElementActivationRange::getType()
{
return type;
}
Element::Element(Element::Type elementType) : Quad(), type(elementType)
{ {
elementFlag = EF_NONE; elementFlag = EF_NONE;
angleFromGroupCenter = distFromGroupCenter = 0;
wavyFlip = false; wavyFlip = false;
parallax = 1;
elementEffectIndex = -1; elementEffectIndex = -1;
elementActive = true; elementActive = true;
bgLayer = 0; bgLayer = 0;
dontSave = false;
wavyAngleOffset=0; wavyAngleOffset=0;
wavyMagnitude=0; wavyMagnitude=0;
@ -52,7 +40,6 @@ Element::Element(Element::Type elementType) : Quad(), type(elementType)
wavyRadius = 0; wavyRadius = 0;
wavyMin = 0; wavyMin = 0;
wavyMax = 0; wavyMax = 0;
oldRotation = 0;
templateIdx = -1; templateIdx = -1;
setStatic(true); setStatic(true);
@ -429,11 +416,6 @@ void Element::fillGrid()
} }
} }
Element::Type Element::getElementType()
{
return type;
}
// override this functionality as needed // override this functionality as needed
bool Element::canSeeAvatar(Avatar *avatar) bool Element::canSeeAvatar(Avatar *avatar)
{ {

View file

@ -25,22 +25,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
class Avatar; class Avatar;
class ElementActivationRange
{
public:
ElementActivationRange();
void isVectorInRange();
enum Type
{
CIRCLE,
RECT
};
float radius;
Type getType();
protected:
Type type;
};
enum ElementFlag enum ElementFlag
{ {
@ -61,26 +45,18 @@ enum ElementFlag
class Element : public Quad class Element : public Quad
{ {
public: public:
enum Type Element();
{
UNDEFINED,
BOX
};
Element(Type elementType);
~Element(); ~Element();
void destroy(); void destroy();
//void interact(Interaction::Type interactionType, Avatar *avatar); //void interact(Interaction::Type interactionType, Avatar *avatar);
bool canSeeAvatar(Avatar *avatar); bool canSeeAvatar(Avatar *avatar);
void update(float dt); void update(float dt);
bool isActive(); bool isActive();
Type getElementType();
//InteractionContainer interactions; //InteractionContainer interactions;
int templateIdx; int templateIdx;
int bgLayer; int bgLayer;
Element *bgLayerNext; Element *bgLayerNext;
float getSortDepth(); float getSortDepth();
bool dontSave;
void render(); void render();
//Flags elementFlags; //Flags elementFlags;
ElementFlag elementFlag; ElementFlag elementFlag;
@ -89,8 +65,6 @@ public:
int getElementEffectIndex(); int getElementEffectIndex();
void setElementEffectByIndex(int e); void setElementEffectByIndex(int e);
void setElementActive(bool v) { elementActive = v; } void setElementActive(bool v) { elementActive = v; }
float parallax;
float angleFromGroupCenter, distFromGroupCenter, oldRotation;
protected: protected:
void setGridFromWavy(); void setGridFromWavy();
float wavyAngleOffset, wavyMagnitude, wavyLerpIn; float wavyAngleOffset, wavyMagnitude, wavyLerpIn;
@ -101,10 +75,8 @@ protected:
void updateEffects(float dt); void updateEffects(float dt);
int elementEffectIndex, elementEffectType; int elementEffectIndex, elementEffectType;
bool elementActive; bool elementActive;
ElementActivationRange activationRange;
Type type;
}; };
/*
class BoxElement : public Element class BoxElement : public Element
{ {
public: public:
@ -113,6 +85,7 @@ public:
protected: protected:
int ww,hh; int ww,hh;
}; };
*/
typedef std::vector<Element*> ElementContainer; typedef std::vector<Element*> ElementContainer;

View file

@ -165,7 +165,7 @@ bool Entity::canSetBoneLock()
return true; return true;
} }
Entity::Entity() : StateMachine(), DFSprite() Entity::Entity()
{ {
addType(SCO_ENTITY); addType(SCO_ENTITY);
poison = 0.0f; poison = 0.0f;
@ -1266,7 +1266,7 @@ void Entity::update(float dt)
//skeletalSprite.setFreeze(true); //skeletalSprite.setFreeze(true);
if (frozenTimer == 0 || getState() == STATE_PUSH) if (frozenTimer == 0 || getState() == STATE_PUSH)
DFSprite::update(dt); AnimatedSprite::update(dt);
onAlwaysUpdate(dt); onAlwaysUpdate(dt);
// always, always update: // always, always update:
@ -1873,7 +1873,7 @@ void Entity::onUpdate(float dt)
} }
} }
DFSprite::onUpdate(dt); AnimatedSprite::onUpdate(dt);
Vector v = position - lastPos; Vector v = position - lastPos;
lastMove = v; lastMove = v;
@ -2971,7 +2971,7 @@ void Entity::render()
blurShader.bind(); blurShader.bind();
set = true; set = true;
} }
DFSprite::render(); AnimatedSprite::render();
//if (beautyFlip && blurShader.isLoaded() && flipScale.isInterpolating()) //if (beautyFlip && blurShader.isLoaded() && flipScale.isInterpolating())
if (set) if (set)
blurShader.unbind(); blurShader.unbind();

View file

@ -20,7 +20,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/ */
#pragma once #pragma once
#include "../BBGE/DFSprite.h" #include "../BBGE/AnimatedSprite.h"
#include "../BBGE/StateMachine.h" #include "../BBGE/StateMachine.h"
#include "../ExternalLibs/tinyxml.h" #include "../ExternalLibs/tinyxml.h"
#include "../BBGE/SkeletalSprite.h" #include "../BBGE/SkeletalSprite.h"
@ -194,7 +194,7 @@ enum BounceType
BOUNCE_REAL = 1 BOUNCE_REAL = 1
}; };
class Entity : public DFSprite, public StateMachine class Entity : public AnimatedSprite, public StateMachine
{ {
public: public:
Entity(); Entity();
@ -234,7 +234,7 @@ public:
bool canSetState(int state); bool canSetState(int state);
virtual void message(const std::string &msg, int v) {} virtual void message(const std::string &msg, int v) {}
virtual void messageVariadic(lua_State *L, int nparams) {} virtual int messageVariadic(lua_State *L, int nparams) { return 0; }
bool isUnderWater(const Vector &o=Vector()); bool isUnderWater(const Vector &o=Vector());

View file

@ -1898,7 +1898,7 @@ Element* Game::createElement(int idx, Vector position, int bgLayer, RenderObject
if (!et) if (!et)
et = this->getElementTemplateByIdx(idx); et = this->getElementTemplateByIdx(idx);
Element *element = new Element(Element::UNDEFINED); Element *element = new Element();
if (et) if (et)
{ {
element->setTexture(et->gfx); element->setTexture(et->gfx);
@ -4951,7 +4951,7 @@ bool Game::loadSceneXML(std::string scene)
saveFile->InsertEndChild(newSF); saveFile->InsertEndChild(newSF);
} }
/*
TiXmlElement *boxElement = doc.FirstChildElement("BoxElement"); TiXmlElement *boxElement = doc.FirstChildElement("BoxElement");
while (boxElement) while (boxElement)
{ {
@ -4962,7 +4962,7 @@ bool Game::loadSceneXML(std::string scene)
dsq->addElement(b); dsq->addElement(b);
boxElement = boxElement->NextSiblingElement("BoxElement"); boxElement = boxElement->NextSiblingElement("BoxElement");
} }
*/
TiXmlElement *simpleElements = doc.FirstChildElement("SE"); TiXmlElement *simpleElements = doc.FirstChildElement("SE");
while (simpleElements) while (simpleElements)
{ {
@ -5620,12 +5620,7 @@ void Game::saveScene(std::string scene)
for (i = 0; i < dsq->getNumElements(); i++) for (i = 0; i < dsq->getNumElements(); i++)
{ {
Element *e = dsq->getElement(i); Element *e = dsq->getElement(i);
if (!e->dontSave) simpleElements[e->bgLayer] << e->templateIdx << " " << int(e->position.x) << " " << int(e->position.y) << " " << int(e->rotation.z) << " " << e->scale.x << " " << e->scale.y << " " << int(e->isfh()) << " " << int(e->isfv()) << " " << e->elementFlag << " " << e->getElementEffectIndex() << " " << e->isRepeatingTextureToFill() << " ";
{
if (e->getElementType() == Element::BOX) {}
else
simpleElements[e->bgLayer] << e->templateIdx << " " << int(e->position.x) << " " << int(e->position.y) << " " << int(e->rotation.z) << " " << e->scale.x << " " << e->scale.y << " " << int(e->isfh()) << " " << int(e->isfv()) << " " << e->elementFlag << " " << e->getElementEffectIndex() << " " << e->isRepeatingTextureToFill() << " ";
}
} }
if (dsq->game->entitySaveData.size() > 0) if (dsq->game->entitySaveData.size() > 0)

View file

@ -525,8 +525,8 @@ Bone *bone(lua_State *L, int slot = 1)
static inline static inline
Path *pathFromName(lua_State *L, int slot = 1) Path *pathFromName(lua_State *L, int slot = 1)
{ {
std::string s = lua_tostring(L, slot); std::string s = getString(L, slot);
stringToLowerUserData(s); stringToLower(s);
Path *p = dsq->game->getPathByName(s); Path *p = dsq->game->getPathByName(s);
if (!p) if (!p)
{ {
@ -1568,7 +1568,7 @@ luaFunc(cureAllStatus)
luaFunc(setMusicToPlay) luaFunc(setMusicToPlay)
{ {
if (lua_isstring(L, 1)) if (lua_isstring(L, 1))
dsq->game->setMusicToPlay(lua_tostring(L, 1)); dsq->game->setMusicToPlay(getString(L, 1));
luaReturnNil(); luaReturnNil();
} }
@ -2210,8 +2210,6 @@ luaFunc(debugLog)
const char *s = lua_tostring(L, 1); const char *s = lua_tostring(L, 1);
if(s) if(s)
debugLog(s); debugLog(s);
else
scriptError("debugLog() not a string");
luaReturnStr(s); luaReturnStr(s);
} }
@ -2220,8 +2218,6 @@ luaFunc(errorLog)
const char *s = lua_tostring(L, 1); const char *s = lua_tostring(L, 1);
if(s) if(s)
errorLog(s); errorLog(s);
else
scriptError("errorLog() not a string");
luaReturnStr(s); luaReturnStr(s);
} }
@ -2256,7 +2252,7 @@ luaFunc(entity_setSegmentTexture)
RenderObject *ro = e->getSegment(lua_tonumber(L, 2)); RenderObject *ro = e->getSegment(lua_tonumber(L, 2));
if (ro) if (ro)
{ {
ro->setTexture(lua_tostring(L, 3)); ro->setTexture(getString(L, 3));
} }
} }
luaReturnNil(); luaReturnNil();
@ -2295,7 +2291,6 @@ luaFunc(entity_findNearestEntityOfType)
luaFunc(createShot) luaFunc(createShot)
{ {
std::string shotData = lua_tostring(L, 1);
Entity *e = entity(L,2); Entity *e = entity(L,2);
Entity *t = 0; Entity *t = 0;
if (lua_touserdata(L, 3) != NULL) if (lua_touserdata(L, 3) != NULL)
@ -2308,7 +2303,7 @@ luaFunc(createShot)
aim.y = lua_tonumber(L, 7); aim.y = lua_tonumber(L, 7);
s = dsq->game->fireShot(shotData, e, t, pos, aim); s = dsq->game->fireShot(getString(L, 1), e, t, pos, aim);
luaReturnPtr(s); luaReturnPtr(s);
} }
@ -2325,7 +2320,7 @@ luaFunc(entity_sound)
// so a cheap hack like this fixes it without changing older scripts. -- FG // so a cheap hack like this fixes it without changing older scripts. -- FG
if (freq >= 100) if (freq >= 100)
freq *= 0.001f; freq *= 0.001f;
e->sound(lua_tostring(L, 2), freq, lua_tonumber(L, 4)); e->sound(getString(L, 2), freq, lua_tonumber(L, 4));
} }
luaReturnNil(); luaReturnNil();
} }
@ -2337,7 +2332,7 @@ luaFunc(entity_playSfx)
if (e && !dsq->isSkippingCutscene()) if (e && !dsq->isSkippingCutscene())
{ {
PlaySfx sfx = dsq->calcPositionalSfx(e->position, lua_tonumber(L, 7)); PlaySfx sfx = dsq->calcPositionalSfx(e->position, lua_tonumber(L, 7));
sfx.name = lua_tostring(L, 2); sfx.name = getString(L, 2);
sfx.freq = lua_tonumber(L, 3); sfx.freq = lua_tonumber(L, 3);
float vol = lua_tonumber(L, 4); float vol = lua_tonumber(L, 4);
sfx.loops = lua_tonumber(L, 5); sfx.loops = lua_tonumber(L, 5);
@ -2572,7 +2567,7 @@ luaFunc(avatar_getSpellCharge)
luaFunc(jumpState) luaFunc(jumpState)
{ {
dsq->enqueueJumpState(lua_tostring(L, 1), getBool(L, 2)); dsq->enqueueJumpState(getString(L, 1), getBool(L, 2));
luaReturnNil(); luaReturnNil();
} }
@ -2855,7 +2850,7 @@ luaFunc(entity_createEntity)
Entity *e = entity(L); Entity *e = entity(L);
Entity *ret = NULL; Entity *ret = NULL;
if (e) if (e)
ret = dsq->game->createEntity(dsq->getEntityTypeIndexByName(lua_tostring(L, 2)), 0, e->position, 0, false, "", ET_ENEMY, 0, 0, true); ret = dsq->game->createEntity(dsq->getEntityTypeIndexByName(getString(L, 2)), 0, e->position, 0, false, "", ET_ENEMY, 0, 0, true);
luaReturnPtr(ret); luaReturnPtr(ret);
} }
@ -2894,8 +2889,8 @@ luaFunc(entity_isBeingPulled)
luaFunc(avatar_setPullTarget) luaFunc(avatar_setPullTarget)
{ {
Entity *e = 0; Entity *e = 0;
if (lua_tonumber(L, 1) != 0) if (lua_isuserdata(L, 1))
e = entity(L); e = entity(L, 1);
if (dsq->game->avatar->pullTarget != 0) if (dsq->game->avatar->pullTarget != 0)
dsq->game->avatar->pullTarget->stopPull(); dsq->game->avatar->pullTarget->stopPull();
@ -3241,15 +3236,10 @@ luaFunc(entity_initSkeletal)
ScriptedEntity *e = scriptedEntity(L); ScriptedEntity *e = scriptedEntity(L);
e->renderQuad = false; e->renderQuad = false;
e->setWidthHeight(128, 128); e->setWidthHeight(128, 128);
e->skeletalSprite.loadSkeletal(lua_tostring(L, 2)); e->skeletalSprite.loadSkeletal(getString(L, 2));
if (lua_isstring(L, 3)) const char *s = lua_tostring(L, 3);
{ if (s && *s)
std::string s = lua_tostring(L, 3); e->skeletalSprite.loadSkin(s);
if (!s.empty())
{
e->skeletalSprite.loadSkin(s);
}
}
luaReturnNil(); luaReturnNil();
} }
@ -3301,7 +3291,7 @@ luaFunc(entity_animate)
transition = 0; transition = 0;
else if (transition == 0) else if (transition == 0)
transition = 0.2; transition = 0.2;
ret = skel->transitionAnimate(lua_tostring(L, 2), transition, lua_tointeger(L, 3), lua_tointeger(L, 4)); ret = skel->transitionAnimate(getString(L, 2), transition, lua_tointeger(L, 3), lua_tointeger(L, 4));
} }
luaReturnNum(ret); luaReturnNum(ret);
} }
@ -3334,8 +3324,8 @@ luaFunc(spawnAroundEntity)
Entity *e = entity(L); Entity *e = entity(L);
int num = lua_tonumber(L, 2); int num = lua_tonumber(L, 2);
int radius = lua_tonumber(L, 3); int radius = lua_tonumber(L, 3);
std::string entType = lua_tostring(L, 4); std::string entType = getString(L, 4);
std::string name = lua_tostring(L, 5); std::string name = getString(L, 5);
int idx = dsq->game->getIdxForEntityType(entType); int idx = dsq->game->getIdxForEntityType(entType);
if (e) if (e)
{ {
@ -3424,7 +3414,7 @@ luaFunc(isPlat)
luaFunc(createEntity) luaFunc(createEntity)
{ {
std::string type = lua_tostring(L, 1); std::string type = getString(L, 1);
std::string name; std::string name;
if (lua_isstring(L, 2)) if (lua_isstring(L, 2))
name = lua_tostring(L, 2); name = lua_tostring(L, 2);
@ -3483,7 +3473,7 @@ luaFunc(setCameraLerpDelay)
luaFunc(setControlHint) luaFunc(setControlHint)
{ {
std::string str = lua_tostring(L, 1); std::string str = getString(L, 1);
bool left = getBool(L, 2); bool left = getBool(L, 2);
bool right = getBool(L, 3); bool right = getBool(L, 3);
bool middle = getBool(L, 4); bool middle = getBool(L, 4);
@ -3657,7 +3647,7 @@ luaFunc(getWallNormal)
luaFunc(incrFlag) luaFunc(incrFlag)
{ {
std::string f = lua_tostring(L, 1); std::string f = getString(L, 1);
int v = 1; int v = 1;
if (lua_isnumber(L, 2)) if (lua_isnumber(L, 2))
v = lua_tointeger(L, 2); v = lua_tointeger(L, 2);
@ -3667,7 +3657,7 @@ luaFunc(incrFlag)
luaFunc(decrFlag) luaFunc(decrFlag)
{ {
std::string f = lua_tostring(L, 1); std::string f = getString(L, 1);
int v = 1; int v = 1;
if (lua_isnumber(L, 2)) if (lua_isnumber(L, 2))
v = lua_tointeger(L, 2); v = lua_tointeger(L, 2);
@ -4129,7 +4119,7 @@ luaFunc(entity_initSegments)
{ {
ScriptedEntity *se = scriptedEntity(L); ScriptedEntity *se = scriptedEntity(L);
if (se) if (se)
se->initSegments(lua_tointeger(L, 2), lua_tointeger(L, 3), lua_tointeger(L, 4), lua_tostring(L, 5), lua_tostring(L, 6), lua_tointeger(L, 7), lua_tointeger(L, 8), lua_tonumber(L, 9), lua_tointeger(L, 10)); se->initSegments(lua_tointeger(L, 2), lua_tointeger(L, 3), lua_tointeger(L, 4), getString(L, 5), getString(L, 6), lua_tointeger(L, 7), lua_tointeger(L, 8), lua_tonumber(L, 9), lua_tointeger(L, 10));
luaReturnNil(); luaReturnNil();
} }
@ -4212,10 +4202,10 @@ luaFunc(entity_msg)
Entity *e = entity(L); Entity *e = entity(L);
if (e) if (e)
{ {
int top = lua_gettop(L);
// pass everything on the stack except the entity pointer // pass everything on the stack except the entity pointer
e->messageVariadic(L, top - 1); int res = e->messageVariadic(L, lua_gettop(L) - 1);
return lua_gettop(L) - top; // return everything that was pushed on our stack if (res >= 0)
return res;
} }
luaReturnNil(); luaReturnNil();
} }
@ -4304,7 +4294,7 @@ luaFunc(setNaijaHeadTexture)
Avatar *a = dsq->game->avatar; Avatar *a = dsq->game->avatar;
if (a) if (a)
{ {
a->setHeadTexture(lua_tostring(L, 1), lua_tonumber(L, 2)); a->setHeadTexture(getString(L, 1), lua_tonumber(L, 2));
} }
luaReturnNil(); luaReturnNil();
} }
@ -4459,7 +4449,7 @@ luaFunc(setupBasicEntity)
ScriptedEntity *se = scriptedEntity(L); ScriptedEntity *se = scriptedEntity(L);
//-- texture, health, manaballamount, exp, money, collideRadius, initState //-- texture, health, manaballamount, exp, money, collideRadius, initState
if (se) if (se)
se->setupBasicEntity(lua_tostring(L, 2), lua_tointeger(L, 3), lua_tointeger(L, 4), lua_tointeger(L, 5), lua_tointeger(L, 6), lua_tointeger(L, 7), lua_tointeger(L, 8), lua_tointeger(L, 9), lua_tointeger(L, 10), lua_tointeger(L, 11), lua_tointeger(L, 12), lua_tointeger(L, 13), lua_tointeger(L, 14)); se->setupBasicEntity(getString(L, 2), lua_tointeger(L, 3), lua_tointeger(L, 4), lua_tointeger(L, 5), lua_tointeger(L, 6), lua_tointeger(L, 7), lua_tointeger(L, 8), lua_tointeger(L, 9), lua_tointeger(L, 10), lua_tointeger(L, 11), lua_tointeger(L, 12), lua_tointeger(L, 13), lua_tointeger(L, 14));
luaReturnNil(); luaReturnNil();
} }
@ -4497,7 +4487,7 @@ luaFunc(entity_setDeathSound)
Entity *e = entity(L); Entity *e = entity(L);
if (e) if (e)
{ {
e->deathSound = lua_tostring(L, 2); e->deathSound = getString(L, 2);
} }
luaReturnNil(); luaReturnNil();
} }
@ -4767,7 +4757,7 @@ luaFunc(entity_getBoneByIdx)
luaFunc(entity_getBoneByName) luaFunc(entity_getBoneByName)
{ {
Entity *e = entity(L); Entity *e = entity(L);
luaReturnPtr(e ? e->skeletalSprite.getBoneByName(lua_tostring(L, 2)) : NULL); luaReturnPtr(e ? e->skeletalSprite.getBoneByName(getString(L, 2)) : NULL);
} }
luaFunc(bone_getIndex) luaFunc(bone_getIndex)
@ -4794,9 +4784,10 @@ luaFunc(bone_isName)
{ {
Bone *b = bone(L); Bone *b = bone(L);
bool v = false; bool v = false;
if (b) const char *s = lua_tostring(L, 2);
if (b && s)
{ {
v = b->name == lua_tostring(L, 2); v = b->name == s;
} }
luaReturnBool(v); luaReturnBool(v);
} }
@ -4911,7 +4902,7 @@ luaFunc(entity_setCurrentTarget)
luaFunc(setMiniMapHint) luaFunc(setMiniMapHint)
{ {
std::istringstream is(lua_tostring(L, 1)); std::istringstream is(getString(L, 1));
is >> dsq->game->miniMapHint.scene >> dsq->game->miniMapHint.warpAreaType; is >> dsq->game->miniMapHint.scene >> dsq->game->miniMapHint.warpAreaType;
dsq->game->updateMiniMapHintPosition(); dsq->game->updateMiniMapHintPosition();
@ -4920,10 +4911,10 @@ luaFunc(setMiniMapHint)
luaFunc(entityFollowEntity) luaFunc(entityFollowEntity)
{ {
Entity *e = dsq->getEntityByName(lua_tostring(L, 1)); Entity *e = dsq->getEntityByName(getString(L, 1));
if (e) if (e)
{ {
e->followEntity = dsq->getEntityByName(lua_tostring(L, 2)); e->followEntity = dsq->getEntityByName(getString(L, 2));
} }
luaReturnNil(); luaReturnNil();
@ -4967,7 +4958,7 @@ luaFunc(toggleInput)
luaFunc(warpAvatar) luaFunc(warpAvatar)
{ {
dsq->game->positionToAvatar = Vector(lua_tointeger(L, 2),lua_tointeger(L, 3)); dsq->game->positionToAvatar = Vector(lua_tointeger(L, 2),lua_tointeger(L, 3));
dsq->game->transitionToScene(lua_tostring(L, 1)); dsq->game->transitionToScene(getString(L, 1));
luaReturnNil(); luaReturnNil();
} }
@ -5165,7 +5156,7 @@ luaFunc(stopMusic)
luaFunc(playMusic) luaFunc(playMusic)
{ {
float crossfadeTime = 0.8; float crossfadeTime = 0.8;
dsq->sound->playMusic(std::string(lua_tostring(L, 1)), SLT_LOOP, SFT_CROSS, crossfadeTime); dsq->sound->playMusic(getString(L, 1), SLT_LOOP, SFT_CROSS, crossfadeTime);
luaReturnNil(); luaReturnNil();
} }
@ -5179,7 +5170,7 @@ luaFunc(playMusicStraight)
luaFunc(playMusicOnce) luaFunc(playMusicOnce)
{ {
float crossfadeTime = 0.8; float crossfadeTime = 0.8;
dsq->sound->playMusic(std::string(lua_tostring(L, 1)), SLT_NONE, SFT_CROSS, crossfadeTime); dsq->sound->playMusic(getString(L, 1), SLT_NONE, SFT_CROSS, crossfadeTime);
luaReturnNil(); luaReturnNil();
} }
@ -5618,7 +5609,7 @@ luaFunc(wait)
luaFunc(warpNaijaToEntity) luaFunc(warpNaijaToEntity)
{ {
Entity *e = dsq->getEntityByName(lua_tostring(L, 1)); Entity *e = dsq->getEntityByName(getString(L, 1));
if (e) if (e)
{ {
dsq->overlay->alpha.interpolateTo(1, 1); dsq->overlay->alpha.interpolateTo(1, 1);
@ -5914,7 +5905,7 @@ luaFunc(entity_rotateToTarget)
luaFunc(entity_partWidthHeight) luaFunc(entity_partWidthHeight)
{ {
ScriptedEntity *e = scriptedEntity(L); ScriptedEntity *e = scriptedEntity(L);
Quad *r = (Quad*)e->partMap[lua_tostring(L, 2)]; Quad *r = (Quad*)e->partMap[getString(L, 2)];
if (r) if (r)
{ {
int w = lua_tointeger(L, 3); int w = lua_tointeger(L, 3);
@ -5927,7 +5918,7 @@ luaFunc(entity_partWidthHeight)
luaFunc(entity_partSetSegs) luaFunc(entity_partSetSegs)
{ {
ScriptedEntity *e = scriptedEntity(L); ScriptedEntity *e = scriptedEntity(L);
Quad *r = (Quad*)e->partMap[lua_tostring(L, 2)]; Quad *r = (Quad*)e->partMap[getString(L, 2)];
if (r) if (r)
{ {
r->setSegs(lua_tointeger(L, 3), lua_tointeger(L, 4), lua_tonumber(L, 5), lua_tonumber(L, 6), lua_tonumber(L, 7), lua_tonumber(L, 8), lua_tonumber(L, 9), lua_tointeger(L, 10)); r->setSegs(lua_tointeger(L, 3), lua_tointeger(L, 4), lua_tonumber(L, 5), lua_tonumber(L, 6), lua_tonumber(L, 7), lua_tonumber(L, 8), lua_tonumber(L, 9), lua_tointeger(L, 10));
@ -6011,7 +6002,7 @@ luaFunc(node_setEffectOn)
Path *p = path(L, 1); Path *p = path(L, 1);
if (p) if (p)
p->setEffectOn(getBool(L, 2)); p->setEffectOn(getBool(L, 2));
luaReturnNum(0); luaReturnNil();
} }
luaFunc(node_activate) luaFunc(node_activate)
@ -6038,12 +6029,11 @@ luaFunc(node_setElementsInLayerActive)
{ {
if (e && p->isCoordinateInside(e->position)) if (e && p->isCoordinateInside(e->position))
{ {
debugLog("setting an element to the value");
e->setElementActive(v); e->setElementActive(v);
} }
} }
} }
luaReturnNum(0); luaReturnNil();
} }
luaFunc(node_getNumEntitiesIn) luaFunc(node_getNumEntitiesIn)
@ -6312,7 +6302,7 @@ luaFunc(entity_partAlpha)
ScriptedEntity *e = scriptedEntity(L); ScriptedEntity *e = scriptedEntity(L);
if (e) if (e)
{ {
RenderObject *r = e->partMap[lua_tostring(L, 2)]; RenderObject *r = e->partMap[getString(L, 2)];
if (r) if (r)
{ {
float start = lua_tonumber(L, 3); float start = lua_tonumber(L, 3);
@ -6329,7 +6319,7 @@ luaFunc(entity_partBlendType)
{ {
ScriptedEntity *e = scriptedEntity(L); ScriptedEntity *e = scriptedEntity(L);
if (e) if (e)
e->partMap[lua_tostring(L, 2)]->setBlendType(lua_tointeger(L, 3)); e->partMap[getString(L, 2)]->setBlendType(lua_tointeger(L, 3));
luaReturnInt(0); luaReturnInt(0);
} }
@ -6338,7 +6328,7 @@ luaFunc(entity_partRotate)
ScriptedEntity *e = scriptedEntity(L); ScriptedEntity *e = scriptedEntity(L);
if (e) if (e)
{ {
RenderObject *r = e->partMap[lua_tostring(L, 2)]; RenderObject *r = e->partMap[getString(L, 2)];
if (r) if (r)
{ {
r->rotation.interpolateTo(Vector(0,0,lua_tointeger(L, 3)), lua_tonumber(L, 4), lua_tointeger(L, 5), lua_tointeger(L, 6), lua_tointeger(L, 7)); r->rotation.interpolateTo(Vector(0,0,lua_tointeger(L, 3)), lua_tonumber(L, 4), lua_tointeger(L, 5), lua_tointeger(L, 6), lua_tointeger(L, 7));
@ -6405,7 +6395,7 @@ luaFunc(entity_initHair)
ScriptedEntity *se = scriptedEntity(L); ScriptedEntity *se = scriptedEntity(L);
if (se) if (se)
{ {
se->initHair(lua_tonumber(L, 2), lua_tonumber(L, 3), lua_tonumber(L, 4), lua_tostring(L, 5)); se->initHair(lua_tonumber(L, 2), lua_tonumber(L, 3), lua_tonumber(L, 4), getString(L, 5));
} }
luaReturnNil(); luaReturnNil();
} }
@ -6463,8 +6453,8 @@ luaFunc(entity_exertHairForce)
luaFunc(entity_initPart) luaFunc(entity_initPart)
{ {
std::string partName(lua_tostring(L, 2)); std::string partName(getString(L, 2));
std::string partTex(lua_tostring(L, 3)); std::string partTex(getString(L, 3));
Vector partPosition(lua_tointeger(L, 4), lua_tointeger(L, 5)); Vector partPosition(lua_tointeger(L, 4), lua_tointeger(L, 5));
int renderAfter = lua_tointeger(L, 6); int renderAfter = lua_tointeger(L, 6);
bool partFlipH = lua_tointeger(L, 7); bool partFlipH = lua_tointeger(L, 7);
@ -6612,7 +6602,7 @@ luaFunc(entity_fireGas)
int radius = lua_tointeger(L, 2); int radius = lua_tointeger(L, 2);
float life = lua_tonumber(L, 3); float life = lua_tonumber(L, 3);
float damage = lua_tonumber(L, 4); float damage = lua_tonumber(L, 4);
std::string gfx = lua_tostring(L, 5); std::string gfx = getString(L, 5);
float colorx = lua_tonumber(L, 6); float colorx = lua_tonumber(L, 6);
float colory = lua_tonumber(L, 7); float colory = lua_tonumber(L, 7);
float colorz = lua_tonumber(L, 8); float colorz = lua_tonumber(L, 8);
@ -6730,7 +6720,7 @@ luaFunc(fade3)
luaFunc(vision) luaFunc(vision)
{ {
dsq->vision(lua_tostring(L, 1), lua_tonumber(L, 2), getBool(L, 3)); dsq->vision(getString(L, 1), lua_tonumber(L, 2), getBool(L, 3));
luaReturnNil(); luaReturnNil();
} }
@ -6747,19 +6737,19 @@ luaFunc(voice)
vmod = -1; vmod = -1;
else if (vmod == -1) else if (vmod == -1)
vmod = 0; vmod = 0;
dsq->voice(lua_tostring(L, 1), vmod); dsq->voice(getString(L, 1), vmod);
luaReturnNil(); luaReturnNil();
} }
luaFunc(voiceOnce) luaFunc(voiceOnce)
{ {
dsq->voiceOnce(lua_tostring(L, 1)); dsq->voiceOnce(getString(L, 1));
luaReturnNil(); luaReturnNil();
} }
luaFunc(voiceInterupt) luaFunc(voiceInterupt)
{ {
dsq->voiceInterupt(lua_tostring(L, 1)); dsq->voiceInterupt(getString(L, 1));
luaReturnNil(); luaReturnNil();
} }
@ -9046,6 +9036,9 @@ bool Script::doCall(int nparams, int nrets)
else else
{ {
lastError = lua_tostring(L, -1); lastError = lua_tostring(L, -1);
lastError += " [";
lastError += luaFormatStackInfo(L);
lastError += "]";
lua_pop(L, 1); lua_pop(L, 1);
result = false; result = false;
} }
@ -9184,32 +9177,27 @@ bool Script::call(const char *name, void *param1, void *param2, void *param3, fl
return true; return true;
} }
bool Script::callVariadic(const char *name, lua_State *fromL, int nparams, void *param) int Script::callVariadic(const char *name, lua_State *fromL, int nparams, void *param)
{ {
// clone topmost nparams elements, they will be popped by xmove int oldtop = lua_gettop(L);
lookupFunc(name);
luaPushPointer(L, param);
// If both stacks are the same, we already pushed 2 more entries to the stack.
int pos = (L == fromL) ? -(nparams+2) : -nparams;
for (int i = 0; i < nparams; ++i) for (int i = 0; i < nparams; ++i)
lua_pushvalue(fromL, -nparams); lua_pushvalue(fromL, pos);
lookupFunc(name); // [f] // Move them to the other stack. Ignored if L == fromL.
luaPushPointer(L, param); // [f, p] lua_xmove(fromL, L, nparams);
// Move them to the other stack
lua_xmove(fromL, L, nparams); // [f, p, ...]
// Do the call // Do the call
bool success = doCall(nparams + 1, LUA_MULTRET); if (!doCall(nparams + 1, LUA_MULTRET))
return -1;
// after returning from the call, push everything that is left on the stack nparams = lua_gettop(L) - oldtop;
// (= what the function returned) back onto the caller's stack. lua_xmove(L, fromL, nparams);
if (success)
{
// clone elements again
int count = lua_gettop(L);
for (int i = 0; i < count; ++i)
lua_pushvalue(L, -count);
lua_xmove(L, fromL, count); return nparams;
}
return success;
} }

View file

@ -60,7 +60,8 @@ public:
// boolean = function(pointer, pointer, pointer, number, number, number, number, pointer) // boolean = function(pointer, pointer, pointer, number, number, number, number, pointer)
bool call(const char *name, void *param1, void *param2, void *param3, float param4, float param5, float param6, float param7, void *param8, bool *ret1); bool call(const char *name, void *param1, void *param2, void *param3, float param4, float param5, float param6, float param7, void *param8, bool *ret1);
// function(pointer, ...) - anything that is already on the stack is forwarded. Results are left on the stack. // function(pointer, ...) - anything that is already on the stack is forwarded. Results are left on the stack.
bool callVariadic(const char *name, lua_State *L, int nparams, void *param); // Returns how many values the called function returned, or -1 in case of error.
int callVariadic(const char *name, lua_State *L, int nparams, void *param);
lua_State *getLuaState() {return L;} lua_State *getLuaState() {return L;}
const std::string &getFile() {return file;} const std::string &getFile() {return file;}

View file

@ -96,14 +96,17 @@ void ScriptedEntity::message(const std::string &msg, int v)
Entity::message(msg, v); Entity::message(msg, v);
} }
void ScriptedEntity::messageVariadic(lua_State *L, int nparams) int ScriptedEntity::messageVariadic(lua_State *L, int nparams)
{ {
if (script) if (script)
{ {
if (!script->callVariadic("msg", L, nparams, this)) int res = script->callVariadic("msg", L, nparams, this);
if (res < 0)
luaDebugMsg("msg", script->getLastError()); luaDebugMsg("msg", script->getLastError());
else
return res;
} }
Entity::messageVariadic(L, nparams); return Entity::messageVariadic(L, nparams);
} }
void ScriptedEntity::warpSegments() void ScriptedEntity::warpSegments()
@ -250,7 +253,7 @@ void ScriptedEntity::setupEntity(const std::string &tex, int lcode)
this->layer = dsq->getEntityLayerToLayer(lcode); this->layer = dsq->getEntityLayerToLayer(lcode);
} }
void ScriptedEntity::setupBasicEntity(std::string texture, int health, int manaBall, int exp, int money, int collideRadius, int state, int w, int h, int expType, bool hitEntity, int updateCull, int layer) void ScriptedEntity::setupBasicEntity(const std::string& texture, int health, int manaBall, int exp, int money, int collideRadius, int state, int w, int h, int expType, bool hitEntity, int updateCull, int layer)
{ {
//this->updateCull = updateCull; //this->updateCull = updateCull;
updateCull = -1; updateCull = -1;

View file

@ -35,7 +35,7 @@ public:
void resetTimer(float t); void resetTimer(float t);
void setEntityLayer(int layer); void setEntityLayer(int layer);
void setupEntity(const std::string &tex, int layer=0); void setupEntity(const std::string &tex, int layer=0);
void setupBasicEntity(std::string texture, int health, int manaBall, int exp, int money, int collideRadius, int state, int w, int h, int expType, bool hitEntity, int updateCull, int layer); void setupBasicEntity(const std::string& texture, int health, int manaBall, int exp, int money, int collideRadius, int state, int w, int h, int expType, bool hitEntity, int updateCull, int layer);
void initHair(int numSegments, int segmentLength, int width, const std::string &tex); void initHair(int numSegments, int segmentLength, int width, const std::string &tex);
void initSegments(int numSegments, int minDist, int maxDist, std::string bodyTex, std::string tailTex, int w, int h, float taper, bool reverseSegments); void initSegments(int numSegments, int minDist, int maxDist, std::string bodyTex, std::string tailTex, int w, int h, float taper, bool reverseSegments);
void registerNewPart(RenderObject *r, const std::string &name); void registerNewPart(RenderObject *r, const std::string &name);
@ -47,7 +47,7 @@ public:
void lightFlare(); void lightFlare();
void entityDied(Entity *e); void entityDied(Entity *e);
void message(const std::string &msg, int v); void message(const std::string &msg, int v);
void messageVariadic(lua_State *L, int nparams); int messageVariadic(lua_State *L, int nparams);
static bool runningActivation; static bool runningActivation;

View file

@ -740,7 +740,7 @@ void SkeletalSprite::animate(const std::string &animation, int loop, int layer)
animLayers[layer].animate(animation, loop); animLayers[layer].animate(animation, loop);
} }
float SkeletalSprite::transitionAnimate(std::string anim, float time, int loop, int layer) float SkeletalSprite::transitionAnimate(const std::string& anim, float time, int loop, int layer)
{ {
AnimationLayer *animLayer = getAnimationLayer(layer); AnimationLayer *animLayer = getAnimationLayer(layer);
if (animLayer) if (animLayer)

View file

@ -217,7 +217,7 @@ public:
void stopAnimation(int layer=0); void stopAnimation(int layer=0);
void stopAllAnimations(); void stopAllAnimations();
float transitionAnimate(std::string anim, float time, int loop=0, int layer=0); float transitionAnimate(const std::string& anim, float time, int loop=0, int layer=0);
bool isAnimating(int layer=0); bool isAnimating(int layer=0);

View file

@ -294,7 +294,6 @@ SET(AQUARIA_SRCS
${SRCDIR}/Avatar.cpp ${SRCDIR}/Avatar.cpp
${SRCDIR}/Beam.cpp ${SRCDIR}/Beam.cpp
${SRCDIR}/BitBlotLogo.cpp ${SRCDIR}/BitBlotLogo.cpp
${SRCDIR}/BoxElement.cpp
${SRCDIR}/CollideEntity.cpp ${SRCDIR}/CollideEntity.cpp
${SRCDIR}/Continuity.cpp ${SRCDIR}/Continuity.cpp
${SRCDIR}/Credits.cpp ${SRCDIR}/Credits.cpp
@ -348,6 +347,7 @@ SET(AQUARIA_SRCS
# Apparently not used at the moment. Listed here just for completeness. # Apparently not used at the moment. Listed here just for completeness.
SET(AQUARIA_SRCS_UNUSED SET(AQUARIA_SRCS_UNUSED
${SRCDIR}/BoxElement.cpp
${SRCDIR}/BubbleRender.cpp ${SRCDIR}/BubbleRender.cpp
${SRCDIR}/FFTNotes.cpp ${SRCDIR}/FFTNotes.cpp
${SRCDIR}/StarRenderer.cpp ${SRCDIR}/StarRenderer.cpp
@ -370,10 +370,8 @@ SET(BBGE_SRCS
${BBGEDIR}/Core.cpp ${BBGEDIR}/Core.cpp
${BBGEDIR}/Cube.cpp ${BBGEDIR}/Cube.cpp
${BBGEDIR}/DarkLayer.cpp ${BBGEDIR}/DarkLayer.cpp
${BBGEDIR}/Datafile.cpp
${BBGEDIR}/DebugFont.cpp ${BBGEDIR}/DebugFont.cpp
${BBGEDIR}/DeflateCompressor.cpp ${BBGEDIR}/DeflateCompressor.cpp
${BBGEDIR}/DFSprite.cpp
${BBGEDIR}/Effects.cpp ${BBGEDIR}/Effects.cpp
${BBGEDIR}/Emitter.cpp ${BBGEDIR}/Emitter.cpp
${BBGEDIR}/Event.cpp ${BBGEDIR}/Event.cpp
@ -450,6 +448,8 @@ SET(BBGE_SRCS_UNUSED
${BBGEDIR}/BloomEffect.cpp ${BBGEDIR}/BloomEffect.cpp
${BBGEDIR}/CShim.cpp ${BBGEDIR}/CShim.cpp
${BBGEDIR}/Cutscene.cpp ${BBGEDIR}/Cutscene.cpp
${BBGEDIR}/Datafile.cpp
${BBGEDIR}/DFSprite.cpp
${BBGEDIR}/FileVars.cpp ${BBGEDIR}/FileVars.cpp
${BBGEDIR}/Light.cpp ${BBGEDIR}/Light.cpp
${BBGEDIR}/LightCone.cpp ${BBGEDIR}/LightCone.cpp

View file

@ -174,7 +174,7 @@ function hitSurface(me)
end end
function damage(me, attacker, bone, damageType, dmg) function damage(me, attacker, bone, damageType, dmg)
if v.parasite and bone_isName(bone,"Parasite") then if v.parasite and bone ~= 0 and bone_isName(bone,"Parasite") then
bone_damageFlash(bone) bone_damageFlash(bone)
v.paraHits = v.paraHits - dmg v.paraHits = v.paraHits - dmg
if v.paraHits <= 0 then if v.paraHits <= 0 then

View file

@ -123,7 +123,7 @@ function update(me, dt)
v.grabbedEnt = v.n v.grabbedEnt = v.n
entity_setState(me, STATE_TRAP) entity_setState(me, STATE_TRAP)
elseif entity_isEntityInRange(me, v.li, grabRange) then elseif v.li ~= 0 and entity_isEntityInRange(me, v.li, grabRange) then
v.grabbedEnt = v.li v.grabbedEnt = v.li
entity_setState(me, STATE_TRAP) entity_setState(me, STATE_TRAP)

View file

@ -206,11 +206,13 @@ function enterState(me)
esetv(me, EV_LOOKAT,1) esetv(me, EV_LOOKAT,1)
entity_animate(me, "idle", LOOP_INF) entity_animate(me, "idle", LOOP_INF)
entity_setMaxSpeed(me, 400) entity_setMaxSpeed(me, 400)
entity_setUpdateCull(me, 1500)
elseif entity_getState(me)==STATE_ATTACHED then elseif entity_getState(me)==STATE_ATTACHED then
entity_setEntityType(me, ET_NEUTRAL) entity_setEntityType(me, ET_NEUTRAL)
esetv(me, EV_LOOKAT,0) esetv(me, EV_LOOKAT,0)
entity_setMaxSpeed(me, 0) entity_setMaxSpeed(me, 0)
entity_setUpdateCull(me, -1)
entity_animate(me, "attached", LOOP_INF) entity_animate(me, "attached", LOOP_INF)
entity_sound(me, "Leach") entity_sound(me, "Leach")
v.attachBone = entity_getNearestBoneToPosition(entity_getTarget(me), entity_getPosition(me)) v.attachBone = entity_getNearestBoneToPosition(entity_getTarget(me), entity_getPosition(me))