Unfortunately, no. I'm not aware of an existing script that does what you're asking specifically, though a general-purpose spell handling script would be nice... In hopes that this way makes more sense, you'll want something like the below... (warning: untested) // DEPENDENCY: Token Collisions // (in script library) // When a token is added on ( 'add:graphic' , ( newToken ) => { // Only bother if the newly-created token is a Darkness spell effect if ( token . get ( 'name' ) !== 'Darkness' ) return ; // get list of tokens on token layer on this page const currentPageTokens = findObjs ({ _pageid : Campaign (). get ( "playerpageid" ), _type : "graphic" , layer : 'objects' }); // define an array let collidingTokens = []; // Check each token for collisions currentPageTokens . forEach (( existingToken ) => { // Ignore tokens without attached sheets or vision if ( ! existingToken . get ( 'represents' ) || ! existingToken . get ( 'light_hassight' )) return ; // Using Token Collision's isOverlapping() function if ( isOverlapping ( newToken , existingToken , false )) { // Add this to the list collidingTokens . push ( existingToken ); // Blind the token existingToken . set ( 'light_hassight' , false ); } }); // Every 500ms, check to see if the tokens have moved away from the darkaness // and should get their sight back setTimeout ( checkForVisionClear , 500 , newToken , collidingTokens ); }); // Check to see if they are no longer overlapping. If they are, erase them from the list const checkForVisionClear = ( darknessToken , characterTokens ) => { let stillOverlapping = []; characterTokens . forEach (( charToken ) => { // If it's still overlapping, let's try again later if ( isOverlapping ( darknessToken , charToken , false )) { stillOverlapping . push ( charToken ); } else { // Restore the token's sight existingToken . set ( 'light_hassight' , true ); } }); if ( stillOverlapping . length > 0 ) { setTimeout ( checkForVisionClear , 500 , darknessToken , stillOverlapping ); } };