RolePlay-S

RolePlay-S 0.4.7

Lazi Ness

Модостроитель
Автор модов
Регистрация
29.05.2024
Темы
1
Сообщения
341
Реакции
265
Надо вот так:

Ruby:
    attr_accessor        :prev_mp # По аналогии с другими статами типа prev. Я не особо разбирался нафиг оно надо, просто делал как Эккма.
    alias_method(:setup_role_play, :setup) #переименовать setup → setup_role_play
 
    def setup(actor_id) #Наш новый def. При его запуске в него подаются данные об actor_id другими def. Как и в оригинальный.
#И остальной код игры будет принимать его за оригинальный потому что имя то же самое.
     
        setup_role_play(actor_id) # вызов старой версии def, который мы переименовали. И мы передаем ему эстафетным методом данные об actor_id.
        @prev_mp = self.mp # MP
    end
в общем, сначала все было нормально, но потом он перестал работать!))

1730665826104.png
 

AleDerXan

Модостроитель
Автор модов
Регистрация
20.06.2024
Темы
6
Сообщения
464
Реакции
221
Возраст
32
Так я тебе про вторую часть кода не просто так говорил.
 

Lazi Ness

Модостроитель
Автор модов
Регистрация
29.05.2024
Темы
1
Сообщения
341
Реакции
265
Надо вот так:

Ruby:
    attr_accessor        :prev_mp # По аналогии с другими статами типа prev. Я не особо разбирался нафиг оно надо, просто делал как Эккма.
    alias_method(:setup_role_play, :setup) #переименовать setup → setup_role_play
 
    def setup(actor_id) #Наш новый def. При его запуске в него подаются данные об actor_id другими def. Как и в оригинальный.
#И остальной код игры будет принимать его за оригинальный потому что имя то же самое.
    
        setup_role_play(actor_id) # вызов старой версии def, который мы переименовали. И мы передаем ему эстафетным методом данные об actor_id.
        @prev_mp = self.mp # MP
    end
Понятно. Твой вариант сработал.) Значит, он все же переименовывает, а не создает ассоциацию.
 

AleDerXan

Модостроитель
Автор модов
Регистрация
20.06.2024
Темы
6
Сообщения
464
Реакции
221
Возраст
32
В игре не было prev_arousal нормального. Только какая-то медленная штука в hud.
Но мне нужно было нормальная версия.
И я сделал prev обработку для arousal.
И код выше, который я скинул - он работает стабильно и без сбоев.
Это там где две части обработки.
 

AleDerXan

Модостроитель
Автор модов
Регистрация
20.06.2024
Темы
6
Сообщения
464
Реакции
221
Возраст
32
И да, к слову.
Если перед названием def стоит self.
То алиас метод нужно делать чуть иначе.
Вот примерно так:
Ruby:
    class << self
        alias_method :Новый_имя_Def, :Старый_имя_DEF
    end
   
    def self.Старый_имя_DEF(входные_данные)
        Делаем что-то своё…
        Новый_имя_Def(входные_данные)
        Делаем что-то своё… второй раз
    end
 

Lazi Ness

Модостроитель
Автор модов
Регистрация
29.05.2024
Темы
1
Сообщения
341
Реакции
265
Так вот как у меня сделано:
Ruby:
class Game_Actor < Game_Battler
    attr_accessor        :prev_arousal_corsys
  
    alias_method :setup_corsys, :setup
    def setup(actor_id)
        setup_corsys(actor_id)
        @prev_arousal_corsys = self.arousal
    end

end


class LonaActorStat < ActorStat
    alias_method :set_stat_corsys, :set_stat
  
    def set_stat(stat_name, value, type=CURRENT_STAT)
        set_stat_corsys(stat_name, value, type)
      
      
        #return if !stat_name
        return p "stats not exist on PlayerActor stat_name=>#{stat_name} V=>#{value} t=>#{type}" if @stat[stat_name].nil?
        value=value.round(3) if value.is_a?(Float)
        @stat[stat_name][type]=value
        #when setting MAX_STAT or MIN_STAT we need to not check them in order to prevent situation when we first increase MAX_STAT, then round to MAX_TRUE, then apply reduction by decreasing MAX_STAT
        #setting MAX_TRUE and MIN_TRUE will break whole chain of checks with how they're made anyway, so it'll be applied only on next refresh.
        check_current_stat(stat_name) if type == CURRENT_STAT
      
        #those calls were in update_state_frames each frame
        if type == CURRENT_STAT && !@actor.nil? then
            if stat_name == "arousal".freeze then
                @actor.check_prev_arousal_to_sta
                @actor.prev_arousal_corsys = @actor.arousal
            end
        end

    end
  
end
не, опять что-то мудреное,)) оставлю пока как есть.
 

AleDerXan

Модостроитель
Автор модов
Регистрация
20.06.2024
Темы
6
Сообщения
464
Реакции
221
Возраст
32
не, опять что-то мудреное,)) оставлю пока как есть.
Я сам часто не особо разбираюсь что там и как. Просто смотрю что делал Эккма для похожих случаев, и копирую как есть. И смотрю что получилось. (Ну и походу дела чуток углубляю понимание… Чисто на примерах.)
Конкретно тут у меня был пример Эккмы с prev_sta.
Тупо в Notepad++ провел поиск по всем файлам игры сочетания «prev_sta», и везде где нашел, добавил через алиас уже у себя в моде, идентичный код но для prev_arousal. И не особо разбирался зачем он там нужен и что делает.
Посмотрел какие def работают с уже созданной и инициализированной prev_sta. И поискал по файлам игры уже их имена, чтоб найти какие другие def их запускают. Написал свой def для работы с prev_arousal, и через алиас добавил его вызов в те def, которые запускали def делающие всякое уже с готовой prev_sta.

В общем, просто полностью повторил готовый рецепт.
 

AleDerXan

Модостроитель
Автор модов
Регистрация
20.06.2024
Темы
6
Сообщения
464
Реакции
221
Возраст
32

Lazi Ness

Модостроитель
Автор модов
Регистрация
29.05.2024
Темы
1
Сообщения
341
Реакции
265
А кстати, как ты добавил абсолютный опыт после фрагов?
Может тут тоже есть что сделать проще?
Утречка! Не понял, о чем речь.)
У меня вот так сейчас, условия для окон с EXP отладочные.
Ruby:
class Game_Actor < Game_Battler

    alias_method(:gain_exp_RP_S, :gain_exp)
 
    def gain_exp(exp, mult=true)
        if mult == true
            player_level = $game_player.actor.level # #0.45 - предел 24к для 1600 (8к), 0.66 - 16к
            exp = (exp*0.2) * (7.00 / (0.45 + Math.exp(-0.1 * (player_level - 25))) - 0.5)
            if exp > 100
                exp = exp.round(-1)
                SndLib.sys_LvUp(50,100)
                $game_map.popup(0,"EXP+#{exp}",0,0)
            end
        else
            exp = exp*mult.to_f
            if exp > 9
                tmp_exp = @exp_when_killed # перенести блок с сообщением в gain_exp
                SndLib.sys_LvUp(5,150)
                $game_map.popup(0,"EXP+#{(exp).round}",0,0)
            end
        end
        gain_exp_RP_S(exp)
    end
end
 
Последнее редактирование:

AleDerXan

Модостроитель
Автор модов
Регистрация
20.06.2024
Темы
6
Сообщения
464
Реакции
221
Возраст
32
Если нужно чтоб убивание давало абсолютный опыт то делаем так:


Ruby:
    def summon_death_event
        $game_player.actor.gain_exp_RP_S(@exp_when_killed) if @exp_when_killed && @last_attacker == $game_player
        $game_map.reserve_summon_event(*death_event_data) if !npc.death_event.nil? && !npc.death_event.empty?
    end
Тут, кажись надо без Алиас. (Или использовать алиас, но преобразовать так число опыта, чтоб после перемножения на (exp*0.2) * (7.00 / (0.45 + Math.exp(-0.1 * (player_level - 25))) - 0.5) вернулось как было…)
Типа………

Ruby:
class Game_NonPlayerCharacter  < Game_Battler
    alias_method(:summon_death_event_RP_S, :summon_death_event)
    def summon_death_event
        if @exp_when_killed && @last_attacker == $game_player
            player_level = $game_player.actor.level
            @exp_when_killed = @exp_when_killed.to_f / ( 0.2 * (7.00 / (0.45 + Math.exp(-0.1 * (player_level - 25))) - 0.5))
        end
        summon_death_event_RP_S
    end
end
 
Последнее редактирование:

AleDerXan

Модостроитель
Автор модов
Регистрация
20.06.2024
Темы
6
Сообщения
464
Реакции
221
Возраст
32
1730711375571.png

1730711402340.png
Я в механике класов Руби еще не очень разобрался, но тут есть шанс, что твой @exp_when_killed не тот который надо…
Переменные по типу @переменная - они не глобальные. Они локальные. Точнее, они глобальное, но частично, лишь для одного класса. А тут заглавие разное…
Разные классы. Пусть подклассы и называются одинаково… Но раз разные классы, то есть шанс, что переменная @exp_when_killed - как бы… не общая. Но нужно проверить.
 
Последнее редактирование:

Lazi Ness

Модостроитель
Автор модов
Регистрация
29.05.2024
Темы
1
Сообщения
341
Реакции
265
Если нужно чтоб убивание давало абсолютный опыт то делаем так:


Ruby:
    def summon_death_event
        $game_player.actor.gain_exp_RP_S(@exp_when_killed) if @exp_when_killed && @last_attacker == $game_player
        $game_map.reserve_summon_event(*death_event_data) if !npc.death_event.nil? && !npc.death_event.empty?
    end
Тут, кажись надо без Алиас. (Или использовать алиас, но преобразовать так число опыта, чтоб после перемножения на (exp*0.2) * (7.00 / (0.45 + Math.exp(-0.1 * (player_level - 25))) - 0.5) вернулось как было…)
Типа………

Ruby:
class Game_NonPlayerCharacter  < Game_Battler
    alias_method(:summon_death_event_RP_S, :summon_death_event)
    def summon_death_event
        if @exp_when_killed && @last_attacker == $game_player
            player_level = $game_player.actor.level
            @exp_when_killed = @exp_when_killed.to_f / ( 0.2 * (7.00 / (0.45 + Math.exp(-0.1 * (player_level - 25))) - 0.5))
        end
        summon_death_event_RP_S
    end
end
м? опыт за убийство мобов сейчас работает как нужно. Сложность мира растет, мобы сильнее, больше опыта, тут все нормально.
Опыт за квесты тоже нормальный, сначала его мало, на высоких лвлах в три раза больше от ванильного.
а вот относительный сексуальный опыт немного высоковат... 700 ед. на 24-м без черт на разврат. С ними в 2-3 раза будет больше. Но в целом, в общем-то не критично.
 
Сверху Снизу