Difficulty scaling/zh: Difference between revisions

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;..."
(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/>


Multi-shot burst (bows) 多發弓發數增加
'''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 之間的隨機數字
|-
|-
| 不過西諾克斯的 LevelSensorMode 屬性並不控制他脖子上的武器如何升級(到頭來是脖子上而不是手上)。總之,西諾克斯用的是另一個機制來決定脖子上的武器如何升級,而且這個機制可以繞過 'LevelSensorMode'。 || addLifeMin 到 addLifeMax 之間的隨機數字
| 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;
       i = j; // 名字對,而且經驗值也夠
        break;
       break;
       }
       }
     }
     }
    //
 
    if (i == -1)
   if (i == -1)
      continue;
     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;
       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());
   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->setProperty("SharpWeaponJudgeType", modifier_to_use); // 用找的
    *actor_to_use = weapon_to_use;
   *actor_to_use = weapon_to_use;
    return true;
   return true; // 有找到
   }
   }
   return false;  // cannot scale up
   return false;  // cannot scale up // 沒找到
}
}
</source>
</source>