Browse Source

装备属性设计

toby 1 year ago
parent
commit
1887d620fc

+ 1 - 1
logic/a-logic-common/src/main/java/com/iohao/mmo/common/kit/RandomKit.java

@@ -57,7 +57,7 @@ public class RandomKit {
      * @return boolean
      */
     public static int randomFromInt(int randomMin,int randomMax) {
-        return randomFromArr(BigDecimal.valueOf(randomMin),
+        return randomFromBigDecimal(BigDecimal.valueOf(randomMin),
                 BigDecimal.valueOf(randomMax))
                 .intValue();
 

+ 24 - 15
logic/equip-logic/src/main/java/com/iohao/mmo/equip/entity/Equip.java

@@ -25,6 +25,8 @@ import lombok.experimental.FieldDefaults;
 import org.springframework.data.annotation.Id;
 import org.springframework.data.mongodb.core.mapping.Document;
 
+import java.util.List;
+
 /**
  * 装备
  *
@@ -46,22 +48,29 @@ public class Equip {
     int position;
     /** 要求等级 */
     int level;
-    /** 鉴定次数 */
-    int identifyCount;
-    /** 装备固定属性最小值 */
-    FixedEquipProperty fixedEquipPropertyMin;
-    /** 装备固定属性最大值 */
-    FixedEquipProperty fixedEquipPropertyMax;
-    /** 装备固定属性 */
-    FixedEquipProperty fixedEquipProperty;
-    /** 品质 1普通,2极品*/
+    /** 品质 1白色,2黄色,3绿色,4蓝色,5紫色,6鬼装*/
     int quality;
-    /** 自定义属性随机范围最小值 */
-    int totalAttrMin;
-    /** 自定义属性随机范围最大值 */
-    int totalAttrMax;
+    /** 基础属性鉴定次数 */
+    int identifyBasicCount;
+    /** 词条属性鉴定次数 */
+    int identifyEntryCount;
+    /** 装备基础属性最小值 */
+    EquipPropertyBasic equipPropertyBasicMin;
+    /** 装备基础属性最大值 */
+    EquipPropertyBasic equipPropertyBasicMax;
+    /** 装备基础属性 */
+    EquipPropertyBasic equipPropertyBasic;
+
+    /** 装备固定属性 */
+    List<EquipEntry> equipPropertyFixedList;
+
+    /** 随机属性最小条数 */
+    int equipPropertyRandomMin;
+    /** 随机属性最大条数 */
+    int equipPropertyRandomMax;
+    /** 装备随机属性 */
+    List<EquipEntry> equipPropertyRandomList;
+
     /** 装备库id */
     String equipTemplateId;
-    /** 额外属性 */
-    ElseEquipProperty elseEquipProperty;
 }

+ 4 - 4
logic/equip-logic/src/main/java/com/iohao/mmo/equip/entity/EquipEntry.java

@@ -24,6 +24,8 @@ import lombok.experimental.FieldDefaults;
 import org.springframework.data.annotation.Id;
 import org.springframework.data.mongodb.core.mapping.Document;
 
+import java.util.List;
+
 /**
  * 装备词条
  *
@@ -40,8 +42,6 @@ public class EquipEntry {
     String name;
     /** 描述 */
     String description;
-    /** 影响属性 */
-    String effectProperty;
-    /** 影响类型:1在装备上加,2在装备上增加百分比,3在全身增加百分比 */
-    int effectType;
+    /** 装备属性 */
+    List<EquipEntryProperty> entryPropertyList;
 }

+ 20 - 27
logic/equip-logic/src/main/java/com/iohao/mmo/equip/entity/EquipProperty.java → logic/equip-logic/src/main/java/com/iohao/mmo/equip/entity/EquipEntryProperty.java

@@ -23,8 +23,10 @@ import lombok.Data;
 import lombok.experimental.FieldDefaults;
 import org.springframework.data.mongodb.core.mapping.Document;
 
+import java.math.BigDecimal;
+
 /**
- * 装备属性汇总
+ * 装备词条库属性
  * <pre>
  *     装备的基本属性
  * </pre>
@@ -35,31 +37,22 @@ import org.springframework.data.mongodb.core.mapping.Document;
 @Data
 @Document
 @FieldDefaults(level = AccessLevel.PRIVATE)
-public class EquipProperty {
-    /** 根骨 */
-    int rootBone;
-    /** 精力 */
-    int energy;
-    /** 力量 */
-    int power;
-    /** 智力 */
-    int intelligence;
-    /** 敏捷 */
-    int agile;
-    /** 最大气血 */
-    int hpMax;
-    /** 最大法力 */
-    int mpMax;
-    /** 幸运 */
-    int lucky;
+public class EquipEntryProperty {
+    /** 等级最小值 */
+    int levelMin;
+    /** 等级最大值 */
+    int levelMax;
+    /** 属性计算方式(1装备加,2装备增加百分比,3全身增加百分比) */
+    int countType;
+    /** 显示方式(1原值显示,2小数转百分比) */
+    int showType;
+    /** 影响属性 */
+    String propertyName;
+    /** 属性范围最小值 */
+    BigDecimal propertyValueMin;
+    /** 属性范围最大值 */
+    BigDecimal propertyValueMax;
+    /** 随机属性结果值 */
+    BigDecimal propertyValue;
 
-    public static EquipProperty resetElseEquipProperty() {
-        EquipProperty elseEquipProperty = new EquipProperty();
-        elseEquipProperty.constitution = 0;
-        elseEquipProperty.magicPower = 0;
-        elseEquipProperty.power = 0;
-        elseEquipProperty.endurance = 0;
-        elseEquipProperty.agile = 0;
-        return elseEquipProperty;
-    }
 }

+ 47 - 0
logic/equip-logic/src/main/java/com/iohao/mmo/equip/entity/EquipEntryTemplate.java

@@ -0,0 +1,47 @@
+/*
+ * ioGame
+ * Copyright (C) 2021 - 2023  渔民小镇 (262610965@qq.com、luoyizhu@gmail.com) . All Rights Reserved.
+ * # iohao.com . 渔民小镇
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+package com.iohao.mmo.equip.entity;
+
+import lombok.AccessLevel;
+import lombok.Data;
+import lombok.experimental.FieldDefaults;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+import java.util.List;
+
+/**
+ * 装备词条库
+ *
+ * @author 唐斌
+ * @date 2023-07-26
+ */
+@Data
+@Document
+@FieldDefaults(level = AccessLevel.PRIVATE)
+public class EquipEntryTemplate {
+    @Id
+    String id;
+    /** 名称 */
+    String name;
+    /** 描述 */
+    String description;
+    /** 装备属性 */
+    List<EquipEntryProperty> entryPropertyList;
+}

+ 73 - 46
logic/equip-logic/src/main/java/com/iohao/mmo/equip/entity/EquipPropertyBasic.java

@@ -20,10 +20,11 @@ package com.iohao.mmo.equip.entity;
 
 import com.iohao.mmo.common.kit.RandomKit;
 import lombok.AccessLevel;
-import lombok.Builder;
 import lombok.Data;
 import lombok.experimental.FieldDefaults;
 import org.springframework.data.mongodb.core.mapping.Document;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
 
 /**
  * 装备基础属性
@@ -35,7 +36,6 @@ import org.springframework.data.mongodb.core.mapping.Document;
  * @date 2023-07-24
  */
 @Data
-@Builder(toBuilder = true)
 @Document
 @FieldDefaults(level = AccessLevel.PRIVATE)
 public class EquipPropertyBasic {
@@ -84,50 +84,77 @@ public class EquipPropertyBasic {
         {
             return equipPropertyBasic;
         }
-        if(fixedEquipPropertyMin.getPhysicsAttackMin()!=null&&fixedEquipPropertyMax.getPhysicsAttackMin()!=null){
-            equipPropertyBasic.toBuilder().physicsAttackMin(RandomKit.randomFromInt(fixedEquipPropertyMin.physicsAttackMin.intValue(),
-                    fixedEquipPropertyMax.physicsAttackMin.intValue()));
+        try{
+            //通过getDeclaredFields()方法获取属性下限对象类中的所有属性(含私有)
+            Field[] minFields = fixedEquipPropertyMin.getClass().getDeclaredFields();
+            //遍历属性
+            for (Field minField : minFields) {
+                //设置允许通过反射访问私有变量
+                minField.setAccessible(true);
+                //获取属性下限类中对应字段的值
+                Object minValue = minField.get(fixedEquipPropertyMin);
+                //如果获取属性下限类中对应的值为空则跳过
+                if(minValue==null){
+                    continue;
+                }
+                //通过getDeclaredFields()方法获取属性上限对象类中的所有属性(含私有)
+                Field[] maxFields = fixedEquipPropertyMax.getClass().getDeclaredFields();
+                //遍历属性
+                for (Field maxField : maxFields) {
+                    //设置允许通过反射访问私有变量
+                    maxField.setAccessible(true);
+                    //获取属性下限类中当前字段属性名称
+                    String minName = minField.getName();
+
+                    //获取属性上限类中对应字段的值
+                    Object maxValue = maxField.get(fixedEquipPropertyMax);
+                    //获取属性上限类中当前字段属性名称
+                    String maxName = maxField.getName();
+                    //如果下限和上限都取到了同一个属性,并且对应的值都不为空,那么取出来在其中进行范围随机
+                    if(minName.equals(maxName)&&maxValue!=null){
+                        //在下限和上限之间随机
+                        Integer randomValue = RandomKit.randomFromInt(Integer.parseInt(minValue.toString()),
+                                Integer.parseInt(maxValue.toString()));
+                        //通过属性名称获取对应set方法的名称
+                        String methodName = "set" + capitalize(minName);
+                        //获取class对象
+                        Class<?> clazz = equipPropertyBasic.getClass();
+                        //获取赋值的字段类型
+                        Class<?> parameterType = randomValue.getClass();
+                        //获取set方法
+                        Method method = clazz.getMethod(methodName, parameterType);
+                        //对equipPropertyBasic的set方法赋值randomValue
+                        method.invoke(equipPropertyBasic, randomValue);
+                        break;
+                    }
+                }
+
+            }
+        } catch (Exception ex){
+            //处理异常
+        }
+        return equipPropertyBasic;
+    }
+    private static String capitalize(String str) {
+        if (str == null || str.length() == 0) {
+            return str;
         }
-        return EquipPropertyBasic.builder()
-                .physicsAttackMin(
-                        RandomKit.randomFromInt(fixedEquipPropertyMin.getPhysicsAttackMin(),
-                                fixedEquipPropertyMax.getPhysicsAttackMin()))
-                .physicsAttackMax(
-                        RandomKit.randomFromInt(fixedEquipPropertyMin.getPhysicsAttackMax(),
-                                fixedEquipPropertyMax.getPhysicsAttackMax()))
-                .magicAttackMin(
-                        RandomKit.randomFromInt(fixedEquipPropertyMin.getMagicAttackMin(),
-                                fixedEquipPropertyMax.getMagicAttackMin()))
-                .magicAttackMax(
-                        RandomKit.randomFromInt(fixedEquipPropertyMin.getMagicAttackMax(),
-                                fixedEquipPropertyMax.getMagicAttackMax()))
-                .physicsDefense(
-                        RandomKit.randomFromInt(fixedEquipPropertyMin.getPhysicsDefense(),
-                                fixedEquipPropertyMax.getPhysicsDefense()))
-                .magicDefense(
-                        RandomKit.randomFromInt(fixedEquipPropertyMin.getMagicDefense(),
-                                fixedEquipPropertyMax.getMagicDefense()))
-                .magicDefense(
-                        RandomKit.randomFromInt(fixedEquipPropertyMin.getMagicDefense(),
-                                fixedEquipPropertyMax.getMagicDefense()))
-                .physicsHit(
-                        RandomKit.randomFromInt(fixedEquipPropertyMin.getPhysicsHit(),
-                                fixedEquipPropertyMax.getPhysicsHit()))
-                .physicsDodge(
-                        RandomKit.randomFromInt(fixedEquipPropertyMin.getPhysicsDodge(),
-                                fixedEquipPropertyMax.getPhysicsDodge()))
-                .magicHit(
-                        RandomKit.randomFromInt(fixedEquipPropertyMin.getMagicHit(),
-                                fixedEquipPropertyMax.getMagicHit()))
-                .magicDodge(
-                        RandomKit.randomFromInt(fixedEquipPropertyMin.getMagicDodge(),
-                                fixedEquipPropertyMax.getMagicDodge()))
-                .hpPct(
-                        RandomKit.randomFromBigDecimal(fixedEquipPropertyMin.getHpPct(),
-                                fixedEquipPropertyMax.getHpPct()))
-                .durability(
-                        RandomKit.randomFromInt(fixedEquipPropertyMin.getDurability(),
-                                fixedEquipPropertyMax.getDurability()))
-                .build();
+        char firstChar = str.charAt(0);
+        if (Character.isUpperCase(firstChar)) {
+            return str;
+        } else {
+            return Character.toUpperCase(firstChar) + str.substring(1);
+        }
+    }
+    public static void main(String[] args) {
+        EquipPropertyBasic fixedEquipPropertyMin = new EquipPropertyBasic();
+        fixedEquipPropertyMin.setHp(10);
+        fixedEquipPropertyMin.setMp(100);
+        EquipPropertyBasic fixedEquipPropertyMax = new EquipPropertyBasic();
+        fixedEquipPropertyMax.setHp(50);
+        fixedEquipPropertyMax.setMp(200);
+
+        EquipPropertyBasic equipPropertyBasic = randomFixed(fixedEquipPropertyMin,fixedEquipPropertyMax);
+        System.out.println(equipPropertyBasic.getHp());
     }
 }

+ 13 - 10
logic/equip-logic/src/main/java/com/iohao/mmo/equip/entity/ElseEquipProperty.java → logic/equip-logic/src/main/java/com/iohao/mmo/equip/entity/EquipPropertyElse.java

@@ -26,7 +26,7 @@ import org.springframework.data.mongodb.core.mapping.Document;
 import java.util.List;
 
 /**
- * 装备额外属性
+ * 装备额外属性统计(装备基础属性以外的属性)
  * <pre>
  *     装备的基本属性
  * </pre>
@@ -37,7 +37,7 @@ import java.util.List;
 @Data
 @Document
 @FieldDefaults(level = AccessLevel.PRIVATE)
-public class ElseEquipProperty {
+public class EquipPropertyElse {
     /** 根骨 */
     int rootBone;
     /** 精力 */
@@ -48,17 +48,20 @@ public class ElseEquipProperty {
     int intelligence;
     /** 敏捷 */
     int agile;
-    /** 最大气血 */
-    int hpMax;
-    /** 最大法力 */
-    int mpMax;
     /** 幸运 */
     int lucky;
-    /** 技能及等级 */
-    List<EquipPropertyItem> skills;
 
-    public static ElseEquipProperty resetElseEquipProperty() {
-        ElseEquipProperty elseEquipProperty = new ElseEquipProperty();
+    /** 最小物理攻击百分比 */
+    /** 最大物理攻击百分比 */
+    /** 最小法术攻击百分比 */
+    /** 最大法术攻击百分比 */
+
+
+
+
+
+    public static EquipPropertyElse resetElseEquipProperty() {
+        EquipPropertyElse elseEquipProperty = new EquipPropertyElse();
         elseEquipProperty.constitution = 0;
         elseEquipProperty.magicPower = 0;
         elseEquipProperty.power = 0;

+ 14 - 8
logic/equip-logic/src/main/java/com/iohao/mmo/equip/entity/EquipTemplate.java

@@ -24,6 +24,8 @@ import lombok.experimental.FieldDefaults;
 import org.springframework.data.annotation.Id;
 import org.springframework.data.mongodb.core.mapping.Document;
 
+import java.util.List;
+
 /**
  * 装备库
  *
@@ -42,12 +44,16 @@ public class EquipTemplate {
     int position;
     /** 要求等级 */
     int level;
-    /** 装备固定属性最小值 */
-    FixedEquipProperty fixedEquipPropertyMin;
-    /** 装备固定属性最大值 */
-    FixedEquipProperty fixedEquipPropertyMax;
-    /** 自定义属性随机范围最小值 */
-    int totalAttrMin;
-    /** 自定义属性随机范围最大值 */
-    int totalAttrMax;
+    /** 品质 1白色,2黄色,3绿色,4蓝色,5紫色,6鬼装*/
+    int quality;
+    /** 装备基础属性最小值 */
+    EquipPropertyBasic equipPropertyBasicMin;
+    /** 装备基础属性最大值 */
+    EquipPropertyBasic equipPropertyBasicMax;
+    /** 装备固定属性 */
+    List<EquipEntry> equipPropertyFixedList;
+    /** 随机属性最小条数 */
+    int equipPropertyRandomMin;
+    /** 随机属性最大条数 */
+    int equipPropertyRandomMax;
 }

+ 1 - 1
logic/equip-logic/src/main/java/com/iohao/mmo/equip/kit/EquipRandomKit.java

@@ -56,7 +56,7 @@ public class EquipRandomKit {
                 rangeMax = rangeMin;
             }
         }
-        return RandomKit.randomFromArr(rangeMin,rangeMax).intValue();
+        return RandomKit.randomFromBigDecimal(rangeMin,rangeMax).intValue();
 
     }
 

+ 2 - 2
logic/equip-logic/src/main/java/com/iohao/mmo/equip/mapper/EquipMapper.java

@@ -18,7 +18,7 @@
  */
 package com.iohao.mmo.equip.mapper;
 
-import com.iohao.mmo.equip.entity.ElseEquipProperty;
+import com.iohao.mmo.equip.entity.EquipPropertyElse;
 import com.iohao.mmo.equip.entity.Equip;
 import com.iohao.mmo.equip.entity.EquipTemplate;
 import com.iohao.mmo.equip.proto.ElseEquipPropertyMessage;
@@ -45,5 +45,5 @@ public interface EquipMapper {
     Equip convert(EquipMessage equipMessage);
 
     EquipTemplateMessage convert(EquipTemplate equipTemplate);
-    ElseEquipPropertyMessage convert(ElseEquipProperty elseEquipProperty);
+    ElseEquipPropertyMessage convert(EquipPropertyElse elseEquipProperty);
 }

+ 3 - 3
logic/equip-logic/src/main/java/com/iohao/mmo/equip/service/EquipService.java

@@ -19,7 +19,7 @@
 package com.iohao.mmo.equip.service;
 
 import com.iohao.mmo.common.config.GameCode;
-import com.iohao.mmo.equip.entity.ElseEquipProperty;
+import com.iohao.mmo.equip.entity.EquipPropertyElse;
 import com.iohao.mmo.equip.entity.Equip;
 import com.iohao.mmo.equip.kit.EquipRandomKit;
 import lombok.AllArgsConstructor;
@@ -83,7 +83,7 @@ public class EquipService {
 
         GameCode.objNotFound.assertTrue(oldEquip!=null);
 
-        ElseEquipProperty elseEquipProperty = equip.getElseEquipProperty();
+        EquipPropertyElse elseEquipProperty = equip.getElseEquipProperty();
         int saveAttrTotal = elseEquipProperty.getConstitution()
                 + elseEquipProperty.getMagicPower()
                 + elseEquipProperty.getPower()
@@ -133,7 +133,7 @@ public class EquipService {
      * @return
      */
     private Equip replaceEquipAttr(Equip equip,int newAttrTotal){
-        equip.setElseEquipProperty(ElseEquipProperty.resetElseEquipProperty());
+        equip.setElseEquipProperty(EquipPropertyElse.resetElseEquipProperty());
         equip.setAttrTotal(newAttrTotal);
         equip.setUndistributedAttr(newAttrTotal);
         //鉴定次数+1

+ 1 - 1
logic/equip-logic/src/main/java/com/iohao/mmo/equip/service/EquipTemplateService.java

@@ -171,7 +171,7 @@ public class EquipTemplateService {
                                 equipTemplate.getFixedEquipPropertyMax())) //装备固定属性
                 .attrTotal(0)
                 .undistributedAttr(0)
-                .elseEquipProperty(ElseEquipProperty.resetElseEquipProperty()) //初始化分配的具体属性点
+                .elseEquipProperty(EquipPropertyElse.resetElseEquipProperty()) //初始化分配的具体属性点
                 .position(equipTemplate.getPosition())
                 .level(equipTemplate.getLevel())
                 .identifyCount(0)