826
edits
(Updating to match new version of source page) |
(Updating to match new version of source page) |
||
Line 1: | Line 1: | ||
<languages/> | <languages/> | ||
'''Difficulty scaling''' | '''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. | ||
== 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. | |||
Quand un ennemi meurt, le jeu incrémente un flag 'Defeated_{SameGroupActorName}_Num' si toutes les conditions suivantes sont remplies : | |||
* | * Le nombre de kills est strictement inférieur à 10. | ||
* | * L'acteur n'a pas le flag NotCountDefeatedNum. | ||
* ''' | * '''Pour Maz Koshia''' : 'Defeated_Priest_Boss_Normal_Num' est 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.) | ||
* ''' | * '''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. | ||
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. | |||
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. | |||
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 == | ||
<div class="mw-translate-fuzzy"> | |||
Les deux fonctions de nivellement ne feront absolument rien si : | |||
* [[WorldMgr]]::sInstance->stageType == 1 (Open World [[stage]]) | * [[WorldMgr]]::sInstance->stageType == 1 (Open World [[stage]]) | ||
* and WorldMgr::sInstance->isAocField ( | * and WorldMgr::sInstance->isAocField (la map actuelle est les épreuves de l'épée) | ||
* and WorldMgr::sInstance->disableScaling ( | * and WorldMgr::sInstance->disableScaling (réglée à true à l'entrée des épreuves de l'épée) | ||
</div> | |||
This means that scaling is always disabled in the Trial of the Sword. | This means that scaling is always disabled in the Trial of the Sword. | ||
Line 32: | Line 34: | ||
Scaling will also be skipped if the current [[map area]] is 28. This corresponds to "HateruSea", which is the Eventide Island area. | Scaling will also be skipped if the current [[map area]] is 28. This corresponds to "HateruSea", which is the Eventide Island area. | ||
== | == Armes == | ||
'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 40: | Line 42: | ||
* '''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. | |||
== | == Bonus des armes == | ||
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. | 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. | ||
There are two bonus tiers in the game: one for low-level types (which appear in blue/white in the game UI) and another for high-level types (yellow). Those that belong to the Yellow tier are usually superior to the other ones. For instance, ''Attack Up +'' is the superior variant of ''Attack Up'' and it typically grants a higher attack power boost compared to ''Attack Up''. | |||
=== Types de bonus === | |||
Pour les armes, les bonus (par exemple Durabilité ↑ ou Attaque ↑) sont entièrement aléatoires. Chaque type de bonus est équiprobable. | |||
{|class="wikitable" | {|class="wikitable" | ||
! Bonus !! | ! Bonus !! <span class="mw-translate-fuzzy">Disponible pour les paliers</span> | ||
|- | |- | ||
|- | |- | ||
| | | Attaque ↑ || Bleu/blanc et jaune | ||
|- | |- | ||
| | | Durabilité ↑ || Bleu/blanc et jaune | ||
|- | |- | ||
| | | Distance lancers ↑ || Jaune | ||
|- | |- | ||
| | | Tirs x N (arcs) || Jaune | ||
|- | |- | ||
| | | Visée rapide (arcs) || Jaune | ||
|- | |- | ||
| | | Glisse ↑ || Jaune | ||
|- | |- | ||
| | | Garde ↑ || Bleu/blanc et jaune | ||
|- | |- | ||
| | | Coup de grâce || Bleu/blanc | ||
|- | |- | ||
| ZoomRapid || | | ZoomRapid || Jaune | ||
|} | |} | ||
Line 77: | Line 81: | ||
* 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 (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 83: | Line 87: | ||
==== amiibo ==== | ==== amiibo ==== | ||
{|class="wikitable" | {|class="wikitable" | ||
! Bonus !! | ! Bonus !! Valeur qui est utilisée pour l'effet bonus | ||
|- | |- | ||
| | | Aucun || - | ||
|- | |- | ||
| | | Attaque ↑ || addAtkMax | ||
|- | |- | ||
| | | Durabilité ↑ || addLifeMax | ||
|- | |- | ||
| | | Distance lancers ↑ || addThrowMax | ||
|- | |- | ||
| | | Tirs x N (arcs) || Tirs x 5 | ||
|- | |- | ||
| | | Visée rapide (arcs) || addRapidFireMin | ||
|- | |- | ||
| | | Glisse ↑ || [[bgparamlist#Global|GlobalParameter]]::shieldSurfMasterFrictionRatio | ||
|- | |- | ||
| | | Garde ↑ || addGuardMax | ||
|} | |} | ||
En résumé, pour les armes amiibo, Attaque ↑ donne toujours le pouvoir d'attaque maximum. Il n'y a pas d'aléatoire. | |||
==== Non | ==== Non amiibo ==== | ||
{|class="wikitable" | {|class="wikitable" | ||
! Bonus !! | ! Bonus !! Valeur qui est utilisée pour l'effet bonus | ||
|- | |- | ||
| | | Aucun || - | ||
|- | |- | ||
| | | Attaque ↑ || Entier aléatoire entre addAtkMin et addAtkMax | ||
|- | |- | ||
| | | Durabilité ↑ || Entier aléatoire entre addLifeMin et addLifeMax | ||
|- | |- | ||
| | | Distance lancers ↑ || Flottant aléatoire entre addThrowMin et addThrowMax | ||
|- | |- | ||
| | | Tirs x N (arcs) || Tirs x 5 | ||
|- | |- | ||
| | | Visée rapide (arcs) || Flottant aléatoire entre addRapidFireMin et addRapidFireMax | ||
|- | |- | ||
| | | Glisse ↑ || [[bgparamlist#Global|GlobalParameter]]::shieldSurfMasterFrictionRatio | ||
|- | |- | ||
| | | Garde ↑ || Entier aléatoire entre addGuardMin et addGuardMax | ||
|} | |} | ||
En résumé, pour les armes non issues d'amiibo, Attaque ↑ donne un pouvoir d'attaque aléatoire. | |||
== | == Ennemis == | ||
When loading enemies, the game will always try to scale enemies. | When loading enemies, the game will always try to scale enemies. | ||
Line 141: | Line 144: | ||
[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 | ||
! | ! Valeur par défaut | ||
! Description | ! Description | ||
|- | |- | ||
| IsHardModeActor | | IsHardModeActor | ||
| false | | false | ||
| | | Contrôle l'apparition ou non d'un ennemi dans le Mode Expert. | ||
|- | |- | ||
| DisableRankUpForHardMode | | DisableRankUpForHardMode | ||
Line 153: | Line 156: | ||
| 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.) | |||
== | == Propriétés == | ||
=== <code>LevelSensorMode</code> === | === <code>LevelSensorMode</code> === | ||
Line 168: | Line 171: | ||
{| class="wikitable" | {| class="wikitable" | ||
! | ! Valeur | ||
! Description | ! Description | ||
|- | |- | ||
Line 193: | Line 196: | ||
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 == | ||
=== <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> | |||
Met en place les structures byml pour la lecture de Ecosystem/[[LevelSensor.byml]]. | |||
=== <code>Ecosystem::LevelSensor::calculatePoints</code> === | === <code>Ecosystem::LevelSensor::calculatePoints</code> === | ||
Appelée par [[PlacementMgr]] au moment du spawn des acteurs. | |||
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 222: | Line 225: | ||
</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. | |||
=== <code>Ecosystem::LevelSensor::scaleWeapon</code> === | === <code>Ecosystem::LevelSensor::scaleWeapon</code> === | ||
Line 232: | Line 235: | ||
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 290: | Line 293: | ||
=== <code>Ecosystem::LevelSensor::scaleActor</code> === | === <code>Ecosystem::LevelSensor::scaleActor</code> === | ||
Analogue à <code>LevelSensor::scaleWeapon</code>. | |||
Pseudocode (1.0.0): | Pseudocode (1.0.0) : | ||
<source lang="c++"> | <source lang="c++"> | ||
Line 340: | Line 343: | ||
</source> | </source> | ||
== | == Les données == | ||
Pour rendre tout cela plus facile à comprendre, voici des liens vers : | |||
* [https://docs.google.com/spreadsheets/d/e/2PACX-1vRSlyOD7FLAn1TUBn64Pu8Pld-WOfgcVByuywHMWvBTEV0j8potD1wkBs-MJJXf-gvEkpfItUCMqMk6/pubhtml | * [https://docs.google.com/spreadsheets/d/e/2PACX-1vRSlyOD7FLAn1TUBn64Pu8Pld-WOfgcVByuywHMWvBTEV0j8potD1wkBs-MJJXf-gvEkpfItUCMqMk6/pubhtml des tableaux de points, de nivellement des ennemis et des armes] | ||
* | * une [https://objmap.zeldamods.org carte objets (object map) avec les infos de nivellement]. | ||
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. | |||
== Ganon | == Ombres de Ganon == | ||
Ganon | 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. | ||
<source lang="c++">__int64 SiteBoss::getInitialHP(SiteBoss *this) // 0x71002D01F4 | <source lang="c++">__int64 SiteBoss::getInitialHP(SiteBoss *this) // 0x71002D01F4 | ||
Line 370: | Line 373: | ||
}</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. | |||
=== | === Cas spécial 1 : Les ombres du château === | ||
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. | |||
Ainsi, les ombres combattues au château disposent toujours de 800+3×400 = 2000 HP quelle que soit la progression de l'histoire. | |||
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. | |||
=== | === Cas spécial 2 : Les ombres du DLC2 === | ||
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. | |||
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>. | |||