Difficulty scaling/fr: Difference between revisions

Updating to match new version of source page
(Created page with "Pour les armes, les bonus (par exemple Durabilité ↑ ou Attaque ↑) sont entièrement aléatoires. Chaque type de bonus est équiprobable.")
(Updating to match new version of source page)
Line 1: Line 1:
<languages/>
<languages/>


'''Difficulty scaling''' (nivellement de la difficulté) est un mécanisme dans ''Breath of the Wild'' qui fait que les ennemis et les armes sont progressivement remplacés par des variantes plus puissantes au cours d'une partie de jeu.
'''Difficulty scaling''' is a mechanic in ''Breath of the Wild'' that results in enemies and weapons being progressively replaced by more powerful variants during a playthrough.


== Points ==  
== Points ==  


Le système de nivellement se base sur un système de points. Tuer des ennemis est la ''seule manière'' d'en recevoir.
The scaling system is based on a point system. Killing enemies is the ''only way'' to receive points.


Quand un ennemi meurt, le jeu incrémente un flag 'Defeated_{SameGroupActorName}_Num' si toutes les conditions suivantes sont remplies :
Whenever an enemy dies, the game increments a flag 'Defeated_{SameGroupActorName}_Num' if all of the following conditions are satisfied:
* Le nombre de kills est strictement inférieur à 10.
* The current kill count is &#x3C; 10.
* L'acteur n'a pas le flag NotCountDefeatedNum.
* The actor does not have the NotCountDefeatedNum flag.
* '''Pour Maz Koshia''' : 'Defeated_Priest_Boss_Normal_Num' est 0.
* '''For Monk Maz Koshia''': 'Defeated_Priest_Boss_Normal_Num' is 0.
* '''Pour Dark Beast Ganon''' : C'est la première fois que le boss final est battu. (Son flag Defeated a pour valeur maximale 1.)  
* '''For Dark Beast Ganon''': It is the first time the boss is beaten. (Ganon's Defeated flag has 1 as the maximum value.)  
* '''Pour les Ombres de Ganon''' : C'est la première fois que l'Ombre est battue au sein de la créature divine, ou dans l'univers onirique (DLC2). Les Ombres que vous battez au château d'Hyrule ne comptent pas.
* '''For Blights''': It is the first time the blight is beaten in the Divine Beast, or in the Illusory Realm. Blights fought in Hyrule Castle do not count.
Cela se produit à chaque fois qu'un ennemi ''quelconque'' meurt, même s'il ne joue pas forcément de rôle dans le système de points (voir ci-dessous) et même si le joueur n'est pas responsable pour leur mort.
This happens every time ''any'' enemy dies, even if they don't necessarily play a role in the point system (see below) and even if the player is not responsible for their death.


Vu que des ennemis doivent être tués tout au long de la quête principale et que les boss sont considérés comme des ennemis, le nivellement de la difficulté est inévitable.
Because enemies have to be killed throughout the main quest and bosses are considered as enemies too, difficulty scaling is unavoidable.


Only the defeated counter flags are stored in the save file. The <code>Ecosystem::LevelSensor</code> subsystem is responsible for [[Difficulty scaling#Ecosystem::LevelSensor::calculatePoints|converting these kill counts to points]] using a [[Difficulty scaling#Ecosystem::LevelSensor::loadByml|configuration file]].
Only the defeated counter flags are stored in the save file. The <code>Ecosystem::LevelSensor</code> subsystem is responsible for [[Difficulty scaling#Ecosystem::LevelSensor::calculatePoints|converting these kill counts to points]] using a [[Difficulty scaling#Ecosystem::LevelSensor::loadByml|configuration file]].
Line 21: Line 21:
The subsystem provides two functions ([[Difficulty scaling#Ecosystem::LevelSensor::scaleWeapon|<code>scaleWeapon</code>]] and [[Difficulty scaling#Ecosystem::LevelSensor::scaleActor|<code>scaleActor</code>]]) that may be called when a weapon or enemy actor is created.
The subsystem provides two functions ([[Difficulty scaling#Ecosystem::LevelSensor::scaleWeapon|<code>scaleWeapon</code>]] and [[Difficulty scaling#Ecosystem::LevelSensor::scaleActor|<code>scaleActor</code>]]) that may be called when a weapon or enemy actor is created.


== Inhibiteurs du nivellement ==  
== Scaling inhibitors ==  


Les deux fonctions de nivellement ne feront absolument rien si :
Both scaling functions will immediately return without doing anything if:
* [[WorldMgr]]::sInstance-&#x3E;stageType == 1 (Open World [[stage]])
* [[WorldMgr]]::sInstance-&#x3E;stageType == 1 (Open World [[stage]])
* and WorldMgr::sInstance-&#x3E;isAocField (la map actuelle est les épreuves de l'épée)
* and WorldMgr::sInstance-&#x3E;isAocField (current map is Trial of the Sword)
* and WorldMgr::sInstance-&#x3E;disableScaling (réglée à true à l'entrée des épreuves de l'épée)
* and WorldMgr::sInstance-&#x3E;disableScaling (set to true when entering Trial of the Sword)


== Armes ==  
This means that scaling is always disabled in the Trial of the Sword.
 
Scaling will also be skipped if the current [[map area]] is 28. This corresponds to &#x22;HateruSea&#x22;, which is the Eventide Island area.
 
== Weapons ==  


'scaleWeapon' is called (i.e. weapons may be scaled) for a weapon if:
'scaleWeapon' is called (i.e. weapons may be scaled) for a weapon if:
Line 36: Line 40:
* '''For other enemy drops''': The flag <code>{MapName}_WeaponDrop_{ID}</code> is false, '''and''' [the actor property 'LevelSensorMode' is higher than 1 ''or'' the enemy is a Guardian Scout ('Enemy_Guardian_Mini')].
* '''For other enemy drops''': The flag <code>{MapName}_WeaponDrop_{ID}</code> is false, '''and''' [the actor property 'LevelSensorMode' is higher than 1 ''or'' the enemy is a Guardian Scout ('Enemy_Guardian_Mini')].


Remarque : les armes achetées dans une boutique ne peuvent pas recevoir de bonus car elles ne rentrent dans aucun des cas mentionnés ci-dessus.
Note: Weapons that are bought from a shop cannot receive modifiers because they do not fit into any of the above cases.


== Bonus des armes ==  
== Weapon bonuses ==  


Scaling of weapons are divided into three steps: Does the weapon get replaced by a different (better weapon)?
Weapon scaling results in weapons being replaced by a different weapon (e.g. a Soldier's Bow which becomes a Royal Bow), or weapons gaining a random, bonus stat boost (e.g. Attack Up, Durability Up, etc.). The range of those boosts is also affected by weapon scaling.
Which of the stats (among attack, guard, durability etc) is increased?
And how much it is increased.


=== Types de bonus ===  
=== Bonus types ===  


Pour les armes, les bonus (par exemple Durabilité ↑ ou Attaque ↑) sont entièrement aléatoires. Chaque type de bonus est équiprobable.
Weapon bonuses (e.g. Durability Up, Attack Up) are entirely random. Each bonus has equal probability.


{|class="wikitable"
{|class="wikitable"
! Bonus !! Disponible pour les paliers
! Bonus !! Available in modifier tiers
|-
|-
|-
|-
| Attaque ↑ || Bleu/blanc et jaune
| Attack up || Blue/White and Yellow
|-
|-
| Durabilité ↑ || Bleu/blanc et jaune
| Durability up || Blue/White and Yellow
|-
|-
| Distance lancers ↑ || Jaune
| Long throw || Yellow
|-
|-
| Tirs x N (arcs) || Jaune
| Multi-shot burst (bows) || Yellow
|-
|-
| Visée rapide (arcs) || Jaune
| Quick shot (bows) || Yellow
|-
|-
| Glisse ↑ || Jaune
| AddSurfMaster || Yellow
|-
|-
| Garde ↑ || Bleu/blanc et jaune
| Shield guard up || Blue/White and Yellow
|-
|-
| Coup de grâce || Bleu/blanc
| Critical Hit || Blue/White
|-
|-
| ZoomRapid || Jaune
| ZoomRapid || Yellow
|}
|}


Line 75: Line 77:
* AddSurfMaster is a bonus that only applies to shields and gives them a lower friction for shield surfing. That bonus type is unused in the game.
* AddSurfMaster is a bonus that only applies to shields and gives them a lower friction for shield surfing. That bonus type is unused in the game.


=== Valeurs de bonus ===  
=== Bonus values ===  


Bonus values (e.g. the durability or attack power increase) are determined from [[ActorParam/GeneralParamList]] (with a copy of the information in [[ActorInfoData]]). Valid ranges and bonuses for each weapon are configured in the WeaponCommon section.
Bonus values (e.g. the durability or attack power increase) are determined from [[ActorParam/GeneralParamList]] (with a copy of the information in [[ActorInfoData]]). Valid ranges and bonuses for each weapon are configured in the WeaponCommon section.
Line 81: Line 83:
==== amiibo ====  
==== amiibo ====  
{|class="wikitable"
{|class="wikitable"
! Bonus !! Valeur qui est utilisée pour l'effet bonus
! Bonus !! Value that is used for the bonus effect
|-
|-
| Aucun || -
| None || -
|-
|-
| Attaque ↑ || addAtkMax
| Attack up || addAtkMax
|-
|-
| Durabilité ↑ || addLifeMax
| Durability up || addLifeMax
|-
|-
| Distance lancers ↑ || addThrowMax
| Long throw || addThrowMax
|-
|-
| Tirs x N (arcs) || Tirs x 5
| Multi-shot burst (bows) || 5-shot burst
|-
|-
| Visée rapide (arcs) || addRapidFireMin
| Quick shot (bows) || addRapidFireMin
|-
|-
| Glisse ↑ || [[bgparamlist#Global|GlobalParameter]]::shieldSurfMasterFrictionRatio
| AddSurfMaster || [[bgparamlist#Global|GlobalParameter]]::shieldSurfMasterFrictionRatio
|-
|-
| Garde ↑ || addGuardMax
| Shield guard up || addGuardMax
|}
|}


En résumé, pour les armes amiibo, Attaque ↑ donne toujours le pouvoir d'attaque maximum. Il n'y a pas d'aléatoire.
In summary, for amiibo weapons, an attack up always brings it to the greatest possible attack power.
No randomness is involved.


==== Non amiibo ====  
==== Non-amiibo ====  


{|class="wikitable"
{|class="wikitable"
! Bonus !! Valeur qui est utilisée pour l'effet bonus
! Bonus !! Value that is used for the bonus effect
|-
|-
| Aucun || -
| None || -
|-
|-
| Attaque ↑ || Entier aléatoire entre addAtkMin et addAtkMax
| Attack up || Random integer between addAtkMin and addAtkMax
|-
|-
| Durabilité ↑ || Entier aléatoire entre addLifeMin et addLifeMax
| Durability up || Random integer between addLifeMin and addLifeMax
|-
|-
| Distance lancers ↑ || Flottant aléatoire entre addThrowMin et addThrowMax
| Long throw || Random float between addThrowMin and addThrowMax
|-
|-
| Tirs x N (arcs) || Tirs x 5
| Multi-shot burst (bows) || 5-shot burst
|-
|-
| Visée rapide (arcs) || Flottant aléatoire entre addRapidFireMin et addRapidFireMax
| Quick shot (bows) || Random float between addRapidFireMin and addRapidFireMax
|-
|-
| Glisse ↑ || [[bgparamlist#Global|GlobalParameter]]::shieldSurfMasterFrictionRatio
| AddSurfMaster || [[bgparamlist#Global|GlobalParameter]]::shieldSurfMasterFrictionRatio
|-
|-
| Garde ↑ || Entier aléatoire entre addGuardMin et addGuardMax
| Shield guard up || Random integer between addGuardMin and addGuardMax
|}
|}


En résumé, pour les armes non issues d'amiibo, Attaque ↑ donne un pouvoir d'attaque aléatoire.
In summary, for non-amiibo weapons, an attack up results in a randomized attack power.


== Ennemis ==  
== Enemies ==  


When loading enemies, the game will always try to scale enemies.
When loading enemies, the game will always try to scale enemies.
Line 138: Line 141:
[1.3.0] In Master Mode, '''all''' enemies are automatically ranked up one tier by default '''post scaling''', independently of 'LevelSensorMode'. [[Actor]]s can receive two additional parameters:
[1.3.0] In Master Mode, '''all''' enemies are automatically ranked up one tier by default '''post scaling''', independently of 'LevelSensorMode'. [[Actor]]s can receive two additional parameters:
{| class="wikitable"
{| class="wikitable"
! Paramètre
! Parameter
! Valeur par défaut
! Default
! Description
! Description
|-
|-
| IsHardModeActor
| IsHardModeActor
| false
| false
| Contrôle l'apparition ou non d'un ennemi dans le Mode Expert.
| Controls whether an enemy only shows up in Master Mode.
|-
|-
| DisableRankUpForHardMode
| DisableRankUpForHardMode
Line 150: Line 153:
| Controls whether the automatic rankup applies to an enemy.
| Controls whether the automatic rankup applies to an enemy.
|}
|}
Dans le Mode Expert, IsHardModeActor, DisableRankUpForHardMode and LevelSensorMode sont combinés sur quelques acteurs pour garder des ennemis de bas niveau dans le monde (par exemple pour garder un Bokoblin rouge au sud du Plateau du Prélude.)
In Master Mode, IsHardModeActor, DisableRankUpForHardMode and LevelSensorMode are combined on some actors to keep low-level enemies in the overworld (e.g. Red Bokoblin south of the Great Plateau).


== Propriétés ==  
== Properties ==  


=== <code>LevelSensorMode</code> ===
=== <code>LevelSensorMode</code> ===
Line 165: Line 168:


{| class="wikitable"
{| class="wikitable"
! Valeur
! Value
! Description
! Description
|-
|-
Line 190: Line 193:
For example, 0 ('None') doesn't mean a weapon will never receive a modifier. It just means that the developers haven't forced the weapon to spawn with a blue/yellow modifier. If scaling requirements are satisfied, the weapon will receive blue or yellow modifiers.
For example, 0 ('None') doesn't mean a weapon will never receive a modifier. It just means that the developers haven't forced the weapon to spawn with a blue/yellow modifier. If scaling requirements are satisfied, the weapon will receive blue or yellow modifiers.


== Algorithme de nivellement ==  
== Scaling algorithm ==  


=== <code>Ecosystem::LevelSensor::loadByml</code> ===  
=== <code>Ecosystem::LevelSensor::loadByml</code> ===  


Cette fonction est appelée par <code>Ecosystem::init</code> depuis <code>ksys::InitializeApp</code>
This function is called by <code>Ecosystem::init</code> from <code>ksys::InitializeApp</code>


Met en place les structures byml pour la lecture de Ecosystem/[[LevelSensor.byml]].
Sets up byml structures for reading Ecosystem/[[LevelSensor.byml]].


=== <code>Ecosystem::LevelSensor::calculatePoints</code> ===  
=== <code>Ecosystem::LevelSensor::calculatePoints</code> ===  


Appelée par [[PlacementMgr]] au moment du spawn des acteurs.
Called by [[PlacementMgr]] when spawning actors.


Calculates weapon and enemy scaling points using a list of flags and configuration values.
Calculates weapon and enemy scaling points using a list of flags and configuration values.
Line 219: Line 222:
</source>
</source>


En pratique, ces paramètres n'ont jamais été modifiés. 1.5.0 (qui sera sans doute la dernière mise à jour du jeu) a toujours les mêmes Level2WeaponPower et Level2EnemyPower.
In practice, settings have never been modified. 1.5.0 (which will likely be the last game update) still has the same Level2WeaponPower and Level2EnemyPower.


=== <code>Ecosystem::LevelSensor::scaleWeapon</code> ===  
=== <code>Ecosystem::LevelSensor::scaleWeapon</code> ===  
Line 229: Line 232:
If the algorithm fails to find an appropriate weapon that satisfies all conditions (point requirements, weapon series, modifier), the originally specified weapon and modifier will be used directly.
If the algorithm fails to find an appropriate weapon that satisfies all conditions (point requirements, weapon series, modifier), the originally specified weapon and modifier will be used directly.


Pseudocode (1.0.0) :
Pseudocode (1.0.0):


<source lang="c++">
<source lang="c++">
Line 287: Line 290:
=== <code>Ecosystem::LevelSensor::scaleActor</code> ===  
=== <code>Ecosystem::LevelSensor::scaleActor</code> ===  


Analogue à <code>LevelSensor::scaleWeapon</code>.
Analogous to <code>LevelSensor::scaleWeapon</code>.


Pseudocode (1.0.0) :
Pseudocode (1.0.0):


<source lang="c++">
<source lang="c++">
Line 337: Line 340:
</source>
</source>


== Les données ==  
== The Data ==  


Pour rendre tout cela plus facile à comprendre, voici des liens vers :
To make things easier to understand, here are links to:
* [https://docs.google.com/spreadsheets/d/e/2PACX-1vRSlyOD7FLAn1TUBn64Pu8Pld-WOfgcVByuywHMWvBTEV0j8potD1wkBs-MJJXf-gvEkpfItUCMqMk6/pubhtml des tableaux de points, de nivellement des ennemis et des armes]
* [https://docs.google.com/spreadsheets/d/e/2PACX-1vRSlyOD7FLAn1TUBn64Pu8Pld-WOfgcVByuywHMWvBTEV0j8potD1wkBs-MJJXf-gvEkpfItUCMqMk6/pubhtml kill point, enemy scaling and weapon scaling tables]
* une [https://objmap.zeldamods.org carte objets (object map) avec les infos de nivellement].
* an [https://objmap.zeldamods.org object map with scaling information].
Cela permet de voir très aisément à la fois les points nécessaires pour mettre à niveau les ennemis ou les armes, ainsi que tous les cas spéciaux.
This makes it possible to see both the required points for enemy/weapon upgrades, as well as all of the special cases extremely easily.


== Ombres de Ganon ==  
== Ganon Blights ==  


Les Ombres de Ganon varient elles aussi en difficulté mais suivent un système différent. Leur HP est déterminé par le HP de base (réglé dans [[ActorParam/GeneralParamList|GeneralParamList]]) et les flags de défaite des ombres.
Ganon blights also have varying difficulty but follow a different system. Their health is determined by the base HP (set in [[ActorParam/GeneralParamList|GeneralParamList]]) and blight defeat flags.


<source lang="c++">__int64 SiteBoss::getInitialHP(SiteBoss *this) // 0x71002D01F4
<source lang="c++">__int64 SiteBoss::getInitialHP(SiteBoss *this) // 0x71002D01F4
Line 367: Line 370:
}</source>
}</source>


En pratique, cela signifie que la première ombre que Link bat disposera de 800+0×400 = 800 HP, la seconde aura 800+1×400 = 1200 HP, la troisième 800+2×400 = 1600 HP et la dernière 800+3×400 = 2000 HP.
Effectively, this means that the first blight Link fights will have 800+0×400 = 800 HP, the second will have 800+1×400 = 1200 HP, the third 800+2×400 = 1600 HP and the last one 800+3×400 = 2000 HP.


=== Cas spécial 1 : Les ombres du château ===  
=== Special case 1: Castle Blights ===  


Les ombres du château d'Hyrule ont <code>IsRemainBoss</code> réglé sur false dans les paramètres de leur AI root (voir [[AIDef:AI/SiteBossSpearRoot]] par exemple), ce qui active le flag 4.
Castle blights have <code>IsRemainBoss</code> set to false in their root AI parameters (see [[AIDef:AI/SiteBossSpearRoot]] for example), which sets flag 4.


Ainsi, les ombres combattues au château disposent toujours de 800+3×400 = 2000 HP quelle que soit la progression de l'histoire.
Thus, blights that are fought in the Castle always have 800+3×400 = 2000 HP regardless of story progression.


Si le flag 4 est activé, le code [[AIDef:Action/SiteBossDie]] n'incrémenta PAS le compteur Defeated. Cela signifie que les ombres du château ne donnent aucun point de nivellement.
If flag 4 is set, the [[AIDef:Action/SiteBossDie]] code will NOT increment the &#x22;defeated&#x22; counter. This means castle blights do not give any scaling points.


=== Cas spécial 2 : Les ombres du DLC2 ===  
=== Special case 2: DLC2 Blights ===  


Les ombres dans l'univers onirique possèdent le tag acteur <code>EnemySiteBoss_R</code>. Cela conduit à l'activation du flag 8. Donc celles-ci auront toujours 500+4×250 = 1500 HP.
Illusory Realm blights possess the <code>EnemySiteBoss_R</code> actor tag. This causes flag 8 to be set. So they will always have 500+4×250 = 1500 HP.


Fait intéressant, la fonction AI de l'ombre de vent de Ganon (Windblight) ne vérifie pas le tag acteur mais plutôt le nom d'acteur. Pour que le flag 8 soit activé, le nom doit absolument être <code>Enemy_SiteBoss_Bow_R</code>.
Interestingly, the Windblight AI function relies doesn't check the actor tag but the actor name instead. For flag 8 to be set, the actor name must be <code>Enemy_SiteBoss_Bow_R</code>.




826

edits