Похоже, что этот вопрос поднимался только здесь на нейтральной, так что отпишусь сначала сюда.
Тоже недавно заморочился склонениями имён и откопал свой старый скрипт из перевода одной флешки на ActionScript2
Оригинал выглядел как-то так:
Спойлер Код:
Код:function slavenamePad() { if(_root.SlaveName.slice(-2) == "ка" || _root.SlaveName.slice(-2) == "ко" || _root.SlaveName.slice(-2) == "га") { this.SlaveVin = _root.SlaveName.substring(0,_root.SlaveName.length - 1) + "у"; this.SlaveDat = _root.SlaveName.substring(0,_root.SlaveName.length - 1) + "е"; this.SlaveRod = _root.SlaveName.substring(0,_root.SlaveName.length - 1) + "и"; this.SlaveTvor = _root.SlaveName.substring(0,_root.SlaveName.length - 1) + "ой"; this.SlavePred = _root.SlaveName.substring(0,_root.SlaveName.length - 1) + "е"; } else if(_root.SlaveName.slice(-2) == "за" || _root.SlaveName.slice(-2) == "на" || _root.SlaveName.slice(-2) == "ма" || _root.SlaveName.slice(-2) == "та" || _root.SlaveName.slice(-2) == "фа" || _root.SlaveName.slice(-2) == "да" || _root.SlaveName.slice(-2) == "ра" || _root.SlaveName.slice(-2) == "са") { this.SlaveVin = _root.SlaveName.substring(0,_root.SlaveName.length - 1) + "у"; this.SlaveDat = _root.SlaveName.substring(0,_root.SlaveName.length - 1) + "е"; this.SlaveRod = _root.SlaveName.substring(0,_root.SlaveName.length - 1) + "ы"; this.SlaveTvor = _root.SlaveName.substring(0,_root.SlaveName.length - 1) + "ой"; this.SlavePred = _root.SlaveName.substring(0,_root.SlaveName.length - 1) + "е"; } else if(_root.SlaveName.slice(-2) == "ия" || _root.SlaveName.slice(-2) == "уя" || _root.SlaveName.slice(-2) == "ля") { this.SlaveVin = _root.SlaveName.substring(0,_root.SlaveName.length - 1) + "ю"; this.SlaveDat = _root.SlaveName.substring(0,_root.SlaveName.length - 1) + "е"; this.SlaveRod = _root.SlaveName.substring(0,_root.SlaveName.length - 1) + "и"; this.SlaveTvor = _root.SlaveName.substring(0,_root.SlaveName.length - 1) + "ей"; this.SlavePred = _root.SlaveName.substring(0,_root.SlaveName.length - 1) + "е"; } else if(_root.SlaveName.slice(-2) == "ён" || _root.SlaveName.slice(-2) == "ер") { this.SlaveVin = _root.SlaveName + "а"; this.SlaveDat = _root.SlaveName + "у"; this.SlaveRod = _root.SlaveName + "а"; this.SlaveTvor = _root.SlaveName + "ом"; this.SlavePred = _root.SlaveName + "е"; } else { this.SlaveVin = _root.SlaveName; this.SlaveDat = _root.SlaveName; this.SlaveRod = _root.SlaveName; this.SlaveTvor = _root.SlaveName; this.SlavePred = _root.SlaveName; } if(_root.SlaveGender == 1) { this.Imen = "он"; this.Vin = "его"; this.Dat = "ему"; this.Rod = "него"; this.Tvor = "им"; this.Pred = "нём"; } else if(_root.SlaveGender == 2) { this.Imen = "она"; this.Vin = "её"; this.Dat = "ей"; this.Rod = "неё"; this.Tvor = "ей"; this.Pred = "ней"; } else if(_root.SlaveGender > 2) { this.Imen = "они"; this.Vin = "их"; this.Dat = "им"; this.Rod = "их"; this.Tvor = "ими"; this.Pred = "них"; } }
Как можно понять, великий и могучий вполне подчиняется логике, т. е. можно создать словарь, и на основе одинаковых окончаний склонять любые имена(и не только) по падежам и родам.
В игре было более сотни рабынь, но скрипт вполне справлялся со всеми. Правда есть один минус, с мужскими именами для той игры я практически не заморачивался за ненадобностью. Есть лишь варианты для ён и ер (Кён и ещё кто-то там).
Сделал вариант скрипта для VX Ace, если героиня женщина, то наверно можно использовать без изменений. У меня всё работает.
Имя персонажа: Мизуна
Для мужского персонажа придётся указать в скрипте пол - isFem = false
И тогда будет: Кён неожиданно атакова(н) (если один), либо Группа Кён(а) неожиданно атакова(на)
Спойлер Скрипт 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
Спойлер Склонение по падежам:
Код:########################### Внезапное нападение ######################### #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 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 end #Проверка падежа/пола. def isFem(fem) if fem == true return "%s неожиданно атакована!" else return "%s неожиданно атакован!" end end #Склонение имён по падежам. #Хэш: 2 последние буквы окончания => замена последней буквы окончания. def pad(actor, p) if p == "V" local = {"ка" => "у", "ко" => "у", "га" => "у", "за" => "у", "на" => "у", "ма" => "у", "та" => "у", "фа" => "у", "да" => "у", "ра" => "у", "са" => "у", "ия" => "ю", "уя" => "ю", "ля" => "ю", "ён" => "а", "ер" => "а", "ий" => "я", "ай" => "я", "ся" => "ю"} elsif p == "D" local = {"ка" => "е", "ко" => "е", "га" => "е", "за" => "е", "на" => "е", "ма" => "е", "та" => "е", "фа" => "е", "да" => "е", "ра" => "е", "са" => "е", "ия" => "е", "уя" => "е", "ля" => "е", "ён" => "у", "ер" => "у", "ий" => "ю", "ай" => "ю", "ся" => "е"} elsif p == "R" local = {"ка" => "и", "ко" => "и", "га" => "и", "за" => "ы", "на" => "ы", "ма" => "ы", "та" => "ы", "фа" => "ы", "да" => "ы", "ра" => "ы", "са" => "ы", "ия" => "и", "уя" => "и", "ля" => "и", "ён" => "а", "ер" => "а", "ий" => "я", "ай" => "я", "ся" => "и"} elsif p == "T" local = {"ка" => "ой", "ко" => "ой", "га" => "ой", "за" => "ой", "на" => "ой", "ма" => "ой", "та" => "ой", "фа" => "ой", "да" => "ой", "ра" => "ой", "са" => "ой", "ия" => "ей", "уя" => "ей", "ля" => "ей", "ён" => "ом", "ер" => "ом", "ий" => "ем", "ай" => "ем", "ся" => "ей"} elsif p == "P" local = {"ка" => "е", "ко" => "е", "га" => "е", "за" => "е", "на" => "е", "ма" => "е", "та" => "е", "фа" => "е", "да" => "е", "ра" => "е", "са" => "е", "ия" => "е", "уя" => "е", "ля" => "е", "ён" => "е", "ер" => "е", "ий" => "и", "ай" => "е", "ся" => "е"} else return actor end if(actor.slice(actor.length-2,2) == "ён" || actor.slice(actor.length-2,2) == "ер") return actor + local[actor.slice(actor.length-2,2)] else return actor.slice(0,actor.length-1) + local[actor.slice(actor.length-2,2)] end end
Если тут нет склонений для вашего персонажа, то их можно легко дописать, добавив варианты замены окончаний в последний скрипт.
Для системных сообщений требуется лишь винительный и родительный падежи. Но можно также назначить скриптом склонения на переменные и использовать их потом в игре как падежи для персонажей с изменяемыми именами.
Просьба к коду сильно не придираться, я вообще в Ruby не спец.
Если кто разбирается, то можно его дополнить и доработать.
Вынес скрипт в отдельную тему Скрипт склонения системных сообщений по полу и падежам.
Социальные закладки