From: Laszlo T. <ave...@us...> - 2005-07-30 10:46:13
|
Update of /cvsroot/gemrb/gemrb/gemrb/plugins/Core In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv31716 Modified Files: EffectQueue.cpp EffectQueue.h Log Message: dispel magic opcode Index: EffectQueue.cpp =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/EffectQueue.cpp,v retrieving revision 1.34 retrieving revision 1.35 diff -C2 -d -r1.34 -r1.35 *** EffectQueue.cpp 29 Jul 2005 21:58:06 -0000 1.34 --- EffectQueue.cpp 30 Jul 2005 10:46:03 -0000 1.35 *************** *** 89,93 **** int fx_alignment_invert (Actor* Owner, Actor* target, Effect* fx);//38 int fx_alignment_change (Actor* Owner, Actor* target, Effect* fx);//39 ! //3a int fx_stealth_modifier (Actor* Owner, Actor* target, Effect* fx);//3b int fx_miscast_magic_modifier (Actor* Owner, Actor* target, Effect* fx);//3c --- 89,93 ---- int fx_alignment_invert (Actor* Owner, Actor* target, Effect* fx);//38 int fx_alignment_change (Actor* Owner, Actor* target, Effect* fx);//39 ! int fx_dispel_effects (Actor* Owner, Actor* target, Effect* fx);//3a int fx_stealth_modifier (Actor* Owner, Actor* target, Effect* fx);//3b int fx_miscast_magic_modifier (Actor* Owner, Actor* target, Effect* fx);//3c *************** *** 647,650 **** --- 647,666 ---- + void EffectQueue::RemoveLevelEffects(ieDword level, bool dispellable) + { + std::vector< Effect* >::iterator f; + for ( f = effects.begin(); f != effects.end(); f++ ) { + if ( (*f)->Power<=level) { + continue; + } + + if (dispellable && ((*f)->Resistance&FX_RESIST_DISPELL_NO_BYPASS) ) { + continue; + } + (*f)->TimingMode=FX_DURATION_JUST_EXPIRED; + } + } + + void EffectQueue::dump() { *************** *** 1296,1299 **** --- 1312,1331 ---- return FX_APPLIED; } + + //0x3A + + int fx_dispell_effects (Actor* /*Owner*/, Actor* target, Effect* fx) + { + if (0) printf( "fx_dispell_effects (%2d): Value: %d, IDS: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); + ieDword level = fx->Power; + + //this might be different, it could be that removal depends on random + if (fx->Parameter2==1) { + level = fx->Parameter1; + } + target->fxqueue.RemoveLevelEffects(level, true); + return FX_NOT_APPLIED; + } + // 0x3B int fx_stealth_modifier (Actor* /*Owner*/, Actor* target, Effect* fx) Index: EffectQueue.h =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/EffectQueue.h,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** EffectQueue.h 29 Jul 2005 21:58:07 -0000 1.9 --- EffectQueue.h 30 Jul 2005 10:46:03 -0000 1.10 *************** *** 55,58 **** --- 55,59 ---- void PrepareDuration(Effect* fx); void RemoveAllEffects(ieDword opcode); + void RemoveLevelEffects(ieDword level, bool dispellable); void dump(); }; |