Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

implemented vef object (mostly)

  • Loading branch information...
commit 6a16baf777f216794f90fbb1cf2ef0bf180db85e 1 parent 2f6f743
@AvengerTeamBG AvengerTeamBG authored
View
24 gemrb/core/GameData.cpp
@@ -41,6 +41,7 @@
#include "Spell.h"
#include "SpellMgr.h"
#include "StoreMgr.h"
+#include "VEFObject.h"
#include "Scriptable/Actor.h"
#include "System/FileStream.h"
@@ -431,6 +432,29 @@ ScriptedAnimation* GameData::GetScriptedAnimation( const char *effect, bool doub
return ret;
}
+VEFObject* GameData::GetVEFObject(const char *effect, bool doublehint)
+{
+ VEFObject *ret = NULL;
+
+ if (Exists( effect, IE_VEF_CLASS_ID, true ) ) {
+ DataStream *ds = GetResource( effect, IE_VEF_CLASS_ID );
+ ret = new VEFObject();
+ strnlwrcpy(ret->ResName, effect, 8);
+ ret->LoadVEF(ds);
+ } else {
+ if (Exists( effect, IE_2DA_CLASS_ID, true ) ) {
+ ret = new VEFObject();
+ ret->Load2DA(effect);
+ } else {
+ ScriptedAnimation *sca = GetScriptedAnimation(effect, doublehint);
+ if (sca) {
+ ret = new VEFObject(sca);
+ }
+ }
+ }
+ return ret;
+}
+
// Return single BAM frame as a sprite. Use if you want one frame only,
// otherwise it's not efficient
Sprite2D* GameData::GetBAMSprite(const ieResRef ResRef, int cycle, int frame, bool silent)
View
6 gemrb/core/GameData.h
@@ -47,8 +47,9 @@ class Palette;
class ScriptedAnimation;
class Spell;
class Sprite2D;
-class TableMgr;
class Store;
+class TableMgr;
+class VEFObject;
struct Table {
Holder<TableMgr> tm;
@@ -95,6 +96,9 @@ class GEM_EXPORT GameData : public ResourceManager
/** creates a vvc/bam animation object at point */
ScriptedAnimation* GetScriptedAnimation( const char *ResRef, bool doublehint);
+ /** creates a composite vef/2da animation */
+ VEFObject* GetVEFObject( const char *ResRef, bool doublehint);
+
/** returns a single sprite (not cached) from a BAM resource */
Sprite2D* GetBAMSprite(const ieResRef ResRef, int cycle, int frame, bool silent=false);
View
3  gemrb/core/GameScript/GSUtils.cpp
@@ -40,6 +40,7 @@
#include "StringMgr.h"
#include "TableMgr.h"
#include "TileMap.h"
+#include "VEFObject.h"
#include "Video.h"
#include "WorldMap.h"
#include "GUI/GameControl.h"
@@ -806,7 +807,7 @@ void CreateVisualEffectCore(Scriptable *Sender, const Point &position, const cha
if (vvc) {
vvc->XPos +=position.x;
vvc->YPos +=position.y;
- Sender->GetCurrentArea( )->AddVVCell( vvc );
+ Sender->GetCurrentArea( )->AddVVCell( new VEFObject(vvc) );
}
}
View
9 gemrb/core/Interface.cpp
@@ -67,6 +67,7 @@
#include "StringMgr.h"
#include "SymbolMgr.h"
#include "TileMap.h"
+#include "VEFObject.h"
#include "Video.h"
#include "WindowMgr.h"
#include "WorldMapMgr.h"
@@ -2252,6 +2253,9 @@ const char* Interface::TypeExt(SClass_ID type) const
case IE_VAR_CLASS_ID:
return "var";
+ case IE_VEF_CLASS_ID:
+ return "vef";
+
case IE_VVC_CLASS_ID:
return "vvc";
@@ -2266,6 +2270,9 @@ const char* Interface::TypeExt(SClass_ID type) const
case IE_WMP_CLASS_ID:
return "wmp";
+
+ default:
+ Log(ERROR, "Interface", "No extension associated to class ID: %lu", (unsigned long) type );
}
return NULL;
}
@@ -2769,7 +2776,7 @@ Actor *Interface::SummonCreature(const ieResRef resource, const ieResRef vvcres,
vvc->YPos=ab->Pos.y;
//force vvc to play only once
vvc->PlayOnce();
- map->AddVVCell( vvc );
+ map->AddVVCell( new VEFObject(vvc) );
//set up the summon disable effect
Effect *newfx = EffectQueue::CreateEffect(fx_summon_disable_ref, 0, 1, FX_DURATION_ABSOLUTE);
View
30 gemrb/core/Map.cpp
@@ -43,6 +43,7 @@
#include "SaveGameIterator.h"
#include "ScriptedAnimation.h"
#include "TileMap.h"
+#include "VEFObject.h"
#include "Video.h"
#include "WorldMap.h"
#include "strrefs.h"
@@ -105,7 +106,7 @@ void Map::ReleaseMemory()
}
}
-static inline AnimationObjectType SelectObject(Actor *actor, int q, AreaAnimation *a, ScriptedAnimation *sca, Particles *spark, Projectile *pro, Container *pile)
+static inline AnimationObjectType SelectObject(Actor *actor, int q, AreaAnimation *a, VEFObject *sca, Particles *spark, Projectile *pro, Container *pile)
{
int actorh;
if (actor) {
@@ -632,10 +633,12 @@ void Map::DrawPortal(InfoPoint *ip, int enable)
if (sca) {
sca->SetBlend();
sca->PlayOnce();
- sca->XPos=ip->Pos.x;
- sca->YPos=ip->Pos.y;
- sca->ZPos=gotportal;
- AddVVCell(sca);
+ //exact position, because HasVVCCell depends on the coordinates, PST had no coordinate offset anyway
+ sca->XPos = ip->Pos.x;
+ sca->YPos = ip->Pos.y;
+ //this is actually ordered by time, not by height
+ sca->ZPos = gotportal;
+ AddVVCell( new VEFObject(sca));
}
return;
}
@@ -1101,7 +1104,7 @@ ieDword Map::GetTrapCount(proIterator &iter)
//doesn't increase iterator, because we might need to erase it from the list
-ScriptedAnimation *Map::GetNextScriptedAnimation(scaIterator &iter)
+VEFObject *Map::GetNextScriptedAnimation(scaIterator &iter)
{
if (iter==vvcCells.end()) {
return NULL;
@@ -1172,7 +1175,7 @@ void Map::DrawMap(Region screen)
Container *pile = GetNextPile(pileidx);
AreaAnimation *a = GetNextAreaAnimation(aniidx, gametime);
- ScriptedAnimation *sca = GetNextScriptedAnimation(scaidx);
+ VEFObject *sca = GetNextScriptedAnimation(scaidx);
Projectile *pro = GetNextProjectile(proidx);
Particles *spark = GetNextSpark(spaidx);
@@ -2162,16 +2165,21 @@ ieDword Map::HasVVCCell(const ieResRef resource, const Point &p)
if ((*iter)->YPos!=p.y) continue;
}
if (strnicmp(resource, (*iter)->ResName, sizeof(ieResRef) )) continue;
- ieDword tmp = (*iter)->GetSequenceDuration(AI_UPDATE_TIME)-(*iter)->GetCurrentFrame();
- if (tmp>ret) {
- ret = tmp;
+ ScriptedAnimation *sca = (*iter)->GetSingleObject();
+ if (sca) {
+ ieDword tmp = sca->GetSequenceDuration(AI_UPDATE_TIME)-sca->GetCurrentFrame();
+ if (tmp>ret) {
+ ret = tmp;
+ }
+ } else {
+ ret = 1;
}
}
return ret;
}
//adding videocell in order, based on its height parameter
-void Map::AddVVCell(ScriptedAnimation* vvc)
+void Map::AddVVCell(VEFObject* vvc)
{
scaIterator iter;
View
9 gemrb/core/Map.h
@@ -46,6 +46,7 @@ class Projectile;
class ScriptedAnimation;
class SpriteCover;
class TileMap;
+class VEFObject;
class Wall_Polygon;
//distance of actors from spawn point
@@ -241,7 +242,7 @@ enum AnimationObjectType {AOT_AREA, AOT_SCRIPTED, AOT_ACTOR, AOT_SPARK, AOT_PROJ
#define PR_IGNORE 2
typedef std::list<AreaAnimation*>::iterator aniIterator;
-typedef std::list<ScriptedAnimation*>::iterator scaIterator;
+typedef std::list<VEFObject*>::iterator scaIterator;
typedef std::list<Projectile*>::iterator proIterator;
typedef std::list<Particles*>::iterator spaIterator;
@@ -280,7 +281,7 @@ class GEM_EXPORT Map : public Scriptable {
std::vector< Actor*> actors;
Wall_Polygon **Walls;
unsigned int WallCount;
- std::list< ScriptedAnimation*> vvcCells;
+ std::list< VEFObject*> vvcCells;
std::list< Projectile*> projectiles;
std::list< Particles*> particles;
std::vector< Entrance*> entrances;
@@ -397,7 +398,7 @@ class GEM_EXPORT Map : public Scriptable {
//returns the duration of a VVC cell set in the area (point may be set to empty)
ieDword HasVVCCell(const ieResRef resource, const Point &p);
- void AddVVCell(ScriptedAnimation* vvc);
+ void AddVVCell(VEFObject* vvc);
bool CanFree();
int GetCursor( const Point &p);
//adds a sparkle puff of colour to a point in the area
@@ -508,7 +509,7 @@ class GEM_EXPORT Map : public Scriptable {
private:
AreaAnimation *GetNextAreaAnimation(aniIterator &iter, ieDword gametime);
Particles *GetNextSpark(spaIterator &iter);
- ScriptedAnimation *GetNextScriptedAnimation(scaIterator &iter);
+ VEFObject *GetNextScriptedAnimation(scaIterator &iter);
Actor *GetNextActor(int &q, int &index);
Container *GetNextPile (int &index) const;
void DrawPile (Region screen, int pileidx);
View
20 gemrb/core/Projectile.cpp
@@ -30,9 +30,10 @@
#include "Image.h"
#include "Interface.h"
#include "ProjectileServer.h"
-#include "Scriptable/Actor.h"
#include "Sprite2D.h"
+#include "VEFObject.h"
#include "Video.h"
+#include "Scriptable/Actor.h"
#include <cmath>
#include <cstdlib>
@@ -757,10 +758,19 @@ void Projectile::EndTravel()
}
}
+//Note: trails couldn't be higher than VVC, but this shouldn't be a problem
int Projectile::AddTrail(ieResRef BAM, const ieByte *pal)
{
- ScriptedAnimation *sca=gamedata->GetScriptedAnimation(BAM,0);
+/*
+ VEFObject *vef=gamedata->GetVEFObject(BAM,0);
+ if (!vef) return 0;
+ ScriptedAnimation *sca=vef->GetSingleObject();
if (!sca) return 0;
+*/
+ ScriptedAnimation* sca=gamedata->GetScriptedAnimation(BAM,0);
+ if (!sca) return 0;
+ VEFObject *vef = new VEFObject(sca);
+
if(pal) {
if (ExtFlags & PEF_TINT) {
Color tmpColor[PALSIZE];
@@ -779,7 +789,7 @@ int Projectile::AddTrail(ieResRef BAM, const ieByte *pal)
sca->SetBlend();
sca->XPos += Pos.x;
sca->YPos += Pos.y;
- area->AddVVCell(sca);
+ area->AddVVCell(vef);
return sca->GetSequenceDuration(AI_UPDATE_TIME);
}
@@ -1407,6 +1417,7 @@ void Projectile::DrawExplosion(const Region &screen)
if (phase==P_EXPLODING1) {
core->GetAudioDrv()->Play(Extension->SoundRes, Pos.x, Pos.y);
//play VVC in center
+ //FIXME: make it possible to play VEF too?
if (aoeflags&PAF_VVC) {
ScriptedAnimation* vvc = gamedata->GetScriptedAnimation(Extension->VVCRes, false);
if (vvc) {
@@ -1430,7 +1441,8 @@ void Projectile::DrawExplosion(const Region &screen)
vvc->YPos+=Pos.y;
vvc->PlayOnce();
vvc->SetBlend();
- area->AddVVCell(vvc);
+ //quick hack to use the single object envelope
+ area->AddVVCell(new VEFObject(vvc));
}
}
View
119 gemrb/core/VEFObject.cpp
@@ -24,6 +24,8 @@
#include "win32def.h"
+#define YESNO(x) ( (x)?"Yes":"No")
+
#include "Game.h"
#include "GameData.h"
#include "Interface.h"
@@ -34,6 +36,44 @@
namespace GemRB {
+VEFObject::VEFObject()
+{
+ XPos=0;
+ YPos=0;
+ ZPos=0;
+ ResName[0]=0;
+ SingleObject=false;
+ Blend=false;
+ PlayOne=false;
+}
+
+VEFObject::VEFObject(ScriptedAnimation *sca)
+{
+ if (!sca) return; //wtf, should avoid this
+
+ XPos=sca->XPos;
+ YPos=sca->YPos;
+ ZPos=sca->ZPos; //sometimes this is not an actual ZPos - PST portals, don't use it for rendering?
+ ResName[0]=0;
+ SingleObject=true;
+ //Blend=false;
+ //PlayOne=false;
+ ScheduleEntry entry;
+ entry.start = core->GetGame()->GameTime;
+ if (sca->Duration==0xffffffff) entry.length = 0xffffffff;
+ else entry.length = sca->Duration+entry.start;
+ entry.offset = Point(0,0);
+ entry.type = VEF_VVC;
+ entry.ptr = sca;
+ memcpy(entry.resourceName, sca->ResName, sizeof(ieResRef) );
+ entries.push_back(entry);
+}
+
+VEFObject::~VEFObject()
+{
+ Init();
+}
+
void VEFObject::Init()
{
std::list<ScheduleEntry>::iterator iter;
@@ -54,7 +94,7 @@ void VEFObject::Init()
}
}
-void VEFObject::AddEntry(ieResRef res, ieDword st, ieDword len, Point pos, ieDword type, ieDword gtime)
+void VEFObject::AddEntry(const ieResRef res, ieDword st, ieDword len, Point pos, ieDword type, ieDword gtime)
{
ScheduleEntry entry;
@@ -68,7 +108,7 @@ void VEFObject::AddEntry(ieResRef res, ieDword st, ieDword len, Point pos, ieDwo
entries.push_back(entry);
}
-ScriptedAnimation *VEFObject::CreateCell(ieResRef res, ieDword start, ieDword end)
+ScriptedAnimation *VEFObject::CreateCell(const ieResRef res, ieDword start, ieDword end)
{
ScriptedAnimation *sca = gamedata->GetScriptedAnimation( res, false);
if (sca && end!=0xffffffff) {
@@ -77,7 +117,7 @@ ScriptedAnimation *VEFObject::CreateCell(ieResRef res, ieDword start, ieDword en
return sca;
}
-VEFObject *VEFObject::CreateObject(ieResRef res, SClass_ID id)
+VEFObject *VEFObject::CreateObject(const ieResRef res, SClass_ID id)
{
if (gamedata->Exists( res, id, true) ) {
VEFObject *obj = new VEFObject();
@@ -86,6 +126,7 @@ VEFObject *VEFObject::CreateObject(ieResRef res, SClass_ID id)
obj->Load2DA(res);
} else {
DataStream* stream = gamedata->GetResource(res, id);
+ strnlwrcpy(obj->ResName, res, 8);
obj->LoadVEF(stream);
}
return obj;
@@ -117,10 +158,15 @@ bool VEFObject::Draw(const Region &screen, Point &position, const Color &p_tint,
switch((*iter).type) {
case VEF_2DA: //original gemrb implementation of composite video effects
(*iter).ptr = CreateObject( (*iter).resourceName, IE_2DA_CLASS_ID);
- break;
+ if ( (*iter).ptr ) {
+ break;
+ }
+ //fall back to VEF
case VEF_VEF: //vanilla engine implementation of composite video effects
(*iter).ptr = CreateObject( (*iter).resourceName, IE_VEF_CLASS_ID);
- if ( (*iter).ptr ) break;
+ if ( (*iter).ptr ) {
+ break;
+ }
//fall back to BAM or VVC
case VEF_BAM: //just a BAM
case VEF_VVC: //videocell (can contain a BAM)
@@ -153,7 +199,7 @@ bool VEFObject::Draw(const Region &screen, Point &position, const Color &p_tint,
return ret;
}
-void VEFObject::Load2DA(ieResRef resource)
+void VEFObject::Load2DA(const ieResRef resource)
{
Init();
AutoTable tab(resource);
@@ -161,6 +207,8 @@ void VEFObject::Load2DA(ieResRef resource)
if (!tab) {
return;
}
+ SingleObject = false;
+ strnlwrcpy(ResName, resource, 8);
ieDword GameTime = core->GetGame()->GameTime;
int rows = tab->GetRowCount();
while(rows--) {
@@ -215,10 +263,11 @@ void VEFObject::LoadVEF(DataStream *stream)
stream->ReadResRef( Signature);
if (strncmp( Signature, "VEF V1.0", 8 ) != 0) {
- print("Not a valid VEF File");
+ Log(ERROR, "VEFObject", "Not a valid VEF File: %s", ResName);
delete stream;
return;
}
+ SingleObject = false;
stream->ReadDword( &offset1);
stream->ReadDword( &count1);
stream->ReadDword( &offset2);
@@ -234,4 +283,60 @@ void VEFObject::LoadVEF(DataStream *stream)
ReadEntry(stream);
}
}
+
+/*
+void VEFObject::SetBlend()
+{
+ Blend=true;
+}
+
+void VEFObject::PlayOnce()
+{
+ PlayOne=true;
+}
+*/
+//works only with single objects
+/*
+ieDword VEFObject::GetSequenceDuration(ieDword multiplier)
+{
+ std::list<ScheduleEntry>::iterator iter;
+
+ for(iter=entries.begin();iter!=entries.end();iter++) {
+ if ( (*iter).type==VEF_VVC || (*iter).type==VEF_BAM ) {
+ ScriptedAnimation *sca = (ScriptedAnimation *) (*iter).ptr;
+ if (sca) return sca->GetSequenceDuration(multiplier);
+ }
+ }
+ return 0;
+}
+
+ieDword VEFObject::GetCurrentFrame()
+{
+ std::list<ScheduleEntry>::iterator iter;
+
+ for(iter=entries.begin();iter!=entries.end();iter++) {
+ if ( (*iter).type==VEF_VVC || (*iter).type==VEF_BAM ) {
+ ScriptedAnimation *sca = (ScriptedAnimation *) (*iter).ptr;
+ if (sca) return sca->GetCurrentFrame();
+ }
+ }
+ return 0;
+}
+*/
+
+ScriptedAnimation *VEFObject::GetSingleObject()
+{
+ ScriptedAnimation *sca = NULL;
+
+ if (SingleObject) {
+ std::list<ScheduleEntry>::iterator iter = entries.begin();
+ if (iter!=entries.end() ) {
+ if ( (*iter).type==VEF_VVC || (*iter).type==VEF_BAM ) {
+ sca = (ScriptedAnimation *) (*iter).ptr;
+ }
+ }
+ }
+ return sca;
+}
+
}
View
22 gemrb/core/VEFObject.h
@@ -45,22 +45,36 @@ struct ScheduleEntry {
};
class GEM_EXPORT VEFObject {
+public:
+ ieResRef ResName;
+ int XPos, YPos, ZPos;
+ bool Blend;
+ bool PlayOne;
+ VEFObject();
+ VEFObject(ScriptedAnimation *sca);
+ ~VEFObject();
private:
std::list<ScheduleEntry> entries;
+ bool SingleObject;
public:
//adds a new entry (use when loading)
- void AddEntry(ieResRef res, ieDword st, ieDword len, Point pos, ieDword type, ieDword gtime);
+ void AddEntry(const ieResRef res, ieDword st, ieDword len, Point pos, ieDword type, ieDword gtime);
//renders the object
bool Draw(const Region &screen, Point &position, const Color &p_tint, Map *area, int dither, int orientation, int height);
- void Load2DA(ieResRef resource);
+ void Load2DA(const ieResRef resource);
void LoadVEF(DataStream *stream);
+ //void SetBlend();
+ //void PlayOnce();
+ //ieDword GetSequenceDuration(ieDword multiplier);
+ //ieDword GetCurrentFrame();
+ ScriptedAnimation *GetSingleObject();
private:
//clears the schedule, used internally
void Init();
//load a 2DA/VEF resource into the object
- VEFObject *CreateObject(ieResRef res, SClass_ID id);
+ VEFObject *CreateObject(const ieResRef res, SClass_ID id);
//load a BAM/VVC resource into the object
- ScriptedAnimation *CreateCell(ieResRef res, ieDword start, ieDword end);
+ ScriptedAnimation *CreateCell(const ieResRef res, ieDword start, ieDword end);
//load a single entry from stream
void ReadEntry(DataStream *stream);
};
View
11 gemrb/plugins/FXOpcodes/FXOpcodes.cpp
@@ -36,6 +36,7 @@
#include "ScriptedAnimation.h"
#include "Spell.h" //needed for fx_cast_spell feedback
#include "TileMap.h" //needs for knock!
+#include "VEFObject.h"
#include "damages.h"
#include "GameScript/GSUtils.h" //needs for MoveBetweenAreasCore
#include "GameScript/Matching.h" //needs for GetAllObjects
@@ -2565,7 +2566,7 @@ int fx_unsummon_creature (Scriptable* /*Owner*/, Actor* target, Effect* fx)
if (sca) {
sca->XPos+=target->Pos.x;
sca->YPos+=target->Pos.y;
- area->AddVVCell(sca);
+ area->AddVVCell(new VEFObject(sca));
}
//remove the creature
target->DestroySelf();
@@ -4128,7 +4129,7 @@ int fx_casting_glow (Scriptable* Owner, Actor* target, Effect* fx)
} else {
sca->SetDefaultDuration(10000);
}
- map->AddVVCell(sca);
+ map->AddVVCell(new VEFObject(sca));
} else {
//simulate sparkle casting glows
Effect *newfx;
@@ -4175,7 +4176,7 @@ int fx_visual_spell_hit (Scriptable* /*Owner*/, Actor* target, Effect* fx)
}
sca->SetBlend();
sca->PlayOnce();
- map->AddVVCell(sca);
+ map->AddVVCell( new VEFObject(sca));
} else {
print("fx_visual_spell_hit: Unhandled Type: %d", fx->Parameter2);
}
@@ -5076,7 +5077,7 @@ Actor *GetFamiliar(Scriptable *Owner, Actor *target, Effect *fx, ieResRef resour
vvc->YPos=fam->Pos.y;
//force vvc to play only once
vvc->PlayOnce();
- map->AddVVCell( vvc );
+ map->AddVVCell( new VEFObject(vvc) );
}
}
@@ -5546,7 +5547,7 @@ int fx_play_visual_effect (Scriptable* /*Owner*/, Actor* target, Effect* fx)
sca->YPos = target->Pos.y;
}
sca->PlayOnce();
- map->AddVVCell( sca );
+ map->AddVVCell( new VEFObject(sca) );
return FX_NOT_APPLIED;
}
View
13 gemrb/plugins/PSTOpcodes/PSTOpcodes.cpp
@@ -29,6 +29,7 @@
#include "Map.h"
#include "TableMgr.h"
#include "TileMap.h"
+#include "VEFObject.h"
#include "Video.h" //for tints
#include "Scriptable/Actor.h"
@@ -207,7 +208,7 @@ int fx_play_bam_blended (Scriptable* Owner, Actor* target, Effect* fx)
if (fx->Parameter2&2) {
sca->XPos+=fx->PosX;
sca->YPos+=fx->PosY;
- area->AddVVCell(sca);
+ area->AddVVCell( new VEFObject(sca));
} else {
ScriptedAnimation *twin = sca->DetachTwin();
if (twin) {
@@ -327,9 +328,9 @@ int fx_play_bam_not_blended (Scriptable* Owner, Actor* target, Effect* fx)
if (twin) {
twin->XPos+=fx->PosX-x;
twin->YPos+=fx->PosY+twin->ZPos-y;
- area->AddVVCell(twin);
+ area->AddVVCell( new VEFObject(twin) );
}
- area->AddVVCell(sca);
+ area->AddVVCell( new VEFObject(sca) );
}
return FX_NOT_APPLIED;
}
@@ -461,6 +462,11 @@ int fx_multiple_vvc (Scriptable* Owner, Actor* /*target*/, Effect* fx)
if (!area)
return FX_NOT_APPLIED;
+ VEFObject *vef = gamedata->GetVEFObject(fx->Resource, true);
+ if (vef) {
+ area->AddVVCell(vef);
+ }
+/*
AutoTable tab(fx->Resource);
if (!tab)
return FX_NOT_APPLIED;
@@ -483,6 +489,7 @@ int fx_multiple_vvc (Scriptable* Owner, Actor* /*target*/, Effect* fx)
sca->YPos+=fx->PosY+offset.y;
area->AddVVCell(sca);
}
+*/
return FX_NOT_APPLIED;
}
Please sign in to comment.
Something went wrong with that request. Please try again.