From 70c1354a4a96698758a88c032866288f79de6f5a Mon Sep 17 00:00:00 2001 From: Benjamin Culkin Date: Sat, 24 Aug 2024 08:16:37 -0400 Subject: Initial commit --- .../java/jp/plusplus/fbs/spirit/SpiritStatus.java | 437 +++++++++++++++++++++ 1 file changed, 437 insertions(+) create mode 100644 src/main/java/jp/plusplus/fbs/spirit/SpiritStatus.java (limited to 'src/main/java/jp/plusplus/fbs/spirit/SpiritStatus.java') diff --git a/src/main/java/jp/plusplus/fbs/spirit/SpiritStatus.java b/src/main/java/jp/plusplus/fbs/spirit/SpiritStatus.java new file mode 100644 index 0000000..3517218 --- /dev/null +++ b/src/main/java/jp/plusplus/fbs/spirit/SpiritStatus.java @@ -0,0 +1,437 @@ +package jp.plusplus.fbs.spirit; + +import jp.plusplus.fbs.exprop.FBSEntityProperties; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.util.MathHelper; + +import java.util.ArrayList; +import java.util.Random; + +/** + * Created by plusplus_F on 2015/11/02. + * 精霊武器のステータスクラス + * NBTで読み書きする + */ +public class SpiritStatus { + private static Random random=new Random(); + private static float log255=2.40654f; + + public static final short LEVEL_MAX=50; + public static final short STATUS_MAX=255; + public static final short FOOD_LEVEL_MAX=128; + + //基本 + private boolean isMale; + private String character; //人格名 + private String name; //プレイヤーのつけた名前 + private String owner; //所有者の名前 + private short level=1; + private double next; + private double exp; + private int itemDamage; //減ってる耐久値 + private short skillPoint; + private int lastBlessDate=-1; + private short foodLevel=FOOD_LEVEL_MAX; + + /** + * ダメージとか採掘レベルに関係する + */ + private short strength; + private float maxDamage; + private float maxHarvestLevel; + + /** + * 最大耐久に関係 + */ + private short toughness; + private float maxDurability; + + /** + * 精霊の所持スキル + */ + private ArrayList skills=new ArrayList(); + + /** + * 精霊の設定 + */ + private Configuration configuration=new Configuration(); + + public SpiritStatus(boolean isMale, String character, String name, EntityPlayer owner){ + this(); + this.isMale=isMale; + this.character=character; + this.name=name; + this.owner=owner.getDisplayName(); + } + public SpiritStatus(){ + level=0; + levelUp(); + } + + public static SpiritStatus readFromNBT(NBTTagCompound nbt){ + if(nbt==null) return null; + SpiritStatus ss=new SpiritStatus(); + + ss.isMale=nbt.getBoolean("isMale"); + ss.character=nbt.getString("character"); + ss.name=nbt.getString("name"); + ss.owner=nbt.getString("owner"); + ss.level=nbt.getShort("level"); + ss.next=nbt.getDouble("next"); + ss.exp=nbt.getDouble("exp"); + ss.itemDamage=nbt.getInteger("itemDamage"); + ss.skillPoint=nbt.getShort("skillPt"); + ss.lastBlessDate=nbt.getInteger("lastBlessDate"); + ss.foodLevel=nbt.getShort("FoodLevel"); + + ss.strength=nbt.getShort("strength"); + ss.toughness=nbt.getShort("toughness"); + ss.maxDamage=nbt.getFloat("maxDamage"); + ss.maxHarvestLevel=nbt.getFloat("maxHarvestLevel"); + ss.maxDurability=nbt.getFloat("maxDurability"); + + NBTTagList list=(NBTTagList)nbt.getTag("skills"); + for(int i=0;i=next && level0 && level%10==0 && random.nextFloat()<0.125f){ + setSkill("fbs.blood", 0); + } + } + + public void addStrength(int p){ + if(p<0) return; + strength+=p; + if(strength>STATUS_MAX) strength=STATUS_MAX; + } + public void addToughness(int p){ + if(p<0) return; + toughness+=p; + if(toughness>STATUS_MAX) toughness=STATUS_MAX; + } + public void addItemDamage(int p) { + if (p < 0) return; + itemDamage += p; + } + public void setItemDamage(int p){ + if (p < 0) return; + itemDamage=p; + } + + public void reduceSkillPoint(){ + if(skillPoint>0) skillPoint--; + } + + public void updateLastBlessDate(int d){ lastBlessDate=d; } + public void repair(int r){ + if(r<0) return; + itemDamage-=r; + if(itemDamage<0) itemDamage=0; + } + + /** + * 各種最大値を設定する。 + * 先天スキルの影響を受ける + * @param maxDamage + * @param maxHarvestLevel + * @param maxDurability + */ + public void setMaxStatus(float maxDamage, float maxHarvestLevel, float maxDurability){ + float rate=1.f; + float rateDamage=1.f; + float rateHL=1.f; + float rateDurability=1.f; + for(SkillManager.SkillData se : getSkills()){ + if(se.getSkill().getName().equals("fbs.precocious")){ + rate=0.75f; + break; + } + else if(se.getSkill().getName().equals("fbs.lateBloomer")){ + rate=1.25f; + break; + } + else if(se.getSkill().getName().equals("fbs.skillful")){ + rate=0.80f; + break; + } + else if(se.getSkill().getName().equals("fbs.hero")){ + rateDamage=1.5f; + rateHL=1.25f; + rateDurability=0.75f; + break; + } + else if(se.getSkill().getName().equals("fbs.patient")){ + rateDamage=0.75f; + rateDurability=1.5f; + break; + } + else if(se.getSkill().getName().equals("fbs.sentimental")){ + rate=0.8f; + break; + } + } + + this.maxDamage=maxDamage*rate*rateDamage; + this.maxHarvestLevel=maxHarvestLevel*rate*rateHL; + this.maxDurability=maxDurability*rate*rateDurability; + } + + /** + * ステータス最大値(255)との割合を計算する。 + * このとき、各種先天スキルの影響を受ける。 + * @param param + * @return + */ + public float calcRatio(int param){ + int type=0; + for(SkillManager.SkillData se : getSkills()){ + if(se.getSkill().getName().equals("fbs.precocious")){ + type=1; + break; + } + else if(se.getSkill().getName().equals("fbs.lateBloomer")){ + type=2; + break; + } + } + + float rate=0; + switch (type){ + case 1: + rate=(param==0?0:(float)Math.log(param)/log255); + break; + + case 2: + rate=(float)(param*param)/(float)(STATUS_MAX*STATUS_MAX); + break; + + default: + rate=(float)param/STATUS_MAX; + } + + return rate; + } + + public short getLv(){ return level; } + public short getStrength(){ return strength; } + public float getMaxDamage(){ return maxDamage; } + public float getMaxHarvestLevel(){ return maxHarvestLevel; } + public short getToughness(){ return toughness; } + public float getMaxDurability(){ return maxDurability; } + public String getName(){ return name; } + public String getOwnerName(){ return owner; } + public String getCharacter(){ return character; } + public int getItemDamage(){ return itemDamage; } + public int getLastBlessDate(){ return lastBlessDate; } + public short getSkillPoint(){ return skillPoint; } + public short getFoodLevel(){ return foodLevel; } + + public void setFoodLevel(int food){ + this.foodLevel=(short)food; + } + + /** + * スキルをセットする + * @param name + * @param lv + */ + public void setSkill(String name, int lv){ + SkillManager.Skill skill=SkillManager.getSkill(name); + if(skill==null) return; + if(lv>=skill.getLvMax()) lv=skill.getLvMax()-1; + + //すでにそのスキルを所持している場合上書き + for(SkillManager.SkillData se : skills){ + if(se.isSkillEqual(skill)){ + se.lv=lv; + return; + } + } + + //そうでないなら新しく + skills.add(new SkillManager.SkillData(skill.getId(), lv)); + } + + /** + * そのスキルを所持しているか判定する + * @param name + * @return + */ + public boolean hasSkill(String name){ + SkillManager.Skill skill=SkillManager.getSkill(name); + if(skill==null) return false; + for(SkillManager.SkillData se : skills){ + if(se.isSkillEqual(skill)){ + return true; + } + } + return false; + } + + /** + * そのスキルのレベルを得る + * @param name + * @return スキルを所持していない場合-1 + */ + public int getSkillLevel(String name){ + SkillManager.Skill skill=SkillManager.getSkill(name); + if(skill==null) return -1; + for(SkillManager.SkillData se : skills){ + if(se.isSkillEqual(skill)){ + return se.lv; + } + } + return -1; + } + public int getSkillLevel(int id){ + for(SkillManager.SkillData se : skills){ + if(se.isSkillEqual(id)){ + return se.lv; + } + } + return -1; + } + + public ArrayList getSkills(){ return skills; } + public Configuration getConfiguration(){ return configuration; } + + /** + * 精霊武器の設定 + */ + public static class Configuration{ + private ArrayList configs=new ArrayList(); + + public Configuration(){ + add("enableMessage", true); + add("enableTimeSignalMessage", true); + } + + public void add(String key){ + add(key, false); + } + public void add(String key, boolean value){ + configs.add(new Pair(key, value)); + } + public void update(String key, boolean value){ + for(Pair p : configs){ + if(p.key.equals(key)){ + p.value=value; + break; + } + } + } + public boolean get(String key){ + for(Pair p : configs){ + if(p.key.equals(key)){ + return p.value; + } + } + return false; + } + public ArrayList getKeys(){ + ArrayList ret=new ArrayList(); + for(Pair p : configs){ + ret.add(p.key); + } + return ret; + } + + public void writeToNBT(NBTTagCompound nbt){ + for(Pair p : configs){ + nbt.setBoolean(p.key, p.value); + } + } + public void readFromNBT(NBTTagCompound nbt){ + for(Pair p :configs){ + update(p.key, nbt.getBoolean(p.key)); + } + } + + private class Pair{ + private String key; + private boolean value; + public Pair(String key, boolean value){ + this.key=key; + this.value=value; + } + } + } +} -- cgit v1.2.3