Плохо! Плохо!:  0
Показано с 1 по 1 из 1

Тема: Скрипт склонения системных сообщений по полу и падежам.

  1. #1

    VX Ace Game Icon Скрипт склонения системных сообщений по полу и падежам.

    Скрипт склонения системных сообщений по полу и падежам.
    Автор: RSV2
    Версия: 1.0




    Описание:

    Вообще, уже довольно давно раздражает невозможность склонять системные сообщения мукеров в переводах, так что сподобился слепить для себя костыль.
    К сожалению универсальным сделать его не удалось.

    Особенности:
    • Позволяет склонять по падежам и половому признаку всплывающие сообщения в игре.
    • Позволяет склонять по падежам почти любые (пока в основном женские) имена. Почему пока почти указано в этом посте.


    Так как скрипт не универсальный, далее опишу как его собрать по частям:

    Подготовка:

    Как оказалось, для обычных проектов, более-менее актуальны сообщения о внезапном нападении и о том, что кто-то кого-то защитил своим телом.

    Так же востребованы сообщения с разделением по половому признаку.
    К сожалению с этим проблема. По умолчанию пол героя нигде в данных мукеров не фигурирует.
    Так что ввёл свой "костыль" добавив метку "#fem#" для персонажей женского рода. (делается ручками для каждого персонажа).
    Так как многие игры используют поле "note" для скриптов, то наверно желательно, чтобы метка начиналась с заглушки "#".

    Спойлер Скриншоты:





    Далее будем собирать скрипт индивидуально под вашу игру. (Буду делать на примере своего перевода)
    Неизменяемые блоки просто копипастим не думая, то что требует изменений - делаем по указанным шаблонам.

    Неизменяемый Блок 1.
    Спойлер Неизменяемый блок 1:

    Код:
    ########################### Внезапное нападение #########################
    #isFem: женщина - true;  мужчина - false
    # Мизуна неожиданно атакова(на)/Василий неодиданно атакова(н)
    # Группа Василия неожиданно атакова(на)
    BattleManager_old = BattleManager.clone
    module BattleManager
      def self.battle_start
        $game_system.battle_count += 1
        $game_party.on_battle_start
        $game_troop.on_battle_start
        $game_troop.enemy_names.each do |name|
          $game_message.add(sprintf(Vocab::Emerge, name))
        end
        if @preemptive
          $game_message.add(sprintf(Vocab::Preemptive, $game_party.name))
        elsif @surprise
          if $game_party.battle_members.size > 1
            $game_message.add(sprintf(isFem(true), $game_party.name))
          else
            #isFem Заменить на false, если персонаж мужчина.
            $game_message.add(sprintf(isFem(true), $game_party.name))
          end
        end
        wait_for_message
      end
      #Сообщение о внезапной атаке в зависимости от пола.
      def self.isFem(fem)
        if fem == true
          return "%s неожиданно атакована!"
        else
          return "%s неожиданно атакован!"
        end
      end
    end
    # Персонаж/Группа
    # (Мизуна/Группа Мизун(ы))
    class Game_Party < Game_Unit
      alias name_pad name
      def name
        return ""           if battle_members.size == 0
        return leader.name  if battle_members.size == 1
        return sprintf(Vocab::PartyName, pad(leader.name,"R"))
      end
    end
    
    class Window_BattleLog < Window_Selectable
    # Сообщение о защите другого персонажа. "(Кот) прикрыл собой Мизун(у)"
      alias display_substitute_new display_substitute
      def display_substitute(substitute, target)
        add_text(sprintf(Vocab::Substitute, substitute.name, pad(target.name, "V")))
        wait
        back_one
      end
    
    #[State] Сообщение о состоянии message3.
      alias display_current_state_new display_current_state
      def display_current_state(subject)
        isFem = subject.actor? ? subject.actor.note.include?("#fem#") : subject.enemy.note.include?("#fem#")
        unless subject.most_important_state_text(isFem).empty?
          add_text(subject.name + subject.most_important_state_text(isFem))
          wait
        end
      end
    #[State]
      alias display_added_states_new display_added_states
      def display_added_states(target)
        isFem = target.actor? ? target.actor.note.include?("#fem#") : target.enemy.note.include?("#fem#")
        target.result.added_state_objects.each do |state|

    Пользовательские сообщения о добавлении конкретных состояний:
    Message1 - Добавление состояния персонажу
    Message2 - Добавление состояния врагу
    Для своей игры делайте свой список по указанному ниже шаблону.
    Все прочие состояния, не вошедшие в этот список будут добавляться как обычно.
    Если не нужно, то можно вообще его не добавлять.
    Спойлер Пользовательские сообщения о добавлении конкретных состояний::

    Код:
          # Свои сообщения о добавлении состояний. Используйте id (порядковый номер в State)
          # Например state.id == 2 - это Яд.
          if state.id == 2
            if isFem
              # Цель женского рода.
              state.message1 = " отравлена"
              state.message2 = " отравлена"
            else
              # Цель мужского рода.
              state.message1 = " отравлен"
              state.message2 = " отравлен"
            end
          elsif state.id == 7
            if isFem
              # Цель женского рода.
              state.message1 = " парализована"
              state.message3 = " парализована"
            else
              # Цель мужского рода.
              state.message1 = " парализован"
              state.message3 = " парализован"
            end
          elsif state.id == 8
            if isFem
              # Цель женского рода.
              state.message1 = " сбита с ног"
              state.message2 = " сбита с ног"
            else
              # Цель мужского рода.
              state.message1 = " сбит с ног"
              state.message2 = " сбит с ног"
            end
          end


    Неизменяемый Блок 2.
    Спойлер Неизменяемый Блок 2:

    Код:
          state_msg = target.actor? ? state.message1 : state.message2
          target.perform_collapse_effect if state.id == target.death_state_id
          next if state_msg.empty?
          # Своё сообщение о добавлении состояния. Отравление id = 2
          replace_text(target.name + state_msg)
          wait
          wait_for_effect
        end
      end
    #[State]
      alias display_removed_states_new display_removed_states
      def display_removed_states(target)
        isFem = target.actor? ? target.actor.note.include?("#fem#") : target.enemy.note.include?("#fem#")
        target.result.removed_state_objects.each do |state|
          next if state.message4.empty?


    Аналогично добавлению состояний, делаем список удаления состояний:
    Message4 - Сообщение при удалении состояния.
    Все прочие состояния, не вошедшие в этот список будут добавляться как обычно.
    Если не нужно, то можно вообще его не добавлять.
    Спойлер Список удаления состояний::

    Код:
          # Пользовательские сообщения об удалении состояний.
          if state.id == 2
            state.message4 = isFem ? " исцелилась от яда" : " исцелился от яда"
          elsif state.id == 7
            state.message4 = isFem ? " избавилась от паралича" : " избавился от паралича"
          elsif state.id == 8
            state.message4 = isFem ? " восстановила равновесие" : " восстановил равновесие"
          end


    Неизменяемый Блок 3.
    Спойлер Неизменяемый Блок 3:

    Код:
          replace_text(target.name + state.message4)
          wait
        end
      end
    #[Skill] Сообщения Skill & Item
      alias display_use_item_new display_use_item
      def display_use_item(subject, item)
        isFem = subject.actor? ? subject.actor.note.include?("#fem#") : subject.enemy.note.include?("#fem#")
        # Сообщение Skill
        if item.is_a?(RPG::Skill)


    Пользовательские сообщения активации навыков:
    Спойлер Пользовательские сообщения активации навыков::

    Код:
          # Своё сообщение Message1 для Skill № XX
          # Добавить через elsif сколько нужно для конкретной игры.
          if item.id == 8
            item.message1 = isFem ? add_text(subject.name + " кинула сюрикен!") : add_text(subject.name + " кинул сюрикен!")
          else
          # Стандартное сообщение Message1
            add_text(subject.name + item.message1)
          end
          unless item.message2.empty?
            wait
            # Своё сообщение Message2 для Skill № XX
            # Добавить через elsif сколько нужно для конкретной игры.
            if item.id == 8
              item.message2 = isFem ? add_text("Ваше сообщение Ж") : add_text("Ваше сообщение М")
            end
            # Стандартное сообщение Message2
            add_text(item.message2)
          end

    ИЛИ
    Если не собираетесь добавлять никаких сообщений для навыков, то просто вставьте код ниже:
    Спойлер ИЛИ:

    Код:
          add_text(subject.name + item.message1)
          unless item.message2.empty?
            wait
            add_text(item.message2)
          end


    Неизменяемый Блок 4.
    Спойлер Неизменяемый Блок 4:

    Код:
        else
          add_text(sprintf(Vocab::UseItem, subject.name, item.name))
        end
      end
    end
    
    #[State] Для State Message3 Сообщение о продолжении состояния.
    class Game_BattlerBase
      alias most_important_state_text_new most_important_state_text
      def most_important_state_text(isFem)
        states.each do |state|


    Пользовательский список течения состояний:
    Message3 - Сообщение о текущем состоянии персонажа.
    Если не нужно, то можно вообще его не добавлять.
    Спойлер Пользовательский список течения состояний:

    Код:
          if state.id == 2
            state.message3 = isFem ? " отравлена ядом" : " отравлен ядом"
          elsif state.id == 7
            state.message3 = isFem ? " застыла парализованная" : " застыл парализованный"
          elsif state.id == 8
            state.message3 = isFem ? " сбита с ног" : " сбит с ног"
          end


    Неизменяемый Блок 5.
    Спойлер Неизменяемый Блок 5:

    Код:
          return state.message3 unless state.message3.empty?
        end
        return ""
      end
    end
    
    #Склонение имён по падежам.
    #Исправление от 09.03.24
    def pad(actor, p)
      if (actor.length <= 2)
        return actor
      end
      if p == "V"
        local = {
        # 2 буквы. Последняя А
        # Последняя А
        "ба" => "у", "ва" => "у", "га" => "у", "да" => "у", "жа" => "у", 
        "за" => "у", "ка" => "у", "ла" => "у", "ма" => "у", "на" => "у",
        "па" => "у", "ра" => "у", "са" => "у", "та" => "у", "фа" => "у",
        "ха" => "у", "ца" => "у", "ча" => "у", "ша" => "у", "ща" => "у",
        # ёк, ок
        "ёк" => "ька", "ок" => "ка",
        # 1 буква
        "б" => "а", "в" => "а", "г" => "а", "д" => "а", "ж" => "а", "з" => "а",
        "й" => "я", "к" => "а", "л" => "а", "м" => "а", "н" => "а", "п" => "а",
        "р" => "а", "с" => "а", "т" => "а", "ф" => "а", "х" => "а", "ц" => "а",
        "ч" => "а", "ш" => "а", "щ" => "а", "я" => "ю"}
      elsif p == "D"
        local = {
        # 2 буквы. Последняя А
        # Последняя А
        "ба" => "е", "ва" => "е", "га" => "е", "да" => "е", "жа" => "е", 
        "за" => "е", "ка" => "е", "ла" => "е", "ма" => "е", "на" => "е",
        "па" => "е", "ра" => "е", "са" => "е", "та" => "е", "фа" => "е",
        "ха" => "е", "ца" => "е", "ча" => "е", "ша" => "е", "ща" => "е",
        # ёк, ок
        "ёк" => "ьку", "ок" => "ку",
        # 1 буква
        "б" => "у", "в" => "у", "г" => "у", "д" => "у", "ж" => "у", "з" => "у",
        "й" => "ю", "к" => "у", "л" => "у", "м" => "у", "н" => "у", "п" => "у",
        "р" => "у", "с" => "у", "т" => "у", "ф" => "у", "х" => "у", "ц" => "у",
        "ч" => "у", "ш" => "у", "щ" => "у", "я" => "е"}
      elsif p == "R"
        local = {
        # 2 буквы. Последняя А
        # Последняя А
        "ба" => "ы", "ва" => "ы", "га" => "и", "да" => "ы", "жа" => "и", 
        "за" => "ы", "ка" => "и", "ла" => "ы", "ма" => "ы", "на" => "ы",
        "па" => "ы", "ра" => "ы", "са" => "ы", "та" => "ы", "фа" => "ы",
        "ха" => "и", "ца" => "ы", "ча" => "и", "ша" => "и", "ща" => "и",
        # ёк, ок
        "ёк" => "ька", "ок" => "ка",
        # 1 буква
        "б" => "а", "в" => "а", "г" => "а", "д" => "а", "ж" => "а", "з" => "а",
        "й" => "я", "к" => "а", "л" => "а", "м" => "а", "н" => "а", "п" => "а", 
        "р" => "а", "с" => "а", "т" => "а", "ф" => "а", "х" => "а", "ц" => "а",
        "ч" => "а", "ш" => "а", "щ" => "а", "я" => "и"}
      elsif p == "T"
        local = {
        # 2 буквы. Последняя А
        # Последняя А
        "ба" => "ой", "ва" => "ой", "га" => "ой", "да" => "ой", "жа" => "ей", 
        "за" => "ой", "ка" => "ой", "ла" => "ой", "ма" => "ой", "на" => "ой",
        "па" => "ой", "ра" => "ой", "са" => "ой", "та" => "ой", "фа" => "ой",
        "ха" => "ой", "ца" => "ей", "ча" => "ей", "ша" => "ей", "ща" => "ей",
        # ёк, ок
        "ёк" => "ьком", "ок" => "ком",
        # 1 буква
        "б" => "ом", "в" => "ом", "г" => "ом", "д" => "ом", "ж" => "ом", "з" => "ом",
        "й" => "ем", "к" => "ом", "л" => "ом", "м" => "ом", "н" => "ом", "п" => "ом",
        "р" => "ом", "с" => "ом", "т" => "ом", "ф" => "ом", "х" => "ом", "ц" => "ем",
        "ч" => "ом", "ш" => "ом", "щ" => "ом", "я" => "ей"}
      elsif p == "P"
        local = {
        # 2 буквы. Последняя А
        # Последняя А
        "ба" => "е", "ва" => "е", "га" => "е", "да" => "е", "жа" => "е", 
        "за" => "е", "ка" => "е", "ла" => "е", "ма" => "е", "на" => "е",
        "па" => "е", "ра" => "е", "са" => "е", "та" => "е", "фа" => "е",
        "ха" => "е", "ца" => "е", "ча" => "е", "ша" => "е", "ща" => "е",
        # ёк, ок
        "ёк" => "ьке", "ок" => "ке",
        # 1 буква
        "б" => "е", "в" => "е", "г" => "е", "д" => "е", "ж" => "е", "з" => "е",
        "й" => "е", "к" => "е", "л" => "е", "м" => "е", "н" => "е", "п" => "е",
        "р" => "е", "с" => "е", "т" => "е", "ф" => "е", "х" => "е", "ц" => "е",
        "ч" => "е", "ш" => "е", "щ" => "е", "я" => "е"}
      else
        return actor
      end
      
      if ((local.include?(actor.slice(actor.length-2,2)) == false) &&
        (local.include?(actor.slice(actor.length-1,1)) == false))
        return actor
      end
      if (actor.slice(actor.length-2,2) == "ок" ||
        actor.slice(actor.length-2,2) == "ёк" )
        return actor.slice(0,actor.length-2) + local[actor.slice(actor.length-2,2)]
      elsif (actor.slice(actor.length-1,1) == "й" ||
        actor.slice(actor.length-1,1) == "я")
        return actor.slice(0,actor.length-1) + local[actor.slice(actor.length-1,1)]
      elsif (actor.slice(actor.length-1,1) != "а" &&
        actor.slice(actor.length-1,1) != "о" &&
        actor.slice(actor.length-1,1) != "ь" &&
        actor.slice(actor.length-1,1) != "ъ" &&
        actor.slice(actor.length-1,1) != "э" &&
        actor.slice(actor.length-1,1) != "ю" &&
        actor.slice(actor.length-1,1) != "ё")
        return actor + local[actor.slice(actor.length-1,1)]
      else
        return actor.slice(0,actor.length-1) + local[actor.slice(actor.length-2,2)]
      end
    end


    Всё, скрипт готов и его можно вставить в список скриптов вашей игры.
    Обратите внимание. Все сообщения указанных в скрипте состояний и навыков в базе данных, будут перехватываться скриптом.
    Поэтому можете их там не изменять.

    Как это выглядит в игре:
    Спойлер Как это выглядит в игре:







    В игре так же можно просклонять персонажа по падежам, назначив склонения например на переменные или имена актёров, а потом их использовать в тексте по мере надобности:
    Скрипт добавления падежей.

    Спойлер Скрипт добавления падежей в игре:

    Код:
    $game_variables[100] = pad($game_actors[1].name, "V")
    $game_variables[101] = pad($game_actors[1].name, "D")
    $game_variables[102] = pad($game_actors[1].name, "R")
    $game_variables[103] = pad($game_actors[1].name, "T")
    $game_variables[104] = pad($game_actors[1].name, "P")


    Дополнительно:
    Мой скрипт с "унисекс" (по возможности) сообщениями.
    (если нужно)
    Спойлер Vocab:
    Код:
    #==============================================================================
    # ■ Vocab
    #------------------------------------------------------------------------------
    #  用語とメッセージを定義するモジュールです。定数でメッセージなどを直接定義す
    # るほか、グローバル変数 $data_system から用語データを取得します。
    #==============================================================================
    
    module Vocab
    
      # ショップ画面
      # Shop Screen
      ShopBuy         = "Купить"
      ShopSell        = "Продать"
      ShopCancel      = "Отмена"
      Possession      = "В наличии"
    
      # Status Screen
      ExpTotal        = "Опыт"
      ExpNext         = "До повышения "
    
      # Save/Load Screen
      SaveMessage     = "Куда сохранить?"
      LoadMessage     = "Что загрузить?"
      File            = "Сохранение"
    
      # Display when there are multiple members
      PartyName       = "Группа %s"
    
      # Basic Battle Messages
      Emerge          = "%s вступает в бой!"
      Preemptive      = "%s наносит первый удар!"
      Surprise        = ""
      EscapeStart     = "%s пытается убежать!"
      EscapeFailure   = "Но побег не удался!"
    
      # Battle Ending Messages
      Victory         = "%s побеждает!"
      Defeat          = "%s терпит поражение."
      ObtainExp       = "Получено %s оч. опыта!"
      ObtainGold      = "Получено %s\\G!"
      ObtainItem      = "Получено %s!"
      LevelUp         = "%s получает новый %s %s!"
      ObtainSkill     = "Изучено: %s!"
    
      # Use Item
      UseItem         = "%s использует %s!"
    
      # Critical Hit
      CriticalToEnemy = "Критический урон!!!"
      CriticalToActor = "Критический урон!!!"
    
      # Results for Actions on Actors
      ActorDamage     = "%s получает %s оч. урона!"
      ActorRecovery   = "%s восстанавливает %s %s!"
      ActorGain       = "%s получает %s оч. %s!"
      ActorLoss       = "%s теряет %s оч. %s!"
      ActorDrain      = "%s поглощает %s оч. %s!"
      ActorNoDamage   = "%s не получает урона!"
      ActorNoHit      = "Промах! %s не получает урона!"
    
      # Results for Actions on Enemies
      EnemyDamage     = "%s получает %s оч. урона!"
      EnemyRecovery   = "%s восстанавливает %s %s!"
      EnemyGain       = "%s повышает %s %s!"
      EnemyLoss       = "%s теряет %s %s!"
      EnemyDrain      = "%s поглощает %s %s!"
      EnemyNoDamage   = "%s не получает урона!"
      EnemyNoHit      = "Мимо! %s не получает урона!"
    
      # Evasion/Reflection
      Evasion         = "%s уклоняется от атаки!"
      MagicEvasion    = "%s нейтрализует магию!"
      MagicReflection = "%s отражает магию!"
      CounterAttack   = "%s контратакует!"
      Substitute      = "%s защищает %s!"
    
      # Buff/Debuff
      BuffAdd         = "%s: повышение %s!"
      DebuffAdd       = "%s: понижение %s!"
      BuffRemove      = "%s: %s возвращается в норму."
    
      # Skill or Item Had No Effect
      ActionFailure   = "%s не ощущает никакого эффекта!"
    
      # Error Message
      PlayerPosError  = "Не установлена стартовая точка игрока."
      EventOverflow   = "Количество вызванных общих событий превысило лимит."
    
      # 基本ステータス
      def self.basic(basic_id)
        $data_system.terms.basic[basic_id]
      end
    
      # 能力値
      def self.param(param_id)
        $data_system.terms.params[param_id]
      end
    
      # 装備タイプ
      def self.etype(etype_id)
        $data_system.terms.etypes[etype_id]
      end
    
      # コマンド
      def self.command(command_id)
        $data_system.terms.commands[command_id]
      end
    
      # 通貨単位
      def self.currency_unit
        $data_system.currency_unit
      end
    
      #--------------------------------------------------------------------------
      def self.level;       basic(0);     end   # レベル
      def self.level_a;     basic(1);     end   # レベル (短)
      def self.hp;          basic(2);     end   # HP
      def self.hp_a;        basic(3);     end   # HP (短)
      def self.mp;          basic(4);     end   # MP
      def self.mp_a;        basic(5);     end   # MP (短)
      def self.tp;          basic(6);     end   # TP
      def self.tp_a;        basic(7);     end   # TP (短)
      def self.fight;       command(0);   end   # 戦う
      def self.escape;      command(1);   end   # 逃げる
      def self.attack;      command(2);   end   # 攻撃
      def self.guard;       command(3);   end   # 防御
      def self.item;        command(4);   end   # アイテム
      def self.skill;       command(5);   end   # スキル
      def self.equip;       command(6);   end   # 装備
      def self.status;      command(7);   end   # ステータス
      def self.formation;   command(8);   end   # 並び替え
      def self.save;        command(9);   end   # セーブ
      def self.game_end;    command(10);  end   # ゲーム終了
      def self.weapon;      command(12);  end   # 武器
      def self.armor;       command(13);  end   # 防具
      def self.key_item;    command(14);  end   # 大事なもの
      def self.equip2;      command(15);  end   # 装備変更
      def self.optimize;    command(16);  end   # 最強装備
      def self.clear;       command(17);  end   # 全て外す
      def self.new_game;    command(18);  end   # ニューゲーム
      def self.continue;    command(19);  end   # コンティニュー
      def self.shutdown;    command(20);  end   # シャットダウン
      def self.to_title;    command(21);  end   # タイトルへ
      def self.cancel;      command(22);  end   # やめる
      #--------------------------------------------------------------------------
    end
    Последний раз редактировалось rsv2; 15.03.2024 в 16:24. Причина: Исправление склонений от 26.12.23

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Метки этой темы

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •  
Скрипт склонения системных сообщений по полу и падежам.