2009-04-19 18:07:22 +00:00
#region = = = = = = = = = = = = = = = = = = Copyright ( c ) 2007 Pascal vd Heiden
/ *
* Copyright ( c ) 2007 Pascal vd Heiden , www . codeimp . com
* This program is released under GNU General Public License
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* /
#endregion
#region = = = = = = = = = = = = = = = = = = Namespaces
using System ;
using System.Collections.Generic ;
using System.Drawing ;
2016-02-22 08:04:06 +00:00
using System.Windows.Forms ;
2009-04-19 18:07:22 +00:00
using CodeImp.DoomBuilder.Config ;
2016-02-22 08:04:06 +00:00
using CodeImp.DoomBuilder.Map ;
2009-04-19 18:07:22 +00:00
#endregion
namespace CodeImp.DoomBuilder.BuilderModes
{
[FindReplace("Sector Effect", BrowseButton = true)]
2014-01-10 15:08:39 +00:00
internal class FindSectorEffect : BaseFindSector
2009-04-19 18:07:22 +00:00
{
#region = = = = = = = = = = = = = = = = = = Constants
#endregion
#region = = = = = = = = = = = = = = = = = = Variables
#endregion
#region = = = = = = = = = = = = = = = = = = Properties
2010-09-01 14:36:31 +00:00
public override Image BrowseImage { get { return Properties . Resources . List ; } }
2009-04-19 18:07:22 +00:00
#endregion
#region = = = = = = = = = = = = = = = = = = Constructor / Destructor
#endregion
#region = = = = = = = = = = = = = = = = = = Methods
// This is called when the browse button is pressed
public override string Browse ( string initialvalue )
{
int effect ;
int . TryParse ( initialvalue , out effect ) ;
2016-02-21 00:11:09 +00:00
return General . Interface . BrowseSectorEffect ( BuilderPlug . Me . FindReplaceForm , effect , true ) . ToString ( ) ;
2009-04-19 18:07:22 +00:00
}
2016-02-21 00:11:09 +00:00
//mxd. This is called when the browse replace button is pressed
public override string BrowseReplace ( string initialvalue )
{
int effect ;
int . TryParse ( initialvalue , out effect ) ;
return General . Interface . BrowseSectorEffect ( BuilderPlug . Me . FindReplaceForm , effect ) . ToString ( ) ;
}
2009-04-19 18:07:22 +00:00
// This is called to perform a search (and replace)
// Returns a list of items to show in the results list
// replacewith is null when not replacing
2014-11-05 12:32:48 +00:00
public override FindReplaceObject [ ] Find ( string value , bool withinselection , bool replace , string replacewith , bool keepselection )
2009-04-19 18:07:22 +00:00
{
List < FindReplaceObject > objs = new List < FindReplaceObject > ( ) ;
// Interpret the replacement
int replaceeffect = 0 ;
2014-11-05 12:32:48 +00:00
if ( replace )
2009-04-19 18:07:22 +00:00
{
// If it cannot be interpreted, set replacewith to null (not replacing at all)
if ( ! int . TryParse ( replacewith , out replaceeffect ) ) replacewith = null ;
if ( replaceeffect < 0 ) replacewith = null ;
if ( replaceeffect > Int16 . MaxValue ) replacewith = null ;
if ( replacewith = = null )
{
MessageBox . Show ( "Invalid replace value for this search type!" , "Find and Replace" , MessageBoxButtons . OK , MessageBoxIcon . Error ) ;
return objs . ToArray ( ) ;
}
}
// Interpret the number given
2014-02-21 14:42:12 +00:00
int effect ;
2009-04-19 18:07:22 +00:00
if ( int . TryParse ( value , out effect ) )
{
2014-09-04 13:48:22 +00:00
//mxd
2016-06-22 13:38:27 +00:00
SectorEffectData sd = General . Map . Config . GetSectorEffectData ( effect ) ;
2014-09-04 13:48:22 +00:00
2009-05-09 11:37:55 +00:00
// Where to search?
2016-06-22 13:38:27 +00:00
ICollection < Sector > list = ( withinselection ? General . Map . Map . GetSelectedSectors ( true ) : General . Map . Map . Sectors ) ;
2009-05-09 11:37:55 +00:00
2009-04-19 18:07:22 +00:00
// Go for all sectors
2009-05-09 11:37:55 +00:00
foreach ( Sector s in list )
2009-04-19 18:07:22 +00:00
{
2016-06-22 13:38:27 +00:00
bool match = false ;
//mxd. Effect matches? -1 means any effect
if ( effect = = - 1 )
{
match = s . Effect > 0 ;
}
else if ( effect = = s . Effect )
{
match = true ;
}
else if ( General . Map . Config . GeneralizedEffects & & effect ! = 0 & & s . Effect ! = 0 )
{
SectorEffectData sdo = General . Map . Config . GetSectorEffectData ( s . Effect ) ;
2019-10-19 18:58:30 +00:00
// It's a bit complicated, so use the following logic:
// Searching for normal effect + generalized effect -> sector has to have both (plus optionally other generalized effects)
// Searching for generalized effect -> sector has to have this generalized effect (plus optionally other generalized effects) and optionally any normal effect
// Searching for normal effect -> sector has to have normal effect and optionally any generalized effect
if ( sd . Effect ! = 0 & & sd . GeneralizedBits . Count > 0 )
match = sd . Effect = = sdo . Effect & & sd . GeneralizedBits . IsSubsetOf ( sdo . GeneralizedBits ) ;
else if ( sd . GeneralizedBits . Count > 0 )
match = sd . GeneralizedBits . IsSubsetOf ( sdo . GeneralizedBits ) ;
else if ( sd . Effect = = sdo . Effect )
match = true ;
2016-06-22 13:38:27 +00:00
}
if ( match )
2009-04-19 18:07:22 +00:00
{
// Replace
2014-11-05 12:32:48 +00:00
if ( replace ) s . Effect = replaceeffect ;
2009-04-19 18:07:22 +00:00
SectorEffectInfo info = General . Map . Config . GetSectorEffectInfo ( s . Effect ) ;
if ( ! info . IsNull )
2009-06-05 19:03:56 +00:00
objs . Add ( new FindReplaceObject ( s , "Sector " + s . Index + " (" + info . Title + ")" ) ) ;
2009-04-19 18:07:22 +00:00
else
2009-06-05 19:03:56 +00:00
objs . Add ( new FindReplaceObject ( s , "Sector " + s . Index ) ) ;
2009-04-19 18:07:22 +00:00
}
}
}
return objs . ToArray ( ) ;
}
#endregion
}
}