- Twisted Pokémon -
So, as you may have seen on the lobby of the Discord channel, a fakemon creator has invented for its fakedex this new mechanic that temporairly changes the typing of a Pokémon on the battlefield and also sharply boosts its strongest stats.
We kinda discussed it on that chat and the changes that the form applies aren't very viable, so I decided to just take inspiration from the concept and make a new mechanic. I have already asked the author consent and he accepted.
We kinda discussed it on that chat and the changes that the form applies aren't very viable, so I decided to just take inspiration from the concept and make a new mechanic. I have already asked the author consent and he accepted.
In each form, the Pokémon changes its typing to a predetermined one (selected in base of its current typing) and its STAB moves will change type to the same of the corresponding Twisted type. Moves that change type will also have a prefix that is a word that reflects the type they became.
So, for each type in the game, we'll have an R-Twisted type and an L-Twisted type, which will more or less stay for offensive and defensive typing respectively, as I tried to make the triads so that types are evenly distributed and LT type resists some of the original type's weaknesses, while the RT type hits supereffectively on some of the types that resist the original type. Priority was given to avoiding immunities, then to replace all weaknesses for LT and all the types that resist for RT, both with at least a 1x.
The other reason I'm posting here is to have some feedback on the triads I made, so your opinion on those is really appreciated. My only rule was that each type has to appear either as an RT or LT type twice, if a type only appears as offensive or defensive, it reflects the facts that there are some types that were meant to be mainly on that side of the spectrum (eg: Ice is an offensive type and Water is a defensive one, makes sense to me).
In the following table you can find R and L-twisted types of each of the existing ones:
Fire: (1/1) Blazing
Water: (0/2) Soaking
Electric: (2/0) Sparkling
Psychic: (1/1) Mesmerizing
Ice: (2/0) Freezing
Dragon: (0/2) Roaring
Dark: (1/1) Obscuring
Fairy: (1/1) Twinkling
Normal: (1/1) Stomping
Fighting: (1/1) Blasting
Flying: (1/1) Swirling
Poison: (1/1) Polluting
Ground: (2/0) Desolating
Rock: (0/2) Crumbling
Bug: (1/1) Infesting
Ghost: (1/1) Terrifying
Steel: (1/1) Piercing
Heracross is Bug / Fighting type. Since a Bug-type can become Water OR Psychic-type, while a Fighting-type can become Steel OR Dark-type, our Heracross can either choose to become Water / Steel (LT) or Psychic / Dark (RT) and its STAB moves will change type accordingly, so for example in its RT form Megahorn would hit with Psychic type effectiveness, while Close Combat would be Dark-type. Nothing happens to other moves, including those of the same type as the new ones, for example Knock Off remains Dark-type even if used by an Heracross R-Twist. Also, stats and ability stay the same as regular form.
- RKS System acts after switch in, so Silvally's type will be determined by the type of the Memory it holds, not by Twist.
- Protean applies its effect after switch-in, so a Protean user will be able to change to its Twisted types when using a STAB
(eg: a Greninja Right Twist using Polluting Hydro Pump will become pure Poison-type).
- Forecast and Mimicry will overwite original typing, but moves that will get STAB from the new typing won't be affected by Twisting
(eg: a Castform-Sunny Right Twist using Flamethrower will use the original version of the move, not Blasting Flamethrower)
- Color Change and Reflect Type totally replace typing, so moves of the Pokemon will have the Twisted type related to its original typing, but they won't get STAB
(eg: Kecleon's Double-Edge would keep its Twisted type even if Keckleon has changed type due to Color Change, same applies to a Pokemon that uses Reflect Type).
- Weather Ball still keeps the type of the weather when used during any of them, but changes to its Twisted types when used during no weather.
- Natural Power is not affected by Twisting because it is a Status move.
- Burn Up fails if the Twisted typing of the user doesn't include Fire, as it can only be used by Fire types.
(eg: Burn Up will fail if used by Arcanine in any of its Twist forms, there is no example where the other case happens)
- Roost removes Flying type only if it is included in the Twisted typing
(eg: Moltres LT would not lose any type, while a Vikavolt RT would become pure Psychic).
- if you have doubts on any other mechanic, feel free to ask below.
- Protean applies its effect after switch-in, so a Protean user will be able to change to its Twisted types when using a STAB
(eg: a Greninja Right Twist using Polluting Hydro Pump will become pure Poison-type).
- Forecast and Mimicry will overwite original typing, but moves that will get STAB from the new typing won't be affected by Twisting
(eg: a Castform-Sunny Right Twist using Flamethrower will use the original version of the move, not Blasting Flamethrower)
- Color Change and Reflect Type totally replace typing, so moves of the Pokemon will have the Twisted type related to its original typing, but they won't get STAB
(eg: Kecleon's Double-Edge would keep its Twisted type even if Keckleon has changed type due to Color Change, same applies to a Pokemon that uses Reflect Type).
- Weather Ball still keeps the type of the weather when used during any of them, but changes to its Twisted types when used during no weather.
- Natural Power is not affected by Twisting because it is a Status move.
- Burn Up fails if the Twisted typing of the user doesn't include Fire, as it can only be used by Fire types.
(eg: Burn Up will fail if used by Arcanine in any of its Twist forms, there is no example where the other case happens)
- Roost removes Flying type only if it is included in the Twisted typing
(eg: Moltres LT would not lose any type, while a Vikavolt RT would become pure Psychic).
- if you have doubts on any other mechanic, feel free to ask below.
Rules:
- Single Battle Format
- Megastones, Z-Crystals and Dyna/Gigantamax are not allowed.
- OU clauses
- Natdex
Matches will be based on Battle Stadium Singles with the accessibility to Natdex, so people will have a team of 6 Pokémon, but when entering battle you'll have to choose 3 among them. During battle, your first Pokémon will appear on the field in its regular form. As it is now for Dynamax, you'll have a checkbox to choose if you want to Twist or not, if you tick it, then:
- if you choose to switch to your second Pokémon, it will appear on the field in its Left Twist form
- if you choose to switch to your third (last) Pokémon, it will appear on th field in its Right Twist form
- if you choose to use a move, nothing will happen
After that, if a Twisted Pokémon is on your side of the field, you won't be able to activate Twist again when switching. So, to activate Twist, the Pokémon that is on your side of the field has to be in its regular form. Twist cannot happen if your Pokémon is forced out with Roar et similia. It doesn't activate also after Parting Shot, U-turn, Volt Switch, Healing Wish, Memento and all similar effects. Finally, a Twisted Pokémon that switches out is reverted to its regular form, no matter if it is forced or pivoting. There is no limit in the number of Twists per battle.
The purpose is to tone down impredictablity and mix the two modalities I've thought (we could also create a co-existing Rotation Battle version of this).
In this case, if I tick the box for Twisting and then I choose to switch into Cinderace, it will come in as Cinderace Left Twist, which is Grass-type, while if I choose to switch into Corviknight, it will come in as Corviknight Right Twist, which is Normal / Ground-type. Nothing happens if it chooses to use Close Combat. Please notice that you can still choose to switch out without Twisting the incoming Pokémon. Seems simple to use, but difficult to predict, but after all in total you still have 4 possible typings that may switch in, less than in OU.
-
LT:
RT:
-
LT:
RT:
-
LT:
RT:
-
LT:
RT:
-
LT:
RT:
-
LT:
RT:
(these above are the only type combos that become monotyped in one of the forms)
-
LT:
RT:
-
LT:
RT:
-
LT:
RT:
-
LT:
RT:
-
LT:
RT:
-
LT:
RT:
-
LT:
and
RT:
-
LT:
RT:
-
LT:
RT:
-
LT:
RT:
-
LT:
RT:
-
LT:
RT:
-
LT:
RT:
-
LT:
RT:
-
LT:
RT:
-
LT:
RT:
LT:
RT:
-
LT:
RT:
-
LT:
RT:
-
LT:
RT:
-
LT:
RT:
-
LT:
RT:
(these above are the only type combos that become monotyped in one of the forms)
-
LT:
RT:
-
LT:
RT:
-
LT:
RT:
-
LT:
RT:
-
LT:
RT:
-
LT:
RT:
-
LT:
RT:
-
LT:
RT:
-
LT:
RT:
-
LT:
RT:
-
LT:
RT:
-
LT:
RT:
-
LT:
RT:
-
LT:
RT:
-
LT:
RT:
-
LT:
RT:
- Special Twists
As you may have understood now, every Pokémon can twist, the transformation will be only in the color of the aura it emanates, that will be the same as the new typing. Some Pokémon though, when Twisting, can change to an alternative specific form, called Special Twist.
Every Pokémon that can Special Twist is able to change form to two different new ones, specific for its base species.
The new form will be of the Pokémon's Twisted typing, but will gain a new ability and its stat distribution will be modified a bit, specifically by swapping around no more than 50 total points, and with variations smaller than ±30 in each stat (and HP never change).
Let's make an example of this on Sudowoodo!
Sudowoodo is able to Special Twist to two forms:
Obviously inspired to a chinese dragon
Twisted Typing (Left):
New Stats: 70 / 120 / 105 / 20 / 55 / 50 (+0, +10, -10, -10, -10, +20)
New Ability: Reckless
Inspired to a silk floss tree and its hands are inspired to chestnut outer shells
Twisted Typing (Right):
New Stats: 70 / 100 / 125 / 20 / 85 / 20 (+0, -10, +10, -10, +20, -10)
New Ability: Iron Barbs
Every Slate you can submit up to 2 Special Twist forms couple (Left and Right, so 4 formes total) for any Pokémon.
We'll add only 3 per slate.
[IMG]https://play.pokemonshowdown.com/sprites/ani/pokemonname.gif[/IMG]
Pokémon: Pokémon's name
Twisted Typing: (Left Twisted Typing) / (Right Twisted Typing)
New Ability: (try to keep balance; new abilities are not allowed)
New Stats (Left): HP / ATK / DEF / SPA / SPD / SPE (stat changes)
New Stats (Right): HP / ATK / DEF / SPA / SPD / SPE (stat changes)
Flavour/Design (optional): How do the twisted forms look?
Competitive Niche: Why do we need these forms?
JavaScript:
export const BattleMovedex: {[k: string]: ModdedMoveData} = {
'twist': {
accuracy: true,
basePower: 0,
category: "Status",
desc: "The user is replaced with another Pokemon in its party. The selected Pokemon will become twisted",
shortDesc: "User switches, Twisting the incoming Pokémon.",
name: "Twist",
isNonstandard: "Custom",
pp: 1,
priority: 6,
alwaysHit: true,
flags: {},
onHit(pokemon){
const side = pokemon.side;
let i = 0;
for(const ally of side.pokemon)
{ ally.canMegaEvo = (i++ % 2 == 0) ? 'R' : 'L'; }
},
selfSwitch: true,
secondary: null,
target: "self",
type: "???",
}
}
JavaScript:
export const BattleStatuses: {[k: string]: ModdedPureEffectData} = {
par: {
name: 'par',
effectType: 'Status',
onStart(target, source, sourceEffect) {
if (sourceEffect && sourceEffect.effectType === 'Ability') {
this.add('-status', target, 'par', '[from] ability: ' + sourceEffect.name, '[of] ' + source);
} else {
this.add('-status', target, 'par');
}
},
onModifySpe(spe, pokemon) {
if (!pokemon.hasAbility('quickfeet')) {
return this.chainModify(0.5);
}
},
onBeforeMovePriority: 1,
onBeforeMove(pokemon, target, move) {
if(move.id === 'twist') return;
if (this.randomChance(1, 4)) {
this.add('cant', pokemon, 'par');
return false;
}
},
},
slp: {
name: 'slp',
effectType: 'Status',
onStart(target, source, sourceEffect) {
if (sourceEffect && sourceEffect.effectType === 'Ability') {
this.add('-status', target, 'slp', '[from] ability: ' + sourceEffect.name, '[of] ' + source);
} else if (sourceEffect && sourceEffect.effectType === 'Move') {
this.add('-status', target, 'slp', '[from] move: ' + sourceEffect.name);
} else {
this.add('-status', target, 'slp');
}
// 1-3 turns
this.effectData.startTime = this.random(2, 5);
this.effectData.time = this.effectData.startTime;
},
onBeforeMovePriority: 10,
onBeforeMove(pokemon, target, move) {
if(move.id === 'twist') return;
if (pokemon.hasAbility('earlybird')) {
pokemon.statusData.time--;
}
pokemon.statusData.time--;
if (pokemon.statusData.time <= 0) {
pokemon.cureStatus();
return;
}
this.add('cant', pokemon, 'slp');
if (move.sleepUsable) {
return;
}
return false;
},
},
frz: {
name: 'frz',
effectType: 'Status',
onStart(target, source, sourceEffect) {
if (sourceEffect && sourceEffect.effectType === 'Ability') {
this.add('-status', target, 'frz', '[from] ability: ' + sourceEffect.name, '[of] ' + source);
} else {
this.add('-status', target, 'frz');
}
if (target.species.name === 'Shaymin-Sky' && target.baseSpecies.baseSpecies === 'Shaymin') {
target.formeChange('Shaymin', this.effect, true);
}
},
onBeforeMovePriority: 10,
onBeforeMove(pokemon, target, move) {
if(move.id === 'twist') return;
if (move.flags['defrost']) return;
if (this.randomChance(1, 5)) {
pokemon.cureStatus();
return;
}
this.add('cant', pokemon, 'frz');
return false;
},
onModifyMove(move, pokemon) {
if (move.flags['defrost']) {
this.add('-curestatus', pokemon, 'frz', '[from] move: ' + move);
pokemon.setStatus('');
}
},
onHit(target, source, move) {
if (move.thawsTarget || move.type === 'Fire' && move.category !== 'Status') {
target.cureStatus();
}
},
},
confusion: {
name: 'confusion',
// this is a volatile status
onStart(target, source, sourceEffect) {
if (sourceEffect && sourceEffect.id === 'lockedmove') {
this.add('-start', target, 'confusion', '[fatigue]');
} else {
this.add('-start', target, 'confusion');
}
this.effectData.time = this.random(2, 6);
},
onEnd(target) {
this.add('-end', target, 'confusion');
},
onBeforeMovePriority: 3,
onBeforeMove(pokemon, target, move) {
if(move.id === 'twist') return;
pokemon.volatiles.confusion.time--;
if (!pokemon.volatiles.confusion.time) {
pokemon.removeVolatile('confusion');
return;
}
this.add('-activate', pokemon, 'confusion');
if (!this.randomChance(1, 3)) {
return;
}
this.activeTarget = pokemon;
const damage = this.getDamage(pokemon, pokemon, 40);
if (typeof damage !== 'number') throw new Error("Confusion damage not dealt");
const activeMove = {id: toID('confused'), effectType: 'Move', type: '???'};
this.damage(damage, pokemon, pokemon, activeMove as ActiveMove);
return false;
},
},
flinch: {
name: 'flinch',
duration: 1,
onBeforeMovePriority: 8,
onBeforeMove(pokemon, target, move) {
if(move.id === 'twist') return;
this.add('cant', pokemon, 'flinch');
this.runEvent('Flinch', pokemon);
return false;
},
},
trapped: {
name: 'trapped',
noCopy: true,
onTrapPokemon(pokemon) {
pokemon.tryTrap();
},
onStart(target) {
let tw = target.moveSlots[target.moveSlots.length - 1];
if(tw.id === 'twist'){
tw.disabled = true;
tw.disabledSource = 'trapped';
}
this.add('-activate', target, 'trapped');
},
},
partiallytrapped: {
name: 'partiallytrapped',
duration: 5,
durationCallback(target, source) {
if (source?.hasItem('gripclaw')) return 8;
return this.random(5, 7);
},
onStart(pokemon, source) {
let tw = pokemon.moveSlots[pokemon.moveSlots.length - 1];
if(tw.id === 'twist'){
tw.disabled = true;
tw.disabledSource = 'partiallytrapped';
}
this.add('-activate', pokemon, 'move: ' + this.effectData.sourceEffect, '[of] ' + source);
},
onResidualOrder: 11,
onResidual(pokemon) {
const source = this.effectData.source;
if (source && (!source.isActive || source.hp <= 0 || !source.activeTurns)) {
// G-Max Centiferno and G-Max Sandblast continue even after the user leaves the field
if (['gmaxcentiferno', 'gmaxsandblast'].includes(this.effectData.sourceEffect.id)) return;
delete pokemon.volatiles['partiallytrapped'];
this.add('-end', pokemon, this.effectData.sourceEffect, '[partiallytrapped]', '[silent]');
return;
}
if (source.hasItem('bindingband')) {
this.damage(pokemon.baseMaxhp / 6);
} else {
this.damage(pokemon.baseMaxhp / 8);
}
},
onEnd(pokemon) {
this.add('-end', pokemon, this.effectData.sourceEffect, '[partiallytrapped]');
},
onTrapPokemon(pokemon) {
if (this.effectData.source && this.effectData.source.isActive) pokemon.tryTrap();
},
},
mustrecharge: {
name: 'mustrecharge',
duration: 2,
onBeforeMovePriority: 11,
onBeforeMove(pokemon, target, move) {
if(move.id === 'twist') return;
this.add('cant', pokemon, 'recharge');
pokemon.removeVolatile('mustrecharge');
pokemon.removeVolatile('truant');
return null;
},
onStart(pokemon) {
this.add('-mustrecharge', pokemon);
},
onLockMove: 'recharge',
},
twisted: {
onStart(pokemon) {
const side = pokemon.side;
const twistedSpecies = this.dex.deepClone(pokemon.species);
const twistlr = pokemon.canMegaEvo;
var twistTyping = null, t;
if (pokemon.types.length === 1 && pokemon.types[0] !== '???')
twistedSpecies.types = [ getTwistedType(pokemon.types[0], twistlr as string ) ];
else {
twistTyping = [ getTwistedType(pokemon.types[0], twistlr as string ), getTwistedType( pokemon.types[1], twistlr as string) ];
if(twistTyping[0] === twistTyping[1]) twistedSpecies.types = [ twistTyping[0] ];
else twistedSpecies.types = twistTyping;
}
pokemon.canMegaEvo = null;
for(const ally of side.pokemon) ally.canMegaEvo = null;
pokemon.moveSlots.pop();
pokemon.formeChange(twistedSpecies, this.effect, false, pokemon.name + 'twisted ' + twistlr);
this.add('-start', pokemon, twistlr + '-Twist', '[silent]');
this.add('-start', pokemon, 'typechange', pokemon.species.types.join('/'), '[silent]');
},
onModifyTypePriority: 2,
onModifyType(move, pokemon) {
let t = pokemon.baseSpecies.types.indexOf(move.type);
if (t >= 0 && move.category !== 'Status' && pokemon.volatiles['twisted']) {
move.type = (pokemon.types.length === 1) ? pokemon.types[0] : pokemon.types[t];
}
},
onSwitchOut(pokemon) {
pokemon.removeVolatile('twisted');
},
onEnd(pokemon) {
var twistName;
const move = this.dex.getMove('twist');
const twistMove = {
move: move.name,
id: move.id,
pp: 1,
maxpp: 1,
target: move.target,
disabled: false,
used: false,
};
pokemon.moveSlots.push(twistMove);
pokemon.canMegaEvo = null;
this.add('-end', pokemon, 'Twist');
this.add('-start', pokemon, 'typechange', pokemon.baseSpecies.types.join('/'), '[silent]');
pokemon.formeChange(pokemon.baseSpecies);
},
},
};
function getTwistedType(type: string, lr: string){
const TwistedType: { [k: string]: { [k: string]: string; }; } = {
Grass: { L: 'Rock', R: 'Electric', prefix: 'Sprouting' },
Fire: { L: 'Grass', R: 'Fighting', prefix: 'Blazing' },
Water: { L: 'Fire', R: 'Poison', prefix: 'Soaking' },
Electric: { L: 'Flying', R: 'Ice', prefix: 'Sparkling' },
Psychic: { L: 'Dark', R: 'Bug', prefix: 'Mesmerizing' },
Ice: { L: 'Psychic', R: 'Electric', prefix: 'Freezing' },
Dragon: { L: 'Fairy', R: 'Fire', prefix: 'Roaring' },
Dark: { L: 'Ghost', R: 'Fairy', prefix: 'Obscuring' },
Fairy: { L: 'Water', R: 'Ground', prefix: 'Twinkling' },
Normal: { L: 'Poison', R: 'Ghost', prefix: 'Stomping' },
Fighting: { L: 'Steel', R: 'Dark', prefix: 'Blasting' },
Flying: { L: 'Rock', R: 'Ground', prefix: 'Swirling' },
Poison: { L: 'Bug', R: 'Grass', prefix: 'Polluting' },
Ground: { L: 'Fighting', R: 'Ice', prefix: 'Desolating' },
Rock: { L: 'Dragon', R: 'Steel', prefix: 'Crumbling' },
Bug: { L: 'Water', R: 'Psychic', prefix: 'Infesting' },
Ghost: { L: 'Normal', R: 'Flying', prefix: 'Terrifying' },
Steel: { L: 'Dragon', R: 'Normal', prefix: 'Piercing' }
}; return TwistedType[type][lr];
}
JavaScript:
{
name: "[Gen 8] Twisted Pokemon",
desc: `You can Twist the Pokemon switching in, changing its type between two predetermined typings.`,
threads: [
`• <a href="https://www.smogon.com/forums/threads/pet-mods-submission-thread.3657184/post-8446318">Twisted Pokemon</a>`,
],
mod: 'twisted',
debug: true,
forcedLevel: 50,
teamLength: {
validate: [3, 6],
battle: 3,
},
ruleset: ['Dynamax Clause', 'Team Preview'],
banlist: ['Moody', 'Power Construct'],
minSourceGen: 8,
onBegin(){
const move = this.dex.getMove('twist');
const twistMove = {
move: move.name,
id: move.id,
pp: 1,
maxpp: 1,
target: move.target,
disabled: false,
used: false,
};
for (const pokemon of this.getAllPokemon()) {
pokemon.moveSlots.push(twistMove);
pokemon.baseMoveSlots.push(twistMove);
pokemon.canMegaEvo = null;
}
},
onSwitchInPriority: 1,
onSwitchIn(pokemon) {
if (pokemon.canMegaEvo === 'L' || pokemon.canMegaEvo === 'R')
pokemon.addVolatile('twisted');
}
},
Last edited: