* beagled/QueryDriver.cs,beagled/PropertyKeywordFu.cs,
[beagle.git] / Tiles / HitToHitFlavor.cs
blob4807e29ef4963353b99bbe27ff4dab122c10afa8
1 //
2 // HitToHitFlavor.cs
3 //
4 // Copyright (C) 2004 Novell, Inc.
5 //
7 //
8 // Permission is hereby granted, free of charge, to any person obtaining a
9 // copy of this software and associated documentation files (the "Software"),
10 // to deal in the Software without restriction, including without limitation
11 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 // and/or sell copies of the Software, and to permit persons to whom the
13 // Software is furnished to do so, subject to the following conditions:
15 // The above copyright notice and this permission notice shall be included in
16 // all copies or substantial portions of the Software.
18 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
24 // DEALINGS IN THE SOFTWARE.
27 using System;
28 using System.Collections;
29 using System.Reflection;
31 namespace Beagle.Tile {
33 public class HitToHitFlavor {
35 private HitToHitFlavor () { } // This class is static
37 static ArrayList flavorArray = null;
39 static private void ScanAssembly (Assembly assembly)
41 foreach (Type type in assembly.GetTypes ()) {
42 if (type.IsSubclassOf (typeof (Tile))) {
43 foreach (object obj in Attribute.GetCustomAttributes (type)) {
44 if (obj is HitFlavor) {
45 HitFlavor flavor = (HitFlavor) obj;
46 flavor.TileType = type;
47 flavorArray.Add (flavor);
54 static public HitFlavor Get (Hit hit)
56 if (flavorArray == null) {
57 flavorArray = new ArrayList ();
58 ScanAssembly (Assembly.GetExecutingAssembly ());
61 HitFlavor flavorBest = null;
62 int weightBest = -1;
64 foreach (HitFlavor flavor in flavorArray) {
65 if (flavor.IsMatch (hit)) {
66 int weight = flavor.Weight;
67 if (weight > weightBest) {
68 flavorBest = flavor;
69 weightBest = weight;
70 } else if (weight == weightBest && flavor.Name != flavorBest.Name) {
71 // This shouldn't happen.
72 Console.WriteLine ("HitFlavor Weight tie! {0} and {1}",
73 flavorBest, flavor);
78 return flavorBest;