Float SpellAreaProjectiles(Script * script) { if (script->VerifyArguments(1) == true) { Word * spellWord = script->GetNextWord(); GameObject * source = (GameObject *)script->GetSource(); if ((source != NULL) && (source->CheckType(OBJ_TYPE_GAME_OBJECT) == true)) { const Spell * spell = GetSpell(spellWord->value); if (spell != NULL) { Shape * shape = source->GetShape(); Shape * newShape = shape->CreateInstance(); newShape->Translate(source->GetPosition()); List<Projectile *> * ActiveProjectiles = GetActiveProjectiles(); ActiveProjectiles->ToStart(); for (uint32 i = 0; i < ActiveProjectiles->GetSize(); i++) { Projectile * projectile = ActiveProjectiles->GetCurrent(); ActiveProjectiles->ToNext(); uint32 baseSize = projectile->GetUInt32Value(PROJ_VAR_BASE_SIZE); Point2D position = projectile->GetPosition(); Rect bounds(position.GetX(), position.GetY(), position.GetX() + baseSize, position.GetY() + baseSize); if (Intersect(newShape, &bounds) == true) { if (projectile->ActiveSpell(spell, source) == false) { projectile->ApplySpell(spell, source); } } else { projectile->RemoveSpell(spell, source); } } delete newShape; return true; } } } return false; }