@Override public boolean tick(Tickable ticking, int tickID) { if (!super.tick(ticking, tickID)) return false; if ((tickID == Tickable.TICKID_MOB) && (invoker() != null) && (affected instanceof MOB)) { final MOB mob = (MOB) affected; final Set<MOB> invokerGroup = invoker().getGroupMembers(new HashSet<MOB>()); if (mob != invoker()) { if (mob.location() != invoker().location()) unInvoke(); else { if (invokerGroup.contains(mob)) unInvoke(); else if (mob.isInCombat()) { int levels = invoker().charStats().getClassLevel("Templar"); if (levels < 0) levels = invoker().phyStats().level(); if (CMLib.dice().rollPercentage() >= levels) { final MOB newvictim = mob.location().fetchRandomInhabitant(); if (newvictim != mob) mob.setVictim(newvictim); } } } } else if ((mob.location() != null) && (CMLib.flags().isEvil(invoker()))) { for (int m = 0; m < mob.location().numInhabitants(); m++) { final MOB M = mob.location().fetchInhabitant(m); if ((M != null) && (M != invoker()) && (!invokerGroup.contains(M)) && (!M.Name().equals(mob.getLiegeID()))) beneficialAffect(invoker, M, 0, Ability.TICKS_FOREVER); } } } return true; }
@Override public boolean isValidClassDivider(MOB killer, MOB killed, MOB mob, Set<MOB> followers) { if ((mob != null) && (mob != killed) && (!mob.amDead()) && ((!mob.isMonster()) || (!CMLib.flags().isAnimalIntelligence(mob))) && ((mob.getVictim() == killed) || (followers.contains(mob)) || (mob == killer))) return true; return false; }
@Override public void setRacialStat(final int abilityCode, final int racialMax) { if ((!CharStats.CODES.isBASE(abilityCode)) || (getStat(abilityCode) == VALUE_ALLSTATS_DEFAULT)) setPermanentStat(abilityCode, racialMax); else { final int baseMax = CMProps.getIntVar(CMProps.Int.BASEMAXSTAT); int currMax = getStat(CharStats.CODES.toMAXBASE(abilityCode)) + baseMax; if (currMax <= 0) currMax = 1; int curStat = getStat(abilityCode); if (curStat > currMax * 7) { final String errorMsg = "Detected mob with " + curStat + "/" + currMax + " " + CharStats.CODES.ABBR(abilityCode); @SuppressWarnings({"unchecked", "rawtypes"}) Set<String> errs = (Set) Resources.getResource("SYSTEM_DEFCHARSTATS_ERRORS"); if (errs == null) { errs = new TreeSet<String>(); Resources.submitResource("SYSTEM_DEFCHARSTATS_ERRORS", errs); } if (!errs.contains(errorMsg)) { errs.add(errorMsg); final StringBuilder str = new StringBuilder(errorMsg); // ByteArrayOutputStream stream=new ByteArrayOutputStream(); // new Exception().printStackTrace(new PrintStream(stream)); // str.append("\n\r"+new String(stream.toByteArray())); Log.errOut("DefCharStats", str.toString()); } curStat = currMax * 7; } final int pctOfMax = Math.round(((float) curStat / (float) currMax) * racialMax); final int stdMaxAdj = Math.round((((float) (currMax - VALUE_ALLSTATS_DEFAULT)) / (float) currMax) * racialMax); final int racialStat = pctOfMax + stdMaxAdj; setStat(abilityCode, ((racialStat < 1) && (racialMax > 0)) ? 1 : racialStat); setStat(CharStats.CODES.toMAXBASE(abilityCode), racialMax - baseMax); } }
@Override public void spring(MOB mob) { final Room room = mob.location(); if (room != null) { final Set<MOB> friendlySet = new HashSet<MOB>(); if (invoker() != null) invoker().getGroupMembers(friendlySet); room.show( mob, affected, CMMsg.MSG_OK_ACTION, L("<T-NAME> explodes, spraying clumps of stomach acid everywhere!")); for (final Enumeration<MOB> m = room.inhabitants(); m.hasMoreElements(); ) { MOB M = m.nextElement(); if ((M != null) && (!friendlySet.contains(M))) { final MOB invoker = (invoker() != null) ? invoker() : M; final int damage = CMLib.dice().roll(4, 5 + invoker.phyStats().level(), 0); CMLib.combat() .postDamage( invoker, M, this, damage, CMMsg.MASK_MALICIOUS | CMMsg.MASK_ALWAYS | CMMsg.TYP_ACID, Weapon.TYPE_MELTING, L("The acid clumps <DAMAGE> <T-NAME>!")); if ((!M.isInCombat()) && (M.isMonster()) && (M != invoker) && (M.location() == invoker.location()) && (M.location().isInhabitant(invoker)) && (CMLib.flags().canBeSeenBy(invoker, M))) CMLib.combat().postAttack(M, invoker, M.fetchWieldedItem()); } } } Physical affected = this.affected; unInvoke(); if (affected instanceof Item) ((Item) affected).destroy(); }
public boolean dbMerge(MOB mob, String name, Modifiable dbM, Modifiable M, Set<String> ignores) throws java.io.IOException, CMException { if ((M instanceof Physical) && (dbM instanceof Physical)) { final Physical PM = (Physical) M; final Physical dbPM = (Physical) dbM; if (CMLib.flags().isCataloged(PM)) { mob.tell(L("^H**Warning: Changes will remove this object from the catalog.")); PM.basePhyStats() .setDisposition(CMath.unsetb(PM.basePhyStats().disposition(), PhyStats.IS_CATALOGED)); } if (CMLib.flags().isCataloged(dbPM)) dbPM.basePhyStats() .setDisposition(CMath.unsetb(dbPM.basePhyStats().disposition(), PhyStats.IS_CATALOGED)); PM.image(); dbPM.image(); } final String[] statCodes = dbM.getStatCodes(); int showFlag = -1; if (CMProps.getIntVar(CMProps.Int.EDITORTYPE) > 0) showFlag = -999; boolean ok = false; boolean didSomething = false; while (!ok) { int showNumber = 0; mob.tell(name); for (int i = 0; i < statCodes.length; i++) { final String statCode = M.getStatCodes()[i]; if (ignores.contains(statCode) || ((M instanceof MOB) && statCode.equalsIgnoreCase("INVENTORY"))) continue; final String promptStr = CMStrings.capitalizeAndLower(M.getStatCodes()[i]); final String dbVal = dbM.getStat(statCode); final String loVal = M.getStat(statCode); if (dbVal.equals(loVal)) continue; ++showNumber; if ((showFlag > 0) && (showFlag != showNumber)) continue; mob.tell( L( "^H@x1. @x2\n\rValue: ^W'@x3'\n\r^HDBVal: ^N'@x4'", "" + showNumber, promptStr, loVal, dbVal)); if ((showFlag != showNumber) && (showFlag > -999)) continue; final String res = mob.session() .choose( L("D)atabase Value, E)dit Value, or N)o Change, or Q)uit All: "), L("DENQ"), L("N")); if (res.trim().equalsIgnoreCase("N")) continue; if (res.trim().equalsIgnoreCase("Q")) throw new CMException("Cancelled by user."); didSomething = true; if (res.trim().equalsIgnoreCase("D")) { M.setStat(statCode, dbVal); continue; } M.setStat( statCode, CMLib.genEd().prompt(mob, M.getStat(statCode), ++showNumber, showFlag, promptStr)); } if (showNumber == 0) return didSomething; if (showFlag < -900) { ok = true; break; } if (showFlag > 0) { showFlag = -1; continue; } showFlag = CMath.s_int(mob.session().prompt(L("Edit which? "), "")); if (showFlag <= 0) { showFlag = -1; ok = true; } } return didSomething; }