mirror of
https://github.com/AquariaOSE/Aquaria.git
synced 2025-02-09 13:24:01 +00:00
Add support for below-maxspeed shots
The game used to unconditionally enforce shots to go at close to their max speed; it is now possible to turn that behavior off if needed: In a shot txt file, set AlwaysMaxSpeed = 0 New Lua functions: + shot_setAlwaysMaxSpeed() + shot_isAlwaysMaxSpeed
This commit is contained in:
parent
cc1530b5e5
commit
0469ab8dfb
3 changed files with 65 additions and 50 deletions
|
@ -2614,6 +2614,19 @@ luaFunc(shot_canHitEntity)
|
||||||
luaReturnBool(hit);
|
luaReturnBool(hit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
luaFunc(shot_setAlwaysMaxSpeed)
|
||||||
|
{
|
||||||
|
if(Shot *shot = getShot(L))
|
||||||
|
shot->alwaysMaxSpeed = getBool(L, 2);
|
||||||
|
luaReturnNil();
|
||||||
|
}
|
||||||
|
|
||||||
|
luaFunc(shot_isAlwaysMaxSpeed)
|
||||||
|
{
|
||||||
|
Shot *shot = getShot(L);
|
||||||
|
luaReturnBool(shot && shot->alwaysMaxSpeed);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
typedef std::pair<Shot*, float> ShotDistancePair;
|
typedef std::pair<Shot*, float> ShotDistancePair;
|
||||||
static std::vector<ShotDistancePair> filteredShots(20);
|
static std::vector<ShotDistancePair> filteredShots(20);
|
||||||
|
@ -10602,6 +10615,8 @@ static const struct {
|
||||||
luaRegister(shot_setTargetPoint),
|
luaRegister(shot_setTargetPoint),
|
||||||
luaRegister(shot_getTargetPoint),
|
luaRegister(shot_getTargetPoint),
|
||||||
luaRegister(shot_canHitEntity),
|
luaRegister(shot_canHitEntity),
|
||||||
|
luaRegister(shot_setAlwaysMaxSpeed),
|
||||||
|
luaRegister(shot_isAlwaysMaxSpeed),
|
||||||
luaRegister(filterNearestShots),
|
luaRegister(filterNearestShots),
|
||||||
luaRegister(filterNearestShotsAdd),
|
luaRegister(filterNearestShotsAdd),
|
||||||
luaRegister(getNextFilteredShot),
|
luaRegister(getNextFilteredShot),
|
||||||
|
|
|
@ -67,6 +67,7 @@ ShotData::ShotData()
|
||||||
rotateToVel = 1;
|
rotateToVel = 1;
|
||||||
waveSpeed = waveMag = 0;
|
waveSpeed = waveMag = 0;
|
||||||
ignoreShield = false;
|
ignoreShield = false;
|
||||||
|
alwaysMaxSpeed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T> void readEquals2(T &in)
|
template <typename T> void readEquals2(T &in)
|
||||||
|
@ -246,6 +247,8 @@ void ShotData::bankLoad(const std::string &file, const std::string &path)
|
||||||
inf >> ignoreShield;
|
inf >> ignoreShield;
|
||||||
else if (token == "DieOnKill")
|
else if (token == "DieOnKill")
|
||||||
inf >> dieOnKill;
|
inf >> dieOnKill;
|
||||||
|
else if (token == "AlwaysMaxSpeed")
|
||||||
|
inf >> alwaysMaxSpeed;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// if having weirdness, check for these
|
// if having weirdness, check for these
|
||||||
|
@ -353,54 +356,54 @@ void Shot::loadBankShot(const std::string &ident, Shot *setter)
|
||||||
std::string id = ident;
|
std::string id = ident;
|
||||||
stringToLower(id);
|
stringToLower(id);
|
||||||
|
|
||||||
setter->applyShotData(&shotBank[id]);
|
ShotBank::const_iterator it = shotBank.find(id);
|
||||||
|
if(it != shotBank.end())
|
||||||
|
setter->applyShotData(it->second);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Shot::applyShotData(ShotData *shotData)
|
void Shot::applyShotData(const ShotData& shotData)
|
||||||
{
|
{
|
||||||
if (shotData)
|
this->shotData = &shotData;
|
||||||
|
this->setBlendType(shotData.blendType);
|
||||||
|
this->homingness = shotData.homing;
|
||||||
|
this->maxSpeed = shotData.maxSpeed;
|
||||||
|
this->setTexture(shotData.texture);
|
||||||
|
this->scale = shotData.scale;
|
||||||
|
this->lifeTime = shotData.lifeTime;
|
||||||
|
this->collideRadius = shotData.collideRadius;
|
||||||
|
this->renderQuad = !shotData.invisible;
|
||||||
|
this->gravity = shotData.gravity;
|
||||||
|
this->damageType = shotData.damageType;
|
||||||
|
this->checkDamageTarget = shotData.checkDamageTarget;
|
||||||
|
this->alwaysMaxSpeed = shotData.alwaysMaxSpeed;
|
||||||
|
if (!shotData.trailPrt.empty())
|
||||||
{
|
{
|
||||||
this->shotData = shotData;
|
setParticleEffect(shotData.trailPrt);
|
||||||
this->setBlendType(shotData->blendType);
|
|
||||||
this->homingness = shotData->homing;
|
|
||||||
this->maxSpeed = shotData->maxSpeed;
|
|
||||||
this->setTexture(shotData->texture);
|
|
||||||
this->scale = shotData->scale;
|
|
||||||
this->lifeTime = shotData->lifeTime;
|
|
||||||
this->collideRadius = shotData->collideRadius;
|
|
||||||
this->renderQuad = !shotData->invisible;
|
|
||||||
this->gravity = shotData->gravity;
|
|
||||||
this->damageType = shotData->damageType;
|
|
||||||
this->checkDamageTarget = shotData->checkDamageTarget;
|
|
||||||
if (!shotData->trailPrt.empty())
|
|
||||||
{
|
|
||||||
setParticleEffect(shotData->trailPrt);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (shotData->numSegs > 0)
|
|
||||||
{
|
|
||||||
segments.resize(shotData->numSegs);
|
|
||||||
for (int i = segments.size()-1; i >=0 ; i--)
|
|
||||||
{
|
|
||||||
Quad *flame = new Quad;
|
|
||||||
flame->setTexture(shotData->segTexture);
|
|
||||||
flame->scale = shotData->segScale - Vector(shotData->segTaper, shotData->segTaper)*(i);
|
|
||||||
flame->setBlendType(this->getBlendType());
|
|
||||||
flame->alpha = 0.5;
|
|
||||||
dsq->game->addRenderObject(flame, LR_PARTICLES);
|
|
||||||
segments[i] = flame;
|
|
||||||
segments[i]->position = position;
|
|
||||||
}
|
|
||||||
|
|
||||||
maxDist = shotData->segDist;
|
|
||||||
minDist = 0;
|
|
||||||
|
|
||||||
initSegments(position);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string scriptname = "shot_" + shotData->name;
|
if (shotData.numSegs > 0)
|
||||||
|
{
|
||||||
|
segments.resize(shotData.numSegs);
|
||||||
|
for (int i = segments.size()-1; i >=0 ; i--)
|
||||||
|
{
|
||||||
|
Quad *flame = new Quad;
|
||||||
|
flame->setTexture(shotData.segTexture);
|
||||||
|
flame->scale = shotData.segScale - Vector(shotData.segTaper, shotData.segTaper)*(i);
|
||||||
|
flame->setBlendType(this->getBlendType());
|
||||||
|
flame->alpha = 0.5;
|
||||||
|
dsq->game->addRenderObject(flame, LR_PARTICLES);
|
||||||
|
segments[i] = flame;
|
||||||
|
segments[i]->position = position;
|
||||||
|
}
|
||||||
|
|
||||||
|
maxDist = shotData.segDist;
|
||||||
|
minDist = 0;
|
||||||
|
|
||||||
|
initSegments(position);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string scriptname = "shot_" + shotData.name;
|
||||||
std::string file = ScriptInterface::MakeScriptFileName(scriptname, "shots");
|
std::string file = ScriptInterface::MakeScriptFileName(scriptname, "shots");
|
||||||
script = dsq->scriptInterface.openScript(file, true);
|
script = dsq->scriptInterface.openScript(file, true);
|
||||||
updateScript = !!script;
|
updateScript = !!script;
|
||||||
|
@ -750,13 +753,9 @@ void Shot::onUpdate(float dt)
|
||||||
else if (target->alpha == 0)
|
else if (target->alpha == 0)
|
||||||
target = 0;
|
target = 0;
|
||||||
}
|
}
|
||||||
if (life >= 1.0f)
|
if (alwaysMaxSpeed && life >= 1.0f)
|
||||||
{
|
{
|
||||||
if (velocity.isZero())
|
if (!velocity.isZero() && velocity.isLength2DIn(maxSpeed*0.75f))
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
else if (velocity.isLength2DIn(maxSpeed*0.75f))
|
|
||||||
{
|
{
|
||||||
velocity.setLength2D(maxSpeed);
|
velocity.setLength2D(maxSpeed);
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,7 +63,7 @@ struct ShotData
|
||||||
float waveSpeed, waveMag;
|
float waveSpeed, waveMag;
|
||||||
|
|
||||||
float spinSpeed;
|
float spinSpeed;
|
||||||
bool invisible, checkDamageTarget, hitWalls, hitEnts, alwaysDoHitEffects;
|
bool invisible, checkDamageTarget, hitWalls, hitEnts, alwaysDoHitEffects, alwaysMaxSpeed;
|
||||||
float rotIncr;
|
float rotIncr;
|
||||||
|
|
||||||
float avatarKickBack, avatarKickBackTime;
|
float avatarKickBack, avatarKickBackTime;
|
||||||
|
@ -108,7 +108,7 @@ public:
|
||||||
static void clearShotBank();
|
static void clearShotBank();
|
||||||
static ShotData* getShotData(const std::string &ident);
|
static ShotData* getShotData(const std::string &ident);
|
||||||
static void loadBankShot(const std::string &ident, Shot *shot);
|
static void loadBankShot(const std::string &ident, Shot *shot);
|
||||||
void applyShotData(ShotData *shotData);
|
void applyShotData(const ShotData& shotData);
|
||||||
|
|
||||||
void setAimVector(const Vector &aim);
|
void setAimVector(const Vector &aim);
|
||||||
void setTarget(Entity *target);
|
void setTarget(Entity *target);
|
||||||
|
@ -116,7 +116,7 @@ public:
|
||||||
float getDamage() const;
|
float getDamage() const;
|
||||||
int getCollideRadius() const;
|
int getCollideRadius() const;
|
||||||
DamageType getDamageType() const;
|
DamageType getDamageType() const;
|
||||||
ShotData *shotData;
|
const ShotData *shotData;
|
||||||
void updatePosition();
|
void updatePosition();
|
||||||
bool isHitEnts() const;
|
bool isHitEnts() const;
|
||||||
bool canHit(Entity *e, Bone *b);
|
bool canHit(Entity *e, Bone *b);
|
||||||
|
@ -129,6 +129,7 @@ public:
|
||||||
float lifeTime;
|
float lifeTime;
|
||||||
DamageType damageType;
|
DamageType damageType;
|
||||||
bool checkDamageTarget;
|
bool checkDamageTarget;
|
||||||
|
bool alwaysMaxSpeed;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue