From: <fu...@us...> - 2009-08-29 13:25:52
|
Revision: 7078 http://gemrb.svn.sourceforge.net/gemrb/?rev=7078&view=rev Author: fuzzie Date: 2009-08-29 13:25:43 +0000 (Sat, 29 Aug 2009) Log Message: ----------- spell casting time fixes Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actions.cpp gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp gemrb/trunk/gemrb/plugins/Core/ActorBlock.h gemrb/trunk/gemrb/plugins/Core/Interface.cpp gemrb/trunk/gemrb/plugins/Core/Spell.cpp gemrb/trunk/gemrb/plugins/Core/Spell.h gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp Modified: gemrb/trunk/gemrb/plugins/Core/Actions.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2009-08-28 23:42:12 UTC (rev 7077) +++ gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2009-08-29 13:25:43 UTC (rev 7078) @@ -2538,7 +2538,8 @@ act->SetOrientation( GetOrient( tar->Pos, act->Pos ), false ); } } - Sender->CastSpell( spellres, tar, true ); + int duration = Sender->CastSpell( spellres, tar, true ); + if (duration != -1) Sender->SetWait(duration); //if target was set, feed action back if (!Sender->LastTarget && Sender->LastTargetPos.isempty()) { @@ -2583,7 +2584,8 @@ actor->SetOrientation( GetOrient( parameters->pointParameter, actor->Pos ), false ); } - Sender->CastSpellPoint( spellres, parameters->pointParameter, true ); + int duration = Sender->CastSpellPoint( spellres, parameters->pointParameter, true ); + if (duration != -1) Sender->SetWait(duration); //if target was set, feed action back if (!Sender->LastTarget && Sender->LastTargetPos.isempty()) { @@ -2632,7 +2634,8 @@ actor->SetOrientation( GetOrient( tar->Pos, actor->Pos ), false ); } } - Sender->CastSpell( spellres, tar, false ); + int duration = Sender->CastSpell( spellres, tar, false ); + if (duration != -1) Sender->SetWait(duration); //if target was set, feed action back if (!Sender->LastTarget && Sender->LastTargetPos.isempty()) { @@ -2666,7 +2669,8 @@ actor->SetOrientation( GetOrient( parameters->pointParameter, actor->Pos ), false ); } - Sender->CastSpellPoint( spellres, parameters->pointParameter, false ); + int duration = Sender->CastSpellPoint( spellres, parameters->pointParameter, false ); + if (duration != -1) Sender->SetWait(duration); //if target was set, feed action back if (Sender->LastTargetPos.isempty()) { @@ -2715,7 +2719,8 @@ actor->SetOrientation( GetOrient( tar->Pos, actor->Pos ), false ); } } - Sender->CastSpell (spellres, tar, false); + int duration = Sender->CastSpell (spellres, tar, false); + if (duration != -1) Sender->SetWait(duration); //if target was set, feed action back if (!Sender->LastTarget && Sender->LastTargetPos.isempty()) { @@ -2748,7 +2753,8 @@ actor->SetOrientation( GetOrient( parameters->pointParameter, actor->Pos ), false ); } - Sender->CastSpellPoint (spellres, parameters->pointParameter, false); + int duration = Sender->CastSpellPoint (spellres, parameters->pointParameter, false); + if (duration != -1) Sender->SetWait(duration); //if target was set, feed action back if (Sender->LastTargetPos.isempty()) { @@ -2780,7 +2786,7 @@ } actor->SetStance (IE_ANI_CONJURE); } - Sender->CastSpell (spellres, tar, false); + Sender->CastSpell (spellres, tar, false, true); if (tar->Type==ST_ACTOR) { Sender->CastSpellEnd(spellres); } else { @@ -2812,7 +2818,7 @@ actor->SetOrientation( GetOrient( parameters->pointParameter, actor->Pos ), false ); actor->SetStance (IE_ANI_CONJURE); } - Sender->CastSpellPoint (spellres, parameters->pointParameter, false); + Sender->CastSpellPoint (spellres, parameters->pointParameter, false, true); Sender->CastSpellPointEnd(spellres); Sender->ReleaseCurrentAction(); } @@ -2838,7 +2844,7 @@ Actor *actor = (Actor *) Sender; actor->SetStance (IE_ANI_CONJURE); } - Sender->CastSpell (spellres, tar, false); + Sender->CastSpell (spellres, tar, false, true); if (tar->Type==ST_ACTOR) { Sender->CastSpellEnd(spellres); } else { Modified: gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp 2009-08-28 23:42:12 UTC (rev 7077) +++ gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp 2009-08-29 13:25:43 UTC (rev 7078) @@ -668,31 +668,31 @@ //set target as point //if spell needs to be depleted, do it //if spell is illegal stop casting -void Scriptable::CastSpellPoint( const ieResRef SpellResRef, Point &target, bool deplete ) +int Scriptable::CastSpellPoint( const ieResRef SpellResRef, Point &target, bool deplete, bool instant ) { LastTarget = 0; LastTargetPos.empty(); if (Type == ST_ACTOR) { Actor *actor = (Actor *) this; if (actor->HandleCastingStance(SpellResRef,deplete) ) { - return; + return -1; } } LastTargetPos = target; - SpellCast(SpellResRef); + return SpellCast(SpellResRef, instant); } //set target as actor (if target isn't actor, use its position) //if spell needs to be depleted, do it //if spell is illegal stop casting -void Scriptable::CastSpell( const ieResRef SpellResRef, Scriptable* target, bool deplete ) +int Scriptable::CastSpell( const ieResRef SpellResRef, Scriptable* target, bool deplete, bool instant ) { LastTarget = 0; LastTargetPos.empty(); if (Type == ST_ACTOR) { Actor *actor = (Actor *) this; if (actor->HandleCastingStance(SpellResRef,deplete) ) { - return; + return -1; } } @@ -702,28 +702,23 @@ if (target->Type==ST_ACTOR) { LastTarget = target->GetGlobalID(); } - SpellCast(SpellResRef); + return SpellCast(SpellResRef, instant); } //start spellcasting (common part) -void Scriptable::SpellCast(const ieResRef SpellResRef) +int Scriptable::SpellCast(const ieResRef SpellResRef, bool instant) { Spell* spl = gamedata->GetSpell( SpellResRef ); if (!spl) { SpellHeader = -1; - return; + return -1; } - //cfb if (Type == ST_ACTOR) { + Actor *actor = (Actor *) this; //The ext. index is here to calculate the casting time - int level = ((Actor *) this)->GetXPLevel(true); + int level = actor->GetXPLevel(true); SpellHeader = spl->GetHeaderIndexFromLevel(level); - Actor *actor = (Actor *) this; - EffectQueue *fxqueue = spl->GetEffectBlock(this, this->Pos, -1, SpellHeader, 0); - fxqueue->SetOwner(actor); - fxqueue->AddAllEffects(actor, actor->Pos); - delete fxqueue; } else { SpellHeader = 0; } @@ -737,8 +732,22 @@ if (casting_time < 0) casting_time = 0; } // this is a guess which seems approximately right so far - SetWait((casting_time*ROUND_SIZE)/10); + int duration = (casting_time*ROUND_SIZE) / 10; + if (instant) + duration = 0; + + //cfb + if (Type == ST_ACTOR) { + Actor *actor = (Actor *) this; + EffectQueue *fxqueue = spl->GetEffectBlock(this, this->Pos, -1); + spl->AddCastingGlow(fxqueue, duration); + fxqueue->SetOwner(actor); + fxqueue->AddAllEffects(actor, actor->Pos); + delete fxqueue; + } + gamedata->FreeSpell(spl, SpellResRef, false); + return duration; } bool Scriptable::TimerActive(ieDword ID) Modified: gemrb/trunk/gemrb/plugins/Core/ActorBlock.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ActorBlock.h 2009-08-28 23:42:12 UTC (rev 7077) +++ gemrb/trunk/gemrb/plugins/Core/ActorBlock.h 2009-08-29 13:25:43 UTC (rev 7078) @@ -270,8 +270,8 @@ /* re/draws overhead text on the map screen */ void DrawOverheadText(Region &screen); /* actor/scriptable casts spell */ - void CastSpellPoint( const ieResRef SpellResRef, Point &Target, bool deplete ); - void CastSpell( const ieResRef SpellResRef, Scriptable* Target, bool deplete ); + int CastSpellPoint( const ieResRef SpellResRef, Point &Target, bool deplete, bool instant = false ); + int CastSpell( const ieResRef SpellResRef, Scriptable* Target, bool deplete, bool instant = false ); /* spellcasting finished */ void CastSpellPointEnd( const ieResRef SpellResRef); void CastSpellEnd( const ieResRef SpellResRef); @@ -282,7 +282,7 @@ void StartTimer(ieDword ID, ieDword expiration); private: /* used internally to handle start of spellcasting */ - void SpellCast(const ieResRef SpellResRef); + int SpellCast(const ieResRef SpellResRef, bool instant); }; class GEM_EXPORT Selectable : public Scriptable { Modified: gemrb/trunk/gemrb/plugins/Core/Interface.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Interface.cpp 2009-08-28 23:42:12 UTC (rev 7077) +++ gemrb/trunk/gemrb/plugins/Core/Interface.cpp 2009-08-29 13:25:43 UTC (rev 7078) @@ -4823,7 +4823,7 @@ } level = spell->GetHeaderIndexFromLevel(level); - EffectQueue *fxqueue = spell->GetEffectBlock(caster, actor->Pos, level, -1, 0); + EffectQueue *fxqueue = spell->GetEffectBlock(caster, actor->Pos, level); //check effect immunities int res = fxqueue->CheckImmunity ( actor ); Modified: gemrb/trunk/gemrb/plugins/Core/Spell.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Spell.cpp 2009-08-28 23:42:12 UTC (rev 7077) +++ gemrb/trunk/gemrb/plugins/Core/Spell.cpp 2009-08-29 13:25:43 UTC (rev 7078) @@ -71,8 +71,19 @@ //otherwise set to caster level static EffectRef fx_casting_glow_ref={"CastingGlow",NULL,-1}; -EffectQueue *Spell::GetEffectBlock(Scriptable *self, Point &pos, int block_index, int ext_index, ieDword pro) const +void Spell::AddCastingGlow(EffectQueue *fxqueue, ieDword duration) { + Effect *fx = EffectQueue::CreateEffect(fx_casting_glow_ref, 0, CastingGraphics, FX_DURATION_ABSOLUTE); + fx->Duration = core->GetGame()->GameTime + duration; + fx->InventorySlot = 0xffff; + fx->Projectile = 0; + fxqueue->AddEffect(fx); + //AddEffect creates a copy, we need to destroy the original + delete fx; +} + +EffectQueue *Spell::GetEffectBlock(Scriptable *self, Point &pos, int block_index, ieDword pro) const +{ Effect *features; int count; @@ -91,17 +102,6 @@ } EffectQueue *fxqueue = new EffectQueue(); - //add casting glow - if (block_index==-1) { - assert(ext_index>=0); - Effect *fx = EffectQueue::CreateEffect(fx_casting_glow_ref, 0, CastingGraphics, FX_DURATION_ABSOLUTE); - fx->Duration = (ext_headers[ext_index].CastingTime*ROUND_SIZE)/10+core->GetGame()->GameTime; - fx->InventorySlot = 0xffff; - fx->Projectile = 0; - fxqueue->AddEffect(fx); - //AddEffect creates a copy, we need to destroy the original - delete fx; - } for (int i=0;i<count;i++) { if (Flags & SF_SIMPLIFIED_DURATION) { //hack the effect according to Level @@ -138,7 +138,7 @@ } Projectile *pro = core->GetProjectileServer()->GetProjectileByIndex(seh->ProjectileAnimation); if (seh->FeatureCount) { - pro->SetEffects(GetEffectBlock(self, target, header, -1, seh->ProjectileAnimation)); + pro->SetEffects(GetEffectBlock(self, target, header, seh->ProjectileAnimation)); } return pro; } Modified: gemrb/trunk/gemrb/plugins/Core/Spell.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Spell.h 2009-08-28 23:42:12 UTC (rev 7077) +++ gemrb/trunk/gemrb/plugins/Core/Spell.h 2009-08-29 13:25:43 UTC (rev 7078) @@ -170,7 +170,9 @@ //converts a wanted level to block index count int GetHeaderIndexFromLevel(int level) const; //-1 will return the cfb - EffectQueue *GetEffectBlock(Scriptable *self, Point &pos, int block_index, int ext_index=-1, ieDword pro=0) const; + EffectQueue *GetEffectBlock(Scriptable *self, Point &pos, int block_index, ieDword pro=0) const; + // add appropriate casting glow effect + void AddCastingGlow(EffectQueue *fxqueue, ieDword duration); //returns a projectile created from an extended header Projectile *GetProjectile(Scriptable *self, int headerindex, Point &pos) const; unsigned int GetCastingDistance(Actor *actor) const; Modified: gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp 2009-08-28 23:42:12 UTC (rev 7077) +++ gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp 2009-08-29 13:25:43 UTC (rev 7078) @@ -2500,7 +2500,7 @@ return FX_NOT_APPLIED; } - EffectQueue *fxqueue = spell->GetEffectBlock(Owner, pos, 0, -1, 0); + EffectQueue *fxqueue = spell->GetEffectBlock(Owner, pos, 0); fxqueue->SetOwner(Owner); //bit 2 original target is excluded or not excluded fxqueue->AffectAllInRange(target->GetCurrentArea(), pos, 0, 0,fx->Parameter1, fx->Parameter2&AE_TARGETEXCL?target:NULL); @@ -2705,7 +2705,7 @@ if (pro) { Point p(fx->PosX, fx->PosY); - pro->SetEffects(spl->GetEffectBlock(Owner, p, 0,-1, fx->Parameter2)); + pro->SetEffects(spl->GetEffectBlock(Owner, p, 0, fx->Parameter2)); Point origin(fx->PosX, fx->PosY); pro->SetCaster(Owner->GetGlobalID()); if (target) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |