13 Commits

Author SHA1 Message Date
chardub
290b6f81d1 Adds menu option for Pokemon to remember any previously learned moves 2025-04-10 09:41:00 -04:00
chardub
80de6b019d Adds debug option to set a Pokémon's level to the current level cap 2025-04-09 12:01:40 -04:00
chardub
eb694dcdb5 Merge remote-tracking branch 'origin/develop-6.6' into develop-6.6 2025-04-08 22:35:54 -04:00
chardub
230b1b86b4 Updated readme 2025-04-08 22:35:30 -04:00
infinitefusion
692a78d041 Merge pull request #96 from KamilaBorowska/allow-changing-gender-of-single-gender-pokemon
Allow changing gender of single gender Pokemon
2025-04-08 21:38:06 -04:00
infinitefusion
fc87f353d7 Merge pull request #122 from Beinmann/make_black_and_white_flute_persist_between_routes
Make black and white flute effects persist when entering a new route
2025-04-08 21:35:47 -04:00
infinitefusion
a0fb092441 Merge pull request #136 from Leischii/options-description-fix
Options UI: Fix descriptions not updating correctly
2025-04-08 21:08:24 -04:00
chardub
a895180ac5 adds missing icon 2025-04-08 21:04:32 -04:00
chardub
f7ff2da270 Adds roadblock to Ilex Forest before obtaining goldenrod badge 2025-04-08 09:58:02 -04:00
Leischii
e6b17bf990 add: initial options update and up/down update trigger 2025-03-30 17:05:30 +02:00
Lukas Gründer
f7d05eca58 Keep black/white flute when entering new route 2024-07-27 23:24:48 +02:00
Lukas Gründer
bd7a15d1fc Make black/white flute toggleable 2024-07-27 23:24:31 +02:00
Konrad Borowski
6af6e448e6 Allow changing gender of single gender Pokemon
Before that change, Gender Stone and Gender Ball didn't actually
do anything with single-gender Pokemon such as Chansey.
2023-07-22 22:58:56 +02:00
21 changed files with 201 additions and 48 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -51,6 +51,7 @@ class Game_System
def bgm_play_internal2(name,volume,pitch,position) # :nodoc:
vol = volume
vol *= $PokemonSystem.bgmvolume/100.0
vol+=30
vol = vol.to_i
begin
Audio.bgm_play(name,vol,pitch,position)

View File

@@ -283,7 +283,13 @@ Events.onMapChange += proc { |_sender, e|
if new_map_metadata && new_map_metadata.teleport_destination
$PokemonGlobal.healingSpot = new_map_metadata.teleport_destination
end
$PokemonMap.clear if $PokemonMap
if $PokemonMap
blackFluteUsed = $PokemonMap.blackFluteUsed
whiteFluteUsed = $PokemonMap.whiteFluteUsed
$PokemonMap.clear
$PokemonMap.blackFluteUsed = blackFluteUsed
$PokemonMap.whiteFluteUsed = whiteFluteUsed
end
$PokemonEncounters.setup($game_map.map_id) if $PokemonEncounters
$PokemonGlobal.visitedMaps[$game_map.map_id] = true
next if old_map_ID == 0 || old_map_ID == $game_map.map_id

View File

@@ -445,6 +445,7 @@ def pbLearnMove(pkmn, move, ignoreifknown = false, bymachine = false, fast = fal
end
pkmnname = pkmn.name
movename = GameData::Move.get(move).name
pkmn.add_learned_move(move) if !bymachine
if pkmn.hasMove?(move)
pbMessage(_INTL("{1} already knows {2}.", pkmnname, movename), &block) if !ignoreifknown
return false
@@ -462,7 +463,12 @@ def pbLearnMove(pkmn, move, ignoreifknown = false, bymachine = false, fast = fal
if forgetmove >= 0
oldmovename = pkmn.moves[forgetmove].name
oldmovepp = pkmn.moves[forgetmove].pp
forgotten_move = pkmn.moves[forgetmove]
pkmn.add_learned_move(forgotten_move)
pkmn.moves[forgetmove] = Pokemon::Move.new(move) # Replaces current/total PP
pkmn.add_learned_move(move)
if bymachine && Settings::TAUGHT_MACHINES_KEEP_OLD_PP
pkmn.moves[forgetmove].pp = [oldmovepp, pkmn.moves[forgetmove].total_pp].min
end

View File

@@ -148,17 +148,19 @@ Events.onStepTaken += proc {
ItemHandlers::UseInField.add(:BLACKFLUTE, proc { |item|
pbUseItemMessage(item)
pbMessage(_INTL("Wild Pokémon will be repelled."))
$PokemonMap.blackFluteUsed = true
message = $PokemonMap.blackFluteUsed ? "Wild Pokemon will no longer be repelled.": "Wild Pokémon will be repelled."
pbMessage(_INTL(message))
$PokemonMap.blackFluteUsed = !$PokemonMap.blackFluteUsed
$PokemonMap.whiteFluteUsed = false
next 1
})
ItemHandlers::UseInField.add(:WHITEFLUTE, proc { |item|
pbUseItemMessage(item)
pbMessage(_INTL("Wild Pokémon will be lured."))
message = $PokemonMap.whiteFluteUsed ? "Wild Pokemon will no longer be lured.": "Wild Pokémon will be lured."
pbMessage(_INTL(message))
$PokemonMap.whiteFluteUsed = !$PokemonMap.whiteFluteUsed
$PokemonMap.blackFluteUsed = false
$PokemonMap.whiteFluteUsed = true
next 1
})

View File

@@ -55,7 +55,7 @@ class Pokemon
# @return [Array<Pokemon::Move>] the moves known by this Pokémon
attr_accessor :moves
# @return [Array<Pokemon::Move>] All the moves ever learned by this Pokémon
# @return [Array<Symbol>] All the move (ids) ever learned by this Pokémon
attr_accessor :learned_moves
# @return [Array<Integer>] the IDs of moves known by this Pokémon when it was obtained
@@ -606,12 +606,12 @@ class Pokemon
# Makes this Pokémon male.
def makeMale
self.gender = 0;
@gender = 0
end
# Makes this Pokémon female.
def makeFemale
self.gender = 1;
@gender = 1
end
# @return [Boolean] whether this Pokémon is male
@@ -874,14 +874,20 @@ class Pokemon
for i in first_move_index...knowable_moves.length
move = Pokemon::Move.new(knowable_moves[i])
@moves.push(move)
@learned_moves = [] if !@learned_moves
@learned_moves << move if !@learned_moves.include?(move)
add_learned_move(move)
end
end
def add_learned_move(move)
@learned_moves = [] if !@learned_moves
@learned_moves << move unless @learned_moves.include?(move)
if move.is_a?(Symbol)
@learned_moves << move unless @learned_moves.include?(move)
else
move_id = move.id
if move_id
@learned_moves << move_id unless @learned_moves.include?(move_id)
end
end
end
@@ -902,9 +908,7 @@ class Pokemon
@moves.push(move)
# Delete the first known move if self now knows more moves than it should
@moves.shift if numMoves > MAX_MOVES
@learned_moves = [] if !@learned_moves
@learned_moves << move if !@learned_moves.include?(move)
echoln @learned_moves
add_learned_move(move)
end
# Deletes the given move from the Pokémon.
@@ -912,17 +916,23 @@ class Pokemon
def forget_move(move_id)
move_data = GameData::Move.try_get(move_id)
return if !move_data
add_learned_move(move_id)
@moves.delete_if { |m| m.id == move_data.id }
end
# Deletes the move at the given index from the Pokémon.
# @param index [Integer] index of the move to be deleted
def forget_move_at_index(index)
move_id = @moves[index].id
add_learned_move(move_id)
@moves.delete_at(index)
end
# Deletes all moves from the Pokémon.
def forget_all_moves
for move in @moves
add_learned_move(move)
end
@moves.clear
end

View File

@@ -1190,6 +1190,43 @@ class PokemonPartyScreen
end
end
def pbRememberMoves(pokemon)
learnable_moves = pokemon.learned_moves
learnable_moves = [] if !learnable_moves
#exclude current moves
echoln "learned moves: #{learnable_moves}"
for current_move in pokemon.moves
echoln current_move.id
if learnable_moves.include?(current_move.id)
learnable_moves.delete(current_move.id)
end
end
move_ids = []
for move in learnable_moves
if move.is_a?(Symbol)
move_ids << move
end
end
if move_ids.empty?
pbMessage(_INTL("{1} has no moves to remember!",pokemon.name))
return false
end
echoln move_ids
retval = true
pbFadeOutIn {
scene = MoveRelearner_Scene.new
screen = MoveRelearnerScreen.new(scene)
if !learnable_moves.empty?
retval = screen.pbStartScreen(pokemon, move_ids)
else
return false
end
}
return retval
end
def pbPokemonRename(pkmn, pkmnid)
cmd = 0
loop do
@@ -1240,6 +1277,7 @@ class PokemonPartyScreen
cmdMail = -1
cmdItem = -1
cmdHat = -1
cmdLearnMove = -1
# Build the commands
commands[cmdSummary = commands.length] = _INTL("Summary")
@@ -1263,6 +1301,8 @@ class PokemonPartyScreen
end
end
commands[cmdNickname = commands.length] = _INTL("Nickname") if !pkmn.egg?
commands[cmdLearnMove = commands.length] = _INTL("Remember moves")
commands[commands.length] = _INTL("Cancel")
command = @scene.pbShowCommands(_INTL("Do what with {1}?", pkmn.name), commands)
havecommand = false
@@ -1324,6 +1364,8 @@ class PokemonPartyScreen
}
elsif cmdHat >= 0 && command == cmdHat
pbPokemonHat(pkmn)
elsif cmdLearnMove > 0 && command == cmdLearnMove
pbRememberMoves(pkmn)
elsif cmdNickname >= 0 && command == cmdNickname
pbPokemonRename(pkmn, pkmnid)
elsif cmdDebug >= 0 && command == cmdDebug

View File

@@ -131,13 +131,14 @@ end
#===============================================================================
#
#===============================================================================
class NumberOption
class NumberOption < Option
include PropertyMixin
attr_reader :name
attr_reader :optstart
attr_reader :optend
def initialize(name, optstart, optend, getProc, setProc)
def initialize(name, optstart, optend, getProc, setProc, description="")
super(description)
@name = name
@optstart = optstart
@optend = optend
@@ -214,6 +215,7 @@ class Window_PokemonOption < Window_DrawableCommand
@mustUpdateDescription = false
@selected_position = 0
@allow_arrows_jump = false
@is_first_update = true
for i in 0...@options.length
@optvalues[i] = 0
end
@@ -321,23 +323,43 @@ class Window_PokemonOption < Window_DrawableCommand
oldindex = self.index
@mustUpdateOptions = false
super
dorefresh = (self.index != oldindex)
if @is_first_update
# Needed for displaying the description of the initially selected option correctly
@selected_position = self[self.index]
@mustUpdateOptions = true
@mustUpdateDescription = true
@is_first_update = false
refresh
return
end
if self.active && self.index < @options.length
if Input.repeat?(Input::LEFT)
self[self.index] = @options[self.index].prev(self[self.index])
dorefresh =
@selected_position = self[self.index]
@mustUpdateOptions = true
@mustUpdateDescription = true
elsif Input.repeat?(Input::RIGHT)
self[self.index] = @options[self.index].next(self[self.index])
dorefresh = true
@selected_position = self[self.index]
@mustUpdateOptions = true
@mustUpdateDescription = true
refresh if self[self.index]
return
end
if Input.repeat?(Input::RIGHT)
self[self.index] = @options[self.index].next(self[self.index])
@selected_position = self[self.index]
@mustUpdateOptions = true
@mustUpdateDescription = true
refresh
return
end
if Input.repeat?(Input::UP) || Input.repeat?(Input::DOWN)
@selected_position = self[self.index]
@mustUpdateOptions = true
@mustUpdateDescription = true
refresh
return
end
end
refresh if dorefresh
refresh if (self.index != oldindex)
end
end

View File

@@ -190,7 +190,7 @@ class MoveRelearnerScreen
end
if move
if @scene.pbConfirm(_INTL("Teach {1}?", GameData::Move.get(move).name))
if pbLearnMove(pkmn, move)
if pbLearnMove(pkmn, move, false, true)
@scene.pbEndScene
return true
end

View File

@@ -201,14 +201,24 @@ PokemonDebugMenuCommands.register("setlevel", {
if pkmn.egg?
screen.pbDisplay(_INTL("{1} is an egg.", pkmn.name))
else
params = ChooseNumberParams.new
params.setRange(1, GameData::GrowthRate.max_level)
params.setDefaultValue(pkmn.level)
level = pbMessageChooseNumber(
_INTL("Set the Pokémon's level (max. {1}).", params.maxNumber), params) { screen.pbUpdate }
if level != pkmn.level
screen.pbRefreshSingle(pkmnid)
if $PokemonSystem.level_caps==1
choice= pbMessage(_INTL("Set to which level?"),[_INTL("Set to level cap"), _INTL("Set to specific level"), _INTL("Cancel")],2)
if choice==0
level = getCurrentLevelCap()
elsif choice == 1
level = promptSetLevelToNumber(pkmn,screen)
else
return
end
else
level = promptSetLevelToNumber(pkmn,screen)
end
if level && level != pkmn.level
pkmn.level = level
pkmn.calc_stats
screen.pbUpdate
screen.pbRefreshSingle(pkmnid)
end
end
@@ -216,6 +226,15 @@ PokemonDebugMenuCommands.register("setlevel", {
}
})
def promptSetLevelToNumber(pkmn,screen)
params = ChooseNumberParams.new
params.setRange(1, GameData::GrowthRate.max_level)
params.setDefaultValue(pkmn.level)
level = pbMessageChooseNumber(
_INTL("Set the Pokémon's level (max. {1}).", params.maxNumber), params) { screen.pbUpdate }
return level
end
PokemonDebugMenuCommands.register("setexp", {
"parent" => "levelstats",
"name" => _INTL("Set Exp"),

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 355 B

61
README.md Normal file
View File

@@ -0,0 +1,61 @@
## Thank you for downloading Pokémon Infinite Fusion!
Playing the game
---
**Windows**
Use **Game.exe** to play the game. That's it!
If you are experiencing issues such as long loading times, you can also try Game-performance.exe.
-----
**MacOS / Linux**
The game is not made to run natively on anything other than Windows. However, it is possible to play it Mac and Linux using Wine or Whiskey.
Refer to these tutorials:
[Wine install guide](https://hackmd.io/@PIF-Tech/MacWineGuide)
[Whiskey install guide](https://hackmd.io/@PIF-Tech/MacWhiskeyGuide)
Once Wine is installed on your computer, you can use "launch-wine.sh" to launch the game.
---
**Android**
To play Infinite Fusion on Android, you need to use a RPG Maker emulator called [JoiPlay](https://joiplay.net/).
[Android setup guide](https://hackmd.io/@PIF-Tech/AndroidGuide)
---
## Contributing to the game
Pokémon Infinite Fusion is open-source! All of the game's code is located in the Data/Scripts folder.
We accept pull requests for bug fixes and minor features* (Please contact chardub on the game's Discord if you have a feature idea to get it pre-approved before you start working on it!)
**Note: Any pull request that modifies the RPG Maker files outside of the Scripts folder will be automatically denied.
This includes any changes to the maps/game events. The reason for this is that unfortunately, the way RPG Maker XP's data
files are structured does not allow to easily see what the changes made are.**
To contribute:
- Fork the game's repo from https://github.com/infinitefusion/infinitefusion-e18
- Work from the **develop** branch to avoid merge conflicts
- Open a pull request once you're done to merge into **develop**. A pull request should only contain a single feature or bug fix. Any PR that bundles multiple features/fixes will be denied.
**There is no guarantee that submitted pull requests will be accepted.*
---
## Useful links:
- [Wiki](https://infinitefusion.fandom.com/)
- [Discord](https://discord.gg/infinitefusion)
- [Reddit](https://www.reddit.com/r/PokemonInfiniteFusion/)
- [Pokecommunity](https://www.pokecommunity.com/showthread.php?t=347883)
- [Showdown](http://play.pokeathlon.com)
- [Fusion calculator](https://www.fusiondex.org/)
This is a free-to-play Pokémon fan game. If you paid any amount of money to play this game, you have been scammed.
This game is not affiliated with Nintendo, Game Freak or Creatures Inc.

View File

@@ -1,16 +0,0 @@
Thank you for downloading Pok?mon Infinite Fusion!
Use Game.exe to play the game.
If you are experiencing issues such as long loading times, you can also try the alternate launcher.
Useful links:
Wiki: https://infinitefusion.fandom.com/
Discord: https://discord.gg/infinitefusion
Reddit: https://www.reddit.com/r/PokemonInfiniteFusion/
Pokecommunity https://www.pokecommunity.com/showthread.php?t=347883
Showdown play.pokeathlon.com
Fusion calculator https://www.fusiondex.org/
This is a free-to-play Pok?mon fan game. If you paid any amount of money to play this game, you have been scammed.
This game is not affiliated with Nintendo, Game Freak or Creatures Inc.