Skip to content

Commit 71e3f6b

Browse files
committed
修复部分种子下锻造崩溃的问题
修复锻造配方中出现多个任意步骤时指引失效的bug
1 parent 9c7dc5e commit 71e3f6b

File tree

2 files changed

+20
-18
lines changed

2 files changed

+20
-18
lines changed

src/main/java/com/eternal130/tfcaf/Util.java

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public class Util {
1717
public static int nextOperationOffset(int Difference, int[] lastRules, int[] itemRules) {
1818
/**
1919
* 计算下一步步骤.
20-
*
20+
*
2121
* @param Difference 目标锻造值-当前锻造值-锻造偏移值
2222
* @param lastRules 锻造步骤要求
2323
* @param itemRules 最后三步步骤
@@ -65,25 +65,27 @@ public static void preCalculator() {
6565
// tfc+锻造槽150,tfc应该也是150
6666
// tfc+中锻造初值在70到120之间
6767
// 锻造指针在0到150之间
68-
// target-current应该在-80到120之间,但因为查表是使用的值减去了锻造偏移,因此扩大了范围
69-
// -100<=target-current<=140
70-
// 0<=target-current+100<=240
71-
// dp[100+i]表示锻造差值为i时的最少锻造步骤数
72-
// dp[100]=0
73-
// dp[100+i]=Math.min(dp[80+i-operations[j]]) +1
74-
for (int i = -100; i <= 140; i++) {
68+
// 这个函数是预计算到某个数值需要各种锻造步骤的数量, 结果保存在steps这个哈希map中
69+
// 为了降低算法的复杂性, 输入的值是目标锻造值-当前锻造值-锻造偏移值,其中目标锻造值与种子有关,范围是70-120,
70+
// 当前锻造值是砧gui槽下面的指针,范围是0-150,锻造偏移值是当前配方要求步骤的数值和,范围是-45到48
71+
// 因此输入值的实际范围是-128到165
72+
// 但是因为目标锻造值-锻造偏移值一定处于0-150之间,因此实际范围是-150到150,而不是-128到165
73+
// dp[150+i]表示锻造差值为i时的最少锻造步骤数
74+
// dp[150]=0
75+
// dp[150+i]=Math.min(dp[80+i-operations[j]]) +1
76+
for (int i = -150; i <= 150; i++) {
7577
steps.put(i, new int[] { 0, 0, 0, 0, 0, 0, 0, 0 });
7678
}
77-
int[] dp = new int[241];
78-
for (int i = 0; i < 241; i++) {
79+
int[] dp = new int[301];
80+
for (int i = 0; i < 301; i++) {
7981
dp[i] = 100;
8082
}
81-
dp[100] = 0;
83+
dp[150] = 0;
8284
// 这里正反两次遍历dp数组,因为单次遍历有某些值无法到达
83-
for (int i = 140; i >= -100; i--) {
85+
for (int i = 150; i >= -150; i--) {
8486
foreachoperation(dp, i);
8587
}
86-
for (int i = -100; i <= 140; i++) {
88+
for (int i = -150; i <= 150; i++) {
8789
foreachoperation(dp, i);
8890
}
8991
operationsTfc.put(0, 3);
@@ -104,9 +106,9 @@ public static void preCalculator() {
104106

105107
private static void foreachoperation(int[] dp, int i) {
106108
for (int op : operations) {
107-
if (i - op >= -100 && i - op <= 140) {
108-
if (dp[100 + i] > dp[100 + i - op] + 1) {
109-
dp[100 + i] = dp[100 + i - op] + 1;
109+
if (i - op >= -150 && i - op <= 150) {
110+
if (dp[150 + i] > dp[150 + i - op] + 1) {
111+
dp[150 + i] = dp[150 + i - op] + 1;
110112
steps.put(
111113
i,
112114
steps.get(i - op)

src/main/java/com/eternal130/tfcaf/eventLoader/mcEvent.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -284,15 +284,15 @@ private int[] getRules(RuleEnum[] rules) {
284284
}
285285
}
286286
// 最后一次遍历,填充剩余的步骤,这里的步骤是可以位于任意位置的步骤,例如BendAny
287-
o: for (RuleEnum rule : rules) {
287+
for (RuleEnum rule : rules) {
288288
// 这个步骤的序号对6取余后是1
289289
if (rule.ordinal() % 6 == 1) {
290290
// 遍历lastOperations,如果有空位就填充,并且因为锻造需求里每步出现一次,所以只填充一次,跳出大循环
291291
for (int i = 0; i < 3; i++) {
292292
if (!flag[i]) {
293293
lastOperations[i] = Util.operationsTfc.get(rule.Action);
294294
flag[i] = true;
295-
break o;
295+
break;
296296
}
297297
}
298298
}

0 commit comments

Comments
 (0)