View Javadoc

1   package cz.cuni.amis.pogamut.ut2004.agent.module.sensor;
2   
3   import java.util.ArrayList;
4   import java.util.Arrays;
5   import java.util.HashSet;
6   import java.util.List;
7   import java.util.Set;
8   
9   import cz.cuni.amis.pogamut.base3d.worldview.object.ILocated;
10  import cz.cuni.amis.pogamut.ut2004.agent.module.sensomotoric.Weapon;
11  import cz.cuni.amis.pogamut.ut2004.communication.messages.ItemType;
12  import cz.cuni.amis.utils.NullCheck;
13  
14  public class WeaponPrefsRange {
15  
16  	private double maxDistance;
17  	private WeaponPrefs owner;
18  	private List<WeaponPref> prefs = new ArrayList<WeaponPref>();
19  
20  	protected WeaponPrefsRange(WeaponPrefs owner, double maxDistance) {
21  		NullCheck.check(owner, "owner");
22  		this.owner = owner;
23  		this.maxDistance = maxDistance;
24  	}
25  	
26  	public WeaponPrefsRange(WeaponPrefs owner, WeaponPrefsRange prefs) {
27  		NullCheck.check(prefs, "prefs");
28  		NullCheck.check(owner, "owner");
29  		this.prefs.addAll(prefs.prefs);
30  		this.owner = owner;
31  		this.maxDistance = prefs.maxDistance;
32  	}
33  
34  	/**
35  	 * Adds another weapon as "the least preferable" one, i.e., you may define
36  	 * weapons from the most preferred to the least preferred by sequentially calling this method.
37  	 * 
38  	 * @param weapon weapon to be used
39  	 * @param usePrimaryMode true == use primary firing mode, false == use secondary firing mode
40  	 */
41  	public WeaponPrefsRange add(ItemType weapon, boolean usePrimaryMode) {
42  		NullCheck.check(weapon, "weapon");
43  		this.prefs.add(new WeaponPref(weapon, usePrimaryMode));
44  		return this;
45  	}
46  	
47  	/**
48  	 * Adds another weapon as "the least preferable" one, i.e., you may define
49  	 * weapons from the most preferred to the least preferred by sequentially calling this method.
50  	 * 
51  	 * @param weapon weapon to be used
52  	 * @param usePrimaryMode true == use primary firing mode, false == use secondary firing mode
53  	 * @return 
54  	 */
55  	public WeaponPrefsRange add(Weapon weapon, boolean usePrimaryMode) {
56  		NullCheck.check(weapon, "weapon");
57  		add(weapon.getType(), usePrimaryMode);
58  		return this;
59  	}
60  
61  	/**
62  	 * Minimum distance for preferences.
63  	 * @return
64  	 */
65  	public double getMinDistance() {
66  		WeaponPrefsRange next = owner.getPreviousRange(this);
67  		if (next == null) return 0;
68  		return next.getMaxDistance();
69  	}
70  	
71  	/**
72  	 * Maximum distance for preferences.
73  	 * @return
74  	 */
75  	public double getMaxDistance() {
76  		return maxDistance;
77  	}
78  	
79  	/**
80  	 * Return the best weapon the bot has for a given distance.
81  	 * @return
82  	 */
83  	public WeaponPref getWeaponPreference() {
84  		return getWeaponPreference((ItemType[])null);
85  	}
86  	
87  	/**
88  	 * Return the best weapon the bot has for a given distance.
89  	 * @param forbiddenWeapons optionally, you may define weapons which bot should not choose (i.e. {@link ItemType#ROCKET_LAUNCHER})
90  	 * @return
91  	 */
92  	public WeaponPref getWeaponPreference(ItemType... forbiddenWeapons) {
93  		List<ItemType> forbidden = (forbiddenWeapons == null ? new ArrayList<ItemType>(0) : Arrays.asList(forbiddenWeapons));
94  		for (WeaponPref pref : prefs) {
95  			if (forbidden.contains(pref.getWeapon())) continue;
96  			if (pref.isPrimary()) {
97  				if (owner.weaponry.hasPrimaryLoadedWeapon(pref.getWeapon())) return pref;
98  			} else {
99  				if (owner.weaponry.hasSecondaryLoadedWeapon(pref.getWeapon())) return pref;				
100 			}
101 		}
102 		return null;
103 	}
104 	
105 	/**
106 	 * Return the best weapon the bot has for a given distance.
107 	 * @param forbiddenWeapons optionally, you may define weapons/mode-of-fire which bot should not choose.
108 	 * @return
109 	 */
110 	public WeaponPref getWeaponPreference(WeaponPref... forbiddenWeapons) {
111 		Set<WeaponPref> forbidden = new HashSet<WeaponPref>();
112 		if (forbiddenWeapons != null) {
113 			for (WeaponPref pref : forbiddenWeapons) {
114 				forbidden.add(pref);
115 			}
116 		}
117 		for (WeaponPref pref : prefs) {
118 			if (forbidden.contains(pref)) continue;
119 			if (pref.isPrimary()) {
120 				if (owner.weaponry.hasPrimaryLoadedWeapon(pref.getWeapon())) return pref;
121 			} else {
122 				if (owner.weaponry.hasSecondaryLoadedWeapon(pref.getWeapon())) return pref;				
123 			}
124 		}
125 		return null;
126 	}
127 
128 	/**
129 	 * Clears all weapon preferences.
130 	 */
131 	public void clear() {
132 		prefs.clear();
133 	}
134 
135 	/**
136 	 * Returns list of preferences (from the most preferred one to the least one). You may alter it as you wish the class
137 	 * be using it.
138 	 * @return
139 	 */
140 	public List<WeaponPref> getPrefs() {
141 		return prefs;
142 	}
143 
144 	/**
145 	 * Set list of preferences to be used (from the most preferred one to the least one).
146 	 * @param prefs
147 	 */
148 	public void setPrefs(List<WeaponPref> prefs) {
149 		this.prefs = prefs;
150 	}
151 
152 	/**
153 	 * Owner of this preferences.
154 	 * @return
155 	 */
156 	public WeaponPrefs getOwner() {
157 		return owner;
158 	}
159 
160 }