From: Laszlo T. <ave...@us...> - 2006-04-22 13:30:32
|
Update of /cvsroot/gemrb/gemrb/gemrb/plugins/Core In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2469/plugins/Core Modified Files: Actions.cpp Actor.cpp Animation.h Button.cpp EffectQueue.cpp EffectQueue.h GameScript.cpp GameScript.h Interface.cpp Map.cpp Map.h ScriptedAnimation.cpp ScriptedAnimation.h TileMap.cpp Log Message: changed area vvc's and animations to linked list fixed area vvc rendering, now it is correctly covered by area animations/actors fixed duration of casting glows fixed empty ground piles (they won't be found anymore when mouse is hovered over them) Index: ScriptedAnimation.h =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/ScriptedAnimation.h,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** ScriptedAnimation.h 19 Apr 2006 20:09:33 -0000 1.18 --- ScriptedAnimation.h 22 Apr 2006 13:30:19 -0000 1.19 *************** *** 29,33 **** #define IE_VVC_TINT 0x00030000 //2 bits need to be set for tint #define IE_VVC_GREYSCALE 0x00080000 ! #define IE_VVC_DARKEN 0x00100000 #define IE_VVC_GLOWING 0x00200000 #define IE_VVC_RED_TINT 0x02000000 --- 29,33 ---- #define IE_VVC_TINT 0x00030000 //2 bits need to be set for tint #define IE_VVC_GREYSCALE 0x00080000 ! #define IE_VVC_DARKEN 0x00100000 //this is unsure #define IE_VVC_GLOWING 0x00200000 #define IE_VVC_RED_TINT 0x02000000 *************** *** 37,40 **** --- 37,42 ---- #define IE_VVC_NOCOVER 0x00000040 + #define IE_VVC_UNUSED 0xe0000000U + //phases #define P_ONSET 0 Index: EffectQueue.cpp =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/EffectQueue.cpp,v retrieving revision 1.60 retrieving revision 1.61 diff -C2 -d -r1.60 -r1.61 *** EffectQueue.cpp 16 Apr 2006 23:57:02 -0000 1.60 --- EffectQueue.cpp 22 Apr 2006 13:30:18 -0000 1.61 *************** *** 109,119 **** } void *tmp = bsearch(effectname, effectnames, opcodes_count, sizeof(EffectRef), find_effect); - /* - for (int i = 0; effectnames[i].Name; i++) { - if (!stricmp( effectnames[i].Name, effectname )) { - return effectnames + i; - } - } - */ if (!tmp) { printf( "Warning: Couldn't assign effect: %s\n", effectname ); --- 109,112 ---- *************** *** 202,205 **** --- 195,207 ---- } + void EffectQueue_ReleaseMemory() + { + if (effectnames) { + free (effectnames); + } + opcodes_count = 0; + effectnames = NULL; + } + void EffectQueue_RegisterOpcodes(int count, EffectRef* opcodes) { *************** *** 222,226 **** { Owner = NULL; ! opcodes_count = 0; } --- 224,228 ---- { Owner = NULL; ! // opcodes_count = 0; } *************** *** 230,238 **** delete( effects[i] ); } - if (effectnames) { - free (effectnames); - } - opcodes_count = 0; - effectnames = NULL; } --- 232,235 ---- *************** *** 266,274 **** void EffectQueue::ApplyAllEffects(Actor* target) { ! ieDword random_value = core->Roll( 1, 100, 0 ); std::vector< Effect* >::iterator f; for ( f = effects.begin(); f != effects.end(); f++ ) { ! (*f)->random_value = random_value; ApplyEffect( target, *f, false ); } --- 263,272 ---- void EffectQueue::ApplyAllEffects(Actor* target) { ! //nah, we already been through this ! //ieDword random_value = core->Roll( 1, 100, 0 ); std::vector< Effect* >::iterator f; for ( f = effects.begin(); f != effects.end(); f++ ) { ! //(*f)->random_value = random_value; ApplyEffect( target, *f, false ); } *************** *** 329,333 **** //watch for this, probability1 is the high number //probability2 is the low number ! if (fx->random_value<fx->Probability2 || fx->random_value>fx->Probability1) { return false; } --- 327,332 ---- //watch for this, probability1 is the high number //probability2 is the low number ! //random value is 1-100 ! if (fx->random_value<=fx->Probability2 || fx->random_value>fx->Probability1) { return false; } *************** *** 812,815 **** --- 811,816 ---- } + // this is a complete level check + //returns 1 if effect block applicable //returns 0 if effect block disabled Index: EffectQueue.h =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/EffectQueue.h,v retrieving revision 1.27 retrieving revision 1.28 diff -C2 -d -r1.27 -r1.28 *** EffectQueue.h 16 Apr 2006 23:57:02 -0000 1.27 --- EffectQueue.h 22 Apr 2006 13:30:18 -0000 1.28 *************** *** 111,120 **** }; ! /** Initializes table of available spell Effects used by all the queues */ bool Init_EffectQueue(); ! /** Registers opcodes implemented by a plugin */ void EffectQueue_RegisterOpcodes(int count, EffectRef *opcodes); bool match_ids(Actor *target, int table, ieDword value); --- 111,123 ---- }; ! /** Initializes table of available spell Effects used by all the queues. */ ! /** The available effects should already be registered by the effect plugins */ bool Init_EffectQueue(); ! /** Registers opcodes implemented by an effect plugin */ void EffectQueue_RegisterOpcodes(int count, EffectRef *opcodes); + /** release effect list when Interface is destroyed */ + void EffectQueue_ReleaseMemory(); bool match_ids(Actor *target, int table, ieDword value); Index: GameScript.cpp =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/GameScript.cpp,v retrieving revision 1.358 retrieving revision 1.359 diff -C2 -d -r1.358 -r1.359 *** GameScript.cpp 16 Apr 2006 23:57:02 -0000 1.358 --- GameScript.cpp 22 Apr 2006 13:30:18 -0000 1.359 *************** *** 605,608 **** --- 605,610 ---- {"randomwalkcontinuous", GameScript::RandomWalkContinuous, AF_BLOCKING}, {"realsetglobaltimer", GameScript::RealSetGlobalTimer,AF_MERGESTRINGS}, + {"reallyforcespell", GameScript::ReallyForceSpell, AF_BLOCKING}, + {"reallyforcespelldead", GameScript::ReallyForceSpellDead, AF_BLOCKING}, {"recoil", GameScript::Recoil, 0}, {"regainpaladinhood", GameScript::RegainPaladinHood, 0}, Index: Actor.cpp =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/Actor.cpp,v retrieving revision 1.181 retrieving revision 1.182 diff -C2 -d -r1.181 -r1.182 *** Actor.cpp 19 Apr 2006 20:09:32 -0000 1.181 --- Actor.cpp 22 Apr 2006 13:30:18 -0000 1.182 *************** *** 1646,1657 **** for (unsigned int i = 0; i < vvcCells.size(); i++) { ScriptedAnimation* vvc = vvcCells[i]; if (!vvc) continue; // actually this is better be drawn by the vvc bool endReached = vvc->Draw(screen, Pos, tint, area, WantDither()); if (endReached) { ! vvcCells[i] = NULL; ! delete( vvc ); continue; } --- 1646,1659 ---- for (unsigned int i = 0; i < vvcCells.size(); i++) { ScriptedAnimation* vvc = vvcCells[i]; + /* we don't allow holes anymore if (!vvc) continue; + */ // actually this is better be drawn by the vvc bool endReached = vvc->Draw(screen, Pos, tint, area, WantDither()); if (endReached) { ! delete vvc; ! vvcCells.erase(vvcCells.begin()+i); continue; } *************** *** 1948,1952 **** } else { delete vvc; ! (*vvcCells)[i]=NULL; } } --- 1950,1954 ---- } else { delete vvc; ! vvcCells->erase(vvcCells->begin()+i); } } Index: TileMap.cpp =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/TileMap.cpp,v retrieving revision 1.53 retrieving revision 1.54 diff -C2 -d -r1.53 -r1.54 *** TileMap.cpp 22 Feb 2006 18:38:20 -0000 1.53 --- TileMap.cpp 22 Apr 2006 13:30:19 -0000 1.54 *************** *** 377,380 **** --- 377,383 ---- } + //look for a container at position + //use type = IE_CONTAINER_PILE if you want to find ground piles only + //in this case, empty piles won't be found! Container* TileMap::GetContainer(Point &position, int type) { *************** *** 396,401 **** //IE piles don't have polygons, the bounding box is enough for them ! if (c->Type==IE_CONTAINER_PILE) return c; if (c->outline->PointIn( position )) return c; --- 399,410 ---- //IE piles don't have polygons, the bounding box is enough for them ! if (c->Type == IE_CONTAINER_PILE) { ! //don't find empty piles if we look for any container ! //if we looked only for piles, then we still return them ! if ((type==-1) && !c->inventory.GetSlotCount()) { ! continue; ! } return c; + } if (c->outline->PointIn( position )) return c; Index: Button.cpp =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/Button.cpp,v retrieving revision 1.98 retrieving revision 1.99 diff -C2 -d -r1.98 -r1.99 *** Button.cpp 16 Apr 2006 23:57:02 -0000 1.98 --- Button.cpp 22 Apr 2006 13:30:18 -0000 1.99 *************** *** 171,176 **** if (Image) { // FIXME: maybe it's useless... ! short xOffs = ( Width / 2 ) - ( Image->Width / 2 ); ! short yOffs = ( Height / 2 ) - ( Image->Height / 2 ); core->GetVideoDriver()->BlitSprite( Image, x + XPos + xOffs, y + YPos + yOffs, true ); --- 171,176 ---- if (Image) { // FIXME: maybe it's useless... ! int xOffs = ( Width / 2 ) - ( Image->Width / 2 ); ! int yOffs = ( Height / 2 ) - ( Image->Height / 2 ); core->GetVideoDriver()->BlitSprite( Image, x + XPos + xOffs, y + YPos + yOffs, true ); *************** *** 190,195 **** h += Picture2->Height; } ! short xOffs = ( Width / 2 ) - ( Picture->Width / 2 ); ! short yOffs = ( Height / 2 ) - ( h / 2 ); Region r( x + XPos + xOffs, y + YPos + yOffs, (int)(Picture->Width * Clipping), h ); core->GetVideoDriver()->BlitSprite( Picture, x + XPos + xOffs, y + YPos + yOffs, true, &r ); --- 190,195 ---- h += Picture2->Height; } ! int xOffs = ( Width / 2 ) - ( Picture->Width / 2 ); ! int yOffs = ( Height / 2 ) - ( h / 2 ); Region r( x + XPos + xOffs, y + YPos + yOffs, (int)(Picture->Width * Clipping), h ); core->GetVideoDriver()->BlitSprite( Picture, x + XPos + xOffs, y + YPos + yOffs, true, &r ); *************** *** 201,206 **** // Button picture if (AnimPicture) { ! short xOffs = ( Width / 2 ) - ( AnimPicture->Width / 2 ); ! short yOffs = ( Height / 2 ) - ( AnimPicture->Height / 2 ); Region r( x + XPos + xOffs, y + YPos + yOffs, (int)(AnimPicture->Width * Clipping), AnimPicture->Height ); core->GetVideoDriver()->BlitSprite( AnimPicture, x + XPos + xOffs, y + YPos + yOffs, true, &r ); --- 201,206 ---- // Button picture if (AnimPicture) { ! int xOffs = ( Width / 2 ) - ( AnimPicture->Width / 2 ); ! int yOffs = ( Height / 2 ) - ( AnimPicture->Height / 2 ); Region r( x + XPos + xOffs, y + YPos + yOffs, (int)(AnimPicture->Width * Clipping), AnimPicture->Height ); core->GetVideoDriver()->BlitSprite( AnimPicture, x + XPos + xOffs, y + YPos + yOffs, true, &r ); Index: GameScript.h =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/GameScript.h,v retrieving revision 1.244 retrieving revision 1.245 diff -C2 -d -r1.244 -r1.245 *** GameScript.h 16 Apr 2006 23:57:02 -0000 1.244 --- GameScript.h 22 Apr 2006 13:30:19 -0000 1.245 *************** *** 1157,1160 **** --- 1157,1162 ---- static void RandomWalkContinuous(Scriptable* Sender, Action* parameters); static void RealSetGlobalTimer(Scriptable* Sender, Action* parameters); + static void ReallyForceSpell(Scriptable* Sender, Action* parameters); + static void ReallyForceSpellDead(Scriptable* Sender, Action* parameters); static void Recoil(Scriptable* Sender, Action* parameters); static void RegainPaladinHood(Scriptable* Sender, Action* parameters); Index: Animation.h =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/Animation.h,v retrieving revision 1.27 retrieving revision 1.28 diff -C2 -d -r1.27 -r1.28 *** Animation.h 29 Mar 2006 17:37:34 -0000 1.27 --- Animation.h 22 Apr 2006 13:30:18 -0000 1.28 *************** *** 45,49 **** Sprite2D **frames; unsigned int indicesCount; - unsigned int startpos; unsigned long starttime; public: --- 45,48 ---- Index: Map.cpp =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/Map.cpp,v retrieving revision 1.238 retrieving revision 1.239 diff -C2 -d -r1.238 -r1.239 *** Map.cpp 19 Apr 2006 20:09:32 -0000 1.238 --- Map.cpp 22 Apr 2006 13:30:19 -0000 1.239 *************** *** 93,98 **** } //returns true if creature must be embedded in the area ! static bool MustSave(Actor *actor) { if (actor->InParty) { --- 93,129 ---- } + inline static AnimationObjectType SelectObject(Actor *actor, AreaAnimation *a, ScriptedAnimation *sca) + { + int actorh; + if (actor) { + actorh = actor->Pos.y; + } else { + actorh = 0x7fffffff; + } + + int aah; + if (a) { + aah = a->Pos.y;//+a->height; + } else { + aah = 0x7fffffff; + } + + int scah; + if (sca) { + scah = sca->YPos;//+sca->ZPos; + } else { + scah = 0x7fffffff; + } + + if (actorh<aah) { + if (actorh<scah) return AOT_ACTOR; + return AOT_SCRIPTED; + } + if (aah<scah) return AOT_AREA; + return AOT_SCRIPTED; + } + //returns true if creature must be embedded in the area ! inline static bool MustSave(Actor *actor) { if (actor->InParty) { *************** *** 343,348 **** delete TMap; } ! for (i = 0; i < animations.size(); i++) { ! delete animations[i]; } --- 374,380 ---- delete TMap; } ! aniIterator aniidx; ! for (aniidx = animations.begin(); aniidx != animations.end(); aniidx++) { ! delete (*aniidx); } *************** *** 373,381 **** } } ! for (i = 0; i < vvcCells.size(); i++) { ! if (vvcCells[i]) { ! delete vvcCells[i]; ! vvcCells[i] = NULL; ! } } for (i = 0; i < ambients.size(); i++) { --- 405,412 ---- } } ! scaIterator iter; ! ! for (iter = vvcCells.begin(); iter != vvcCells.end(); iter++) { ! delete (*iter); } for (i = 0; i < ambients.size(); i++) { *************** *** 640,649 **** //there is a similar function in Actors for mobile vvcs //this probably needs an additional container object which stores position, duration etc void Map::DrawVideocells(Region screen) { for (unsigned int i = 0; i < vvcCells.size(); i++) { ScriptedAnimation* vvc = vvcCells[i]; - if (!vvc) - continue; Point Pos(0,0); //we need the position of the vvc on the area --- 671,679 ---- //there is a similar function in Actors for mobile vvcs //this probably needs an additional container object which stores position, duration etc + /* void Map::DrawVideocells(Region screen) { for (unsigned int i = 0; i < vvcCells.size(); i++) { ScriptedAnimation* vvc = vvcCells[i]; Point Pos(0,0); //we need the position of the vvc on the area *************** *** 654,664 **** bool endReached = vvc->Draw(screen, Pos, tint, this, false); if (endReached) { - vvcCells[i] = NULL; delete( vvc ); continue; } } } ! void Map::DrawContainers( Region screen, Container *overContainer) --- 684,694 ---- bool endReached = vvc->Draw(screen, Pos, tint, this, false); if (endReached) { delete( vvc ); + vvcCells.erase(vvcCells.begin()+i); continue; } } } ! */ void Map::DrawContainers( Region screen, Container *overContainer) *************** *** 735,745 **** } ! AreaAnimation *Map::GetNextAreaAnimation(int &aniidx, ieDword gametime) { retry: ! if (aniidx>=GetAnimationCount()) { return NULL; } ! AreaAnimation *a = GetAnimation(aniidx++); if (!a->Schedule(gametime) ) { goto retry; --- 765,775 ---- } ! AreaAnimation *Map::GetNextAreaAnimation(aniIterator &iter, ieDword gametime) { retry: ! if (iter==animations.end()) { return NULL; } ! AreaAnimation *a = *(iter++); if (!a->Schedule(gametime) ) { goto retry; *************** *** 751,754 **** --- 781,793 ---- } + //doesn't increase iterator, because we might need to erase it from the list + ScriptedAnimation *Map::GetNextScriptedAnimation(scaIterator &iter) + { + if (iter==vvcCells.end()) { + return NULL; + } + return *iter; + } + void Map::DrawMap(Region screen, GameControl* gc) { *************** *** 780,815 **** int index = Qcount[q]; Actor* actor = GetNextActor(q, index); ! int aniidx = 0; AreaAnimation *a = GetNextAreaAnimation(aniidx, gametime); ! while (true) { ! if (!a || (actor && (actor->Pos.y<a->Pos.y+a->height)) ) { ! if (!actor) { ! break; ! } actor->Draw( screen ); actor = GetNextActor(q, index); ! } else { //draw animation ! int animcount=a->animcount; ! //always draw the animation tinted because tint is also used for ! //transparency ! Color tint = {255,255,255,255-(ieByte) a->transparency}; ! if ((a->Flags&A_ANI_NO_SHADOW)) { ! tint = LightMap->GetPixel( a->Pos.x / 16, a->Pos.y / 12); ! tint.a = 255-(ieByte) a->transparency; ! } ! while (animcount--) { ! Animation *anim = a->animation[animcount]; ! video->BlitGameSprite( anim->NextFrame(), ! a->Pos.x + screen.x, a->Pos.y + screen.y, ! BLIT_TINTED, tint, 0, a->palette, &screen ); } a = GetNextAreaAnimation(aniidx,gametime); } } - DrawVideocells(screen); - if ((core->FogOfWar&2) && SearchMap) { DrawSearchMap(screen); --- 819,875 ---- int index = Qcount[q]; Actor* actor = GetNextActor(q, index); ! aniIterator aniidx = animations.begin(); ! scaIterator scaidx = vvcCells.begin(); AreaAnimation *a = GetNextAreaAnimation(aniidx, gametime); ! ScriptedAnimation *sca = GetNextScriptedAnimation(scaidx); ! ! while (actor || a || sca) { ! switch(SelectObject(actor,a,sca)) { ! case AOT_ACTOR: actor->Draw( screen ); actor = GetNextActor(q, index); ! break; ! case AOT_AREA: //draw animation ! { ! int animcount=a->animcount; ! //always draw the animation tinted because tint is also used for ! //transparency ! Color tint = {255,255,255,255-(ieByte) a->transparency}; ! if ((a->Flags&A_ANI_NO_SHADOW)) { ! tint = LightMap->GetPixel( a->Pos.x / 16, a->Pos.y / 12); ! tint.a = 255-(ieByte) a->transparency; ! } ! while (animcount--) { ! Animation *anim = a->animation[animcount]; ! video->BlitGameSprite( anim->NextFrame(), ! a->Pos.x + screen.x, a->Pos.y + screen.y, ! BLIT_TINTED, tint, 0, a->palette, &screen ); ! } } a = GetNextAreaAnimation(aniidx,gametime); + break; + case AOT_SCRIPTED: + { + Point Pos(0,0); + + Color tint = LightMap->GetPixel( sca->XPos / 16, sca->YPos / 12); + tint.a = 255; + bool endReached = sca->Draw(screen, Pos, tint, this, 0); + if (endReached) { + delete( sca ); + scaidx=vvcCells.erase(scaidx); + } else { + scaidx++; + } + } + sca = GetNextScriptedAnimation(scaidx); + break; + default: + abort(); } } if ((core->FogOfWar&2) && SearchMap) { DrawSearchMap(screen); *************** *** 855,860 **** void Map::AddAnimation(AreaAnimation* anim) { - int i; - //this hack is to make sure animations flagged with background //are always drawn first (-9999 seems sufficiently small) --- 915,918 ---- *************** *** 862,867 **** anim->height=-9999; } ! for(i=animations.size();i && animations[i-1]->height>anim->height; i--); ! animations.insert(animations.begin()+i, anim); } --- 920,927 ---- anim->height=-9999; } ! ! aniIterator iter; ! for(iter=animations.begin(); (iter!=animations.end()) && ((*iter)->height<anim->height); iter++); ! animations.insert(iter, anim); } *************** *** 1359,1421 **** } } - /* - Actor* Map::GetRoot(int priority, int &index) - { - if (index == 0) { - return NULL; - } - - Actor **baseline=queue[priority]+(Qcount[priority]-index); - Actor* ret = baseline[0]; - index--; - if (index == 0) { - return ret; - } - Actor* node = baseline[1]; - - int lastPos = 1; - while (true) { - int leftChildPos = lastPos * 2; - int rightChildPos = lastPos * 2 + 1; - if (leftChildPos > index) - break; - Actor* child = baseline[leftChildPos]; - int childPos = leftChildPos; - if (rightChildPos <= index) { - //If both Child Exist - Actor* rightChild = baseline[rightChildPos]; - if (rightChild->Pos.y < child->Pos.y) { - childPos = rightChildPos; - child = rightChild; - } - } - if (node->Pos.y > child->Pos.y) { - baseline[lastPos] = child; - baseline[childPos] = node; - lastPos = childPos; - } else - break; - } - return ret; - } - */ void Map::AddVVCCell(ScriptedAnimation* vvc) { ! unsigned int i=vvcCells.size(); ! while (i--) { ! if (vvcCells[i] == NULL) { ! vvcCells[i] = vvc; ! return; ! } ! } ! vvcCells.push_back( vvc ); } AreaAnimation* Map::GetAnimation(const char* Name) { ! unsigned int i=animations.size(); ! while (i--) { ! AreaAnimation *anim = animations[i]; if (anim->Name && (strnicmp( anim->Name, Name, 32 ) == 0)) { --- 1419,1438 ---- } } + //adding videocell in order, based on its height parameter void Map::AddVVCCell(ScriptedAnimation* vvc) { ! scaIterator iter; ! ! for(iter=vvcCells.begin();iter!=vvcCells.end() && (*iter)->ZPos>vvc->ZPos; iter++); ! vvcCells.insert(iter, vvc); } AreaAnimation* Map::GetAnimation(const char* Name) { ! aniIterator iter; ! ! for(iter=animations.begin();iter!=animations.end();iter++) { ! AreaAnimation *anim = *iter; if (anim->Name && (strnicmp( anim->Name, Name, 32 ) == 0)) { Index: Map.h =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/Map.h,v retrieving revision 1.110 retrieving revision 1.111 diff -C2 -d -r1.110 -r1.111 *** Map.h 19 Apr 2006 20:09:33 -0000 1.110 --- Map.h 22 Apr 2006 13:30:19 -0000 1.111 *************** *** 172,175 **** --- 172,177 ---- }; + enum AnimationObjectType {AOT_AREA, AOT_SCRIPTED, AOT_ACTOR}; + //i believe we need only the active actors/visible inactive actors queues #define QUEUE_COUNT 2 *************** *** 180,183 **** --- 182,188 ---- #define PR_IGNORE 2 + typedef std::list<AreaAnimation*>::iterator aniIterator; + typedef std::list<ScriptedAnimation*>::iterator scaIterator; + class GEM_EXPORT Map : public Scriptable { public: *************** *** 200,209 **** std::queue< unsigned int> InternalStack; unsigned int Width, Height; ! std::vector< AreaAnimation*> animations; std::vector< Actor*> actors; Wall_Polygon **Walls; unsigned int WallCount; ! //std::vector< WallGroup*> wallGroups; ! std::vector< ScriptedAnimation*> vvcCells; std::vector< Entrance*> entrances; std::vector< Ambient*> ambients; --- 205,213 ---- std::queue< unsigned int> InternalStack; unsigned int Width, Height; ! std::list< AreaAnimation*> animations; std::vector< Actor*> actors; Wall_Polygon **Walls; unsigned int WallCount; ! std::list< ScriptedAnimation*> vvcCells; std::vector< Entrance*> entrances; std::vector< Ambient*> ambients; *************** *** 228,232 **** void CopyGroundPiles(Map *othermap, Point &Pos); /* draws stationary vvc graphics */ ! void DrawVideocells(Region screen); void DrawContainers(Region screen, Container *overContainer); void DrawMap(Region screen, GameControl* gc); --- 232,236 ---- void CopyGroundPiles(Map *othermap, Point &Pos); /* draws stationary vvc graphics */ ! //void DrawVideocells(Region screen); void DrawContainers(Region screen, Container *overContainer); void DrawMap(Region screen, GameControl* gc); *************** *** 234,239 **** void AddAnimation(AreaAnimation* anim); AreaAnimation* GetAnimation(const char* Name); ! AreaAnimation* GetAnimation(int i) { return animations[i]; } ! int GetAnimationCount() const { return (int) animations.size(); } unsigned int GetWallCount() { return WallCount; } --- 238,243 ---- void AddAnimation(AreaAnimation* anim); AreaAnimation* GetAnimation(const char* Name); ! aniIterator GetFirstAnimation() { return animations.begin(); } ! size_t GetAnimationCount() const { return animations.size(); } unsigned int GetWallCount() { return WallCount; } *************** *** 352,356 **** void MoveToNewArea(const char *area, const char *entrance, int EveryOne, Actor *actor); private: ! AreaAnimation *GetNextAreaAnimation(int &aniidx, ieDword gametime); Actor *GetNextActor(int &q, int &index); void DrawSearchMap(Region &screen); --- 356,361 ---- void MoveToNewArea(const char *area, const char *entrance, int EveryOne, Actor *actor); private: ! AreaAnimation *GetNextAreaAnimation(aniIterator &iter, ieDword gametime); ! ScriptedAnimation *GetNextScriptedAnimation(scaIterator &iter); Actor *GetNextActor(int &q, int &index); void DrawSearchMap(Region &screen); Index: Interface.cpp =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/Interface.cpp,v retrieving revision 1.397 retrieving revision 1.398 diff -C2 -d -r1.397 -r1.398 *** Interface.cpp 19 Apr 2006 20:09:32 -0000 1.397 --- Interface.cpp 22 Apr 2006 13:30:19 -0000 1.398 *************** *** 298,301 **** --- 298,302 ---- } + EffectQueue_ReleaseMemory(); CharAnimations::ReleaseMemory(); if (CurrentStore) { *************** *** 4175,4178 **** --- 4176,4180 ---- ScriptedAnimation *ret=new ScriptedAnimation(); ret->LoadAnimationFactory( af); + strnlwrcpy(ret->ResName, effect, 8); return ret; } Index: ScriptedAnimation.cpp =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/ScriptedAnimation.cpp,v retrieving revision 1.30 retrieving revision 1.31 diff -C2 -d -r1.30 -r1.31 *** ScriptedAnimation.cpp 19 Apr 2006 20:09:33 -0000 1.30 --- ScriptedAnimation.cpp 22 Apr 2006 13:30:19 -0000 1.31 *************** *** 52,55 **** --- 52,56 ---- FrameRate = 15; FaceTarget = 0; + dither = 0; Duration = 0xffffffff; justCreated = true; *************** *** 123,127 **** anims[P_RELEASE]->Flags |= S_ANI_PLAYONCE; ! memcpy(ResName, af->ResRef, 8); } --- 124,128 ---- anims[P_RELEASE]->Flags |= S_ANI_PLAYONCE; ! memcpy(ResName, af->ResRef, sizeof(ResName) ); } *************** *** 215,222 **** --- 216,227 ---- //copying resource name to the object, so it could be referenced by it //used by immunity/remove specific animation + //this is better done in Interface::GetScriptedAnimation + //where the original resref is more readily available + /* memcpy(ResName, stream->filename, 8); for(int i=0;i<8;i++) { if (ResName[i]=='.') ResName[i]=0; } + */ SetPhase(P_ONSET); PaletteName[0]=0; *************** *** 339,344 **** //explicit duration ! if (core->GetGame()->Ticks>Duration) { ! return true; } //automatically slip from onset to hold to release --- 344,352 ---- //explicit duration ! if (Phase==P_HOLD) { ! if (core->GetGame()->Ticks>Duration) { ! Phase++; ! goto retry; ! } } //automatically slip from onset to hold to release *************** *** 382,386 **** int cx = Pos.x + XPos; ! int cy = Pos.y + ZPos + YPos; if( SequenceFlags&IE_VVC_NOCOVER) { --- 390,394 ---- int cx = Pos.x + XPos; ! int cy = Pos.y - ZPos + YPos; if( SequenceFlags&IE_VVC_NOCOVER) { Index: Actions.cpp =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/Actions.cpp,v retrieving revision 1.66 retrieving revision 1.67 diff -C2 -d -r1.66 -r1.67 *** Actions.cpp 19 Apr 2006 20:09:32 -0000 1.66 --- Actions.cpp 22 Apr 2006 13:30:18 -0000 1.67 *************** *** 1852,1855 **** --- 1852,1856 ---- } + //it is unsure how the ForceSpell actions differ void GameScript::ForceSpell(Scriptable* Sender, Action* parameters) { *************** *** 1878,1881 **** --- 1879,1937 ---- } + void GameScript::ReallyForceSpell(Scriptable* Sender, Action* parameters) + { + ieResRef spellres; + + if (!ResolveSpellName( spellres, parameters) ) { + Sender->ReleaseCurrentAction(); + return; + } + + Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); + if (!tar) { + Sender->ReleaseCurrentAction(); + return; + } + if (Sender->Type == ST_ACTOR) { + Actor *actor = (Actor *) Sender; + actor->SetStance (IE_ANI_CAST); + } + Point s,d; + GetPositionFromScriptable( Sender, s, false ); + GetPositionFromScriptable( tar, d, false ); + printf( "ReallyForceSpell from [%d,%d] to [%d,%d]\n", s.x, s.y, d.x, d.y ); + //this might be bad + Sender->ReleaseCurrentAction(); + } + + // this differs from ReallyForceSpell that this one allows dead Sender casting + void GameScript::ReallyForceSpellDead(Scriptable* Sender, Action* parameters) + { + ieResRef spellres; + + if (!ResolveSpellName( spellres, parameters) ) { + Sender->ReleaseCurrentAction(); + return; + } + + Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); + if (!tar) { + Sender->ReleaseCurrentAction(); + return; + } + /* if dead, then do not move + if (Sender->Type == ST_ACTOR) { + Actor *actor = (Actor *) Sender; + actor->SetStance (IE_ANI_CAST); + } + */ + Point s,d; + GetPositionFromScriptable( Sender, s, false ); + GetPositionFromScriptable( tar, d, false ); + printf( "ReallyForceSpellDead from [%d,%d] to [%d,%d]\n", s.x, s.y, d.x, d.y ); + //this might be bad + Sender->ReleaseCurrentAction(); + } + void GameScript::Deactivate(Scriptable* Sender, Action* parameters) { |