mirror of
https://github.com/infinitefusion/infinitefusion-e18.git
synced 2026-07-22 07:37:00 +00:00
150 lines
4.8 KiB
Ruby
150 lines
4.8 KiB
Ruby
class Game_Temp
|
|
attr_accessor :choose_number_window
|
|
end
|
|
|
|
class ExpExtraction
|
|
attr_accessor :exp_to_extract
|
|
attr_accessor :nb_candies
|
|
|
|
attr_reader :valid_exp
|
|
attr_reader :max_value
|
|
attr_reader :full_price
|
|
|
|
BASE_PRICE = 1000
|
|
LOSS_PER_CANDY = 50
|
|
def initialize(pokemon, unit_price)
|
|
@pokemon = pokemon
|
|
@unit_price = unit_price
|
|
@exp_to_extract = 0
|
|
@nb_candies = (@exp_to_extract / 1000).floor
|
|
@full_price = BASE_PRICE + @unit_price * @nb_candies
|
|
@total_exp = pokemon.exp_gained_with_player
|
|
|
|
pokemon.exp_gained_with_player = 0 if !pokemon.exp_gained_with_player
|
|
@valid_exp = [pokemon.exp_gained_with_player,pokemon.exp].min
|
|
@max_value = @valid_exp / 1000.floor
|
|
|
|
update_text
|
|
|
|
end
|
|
|
|
def update(nb_candies)
|
|
return if nb_candies == @nb_candies
|
|
@nb_candies = nb_candies
|
|
@exp_to_extract = @nb_candies * 1000
|
|
|
|
@nb_candies = (@exp_to_extract / 1000).floor
|
|
@full_price = calculate_price
|
|
|
|
update_text
|
|
end
|
|
|
|
def calculate_price # todo: scale exponentially with bigger numbers
|
|
return BASE_PRICE + @unit_price * @nb_candies
|
|
end
|
|
|
|
def update_text
|
|
Kernel.pbClearNumber()
|
|
Kernel.pbClearText()
|
|
return if @max_value < 1
|
|
Kernel.pbDisplayText(_INTL("Exp to extract:"), 80, 100,)
|
|
Kernel.pbDisplayText("#{@exp_to_extract} / #{@valid_exp}", 120, 130,)
|
|
|
|
Kernel.pbDisplayText(_INTL("Price:"), 40, 170,)
|
|
Kernel.pbDisplayText("$#{@full_price}", 80, 200,)
|
|
end
|
|
|
|
def dispose
|
|
Kernel.pbClearText()
|
|
Kernel.pbClearNumber()
|
|
$game_temp.choose_number_window = nil
|
|
end
|
|
end
|
|
|
|
# nbCandiesVariable: variable in which to store the nb. of candies obtained.
|
|
# The event does a little animation before giving out the candies.
|
|
#
|
|
def extractExpFromPokemon(pokemon, unitPrice, nbCandiesVariable = 1)
|
|
|
|
expExtraction = ExpExtraction.new(pokemon, unitPrice)
|
|
if expExtraction.max_value < 1
|
|
pbCallBubDown(2, @event_id)
|
|
pbMessage(_INTL("Oh, I'm sorry, but this Pokémon does not have enough Exp. available for the procedure."))
|
|
pbCallBubDown(2, @event_id)
|
|
pbMessage(_INTL("Keep in mind that only the Exp. that was obtained with a Trainer can be safely extracted. Any Exp. it gained as a wild Pokémon is no good!"))
|
|
return false
|
|
end
|
|
|
|
update_proc = proc {
|
|
cmdwindow = $game_temp.choose_number_window
|
|
if cmdwindow
|
|
current_number = cmdwindow.number
|
|
expExtraction.update(current_number)
|
|
end
|
|
}
|
|
|
|
params = ChooseNumberParams.new
|
|
params.setRange(0, expExtraction.max_value)
|
|
params.setDefaultValue(1)
|
|
params.setCancelValue(0)
|
|
|
|
value = pbMessageChooseNumber(_INTL("\\GHow many \\C[1]Exp. Candies\\C[0] to extract?"), params, &update_proc)
|
|
new_exp = pokemon.exp - expExtraction.exp_to_extract
|
|
new_exp -= ExpExtraction::LOSS_PER_CANDY*expExtraction.nb_candies
|
|
new_exp -= expExtraction.nb_candies
|
|
|
|
|
|
new_exp = 0 if new_exp < 0
|
|
nb_candies = expExtraction.nb_candies
|
|
|
|
new_level = pokemon.calculate_level_at_exp(new_exp)
|
|
expExtraction.dispose
|
|
if expExtraction.nb_candies <= 0 || value <=0 #value:0 means that it was cancelled
|
|
return false
|
|
end
|
|
|
|
if $Trainer.money < expExtraction.full_price
|
|
pbCallBubDown(2, @event_id)
|
|
pbMessage(_INTL("Oh, I'm sorry, but you don't have enough money to afford the procedure. You might want to try a smaller extraction."))
|
|
return false
|
|
end
|
|
|
|
pbCallBubDown(2, @event_id)
|
|
if pbConfirmMessage(_INTL("Your {1} will go from \\C[1]Level {2}\\C[0] to \\C[1]Level {3}\\C[0] after all the Exp. Candies are extracted. Do you still want to continue?", pokemon.name, pokemon.level, new_level))
|
|
exp_to_extract = expExtraction.exp_to_extract + ExpExtraction::LOSS_PER_CANDY*expExtraction.nb_candies
|
|
removeExp(pokemon, exp_to_extract)
|
|
pbSet(nbCandiesVariable, nb_candies)
|
|
$Trainer.money -= expExtraction.full_price
|
|
else
|
|
return false
|
|
end
|
|
|
|
end
|
|
|
|
def removeExp(pokemon, exp_to_remove)
|
|
pokemon.exp_gained_with_player = 0 unless pokemon.exp_gained_with_player
|
|
pokemon.exp_gained_with_player -= exp_to_remove
|
|
pokemon.exp_gained_with_player = 0 if pokemon.exp_gained_with_player < 0
|
|
|
|
if pokemon.exp_gained_since_fused && pokemon.exp_gained_with_player > 0
|
|
pokemon.exp_gained_since_fused -= exp_to_remove
|
|
if pokemon.exp_gained_since_fused < 0
|
|
pokemon.exp_when_fused_head = 0 unless pokemon.exp_when_fused_head
|
|
pokemon.exp_when_fused_body = 0 unless pokemon.exp_when_fused_body
|
|
|
|
difference = pokemon.exp_gained_since_fused.abs
|
|
pokemon.exp_gained_since_fused = 0
|
|
pokemon.exp_when_fused_head -= difference / 2
|
|
pokemon.exp_when_fused_body -= difference / 2
|
|
|
|
pokemon.exp_when_fused_head = 0 if pokemon.exp_when_fused_head < 0
|
|
pokemon.exp_when_fused_body = 0 if pokemon.exp_when_fused_body < 0
|
|
end
|
|
pokemon.exp_gained_since_fused = 0 if pokemon.exp_gained_since_fused < 0
|
|
end
|
|
|
|
pokemon.exp -= exp_to_remove
|
|
pokemon.exp = 0 if pokemon.exp < 0
|
|
pokemon.calc_stats
|
|
end
|