#============================================================================== # ■ キャラクタの名前入力画面を拡張するスクリプト # Ver 0.03 2012/05/14 キャンセルしても名前が変更されていた不具合を修正 # Ver 0.02 2012/04/09 名前が最大文字数を最初から超えていた場合の処理を修正 # Ver 0.01 2012/04/08 # http://fweb.midi.co.jp/~mikagami/atelier/ #------------------------------------------------------------------------------ # # 名前入力画面で漢字や記号、半角文字など、使用できる文字を増やします。 # # ※注意! # ・他に名前入力画面をカスタマイズするスクリプトを導入している場合、競合が起こる #  可能性は高いと思います。 # ・ひととおりの動作確認はしていますが、不具合ゼロを保障するものではありません。 # ・このスクリプトの著作権は著者にあります。 #  ですがスクリプトの利用や改造・再配布に著者の許可は必要ありません。 #  著者には未完成な部分の補完や改造依頼に対する対応義務はありません。 #  他者に改造依頼するより、あなた自身が改造すれば、みんなが幸せになります。 # #============================================================================== module NameInputLetter #-------------------------------------------------------------------------- # ● 定数 #-------------------------------------------------------------------------- HIRAGANA = "あいうえおがぎぐげごかきくけこざじずぜぞさしすせそだぢづでどたちつてとばびぶべぼなにぬねのぱぴぷぺぽはひふへほぁぃぅぇぉまみむめもっゃゅょゎやゆよわんゔをー~・らりるれろ=☆★『』" KATAKANA1 = "アイウエオハヒフヘホカキクケコマミムメモサシスセソヤ ユ ヨタチツテトラリルレロナニヌネノワヲンー・ァィゥェォッャュョ=゙゚" KATAKANA2 = "アイウエオガギグゲゴカキクケコザジズゼゾサシスセソダヂヅデドタチツテトバビブベボナニヌネノパピプペポハヒフヘホァィゥェォマミムメモッャュョヮヤユヨワンヴヲー~・ラリルレロ=☆★『』" ALPHABET1 = "ABCDEabcdeFGHIJfghijKLMNOklmnoPQRSTpqrstUVWXYuvwxyZ z 1234567890+-*/=・@.()" ALPHABET2 = "ABCDEabcdeFGHIJfghijKLMNOklmnoPQRSTpqrstUVWXYuvwxyZ    z    1234567890+-*/=・@.()" KIGOU1 = ",.・:;?!`^~_/|'()[]{}+-=<>\\$%#&*@ ΑΒΓΔΕαβγδεΖΗΘΙΚζηθικΛΜΝΞΟλμνξοΠΡΣΤΥπρστυΦΧΨΩ φχψω " KIGOU2 = "、。,.・:;?!゛゜´`¨^ ̄_ヽヾゝゞ〃仝々〆〇ー―‐/\~∥|…‥‘’“”()〔〕[]{}〈〉《》「」『』【】+-±×÷=≠<>≦≧∞∴♂♀°′″℃¥$¢£%#&*@§☆★○●◎◇◆□■△▲▽▼※〒→←↑↓〓∈∋⊆⊇⊂⊃∪∩∧∨¬⇒⇔∀∃∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬ʼn♯♭♪†‡¶◯─│  ┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡" KANJI00 = "亜唖娃阿哀愛挨姶逢葵茜穐悪握渥旭葦芦鯵梓圧斡扱宛姐虻飴絢綾鮎或粟袷安庵按暗案闇鞍杏" KANJI01 = "ゐヰ以伊位依偉囲夷委威尉惟意慰易椅為畏異移維緯胃萎衣謂違遺医井亥域育郁磯一壱溢逸稲茨芋鰯允印咽員因姻引飲淫胤蔭院陰隠韻吋" KANJI02 = "右宇烏羽迂雨卯鵜窺丑碓臼渦嘘唄欝蔚鰻姥厩浦瓜閏噂云運雲" KANJI03 = "ゑヱ荏餌叡営嬰影映曳栄永泳洩瑛盈穎頴英衛詠鋭液疫益駅悦謁越閲榎厭円園堰奄宴延怨掩援沿演炎焔煙燕猿縁艶苑薗遠鉛鴛塩" KANJI04 = "於汚甥凹央奥往応押旺横欧殴王翁襖鴬鴎黄岡沖荻億屋憶臆桶牡乙俺卸恩温穏音" KANJI05 = "ヵ下化仮何伽価佳加可嘉夏嫁家寡科暇果架歌河火珂禍禾稼箇花苛茄荷華菓蝦課嘩貨迦過霞蚊俄峨我牙画臥芽蛾賀雅餓駕介会解回塊壊廻快怪悔恢懐戒拐改魁晦械海灰界皆絵芥蟹開階貝凱劾外咳害崖慨概涯碍蓋街該鎧骸浬馨蛙垣柿蛎鈎劃嚇各廓拡撹格核殻獲確穫覚角赫較郭閣隔革学岳楽額顎掛笠樫橿梶鰍潟割喝恰括活渇滑葛褐轄且鰹叶椛樺鞄株兜竃蒲釜鎌噛鴨栢茅萱粥刈苅瓦乾侃冠寒刊勘勧巻喚堪姦完官寛干幹患感慣憾換敢柑桓棺款歓汗漢澗潅環甘監看竿管簡緩缶翰肝艦莞観諌貫還鑑間閑関陥韓館舘丸含岸巌玩癌眼岩翫贋雁頑顔願" KANJI06 = "企伎危喜器基奇嬉寄岐希幾忌揮机旗既期棋棄機帰毅気汽畿祈季稀紀徽規記貴起軌輝飢騎鬼亀偽儀妓宜戯技擬欺犠疑祇義蟻誼議掬菊鞠吉吃喫桔橘詰砧杵黍却客脚虐逆丘久仇休及吸宮弓急救朽求汲泣灸球究窮笈級糾給旧牛去居巨拒拠挙渠虚許距鋸漁禦魚亨享京供侠僑兇競共凶協匡卿叫喬境峡強彊怯恐恭挟教橋況狂狭矯胸脅興蕎郷鏡響饗驚仰凝尭暁業局曲極玉桐粁僅勤均巾錦斤欣欽琴禁禽筋緊芹菌衿襟謹近金吟銀" KANJI07 = "九倶句区狗玖矩苦躯駆駈駒具愚虞喰空偶寓遇隅串櫛釧屑屈掘窟沓靴轡窪熊隈粂栗繰桑鍬勲君薫訓群軍郡" KANJI08 = "ヶ卦袈祁係傾刑兄啓圭珪型契形径恵慶慧憩掲携敬景桂渓畦稽系経継繋罫茎荊蛍計詣警軽頚鶏芸迎鯨劇戟撃激隙桁傑欠決潔穴結血訣月件倹倦健兼券剣喧圏堅嫌建憲懸拳捲検権牽犬献研硯絹県肩見謙賢軒遣鍵険顕験鹸元原厳幻弦減源玄現絃舷言諺限" KANJI09 = "乎個古呼固姑孤己庫弧戸故枯湖狐糊袴股胡菰虎誇跨鈷雇顧鼓五互伍午呉吾娯後御悟梧檎瑚碁語誤護醐乞鯉交佼侯候倖光公功効勾厚口向后喉坑垢好孔孝宏工巧巷幸広庚康弘恒慌抗拘控攻昂晃更杭校梗構江洪浩港溝甲皇硬稿糠紅紘絞綱耕考肯肱腔膏航荒行衡講貢購郊酵鉱砿鋼閤降項香高鴻剛劫号合壕拷濠豪轟麹克刻告国穀酷鵠黒獄漉腰甑忽惚骨狛込此頃今困坤墾婚恨懇昏昆根梱混痕紺艮魂" KANJI10 = "些佐叉唆嵯左差査沙瑳砂詐鎖裟坐座挫債催再最哉塞妻宰彩才採栽歳済災采犀砕砦祭斎細菜裁載際剤在材罪財冴坂阪堺榊肴咲崎埼碕鷺作削咋搾昨朔柵窄策索錯桜鮭笹匙冊刷察拶撮擦札殺薩雑皐鯖捌錆鮫皿晒三傘参山惨撒散桟燦珊産算纂蚕讃賛酸餐斬暫残" KANJI11 = "仕仔伺使刺司史嗣四士始姉姿子屍市師志思指支孜斯施旨枝止死氏獅祉私糸紙紫肢脂至視詞詩試誌諮資賜雌飼歯事似侍児字寺慈持時次滋治爾璽痔磁示而耳自蒔辞汐鹿式識鴫竺軸宍雫七叱執失嫉室悉湿漆疾質実蔀篠偲柴芝屡蕊縞舎写射捨赦斜煮社紗者謝車遮蛇邪借勺尺杓灼爵酌釈錫若寂弱惹主取守手朱殊狩珠種腫趣酒首儒受呪寿授樹綬需囚収周宗就州修愁拾洲秀秋終繍習臭舟蒐衆襲讐蹴輯週酋酬集醜什住充十従戎柔汁渋獣縦重銃叔夙宿淑祝縮粛塾熟出術述俊峻春瞬竣舜駿准循旬楯殉淳準潤盾純巡遵醇順処初所暑曙渚庶緒署書薯藷諸助叙女序徐恕鋤除傷償勝匠升召哨商唱嘗奨妾娼宵将小少尚庄床廠彰承抄招掌捷昇昌昭晶松梢樟樵沼消渉湘焼焦照症省硝礁祥称章笑粧紹肖菖蒋蕉衝裳訟証詔詳象賞醤鉦鍾鐘障鞘上丈丞乗冗剰城場壌嬢常情擾条杖浄状畳穣蒸譲醸錠嘱埴飾拭植殖燭織職色触食蝕辱尻伸信侵唇娠寝審心慎振新晋森榛浸深申疹真神秦紳臣芯薪親診身辛進針震人仁刃塵壬尋甚尽腎訊迅陣靭" KANJI12 = "笥諏須酢図厨逗吹垂帥推水炊睡粋翠衰遂酔錐錘随瑞髄崇嵩数枢趨雛据杉椙菅頗雀裾澄摺寸" KANJI13 = "世瀬畝是凄制勢姓征性成政整星晴棲栖正清牲生盛精聖声製西誠誓請逝醒青静斉税脆隻席惜戚斥昔析石積籍績脊責赤跡蹟碩切拙接摂折設窃節説雪絶舌蝉仙先千占宣専尖川戦扇撰栓栴泉浅洗染潜煎煽旋穿箭線繊羨腺舛船薦詮賎践選遷銭銑閃鮮前善漸然全禅繕膳糎" KANJI14 = "噌塑岨措曾曽楚狙疏疎礎祖租粗素組蘇訴阻遡鼠僧創双叢倉喪壮奏爽宋層匝惣想捜掃挿掻操早曹巣槍槽漕燥争痩相窓糟総綜聡草荘葬蒼藻装走送遭鎗霜騒像増憎臓蔵贈造促側則即息捉束測足速俗属賊族続卒袖其揃存孫尊損村遜" KANJI15 = "他多太汰詑唾堕妥惰打柁舵楕陀駄騨体堆対耐岱帯待怠態戴替泰滞胎腿苔袋貸退逮隊黛鯛代台大第醍題鷹滝瀧卓啄宅托択拓沢濯琢託鐸濁諾茸凧蛸只叩但達辰奪脱巽竪辿棚谷狸鱈樽誰丹単嘆坦担探旦歎淡湛炭短端箪綻耽胆蛋誕鍛団壇弾断暖檀段男談" KANJI16 = "値知地弛恥智池痴稚置致蜘遅馳築畜竹筑蓄逐秩窒茶嫡着中仲宙忠抽昼柱注虫衷註酎鋳駐樗瀦猪苧著貯丁兆凋喋寵帖帳庁弔張彫徴懲挑暢朝潮牒町眺聴脹腸蝶調諜超跳銚長頂鳥勅捗直朕沈珍賃鎮陳" KANJI17 = "津墜椎槌追鎚痛通塚栂掴槻佃漬柘辻蔦綴鍔椿潰坪壷嬬紬爪吊釣鶴" KANJI18 = "亭低停偵剃貞呈堤定帝底庭廷弟悌抵挺提梯汀碇禎程締艇訂諦蹄逓邸鄭釘鼎泥摘擢敵滴的笛適鏑溺哲徹撤轍迭鉄典填天展店添纏甜貼転顛点伝殿澱田電" KANJI19 = "兎吐堵塗妬屠徒斗杜渡登菟賭途都鍍砥砺努度土奴怒倒党冬凍刀唐塔塘套宕島嶋悼投搭東桃梼棟盗淘湯涛灯燈当痘祷等答筒糖統到董蕩藤討謄豆踏逃透鐙陶頭騰闘働動同堂導憧撞洞瞳童胴萄道銅峠鴇匿得徳涜特督禿篤毒独読栃橡凸突椴届鳶苫寅酉瀞噸屯惇敦沌豚遁頓呑曇鈍" KANJI20 = "奈那内乍凪薙謎灘捺鍋楢馴縄畷南楠軟難汝" KANJI21 = "二尼弐迩匂賑肉虹廿日乳入如尿韮任妊忍認" KANJI22 = "濡" KANJI23 = "禰祢寧葱猫熱年念捻撚燃粘" KANJI24 = "乃廼之埜嚢悩濃納能脳膿農覗蚤" KANJI25 = "巴把播覇杷波派琶破婆罵芭馬俳廃拝排敗杯盃牌背肺輩配倍培媒梅楳煤狽買売賠陪這蝿秤矧萩伯剥博拍柏泊白箔粕舶薄迫曝漠爆縛莫駁麦函箱硲箸肇筈櫨幡肌畑畠八鉢溌発醗髪伐罰抜筏閥鳩噺塙蛤隼伴判半反叛帆搬斑板氾汎版犯班畔繁般藩販範釆煩頒飯挽晩番盤磐蕃蛮" KANJI26 = "匪卑否妃庇彼悲扉批披斐比泌疲皮碑秘緋罷肥被誹費避非飛樋簸備尾微枇毘琵眉美鼻柊稗匹疋髭彦膝菱肘弼必畢筆逼桧姫媛紐百謬俵彪標氷漂瓢票表評豹廟描病秒苗錨鋲蒜蛭鰭品彬斌浜瀕貧賓頻敏瓶" KANJI27 = "不付埠夫婦富冨布府怖扶敷斧普浮父符腐膚芙譜負賦赴阜附侮撫武舞葡蕪部封楓風葺蕗伏副復幅服福腹複覆淵弗払沸仏物鮒分吻噴墳憤扮焚奮粉糞紛雰文聞" KANJI28 = "丙併兵塀幣平弊柄並蔽閉陛米頁僻壁癖碧別瞥蔑箆偏変片篇編辺返遍便勉娩弁鞭" KANJI29 = "保舗鋪圃捕歩甫補輔穂募墓慕戊暮母簿菩倣俸包呆報奉宝峰峯崩庖抱捧放方朋法泡烹砲縫胞芳萌蓬蜂褒訪豊邦鋒飽鳳鵬乏亡傍剖坊妨帽忘忙房暴望某棒冒紡肪膨謀貌貿鉾防吠頬北僕卜墨撲朴牧睦穆釦勃没殆堀幌奔本翻凡盆" KANJI30 = "摩磨魔麻埋妹昧枚毎哩槙幕膜枕鮪柾鱒桝亦俣又抹末沫迄侭繭麿万慢満漫蔓" KANJI31 = "味未魅巳箕岬密蜜湊蓑稔脈妙粍民眠" KANJI32 = "務夢無牟矛霧鵡椋婿娘" KANJI33 = "冥名命明盟迷銘鳴姪牝滅免棉綿緬面麺" KANJI34 = "摸模茂妄孟毛猛盲網耗蒙儲木黙目杢勿餅尤戻籾貰問悶紋門匁" KANJI35 = "也冶夜爺耶野弥矢厄役約薬訳躍靖柳薮鑓" KANJI36 = "愉愈油癒諭輸唯佑優勇友宥幽悠憂揖有柚湧涌猶猷由祐裕誘遊邑郵雄融夕" KANJI37 = "予余与誉輿預傭幼妖容庸揚揺擁曜楊様洋溶熔用窯羊耀葉蓉要謡踊遥陽養慾抑欲沃浴翌翼淀" KANJI38 = "羅螺裸来莱頼雷洛絡落酪乱卵嵐欄濫藍蘭覧" KANJI39 = "利吏履李梨理璃痢裏裡里離陸律率立葎掠略劉流溜琉留硫粒隆竜龍侶慮旅虜了亮僚両凌寮料梁涼猟療瞭稜糧良諒遼量陵領力緑倫厘林淋燐琳臨輪隣鱗麟" KANJI40 = "瑠塁涙累類" KANJI41 = "令伶例冷励嶺怜玲礼苓鈴隷零霊麗齢暦歴列劣烈裂廉恋憐漣煉簾練聯蓮連錬" KANJI42 = "呂魯櫓炉賂路露労婁廊弄朗楼榔浪漏牢狼篭老聾蝋郎六麓禄肋録論" KANJI43 = "倭和話歪賄脇惑枠鷲亙亘鰐詫藁蕨椀湾碗腕" #-------------------------------------------------------------------------- # ● 文字が全角か半角かチェックする #-------------------------------------------------------------------------- def self.hankaku?(letter) return true if ALPHABET1.include?(letter) return true if KATAKANA1.include?(letter) return true if KIGOU1.include?(letter) return false end #-------------------------------------------------------------------------- # ● 全角文字を2文字と換算した場合の文字数の取得 #-------------------------------------------------------------------------- def self.length(name) len = 0 name.scan(/./) {|s| len += (hankaku?(s) ? 1 : 2)} return len end #-------------------------------------------------------------------------- # ● 文字配列の取得・ひらがな #-------------------------------------------------------------------------- def self.hiragana_arr return HIRAGANA.scan(/./) end #-------------------------------------------------------------------------- # ● 文字配列の取得・半角カタカナ #-------------------------------------------------------------------------- def self.katakana1_arr return KATAKANA1.scan(/./) end #-------------------------------------------------------------------------- # ● 文字配列の取得・全角カタカナ #-------------------------------------------------------------------------- def self.katakana2_arr return KATAKANA2.scan(/./) end #-------------------------------------------------------------------------- # ● 文字配列の取得・半角アルファベット #-------------------------------------------------------------------------- def self.alphabet1_arr return ALPHABET1.scan(/./) end #-------------------------------------------------------------------------- # ● 文字配列の取得・全角アルファベット #-------------------------------------------------------------------------- def self.alphabet2_arr return ALPHABET2.scan(/./) end #-------------------------------------------------------------------------- # ● 文字配列の取得・半角記号 #-------------------------------------------------------------------------- def self.kigou1_arr return KIGOU1.scan(/./) end #-------------------------------------------------------------------------- # ● 文字配列の取得・全角記号 #-------------------------------------------------------------------------- def self.kigou2_arr return KIGOU2.scan(/./) end #-------------------------------------------------------------------------- # ● 文字配列の取得・漢字 #-------------------------------------------------------------------------- def self.kanji_arr(num) case num when 0; return KANJI00.scan(/./) when 1; return KANJI01.scan(/./) when 2; return KANJI02.scan(/./) when 3; return KANJI03.scan(/./) when 4; return KANJI04.scan(/./) when 5; return KANJI05.scan(/./) when 6; return KANJI06.scan(/./) when 7; return KANJI07.scan(/./) when 8; return KANJI08.scan(/./) when 9; return KANJI09.scan(/./) when 10; return KANJI10.scan(/./) when 11; return KANJI11.scan(/./) when 12; return KANJI12.scan(/./) when 13; return KANJI13.scan(/./) when 14; return KANJI14.scan(/./) when 15; return KANJI15.scan(/./) when 16; return KANJI16.scan(/./) when 17; return KANJI17.scan(/./) when 18; return KANJI18.scan(/./) when 19; return KANJI19.scan(/./) when 20; return KANJI20.scan(/./) when 21; return KANJI21.scan(/./) when 22; return KANJI22.scan(/./) when 23; return KANJI23.scan(/./) when 24; return KANJI24.scan(/./) when 25; return KANJI25.scan(/./) when 26; return KANJI26.scan(/./) when 27; return KANJI27.scan(/./) when 28; return KANJI28.scan(/./) when 29; return KANJI29.scan(/./) when 30; return KANJI30.scan(/./) when 31; return KANJI31.scan(/./) when 32; return KANJI32.scan(/./) when 33; return KANJI33.scan(/./) when 34; return KANJI34.scan(/./) when 35; return KANJI35.scan(/./) when 36; return KANJI36.scan(/./) when 37; return KANJI37.scan(/./) when 38; return KANJI38.scan(/./) when 39; return KANJI39.scan(/./) when 40; return KANJI40.scan(/./) when 41; return KANJI41.scan(/./) when 42; return KANJI42.scan(/./) when 43; return KANJI43.scan(/./) end return [] end end class Window_NameEdit2 < Window_Selectable #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :name # 名前 attr_reader :index # カーソル位置 #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(actor, max_char) @actor = actor @max_char = max_char * 2 @name = name_fit(actor.name.clone) @commands = ["1つ戻す", "キャンセル", "決定"] x = (Graphics.width - 480) / 2 y = (Graphics.height - (fitting_height(4) + fitting_height(9) + 8)) / 2 super(x, y, 480, fitting_height(4)) @index = 100 + @name.size @historys = [] refresh activate end #-------------------------------------------------------------------------- # ● 名前を文字数内に収める #-------------------------------------------------------------------------- def name_fit(name) while NameInputLetter.length(name) > @max_char do name[-1, 1] = "" end return name end #-------------------------------------------------------------------------- # ● 名前が最大文字数に達したかどうか #-------------------------------------------------------------------------- def name_full? return NameInputLetter.length(@name) >= @max_char end #-------------------------------------------------------------------------- # ● 履歴を1つ戻す #-------------------------------------------------------------------------- def history_back return if @historys.empty? @name = @historys.pop refresh end #-------------------------------------------------------------------------- # ● 文字の追加 # ch : 追加する文字 #-------------------------------------------------------------------------- def add(ch) return false if (@index - 100) >= @max_char return false if NameInputLetter.length(@name + ch) > @max_char @historys.push(@name.clone) @name = @name.insert(@index - 100, ch) @index += 1 refresh return true end #-------------------------------------------------------------------------- # ● 選択文字の削除 #-------------------------------------------------------------------------- def delete return false if @index < 100 return false if @name[@index - 100, 1].empty? @historys.push(@name.clone) @name.slice!(@index - 100, 1) refresh return true end #-------------------------------------------------------------------------- # ● 顔グラフィックの幅を取得 #-------------------------------------------------------------------------- def face_width return 96 end #-------------------------------------------------------------------------- # ● 文字の幅を取得(半角) #-------------------------------------------------------------------------- def char_width1 text_size('a').width end #-------------------------------------------------------------------------- # ● 文字の幅を取得(全角) #-------------------------------------------------------------------------- def char_width2 text_size('あ').width end #-------------------------------------------------------------------------- # ● 名前を描画する左端の座標を取得 #-------------------------------------------------------------------------- def left return face_width + 10 end #-------------------------------------------------------------------------- # ● 下線の矩形を取得 #-------------------------------------------------------------------------- def underline_rect(index) rect = Rect.new rect.x = left + index * (char_width1 + 2) + 20 rect.y = 50 rect.width = char_width1 rect.height = 2 rect end #-------------------------------------------------------------------------- # ● 下線の色を取得 #-------------------------------------------------------------------------- def underline_color color = normal_color color.alpha = 48 color end #-------------------------------------------------------------------------- # ● 下線を描画 #-------------------------------------------------------------------------- def draw_underline(index) contents.fill_rect(underline_rect(index), underline_color) end #-------------------------------------------------------------------------- # ● 項目を描画する矩形の取得 #-------------------------------------------------------------------------- def item_rect(index) rect = Rect.new if index < @commands.size rect.x = left + index * 112 rect.y = 3 * line_height rect.width = 100 else rect.y = 23 name_index = index - 100 if name_index == 0 before_len = 0 else before_len = NameInputLetter.length(@name[0, name_index]) end rect.x = left + before_len * (char_width1 + 2) + 20 ch = @name[name_index] ch = "あ" if ch == nil rect.width = NameInputLetter.hankaku?(ch) ? char_width1 : char_width1 * 2 + 2 rect.x -= 2 rect.width += 4 end rect.height = line_height rect end #-------------------------------------------------------------------------- # ● 文字を描画 #-------------------------------------------------------------------------- def draw_char(index) rect = item_rect(index + 100) rect.x -= 2 rect.width += 4 change_color(normal_color) draw_text(rect, @name[index] || "", 1) end #-------------------------------------------------------------------------- # ● コマンド文字を描画 #-------------------------------------------------------------------------- def draw_command(index) if index == 0 and @historys.empty? change_color(normal_color, false) else change_color(normal_color) end draw_text(item_rect(index), @commands[index], 1) end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh contents.clear draw_actor_face(@actor, 0, 0) @max_char.times {|i| draw_underline(i) } @name.size.times {|i| draw_char(i) } @commands.size.times {|i| draw_command(i) } end #-------------------------------------------------------------------------- # ● カーソルの移動可能判定 #-------------------------------------------------------------------------- def cursor_movable? active end #-------------------------------------------------------------------------- # ● カーソルを下に移動 # wrap : ラップアラウンド許可 #-------------------------------------------------------------------------- def cursor_down(wrap) if @index < 100 and wrap @index = @name.size + 100 else @index = 0 end end #-------------------------------------------------------------------------- # ● カーソルを上に移動 # wrap : ラップアラウンド許可 #-------------------------------------------------------------------------- def cursor_up(wrap) if @index < 100 @index = @name.size + 100 elsif wrap @index = 0 end end #-------------------------------------------------------------------------- # ● カーソルを右に移動 # wrap : ラップアラウンド許可 #-------------------------------------------------------------------------- def cursor_right(wrap) if @index >= 100 name_index = @index - 100 @index += 1 if @name.size > name_index elsif @index < @commands.size - 1 @index += 1 elsif wrap @index = 0 end end #-------------------------------------------------------------------------- # ● カーソルを左に移動 # wrap : ラップアラウンド許可 #-------------------------------------------------------------------------- def cursor_left(wrap) if @index >= 100 name_index = @index - 100 @index -= 1 if 0 < name_index elsif @index > 0 @index -= 1 elsif wrap @index = @commands.size - 1 end end #-------------------------------------------------------------------------- # ● カーソルの移動処理 #-------------------------------------------------------------------------- def process_cursor_move super update_cursor end #-------------------------------------------------------------------------- # ● 決定ボタンが押されたときの処理 #-------------------------------------------------------------------------- def process_ok if @index == 0 on_history_back elsif @index == 1 Sound.play_ok Input.update call_cancel_handler elsif @index == 2 on_name_ok else on_select_letter end end #-------------------------------------------------------------------------- # ● 1つ戻る #-------------------------------------------------------------------------- def on_history_back if @historys.empty? Sound.play_buzzer else Sound.play_ok history_back end end #-------------------------------------------------------------------------- # ● 名前の決定 #-------------------------------------------------------------------------- def on_name_ok if @name.empty? Sound.play_buzzer else Sound.play_ok Input.update call_ok_handler end end #-------------------------------------------------------------------------- # ● 文字の選択へ #-------------------------------------------------------------------------- def on_select_letter if NameInputLetter.length(@name) >= @max_char Sound.play_buzzer else Sound.play_ok Input.update call_ok_handler end end #-------------------------------------------------------------------------- # ● キャンセルボタンが押されたときの処理 #-------------------------------------------------------------------------- def process_cancel if @index < 100 Sound.play_buzzer return end if delete Sound.play_cancel else Sound.play_buzzer end end end class Window_NameInputCommand < Window_Command #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(edit_window) super(edit_window.x, edit_window.y + edit_window.height + 8) deactivate select(0) end #-------------------------------------------------------------------------- # ● ウィンドウ幅の取得 #-------------------------------------------------------------------------- def window_width return 120 end #-------------------------------------------------------------------------- # ● 表示行数の取得 #-------------------------------------------------------------------------- def visible_line_number return 9 end #-------------------------------------------------------------------------- # ● コマンドリストの作成 #-------------------------------------------------------------------------- def make_command_list add_command("ひらがな", :hiragana) add_command("カナ全角", :katakana2) add_command("カナ半角", :katakana1) add_command("英数全角", :alphabet2) add_command("英数半角", :alphabet1) add_command("記号全角", :kigou2) add_command("記号半角", :kigou1) add_command("漢字・あ", :kanji00) add_command("漢字・い", :kanji01) add_command("漢字・う", :kanji02) add_command("漢字・え", :kanji03) add_command("漢字・お", :kanji04) add_command("漢字・か", :kanji05) add_command("漢字・き", :kanji06) add_command("漢字・く", :kanji07) add_command("漢字・け", :kanji08) add_command("漢字・こ", :kanji09) add_command("漢字・さ", :kanji10) add_command("漢字・し", :kanji11) add_command("漢字・す", :kanji12) add_command("漢字・せ", :kanji13) add_command("漢字・そ", :kanji14) add_command("漢字・た", :kanji15) add_command("漢字・ち", :kanji16) add_command("漢字・つ", :kanji17) add_command("漢字・て", :kanji18) add_command("漢字・と", :kanji19) add_command("漢字・な", :kanji20) add_command("漢字・に", :kanji21) add_command("漢字・ぬ", :kanji22) add_command("漢字・ね", :kanji23) add_command("漢字・の", :kanji24) add_command("漢字・は", :kanji25) add_command("漢字・ひ", :kanji26) add_command("漢字・ふ", :kanji27) add_command("漢字・へ", :kanji28) add_command("漢字・ほ", :kanji29) add_command("漢字・ま", :kanji30) add_command("漢字・み", :kanji31) add_command("漢字・む", :kanji32) add_command("漢字・め", :kanji33) add_command("漢字・も", :kanji34) add_command("漢字・や", :kanji35) add_command("漢字・ゆ", :kanji36) add_command("漢字・よ", :kanji37) add_command("漢字・ら", :kanji38) add_command("漢字・り", :kanji39) add_command("漢字・る", :kanji40) add_command("漢字・れ", :kanji41) add_command("漢字・ろ", :kanji42) add_command("漢字・わ", :kanji43) end #-------------------------------------------------------------------------- # ● 入力ウィンドウの設定 #-------------------------------------------------------------------------- def input_window=(win) @input_window = win end #-------------------------------------------------------------------------- # ● カーソルの移動処理 #-------------------------------------------------------------------------- def process_cursor_move last_index = @index super return if @input_window == nil @input_window.change_table(@index) if @index != last_index end end class Window_NameInput2 < Window_Selectable #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(edit_window, command_window) @edit_window = edit_window @page = 0 super(command_window.x + command_window.width, command_window.y, edit_window.width - command_window.width, fitting_height(9)) refresh deactivate select(0) end #-------------------------------------------------------------------------- # ● 桁数の取得 #-------------------------------------------------------------------------- def col_max return 10 end #-------------------------------------------------------------------------- # ● 項目数の取得 #-------------------------------------------------------------------------- def item_max return table[@page].size end #-------------------------------------------------------------------------- # ● 文字表の取得 #-------------------------------------------------------------------------- def table return @table if @table != nil @table = [] @table.push(NameInputLetter.hiragana_arr) @table.push(NameInputLetter.katakana2_arr) @table.push(NameInputLetter.katakana1_arr) @table.push(NameInputLetter.alphabet2_arr) @table.push(NameInputLetter.alphabet1_arr) @table.push(NameInputLetter.kigou2_arr) @table.push(NameInputLetter.kigou1_arr) for i in 0..43 do @table.push(NameInputLetter.kanji_arr(i)) end return @table end #-------------------------------------------------------------------------- # ● ページの切り替え #-------------------------------------------------------------------------- def change_table(num) @page = num refresh select(0) end #-------------------------------------------------------------------------- # ● 文字の取得 #-------------------------------------------------------------------------- def character ch = table[@page][@index] return ch end #-------------------------------------------------------------------------- # ● 項目を描画する矩形の取得 #-------------------------------------------------------------------------- def item_rect(index) rect = Rect.new rect.x = index % 10 * 32 + index % 10 / 5 * 16 rect.y = index / 10 * line_height rect.width = 32 rect.height = line_height rect end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh create_contents change_color(normal_color) table[@page].size.times {|i| draw_letter(i) } end #-------------------------------------------------------------------------- # ● ウィンドウ内容の作成 #-------------------------------------------------------------------------- def create_contents c_height = (table[@page].size / 10) * line_height c_height += line_height if table[@page].size % 10 > 0 contents.dispose self.contents = Bitmap.new(contents_width, c_height) end #-------------------------------------------------------------------------- # ● 文字の描画 #-------------------------------------------------------------------------- def draw_letter(index) ch = table[@page][index] ch = " " + ch + " " if NameInputLetter.hankaku?(ch) # 半角文字の潰れ防止 draw_text(item_rect(index), ch, 1) end #-------------------------------------------------------------------------- # ● 次のページへ移動 #-------------------------------------------------------------------------- def cursor_pagedown @edit_window.cursor_right(false) end #-------------------------------------------------------------------------- # ● 前のページへ移動 #-------------------------------------------------------------------------- def cursor_pageup @edit_window.cursor_left(false) end #-------------------------------------------------------------------------- # ● カーソルの移動処理 #-------------------------------------------------------------------------- def process_cursor_move edit_index = @edit_window.index super update_cursor Sound.play_cursor if edit_index != @edit_window.index end #-------------------------------------------------------------------------- # ● 決定ボタンが押されたときの処理 #-------------------------------------------------------------------------- def process_ok if !character.empty? on_name_add end end #-------------------------------------------------------------------------- # ● 名前に文字を追加 #-------------------------------------------------------------------------- def on_name_add if @edit_window.add(character) Sound.play_ok call_ok_handler else Sound.play_buzzer end end end class Scene_Name < Scene_MenuBase #-------------------------------------------------------------------------- # ● 準備 #-------------------------------------------------------------------------- def prepare(actor_id, max_char) @actor_id = actor_id @max_char = max_char end #-------------------------------------------------------------------------- # ● 開始処理 #-------------------------------------------------------------------------- def start super @actor = $game_actors[@actor_id] create_command_window end #-------------------------------------------------------------------------- # ● コマンドウィンドウの作成 #-------------------------------------------------------------------------- def create_command_window @edit_window = Window_NameEdit2.new(@actor, @max_char) @command_window = Window_NameInputCommand.new(@edit_window) @input_window = Window_NameInput2.new(@edit_window, @command_window) @command_window.input_window = @input_window @edit_window.set_handler(:ok, method(:on_ok)) @edit_window.set_handler(:cancel, method(:on_cancel)) @command_window.set_handler(:ok, method(:on_input_active)) @command_window.set_handler(:cancel, method(:on_menu_active)) @input_window.set_handler(:ok, method(:on_input_letter)) @input_window.set_handler(:cancel, method(:on_command_active)) end #-------------------------------------------------------------------------- # ● 入力 #-------------------------------------------------------------------------- def on_ok if @edit_window.index >= 100 on_command_active else @actor.name = @edit_window.name return_scene end end #-------------------------------------------------------------------------- # ● キャンセル #-------------------------------------------------------------------------- def on_cancel return_scene end #-------------------------------------------------------------------------- # ● メニュー選択をアクティブに #-------------------------------------------------------------------------- def on_menu_active @edit_window.activate @command_window.deactivate @input_window.deactivate end #-------------------------------------------------------------------------- # ● コマンド選択をアクティブに #-------------------------------------------------------------------------- def on_command_active @edit_window.deactivate @command_window.activate @input_window.deactivate end #-------------------------------------------------------------------------- # ● 文字選択をアクティブに #-------------------------------------------------------------------------- def on_input_active @edit_window.deactivate @command_window.deactivate @input_window.activate end #-------------------------------------------------------------------------- # ● 文字の挿入 #-------------------------------------------------------------------------- def on_input_letter if @edit_window.name_full? @edit_window.select(2) on_menu_active end end end