[Bug] Fixed primal weather interaction. (#1744)
* Fixed primal weather interaction. * Made adjustments * Improved code readability
This commit is contained in:
parent
c177f3c1fb
commit
7c3ace7204
|
@ -1726,7 +1726,9 @@ export class PostSummonWeatherChangeAbAttr extends PostSummonAbAttr {
|
||||||
}
|
}
|
||||||
|
|
||||||
applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean {
|
applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean {
|
||||||
if (!pokemon.scene.arena.weather?.isImmutable()) {
|
if ((this.weatherType === WeatherType.HEAVY_RAIN ||
|
||||||
|
this.weatherType === WeatherType.HARSH_SUN ||
|
||||||
|
this.weatherType === WeatherType.STRONG_WINDS) || !pokemon.scene.arena.weather?.isImmutable()) {
|
||||||
return pokemon.scene.arena.trySetWeather(this.weatherType, true);
|
return pokemon.scene.arena.trySetWeather(this.weatherType, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1854,6 +1856,52 @@ export class PreSwitchOutResetStatusAbAttr extends PreSwitchOutAbAttr {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clears Desolate Land/Primordial Sea/Delta Stream upon the Pokemon switching out.
|
||||||
|
*/
|
||||||
|
export class PreSwitchOutClearWeatherAbAttr extends PreSwitchOutAbAttr {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param pokemon The {@linkcode Pokemon} with the ability
|
||||||
|
* @param passive N/A
|
||||||
|
* @param args N/A
|
||||||
|
* @returns {boolean} Returns true if the weather clears, otherwise false.
|
||||||
|
*/
|
||||||
|
applyPreSwitchOut(pokemon: Pokemon, passive: boolean, args: any[]): boolean | Promise<boolean> {
|
||||||
|
const weatherType = pokemon.scene.arena.weather.weatherType;
|
||||||
|
let turnOffWeather = false;
|
||||||
|
|
||||||
|
// Clear weather only if user's ability matches the weather and no other pokemon has the ability.
|
||||||
|
switch (weatherType) {
|
||||||
|
case (WeatherType.HARSH_SUN):
|
||||||
|
if (pokemon.hasAbility(Abilities.DESOLATE_LAND)
|
||||||
|
&& pokemon.scene.getField(true).filter(p => p !== pokemon).filter(p => p.hasAbility(Abilities.DESOLATE_LAND)).length === 0) {
|
||||||
|
turnOffWeather = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case (WeatherType.HEAVY_RAIN):
|
||||||
|
if (pokemon.hasAbility(Abilities.PRIMORDIAL_SEA)
|
||||||
|
&& pokemon.scene.getField(true).filter(p => p !== pokemon).filter(p => p.hasAbility(Abilities.PRIMORDIAL_SEA)).length === 0) {
|
||||||
|
turnOffWeather = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case (WeatherType.STRONG_WINDS):
|
||||||
|
if (pokemon.hasAbility(Abilities.DELTA_STREAM)
|
||||||
|
&& pokemon.scene.getField(true).filter(p => p !== pokemon).filter(p => p.hasAbility(Abilities.DELTA_STREAM)).length === 0) {
|
||||||
|
turnOffWeather = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (turnOffWeather) {
|
||||||
|
pokemon.scene.arena.trySetWeather(WeatherType.NONE, false);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export class PreSwitchOutHealAbAttr extends PreSwitchOutAbAttr {
|
export class PreSwitchOutHealAbAttr extends PreSwitchOutAbAttr {
|
||||||
applyPreSwitchOut(pokemon: Pokemon, passive: boolean, args: any[]): boolean | Promise<boolean> {
|
applyPreSwitchOut(pokemon: Pokemon, passive: boolean, args: any[]): boolean | Promise<boolean> {
|
||||||
if (pokemon.getHpRatio() < 1 ) {
|
if (pokemon.getHpRatio() < 1 ) {
|
||||||
|
@ -2985,6 +3033,55 @@ export class PostFaintAbAttr extends AbAttr {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clears Desolate Land/Primordial Sea/Delta Stream upon the Pokemon fainting
|
||||||
|
*/
|
||||||
|
export class PostFaintClearWeatherAbAttr extends PostFaintAbAttr {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param pokemon The {@linkcode Pokemon} with the ability
|
||||||
|
* @param passive N/A
|
||||||
|
* @param attacker N/A
|
||||||
|
* @param move N/A
|
||||||
|
* @param hitResult N/A
|
||||||
|
* @param args N/A
|
||||||
|
* @returns {boolean} Returns true if the weather clears, otherwise false.
|
||||||
|
*/
|
||||||
|
applyPostFaint(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, hitResult: HitResult, args: any[]): boolean {
|
||||||
|
const weatherType = pokemon.scene.arena.weather.weatherType;
|
||||||
|
let turnOffWeather = false;
|
||||||
|
|
||||||
|
// Clear weather only if user's ability matches the weather and no other pokemon has the ability.
|
||||||
|
switch (weatherType) {
|
||||||
|
case (WeatherType.HARSH_SUN):
|
||||||
|
if (pokemon.hasAbility(Abilities.DESOLATE_LAND)
|
||||||
|
&& pokemon.scene.getField(true).filter(p => p.hasAbility(Abilities.DESOLATE_LAND)).length === 0) {
|
||||||
|
turnOffWeather = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case (WeatherType.HEAVY_RAIN):
|
||||||
|
if (pokemon.hasAbility(Abilities.PRIMORDIAL_SEA)
|
||||||
|
&& pokemon.scene.getField(true).filter(p => p.hasAbility(Abilities.PRIMORDIAL_SEA)).length === 0) {
|
||||||
|
turnOffWeather = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case (WeatherType.STRONG_WINDS):
|
||||||
|
if (pokemon.hasAbility(Abilities.DELTA_STREAM)
|
||||||
|
&& pokemon.scene.getField(true).filter(p => p.hasAbility(Abilities.DELTA_STREAM)).length === 0) {
|
||||||
|
turnOffWeather = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (turnOffWeather) {
|
||||||
|
pokemon.scene.arena.trySetWeather(WeatherType.NONE, false);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export class PostFaintContactDamageAbAttr extends PostFaintAbAttr {
|
export class PostFaintContactDamageAbAttr extends PostFaintAbAttr {
|
||||||
private damageRatio: integer;
|
private damageRatio: integer;
|
||||||
|
|
||||||
|
@ -4161,13 +4258,22 @@ export function initAbilities() {
|
||||||
.unimplemented(),
|
.unimplemented(),
|
||||||
new Ability(Abilities.PRIMORDIAL_SEA, 6)
|
new Ability(Abilities.PRIMORDIAL_SEA, 6)
|
||||||
.attr(PostSummonWeatherChangeAbAttr, WeatherType.HEAVY_RAIN)
|
.attr(PostSummonWeatherChangeAbAttr, WeatherType.HEAVY_RAIN)
|
||||||
.attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.HEAVY_RAIN),
|
.attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.HEAVY_RAIN)
|
||||||
|
.attr(PreSwitchOutClearWeatherAbAttr)
|
||||||
|
.attr(PostFaintClearWeatherAbAttr)
|
||||||
|
.bypassFaint(),
|
||||||
new Ability(Abilities.DESOLATE_LAND, 6)
|
new Ability(Abilities.DESOLATE_LAND, 6)
|
||||||
.attr(PostSummonWeatherChangeAbAttr, WeatherType.HARSH_SUN)
|
.attr(PostSummonWeatherChangeAbAttr, WeatherType.HARSH_SUN)
|
||||||
.attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.HARSH_SUN),
|
.attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.HARSH_SUN)
|
||||||
|
.attr(PreSwitchOutClearWeatherAbAttr)
|
||||||
|
.attr(PostFaintClearWeatherAbAttr)
|
||||||
|
.bypassFaint(),
|
||||||
new Ability(Abilities.DELTA_STREAM, 6)
|
new Ability(Abilities.DELTA_STREAM, 6)
|
||||||
.attr(PostSummonWeatherChangeAbAttr, WeatherType.STRONG_WINDS)
|
.attr(PostSummonWeatherChangeAbAttr, WeatherType.STRONG_WINDS)
|
||||||
.attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.STRONG_WINDS),
|
.attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.STRONG_WINDS)
|
||||||
|
.attr(PreSwitchOutClearWeatherAbAttr)
|
||||||
|
.attr(PostFaintClearWeatherAbAttr)
|
||||||
|
.bypassFaint(),
|
||||||
new Ability(Abilities.STAMINA, 7)
|
new Ability(Abilities.STAMINA, 7)
|
||||||
.attr(PostDefendStatChangeAbAttr, (target, user, move) => move.category !== MoveCategory.STATUS, BattleStat.DEF, 1),
|
.attr(PostDefendStatChangeAbAttr, (target, user, move) => move.category !== MoveCategory.STATUS, BattleStat.DEF, 1),
|
||||||
new Ability(Abilities.WIMP_OUT, 7)
|
new Ability(Abilities.WIMP_OUT, 7)
|
||||||
|
|
Loading…
Reference in New Issue