00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 package com.realtime.crossfire.jxclient.spells;
00023
00024 import com.realtime.crossfire.jxclient.skills.Skill;
00025 import com.realtime.crossfire.jxclient.skills.SkillSet;
00026 import com.realtime.crossfire.jxclient.stats.Stats;
00027 import com.realtime.crossfire.jxclient.util.EventListenerList2;
00028 import com.realtime.crossfire.jxclient.util.StringSplitter;
00029 import org.jetbrains.annotations.NotNull;
00030
00035 public class Spell {
00036
00040 @NotNull
00041 private final String name;
00042
00046 @NotNull
00047 private final EventListenerList2<SpellListener> listeners = new EventListenerList2<SpellListener>(SpellListener.class);
00048
00052 private int faceNum;
00053
00057 private int tag;
00058
00062 @NotNull
00063 private String message = "";
00064
00068 private int level;
00069
00073 private int castingTime;
00074
00078 private int mana;
00079
00083 private int grace;
00084
00088 private int damage;
00089
00093 private int skill;
00094
00098 private int path;
00099
00103 private boolean unknown = false;
00104
00108 private final SkillSet skillSet;
00109
00113 private final Stats stats;
00114
00120 public Spell(@NotNull final String name, @NotNull final SkillSet skillSet, @NotNull final Stats stats) {
00121 this.name = name;
00122 this.skillSet = skillSet;
00123 this.stats = stats;
00124 }
00125
00130 public int getTag() {
00131 return tag;
00132 }
00133
00138 public int getLevel() {
00139 return level;
00140 }
00141
00146 public int getCastingTime() {
00147 return castingTime;
00148 }
00149
00154 public int getMana() {
00155 return mana;
00156 }
00157
00162 public int getGrace() {
00163 return grace;
00164 }
00165
00170 public int getDamage() {
00171 return damage;
00172 }
00173
00178 public int getSkill() {
00179 return skill;
00180 }
00181
00186 public int getPath() {
00187 return path;
00188 }
00189
00194 @NotNull
00195 public String getName() {
00196 return name;
00197 }
00198
00203 @NotNull
00204 public String getMessage() {
00205 return message;
00206 }
00207
00212 public int getFaceNum() {
00213 return faceNum;
00214 }
00215
00220 public boolean isUnknown() {
00221 return unknown;
00222 }
00223
00228 public void setUnknown(final boolean unknown) {
00229 if (this.unknown != unknown) {
00230 this.unknown = unknown;
00231 fireChanged();
00232 }
00233 }
00234
00248 public void setParameters(final int faceNum, final int tag, @NotNull final String message, final int level, final int castingTime, final int mana, final int grace, final int damage, final int skill, final int path) {
00249 boolean changed = false;
00250
00251 if (this.faceNum != faceNum) {
00252 this.faceNum = faceNum;
00253 changed = true;
00254 }
00255
00256 if (this.tag != tag) {
00257 this.tag = tag;
00258 changed = true;
00259 }
00260
00261 if (!this.message.equals(message)) {
00262 this.message = message;
00263 changed = true;
00264 }
00265
00266 if (this.level != level) {
00267 this.level = level;
00268 changed = true;
00269 }
00270
00271 if (this.castingTime != castingTime) {
00272 this.castingTime = castingTime;
00273 changed = true;
00274 }
00275
00276 if (this.mana != mana) {
00277 this.mana = mana;
00278 changed = true;
00279 }
00280
00281 if (this.grace != grace) {
00282 this.grace = grace;
00283 changed = true;
00284 }
00285
00286 if (this.damage != damage) {
00287 this.damage = damage;
00288 changed = true;
00289 }
00290
00291 if (this.skill != skill) {
00292 this.skill = skill;
00293 changed = true;
00294 }
00295
00296 if (this.path != path) {
00297 this.path = path;
00298 changed = true;
00299 }
00300
00301 if (unknown) {
00302 unknown = false;
00303 changed = true;
00304 }
00305
00306 if (changed) {
00307 fireChanged();
00308 }
00309 }
00310
00320 public void updateParameters(final boolean updateMana, final int mana, final boolean updateGrace, final int grace, final boolean updateDamage, final int damage) {
00321 boolean changed = false;
00322
00323 if (updateMana && this.mana != mana) {
00324 this.mana = mana;
00325 changed = true;
00326 }
00327
00328 if (updateGrace && this.grace != grace) {
00329 this.grace = grace;
00330 changed = true;
00331 }
00332
00333 if (updateDamage && this.damage != damage) {
00334 this.damage = damage;
00335 changed = true;
00336 }
00337
00338 if (changed) {
00339 fireChanged();
00340 }
00341 }
00342
00346 @NotNull
00347 @Override
00348 public String toString() {
00349 return "Name:"+name+" ID:"+tag+" Level:"+level+" Time:"+castingTime+" Mana:"+mana+" Grace:"+grace+" Damage:"+damage+" Skill:"+skill+" Path:"+path+" Unknown:"+unknown;
00350 }
00351
00356 @NotNull
00357 public String getTooltipText() {
00358 final StringBuilder sb = new StringBuilder("<b>");
00359 sb.append(name.substring(0, 1).toUpperCase()).append(name.substring(1));
00360 sb.append("</b>");
00361 if (unknown) {
00362 sb.append(" (unknown)");
00363 }
00364 if ((path & stats.getStat(Stats.CS_STAT_SPELL_DENY)) != 0) {
00365 sb.append("<br><b>Denied</b>");
00366 } else {
00367 final Skill sk = skillSet.getSkill(skill);
00368 if (sk != null) {
00369 sb.append("<br>Skill: ").append(sk.toString());
00370 }
00371 if (level > 0) {
00372 String supp = null;
00373 sb.append("<br>Level: ");
00374 if (sk != null && level <= sk.getLevel()) {
00375 int effective = sk.getLevel() - level;
00376 if ((path & stats.getStat(Stats.CS_STAT_SPELL_ATTUNE)) != 0) {
00377 effective += 2;
00378 supp = " (attuned)";
00379 } else if ((path & stats.getStat(Stats.CS_STAT_SPELL_REPEL)) != 0) {
00380 effective -= 2;
00381 supp = " (repelled)";
00382 }
00383 sb.append(effective);
00384 if (supp != null) {
00385 sb.append(supp);
00386 }
00387 } else {
00388 sb.append(level);
00389 }
00390 }
00391 if (mana > 0) {
00392 sb.append("<br>Mana: ").append(mana);
00393 }
00394 if (grace > 0) {
00395 sb.append("<br>Grace: ").append(grace);
00396 }
00397 if (damage > 0) {
00398 sb.append("<br>Damage: ").append(damage);
00399 }
00400 }
00401 if (message.length() > 0) {
00402 sb.append("<br>");
00403 sb.append(StringSplitter.splitAsHtml(message));
00404 }
00405 return sb.toString();
00406 }
00407
00411 private void fireChanged() {
00412 for (final SpellListener listener : listeners.getListeners()) {
00413 listener.spellChanged();
00414 }
00415 }
00416
00421 public void addSpellListener(@NotNull final SpellListener listener) {
00422 listeners.add(listener);
00423 }
00424
00429 public void removeSpellListener(@NotNull final SpellListener listener) {
00430 listeners.remove(listener);
00431 }
00432
00433 }