1,158
edits
(Created page with "處理敵人的升級。方法跟上面 <code>LevelSensor::scaleWeapon</code> 處理武器的升級類似。") |
(Created page with "<source lang="c++"> if (actor->params["LevelSensorMode"] < 1) return false; if (actor_name.contains("Enemy")) { for (enemy_table : this->byml["enemy"]) { i = -1;...") |
||
Line 1: | Line 1: | ||
<languages/> | <languages/> | ||
'''Difficulty scaling'''(等級系統)是曠野之息用來控制敵人跟武器等級的一個機制。你會注意到,在遊玩的過程中,同一個地點的敵人可能在若干次血月後變成了更強的敵人,且其手上的武器也有所變化。 | |||
== 經驗值 == | == 經驗值 == | ||
Line 7: | Line 7: | ||
等級系統是根據存檔裡的一個「經驗值」系統決定的。只有怪物死掉可以獲得經驗值。(意即解神廟、解任務之類的事情不算。) | 等級系統是根據存檔裡的一個「經驗值」系統決定的。只有怪物死掉可以獲得經驗值。(意即解神廟、解任務之類的事情不算。) | ||
每當有敵人死掉,遊戲就會想增加 Defeated_{SameGroupActorName}_Num 這個計數器。 | |||
花括號的意思是,如果是波克布林死掉,就會更新波克布林專屬的計數器。 | |||
不過,只有下列條件滿足的時候,計數器才會真的增加。 | |||
* 計數器本身還不到 10(意思是大部分的怪物只有殺死前十隻才算) | |||
* 死掉的那個敵人沒有 NotCountDefeatedNum flag(意思是某些特殊情況下不算) | |||
* '''導師米茲·喬希亞'''專用的計數器 'Defeated_Priest_Boss_Normal_Num' 是 0(意思是只有殺第一次才算) | |||
* '''魔獸加儂'''也是只有第一次才算 | |||
* '''厄咒加儂'''只有在神獸裡打敗的才算,原始遊戲打一次,DLC 跟幻影打一次,總共兩次(在城堡裡打的不算) | |||
需要注意的是只要有''任何''敵人死掉,不管死法,也不管是不是林克親手殺的,遊戲都會試圖增加計數器。下面會講到哪些情況下不會算。 | |||
由於主線劇情會要求玩家殺怪,所以玩家或多或少都會累積經驗值,並且相應地導致等級上升。 | 由於主線劇情會要求玩家殺怪,所以玩家或多或少都會累積經驗值,並且相應地導致等級上升。 | ||
Line 110: | Line 120: | ||
| Attack up 攻擊力 || addAtkMin 到 addAtkMax 之間的隨機數字 | | Attack up 攻擊力 || addAtkMin 到 addAtkMax 之間的隨機數字 | ||
|- | |- | ||
| | | Durability up 耐久度提升 || addLifeMin 到 addLifeMax 之間的隨機數字 | ||
|- | |- | ||
| Long throw 遠距離投擲 || addThrowMin 到 addThrowMax 之間的隨機數字 | | Long throw 遠距離投擲 || addThrowMin 到 addThrowMax 之間的隨機數字 | ||
Line 298: | Line 308: | ||
if (actor->params["LevelSensorMode"] < 1) | if (actor->params["LevelSensorMode"] < 1) | ||
return false; | return false; | ||
if (actor_name.contains("Enemy")) { | if (actor_name.contains("Enemy")) { | ||
for (enemy_table : this->byml["enemy"]) { | for (enemy_table : this->byml["enemy"]) { | ||
Line 305: | Line 315: | ||
entry = enemy_table["actors"][j]; | entry = enemy_table["actors"][j]; | ||
if (entry["name"] == actor_name && this->enemy_points > entry["value"]) { | if (entry["name"] == actor_name && this->enemy_points > entry["value"]) { | ||
i = j; // 名字對,而且經驗值也夠 | |||
break; | |||
} | } | ||
} | } | ||
if (i == -1) | |||
continue; // 找不到換下一個 | |||
do { | do { | ||
entry = enemy_table["actors"][i]; | entry = enemy_table["actors"][i]; | ||
if (this->enemy_points <= entry["value"]) | if (this->enemy_points <= entry["value"]) | ||
break; // 有找到就枚舉到經驗值最高又符合條件的才停 | |||
++i; | ++i; | ||
} while (i < enemy_table["actors"].size); | } while (i < enemy_table["actors"].size); | ||
*actor_to_use = entry["name"]; | *actor_to_use = entry["name"]; | ||
return true; | return true; | ||
Line 325: | Line 335: | ||
return false; // cannot scale up | return false; // cannot scale up | ||
} | } | ||
if (actor_name.contains("Weapon")) { | if (actor_name.contains("Weapon")) { // 找到敵人後,手上的武器單獨處理 | ||
weapon_name = actor->getWeaponName(); | weapon_name = actor->getWeaponName(); | ||
modifier = actor->params["SharpWeaponJudgeType"]; | modifier = actor->params["SharpWeaponJudgeType"]; | ||
if (modifier == WeaponModifier::RandomBlue) | if (modifier == WeaponModifier::RandomBlue) | ||
modifier = get_random_blue_modifier(actor->getWeaponName()); // 抽獎 | |||
if (scaleWeapon(weapon_name, &weapon_to_use, &modifier_to_use)) { | if (scaleWeapon(weapon_name, &weapon_to_use, &modifier_to_use)) { | ||
actor->setProperty("SharpWeaponJudgeType", modifier_to_use); // 用找的 | |||
*actor_to_use = weapon_to_use; | |||
return true; // 有找到 | |||
} | } | ||
return false; // cannot scale up | return false; // cannot scale up // 沒找到 | ||
} | } | ||
</source> | </source> |