if defined?(RecordMixer) class Mystery_Gift_Gen2 MAX_GIFTS_DAILY = 5 MAX_PER_PERSON_DAILY = 1 COMMON_GIFTS = [ [:CHESTOBERRY,:RAWSTBERRY], [:ASPEARBERRY,:PECHABERRY], [:GUARDSPEC,:XDEFENSE], [:XATTACK,:PERSIMBERRY], [:DIREHIT,:XSPATK], [:XACCURACY,:GRASSMAIL], [:FLAMEMAIL,:BUBBLEMAIL], [:ORANBERRY,:CHERIBERRY] ] UNCOMMON_GIFTS = [ [:LUMBERRY,:SITRUSBERRY], [:REVIVE,:GREATBALL], [:SUPERREPEL,:MAXREPEL], [:ELIXIR,:ETHER] ] RARE_GIFTS = [ :WATERSTONE, :FIRESTONE, :LEAFSTONE, :THUNDERSTONE, :MAXETHER, :MAXELIXIR, :MAXREVIVE, :SCOPELENS ] VERY_RARE_GIFTS = [:HPUP,:PPUP] attr_reader :daily_timer attr_reader :gifts_received_today attr_reader :current_gift attr_reader :current_error def initialize @daily_timer = Time.now.to_i @gifts_received_today = [] @current_error = 0 end def reset_daily_gifts @current_gift = nil days = 1 return if !@daily_timer now = Time.now elapsed = (now.to_i - @daily_timer) / 86_400 elapsed += 1 if (now.to_i - @daily_timer) % 86_400 > ((now.hour * 3600) + (now.min * 60) + now.sec) return unless elapsed >= days @daily_timer = now @gifts_received_today = [] end def receive_gift(player_name,player_id,gift) @current_gift = [player_name, gift] @gifts_received_today.push(sprintf("%s-%d",player_name,player_id)) end def can_receive_gift?(player_name,player_id) player_key = sprintf("%s-%d",player_name,player_id) @current_error = 0 if @gifts_received_today.length>=MAX_GIFTS_DAILY @current_error = 1 return false elsif @gifts_received_today.select {|g| g == player_key}.length>=MAX_PER_PERSON_DAILY @current_error = 2 return false end return true end def self.generate_gift(id) r = rand(256) if r>=26 r = rand(8) gift = COMMON_GIFTS[r][(id & (1 << r) >> r)] return gift end r = rand(256) if r>=51 r = rand(4) bit = [15,8,9,10][r] gift = UNCOMMON_GIFTS[r][(id & (1 << bit) >> bit)] return gift end r = rand(256) if r>=51 bit = gift = RARE_GIFTS[(id & (0b111<< 12) >> 12)] return gift end gift = VERY_RARE_GIFTS[(id & (1 << 15) >> 15)] return gift || :GREATBALL end end class PokemonGlobalMetadata def mystery_gift_gen2 @mystery_gift_gen2 = Mystery_Gift_Gen2.new unless @mystery_gift_gen2 return @mystery_gift_gen2 end end RecordMixer.register(:mystery_gift_gen2,{ "name" => proc { _INTL("Record Mixer Bonus Item")}, "prepareData" => proc { $PokemonGlobal.mystery_gift_gen2.reset_daily_gifts if !$PokemonGlobal.pcItemStorage $PokemonGlobal.pcItemStorage = PCItemStorage.new end }, "writeData" => proc {|writer| player_var = ($player.nil?) ? $Trainer : $player writer.str(player_var.name) writer.int(player_var.id) }, "parseData" => proc {|record| player_name = record.str player_id = record.int gift = nil if $PokemonGlobal.mystery_gift_gen2.can_receive_gift?(player_name,player_id) gift = Mystery_Gift_Gen2.generate_gift(player_id) end $PokemonGlobal.mystery_gift_gen2.receive_gift(player_name,player_id,gift) }, "finalizeData" => proc { player_name,gift = $PokemonGlobal.mystery_gift_gen2.current_gift case $PokemonGlobal.mystery_gift_gen2.current_error when 1 Kernel.pbMessage(_INTL("Sorry, only {1} gifts a day.\\1",Mystery_Gift_Gen2::MAX_GIFTS_DAILY)) when 2 Kernel.pbMessage(_INTL("Sorry, you got all the gifts from {1} for today.\\1",player_name)) else if defined?(GameData) gift_name = GameData::Item.get(gift).name else gift = getID(PBItems,gift) gift_name = PBItems.getName(gift) end Kernel.pbMessage(_INTL("{1} sent {2}.\\1",player_name,gift_name)) if $PokemonGlobal.pcItemStorage.respond_to?(:can_add?) if $PokemonGlobal.pcItemStorage.can_add?(gift) $PokemonGlobal.pcItemStorage.add(gift) Kernel.pbMessage(_INTL("It was sent to your PC.\\1")) else Kernel.pbMessage(_INTL("But you have no room for it...\\1")) end else if $PokemonGlobal.pcItemStorage.pbCanStore?(gift) $PokemonGlobal.pcItemStorage.pbStoreItem(gift) Kernel.pbMessage(_INTL("It was sent to your PC.\\1")) else Kernel.pbMessage(_INTL("But you have no room for it...\\1")) end end end } }) end