Skip to content

Commit

Permalink
Fix bow/crossbow damage and add crit damage stat to their tooltip
Browse files Browse the repository at this point in the history
 * Closes #34
 * Closes #31
  • Loading branch information
squeek502 committed Apr 24, 2015
1 parent a510c9d commit 17228f8
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 3 deletions.
9 changes: 9 additions & 0 deletions java/squeek/tictooltips/TooltipHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -624,6 +624,15 @@ public List<String> getBowTooltip(ToolCore tool, NBTTagCompound toolTag, ItemSta
if (ToolHelper.hasToolTag(currentAmmo) && currentAmmo.getItem() instanceof ToolCore)
{
toolTip.addAll(getWeaponTooltip((ToolCore) currentAmmo.getItem(), ToolHelper.getToolTag(currentAmmo), projectileWeapon.getProjectileSpeed(itemStack)));

float[] critDamageRange = ToolHelper.getCriticalDamageRange((ToolCore) currentAmmo.getItem(), ToolHelper.getToolTag(currentAmmo), projectileWeapon.getProjectileSpeed(itemStack));
if (critDamageRange[1] != 0)
{
EnumChatFormatting textColor = critDamageRange[0] >= 0 ? EnumChatFormatting.DARK_GREEN : EnumChatFormatting.DARK_RED;
String bonusOrLoss = (critDamageRange[0] >= 0 ? StringHelper.getLocalizedString("gui.toolstation4") : StringHelper.getLocalizedString("gui.toolstation5"));
bonusOrLoss = bonusOrLoss.substring(0, bonusOrLoss.length() - 2);
toolTip.add(EnumChatFormatting.DARK_GRAY + "- " + StatCollector.translateToLocalFormatted("tictooltips.tool.crit.damage", bonusOrLoss) + textColor + StringHelper.getDamageNumberString(critDamageRange[0]) + "-" + StringHelper.getDamageString(critDamageRange[1]));
}
}
else if (currentAmmo.getItem() == Items.arrow)
{
Expand Down
10 changes: 10 additions & 0 deletions java/squeek/tictooltips/helpers/StringHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,21 @@ public static String getDamageString(int attack)
return damageNum + heart;
}

public static String getDamageString(float attack)
{
return getDamageString((int) attack);
}

public static String getDamageNumberString(int attack)
{
return df.format(attack / 2f);
}

public static String getDamageNumberString(float attack)
{
return getDamageNumberString((int) attack);
}

public static String getShoddinessTypeString(float shoddiness)
{
return shoddiness > 0 ? StringHelper.getLocalizedString("material.stone.ability") : (shoddiness < 0 ? StringHelper.getLocalizedString("material.cactus.ability") : "");
Expand Down
42 changes: 39 additions & 3 deletions java/squeek/tictooltips/helpers/ToolHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import tconstruct.library.tools.HarvestTool;
import tconstruct.library.tools.ToolCore;
import tconstruct.library.tools.ToolMaterial;
import tconstruct.library.weaponry.AmmoItem;
import tconstruct.library.weaponry.AmmoWeapon;
import tconstruct.library.weaponry.IAmmo;
import tconstruct.tools.TinkerTools;
Expand Down Expand Up @@ -152,7 +153,25 @@ public static int getRawDamage(ToolCore tool, NBTTagCompound toolTag)

public static int getDamage(ToolCore tool, NBTTagCompound toolTag, float damageModifier)
{
float attack = toolTag.getInteger("Attack") * damageModifier;
return (int) getPreciseDamage(tool, toolTag, damageModifier);
}

public static float getPreciseDamage(ToolCore tool, NBTTagCompound toolTag, float damageModifier)
{
float attack;
if ((Item) tool instanceof AmmoItem && toolTag.hasKey("BaseAttack"))
{
float baseAttack = toolTag.getInteger("BaseAttack");
float totalAttack = toolTag.getInteger("Attack");
attack = baseAttack * damageModifier; // damageModifier is the projectile speed here

// add quartz damage
attack += (totalAttack - baseAttack);

attack = Math.max(0, attack - totalAttack / 2f);
}
else
attack = toolTag.getInteger("Attack") * damageModifier;
attack += getShoddinessDamageBonus(tool, toolTag);
attack *= tool.getDamageModifier();
if (tool instanceof AmmoWeapon)
Expand All @@ -162,12 +181,29 @@ public static int getDamage(ToolCore tool, NBTTagCompound toolTag, float damageM
if (attack < 1)
attack = 1;

return (int) attack;
return attack;
}

public static int getDamage(ToolCore tool, NBTTagCompound toolTag)
{
return getDamage(tool, toolTag, 1f);
return (int) getPreciseDamage(tool, toolTag);
}

public static float getPreciseDamage(ToolCore tool, NBTTagCompound toolTag)
{
return getPreciseDamage(tool, toolTag, 1f);
}

public static float[] getCriticalDamageRange(ToolCore tool, NBTTagCompound toolTag, float damageModifier)
{
float attack = getPreciseDamage(tool, toolTag, damageModifier);

// the real formula (from ProjectileBase.onHitEntity):
// (this.rand.nextFloat()/4f + Math.min(0.75f, distance/25f)) * (damage / 2f + 2f);
float minCritDamage = 0.0f;
float maxCritDamage = (1.0f / 4f + 0.75f) * (attack / 2f + 2f);

return new float[]{minCritDamage, maxCritDamage};
}

public static int getSprintDamage(ToolCore tool, NBTTagCompound toolTag)
Expand Down
1 change: 1 addition & 0 deletions resources/assets/tictooltips/lang/en_US.lang
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ tictooltips.tool.chance.to.behead=Chance to Behead:
tictooltips.tool.modifiers=Modifiers:
tictooltips.tool.knockback=Knockback:
tictooltips.tool.sprint.damage=Sprint Damage:
tictooltips.tool.crit.damage=Crit Damage %s:

# generic
tictooltips.minimum=Min
Expand Down

0 comments on commit 17228f8

Please sign in to comment.