From 1317eb0d29035d243462c28b8af53d6459c48637 Mon Sep 17 00:00:00 2001 From: "jean.chalard" Date: Sun, 14 Nov 2010 16:24:29 +0000 Subject: [PATCH] J : * Add multilingual support for utf-8. * Use japanese as a test case (removing the old tentative support). * A number of shortcomings affect this code. + Bugs : - This splits algorithms used to determine the length of a string and to render it in two: either the string starts with an ascii char and the monobyte, variable-space algorithm is used, or it does not and a multibyte but fixed-space algorithm is used. This shortcoming also exists in the code to support chinese. - From the above comes the biggest limitation: any string that starts with an ascii character but include non-ascii characters will not be rendered correctly. - This does not and cannot support chars outside the BMP. This probably won't matter, ever. + Todos, fixmes, wishlist : - Single-width characters with diacritics are reported as double-space chars. It doesn't matter too much at the moment, but should be fixed in the future. - Font support currently only includes japanese. + Performance and compatibility notes : - Chinese code has not been switched to utf-8, to maintain backward compatibility. We should switch it at some point in the future, but ponder the right way to do it first. - Retaining the support for chinese with a non-international charset hurts performance (by making some methods uselessly virtual). * Still, this generally works and is extensible (it can be used to implement korean, traditional chinese, etc, without any more code). Implementing languages with diacritics needs an improvement of the bool doubleWidthChar() method. --- projects/mtg/Makefile | 2 +- .../mtg/bin/Res/graphics/{f3.sjis => f3.font} | Bin 1016064 -> 1011332 bytes .../Res/graphics/{magic.sjis => magic.font} | Bin 1016064 -> 1011332 bytes .../Res/graphics/{simon.sjis => simon.font} | Bin 571536 -> 626292 bytes .../{smallface.sjis => smallface.font} | Bin 571536 -> 626220 bytes projects/mtg/bin/Res/lang/jp.txt | 519 +++--- projects/mtg/bin/Res/lang/jp_cards.txt | 444 ++--- projects/mtg/include/WFont.h | 34 +- projects/mtg/src/CardPrimitive.cpp | 6 +- projects/mtg/src/Translate.cpp | 3 +- projects/mtg/src/WFont.cpp | 1623 ++++++++++------- projects/mtg/src/WResourceManager.cpp | 20 +- 12 files changed, 1521 insertions(+), 1130 deletions(-) rename projects/mtg/bin/Res/graphics/{f3.sjis => f3.font} (94%) rename projects/mtg/bin/Res/graphics/{magic.sjis => magic.font} (94%) rename projects/mtg/bin/Res/graphics/{simon.sjis => simon.font} (88%) rename projects/mtg/bin/Res/graphics/{smallface.sjis => smallface.font} (88%) diff --git a/projects/mtg/Makefile b/projects/mtg/Makefile index c9d7c8721..30e8d756b 100644 --- a/projects/mtg/Makefile +++ b/projects/mtg/Makefile @@ -42,7 +42,7 @@ OBJS += objs/TestSuiteAI.o INCDIR = -I../../JGE/include -I../../JGE/src -I/usr/X11/include -I../../projects/mtg/include LIBDIR = -L../../JGE/lib/linux -L../../JGE -L/usr/X11/lib LIBS = -ljge -lfreetype -ljpeg -lgif -lpng -lz -lm -lstdc++ -lhgetools -lGL -lGLU -lX11 $(FMOD) -CFLAGS = $(INCDIR) -O2 -DLINUX -DUSE_PRECOMPILED_HEADERS=1 +CFLAGS = $(INCDIR) -DLINUX -DUSE_PRECOMPILED_HEADERS=1 ASFLAGS = $(CXXFLAGS) all: $(DEFAULT_RULE) diff --git a/projects/mtg/bin/Res/graphics/f3.sjis b/projects/mtg/bin/Res/graphics/f3.font similarity index 94% rename from projects/mtg/bin/Res/graphics/f3.sjis rename to projects/mtg/bin/Res/graphics/f3.font index a91b79bfa29c1c0aba2f87edd908ae2858034298..6454548a83f67e0b96d204eefbfdbc36b521d6ec 100644 GIT binary patch delta 36722 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 xd_Q)V5J^$)TKUP~uP_1F+M6o?Z$0OzCY zJ^or`&}0`}Rm$d`TB&S=j9yTKBFLWdmOPC8nikr~PI$#U$e~?ktr05rfuYwSr2$yc zd_>eEeg?*KYwjuozmGPA3++DB;tV*+^%2O1$e0Bqs1Z7R(0l|-b&;X-&)?00?sF)n zf0rRBQfUF4UWIU?n+F!2UX}qc9>jC5!UcBbRg@e ziHAzX;_eGIf$SpJvuYESHmM&iK9{S87e-a-_T>g(wF0+b-~e?i?3ROwWse-_#8a_PQvDIbFc&1QBVIYjFAdtk)5vgY#vK~ zvO1 y?5w9R2%|P2(hsGCW&;H4W`6*SN0D&= diff --git a/projects/mtg/bin/Res/graphics/magic.sjis b/projects/mtg/bin/Res/graphics/magic.font similarity index 94% rename from projects/mtg/bin/Res/graphics/magic.sjis rename to projects/mtg/bin/Res/graphics/magic.font index 1adace8d5def9ad5d68a96e06510634cfe20468c..da67fd37db4842bd1544fda9edeed0bef5fe6bde 100644 GIT binary patch delta 38168 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 TX7ga5v#<4Z%8pL)aJKOqM6Z$i diff --git a/projects/mtg/bin/Res/graphics/simon.sjis b/projects/mtg/bin/Res/graphics/simon.font similarity index 88% rename from projects/mtg/bin/Res/graphics/simon.sjis rename to projects/mtg/bin/Res/graphics/simon.font index 7fb20b8dab7d99ff9faccafcad93fe83db7eab20..76469ca90f460d5e400b4cf8a06475b428e1fecf 100644 GIT binary patch delta 36995 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 ZeXM==Ne@?nGzP#08yeUkrWjh7{twjo$7BEi delta 1532 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 delta 1624 zcmeHHT}V_x6lTxP{aF)rEi2c*!9axFN^Sf_T~V|xvgjcy(-6c6iIO5B1X~Efq@dY- z7?843DxyfmczJ)LWWbJjd1EgLEvVryoh$MRmBoJ^u-R+Jd5#h`UI!bpc*2HI16S{_-R6m zuy8LZ3Z`U&lMJR5O2SK#a}-qEmjyMFMJ>XY4V6*72&oqX*)VQuaylYR1;FI6OXk(;Zh!b zt?+a)io7i7u0z;+Mng_to5A$NuO4!D$0d`e2)jXLxYo1q7M@Qz(hkT{!(i20Yz^&$F!`nD{!W z#Bf@UJq^|n6J=#q-9Hdc;4}xlKI<$qmP*rW>lEXgJ!1S25UlzwBT;c4QaN>DMlN~J z#Kl%f=5!}6G?Q5-#_B-|6k)KN%rH?}Nj7j=W~>qgU%e%Brse~pOfV7e&~;8Lu)SCb zGT}~yO`I}3ep-nXRrM*IxodTi(^EJaP*Ppu@f8x!Y4LDaoi}=knF+bp-sP(Sv-78JJ&kFU|@5=h{g-R!RZdHwrSF!+qo7q$|~0+uODDLrzxnM(?X0Vc`$rm zrn$o-f_3tJqf^=>6DJ#CtKr~XyZ(jw`@?d-6(X9Wz^YnqKyH&zem z^GsZ7g^ir%qjOG|iqiKOhfO+N>jt^eOL2a`O;XM@f~hug*>)mkFfD&+f3MZ1)#^B% F_y;i6@NED9 diff --git a/projects/mtg/bin/Res/lang/jp.txt b/projects/mtg/bin/Res/lang/jp.txt index 2e30fa2e0..e32dc11ad 100644 --- a/projects/mtg/bin/Res/lang/jp.txt +++ b/projects/mtg/bin/Res/lang/jp.txt @@ -1,47 +1,42 @@ #LANG:Japanese -#Wagic 0.13.1 { - -#Note: -# - Limitation: Special characters that are not in the limited Shift-JIS -# set can not be used, the game won't display them. - +#Wagic 0.13.1 日本語 ########################## # MAIN MENU # ########################## # Main menu: -Play=X^[g -Deck Editor=fbL -Shop=Vbv -Options=IvV -Exit=߂ +Play=スタート +Deck Editor=デッキ +Shop=ショップ +Options=オプション +Exit=やめる ########################## # DECK EDITOR # ########################## # Filter: -5DN=tBtXEh[ +5DN=フィフス・ドーン #Archenemy -ALA=A[̒f +ALA=アラーラの断片 #ALL #APC -ARB=A[Ēa +ARB=アラーラ再誕 #ARN #ATQ -BOK=_͖d +BOK=神河謀叛 #BRB #BTD -CHK=_͕ +CHK=神河物語 #CHR -CSP=R[hXibv -DIS=fBZV +CSP=コールドスナップ +DIS=ディセンション #DRK -DST=_[NXeB[ +DST=ダークスティール #Duel Decks: Phyrexia vs. the Coalition #DVD -EVE=C[u^Ch +EVE=イーブンタイド #EVG #EVT #EXO @@ -50,7 +45,7 @@ EVE= #FVD #FVE #FVR -GPT=MhpNg +GPT=ギルドパクト #GVL #HML #HOP @@ -62,12 +57,12 @@ GPT= #LEB #LEG #LGN -LRW=[EB +LRW=ローウィン #MED #ME2 #ME3 #MIR -MOR=[jO^Ch +MOR=モーニングタイド #MRD #MRQ #NMS @@ -76,24 +71,24 @@ MOR= #P02 #PCY #PDS -PLC=̍ +PLC=次元の混乱 #PLS #POR #PPR #PTK -RAV=ujJFMh̓s -ROE=Gh[Wo +RAV=ラブニカ:ギルドの都 +ROE=エルドラージ覚醒 #SCG -SHM=VhE[A -SOK=_͋~ -SOM=~fB̏ +SHM=シャドウムーア +SOK=神河救済 +SOM=ミラディンの傷跡 #STH Starter '00=Starter '00 Starter '99=Starter '99 #TMP #TOR -TSB=̂点̃^CVtg -TSP=̂点 +TSB=時のらせんのタイムシフト +TSP=時のらせん #UDS #UGL #ULG @@ -101,10 +96,10 @@ TSP= #USG #VIS #WTH -WWK=[hEFCN +WWK=ワールドウェイク Wagic 2010=M2010 Wagic 2011=M2011 -ZEN=[fBJ[ +ZEN=ゼンディカー ########################## @@ -112,232 +107,232 @@ ZEN= ########################## # please keep this alphabetized -Abuna Acolyte=m̌K -Accorder's Shield=aґ̏ -Acid Web Spider=_̑̒w -Alpha Tyrranax=ŏʂ̃eBibNX -Arc Trail=dʂ̍ -Argent Sphinx=┒̃XtBNX -Argentum Armor=A[WF^̊Z -Arrest=S -Asceticism=s` -Assault Strobe=ˌ̃Xg{ -Auriok Edgewright=I[IbN̐nH -Auriok Replica=I[IbN̖͑i -Auriok Sunchaser=I[IbN̑zǂ -Barbed Battlegear=th̐ -Barrage Ogre=A˂̃I[K -Bellowing Tanglewurm=i闍݃[ -Blackcleave Cliffs=̊R -Blackcleave Goblin=̃Su -Bladed Pinions=n̗ -Blade-Tribe Berserkers=n̋m -Bleak Coven Vampires=₽W̋zS -Blight Mamba=rp̃}o -Blistergrub=cn@ -Bloodshot Trainee=܂Ȃ̗K -Blunt the Assault=ˌ̓݉ -Bonds of Quicksilver=̔ -Carapace Forger=bk̒bH -Carnifex Demon=s̈ -Carrion Call=řĂѐ -Cerebral Eruption=m̔ -Chimeric Mass=L}CIQ -Chrome Steed=̏xn -Clone Shell=N[̊k -Contagion Clasp=`a̗ߋ -Contagion Engine=`aGW -Contagious Nim=`a̎r -Copperhorn Scout=pJ̐ˌ -Copperline Gorge=̒na -Copper Myr=̃}CA -Corpse Cur=̖̂쌢 -Corrupted Harvester=—n -Culling Dais=Iʂ̍ -Cystbearer=XE -Darkslick Drake=Ŋ̃hCN -Darkslick Shores=Ŋ̊ -Darksteel Axe=_[NXeB[̕ -Darksteel Juggernaut=_[NXeB[̋ -Darksteel Myr=_[NXeB[̃}CA -Darksteel Sentinel=_[NXeB[̕ -Dispense Justice=`̎{s -Disperse=U -Dissipation Field=̏ -Dross Hopper=hXob^ -Echo Circlet=܂̏ -Elspeth Tirel=GYyXEeB -Embersmith=Rb -Engulfing Slagwurm=ݍދ[ -Etched Champion=܂ꂽE -Exsanguinate=b -Ezuri, Renegade Leader=w̎哱ҁAGY[ -Ezuri's Archers=GY[̎ˎ -Ezuri's Brigade=GY[̑啔 -Ferrovore=SH -Flameborn Hellion=܂̃wI -Flesh Allergy=̃AM[ -Flight Spellbomb=s̎e -Fulgent Distraction=WࣂS -Fume Spitter=f -Furnace Celebration=F̎T -Galvanic Blast=dj -Genesis Wave=N̔g -Geth, Lord of the Vault=쓰̉AQX -Ghalma's Warden=K}̕ی -Glimmerpoint Stag=p̎ -Glimmerpost=n -Glint Hawk=߂ -Glint Hawk Idol=߂̋ -Goblin Gaveleer=SȕƑł -Golden Urn=P -Gold Myr=̃}CA -Golem Artisan=S[̐EH -Golem Foundry=S[̒ -Golem's Heart=S[̐S -Grafted Exoskeleton=̗ZOi -Grand Architect=匚z -Grasp of Darkness=ł̏ -Grindclock=v -Halt Order=~ -Hand of the Praetors=@̎ -Heavy Arbalest=΋| -Hoard-Smelter Dragon=B̃hS -Horizon Spellbomb=n̎e -Ichorclaw Myr=_t܂̃}CA -Ichor Rats=_t̑l -Indomitable Archangel=sޓ]̑Vg -Inexorable Tide=e͖ -Infiltration Lens=Z̃Y -Instill Infection=̕ -Iron Myr=S̃}CA -Kemba, Kha Regent=̐ېAPo -Kemba's Skyguard=Pőq -Koth of the Hammer=Ƃ̃RX -Kuldotha Forgemaster=Jh[T̒b -Kuldotha Phoenix=Jh[T̃tFjbNX -Kuldotha Rebirth=Jh[T̍Ēa -Leaden Myr=̃}CA -Leonin Arbiter=Ij̍قl -Liege of the Tangle=ݐX̎ -Lifesmith=b -Liquimetal Coating=t|̓h -Livewire Lash=̕ -Loxodon Wayfarer=N\h̗l -Lumengrid Drake=[Obh̃hCN -Lux Cannon=̑C -Melt Terrain=n`̗Z -Memnite=iCg -Memoricide=LE -Mimic Vat=~~bN̑剱 -Mindslaver=_ꑮ -Molder Beast=Hb -Molten Psyche=nS̐_ -Molten-Tail Masticore=nS̔̃}XeBRA -Moriok Reaver=IbN̓ -Moriok Replica=IbN̖͑i -Mox Opal=Ip[̃bNX -Myr Battlesphere=}CA̐퓬 -Myr Galvanizer=}CÅd -Myr Propagator=}CA̔ɐB -Myr Reservoir=}CA̒ -Myrsmith=}CAb -Necrogen Censer=rC̍F -Necrogen Scudder=rC΂ -Necropede=rS -Necrotic Ooze=󎀂̃E[Y -Neurok Invisimancer=j[bN̓pm -Neurok Replica=j[bN̖͑i -Nihil Spellbomb=̎e -Nim Deathmantle=r̎̃}g -Ogre Geargrabber=I[K̑D -Origin Spellbomb=N̎e -Oxidda Daredevil=ILV_̌ -Oxidda Scrapmelter=ILV_̋Sn -Painful Quandary=ɂ܂ꋫ -Painsmith=ɒb -Palladium Myr=pWẼ}CA -Panic Spellbomb=Q̎e -Perilous Myr=댯ȃ}CA -Plague Stinger=uâƂh -Plated Seastrider=‹Z̊C‚ -Platinum Emperion=̒鑜 -Precursor Golem=̃S[ -Prototype Portal=i̔ -Psychic Miasma=_ᏋC -Putrefax=^b -Quicksilver Gargantuan=̃KK`A -Ratchet Bomb=Qe -Razorfield Thresher=䓁̑ł‚ -Razor Hippogriff=䓁̃q|Ot -Razorverge Thicket=䓁̖΂ -Relic Putrescence=̕s -Revoke Existence=݂̔j -Riddlesmith=b -Rusted Relic=Kт -Rust Tick=K_j -Saberclaw Golem=܂̃S[ -Salvage Scout=̐ˌ -Scoria Elemental=̐ -Scrapdiver Serpent=S̊C -Screeching Silcaw=؂萺̃VJE -Seachrome Coast=C̉ -Seize the Initiative=哱̒D -Semblance Anvil=ގ̋ -Shape Anew=Vȑ` -Shatter= -Silver Myr=̃}CA -Skinrender= -Skithiryx, the Blight Dragon=rp̃hSAXLWNX -Sky-Eel School=󒷋̌Q -Slice in Twain=^ -Snapsail Glider=Ƃߏ̊ -Soliton=\g -Soul Parry=̎󂯗 -Spikeshot Elder=gQ̌ØV -Steady Progress=Ȑi -Steel Hellkite=|̃wJCg -Stoic Rebuttal=ÂȔ_ -Strata Scythe=nẘ -Strider Harness=舕̂̑ -Sunblast Angel=zj̓Vg -Sunspear Shikari=z̑̃VJ[ -Sword of Body and Mind=̂Ɛ_̌ -Sylvok Lifestaff=VHN̐ -Sylvok Replica=VHN̖͑i -Tainted Strike=ꂽꌂ -Tangle Angler=ݐX -Tel-Jilad Defiance=eW[h̒R -Tel-Jilad Fallen=eW[h̑‚ -Tempered Steel=bꂽ| -Throne of Geth=QX̋ʍ -Thrummingbird=‚炵 -Tower of Calamities=Г̓ -Trigon of Corruption=—̎Op아 -Trigon of Infestation=̎Op아 -Trigon of Mending=񕜂̎Op아 -Trigon of Rage={̎Op아 -Trigon of Thought=vl̎Op아 -Trinket Mage=e΂̖m -True Conviction=^̊mM -Tumble Magnet=]|̎ -Tunnel Ignus=gl̃COiX -Turn Aside=U -Turn to Slag= -Twisted Image=悶ꂽf -Untamed Might=rX -Vault Skyward=ւ̒ -Vector Asp=}̃AXv -Vedalken Certarch=B_P̃Z^[` -Venser's Journal=FZ[̓ -Venser, the Sojourner=ؗ҃FZ[ -Vigil for the Lost=ꂵ҂ւ̋F -Viridian Revel=BWÂՂ葛 -Volition Reins=f̎j -Vulshok Heartstoker=@VN̐S -Vulshok Replica=@VN̖͑i -Wall of Tanglecord=ݐ̕ -Whitesun's Passage=̑z̒ʉ -Wing Puncture=̓˂h -Withstand Death=ւ̒R -Wurmcoil Engine=[ƂGW +Abuna Acolyte=高僧の見習い +Accorder's Shield=調和者隊の盾 +Acid Web Spider=酸の巣の蜘蛛 +Alpha Tyrranax=最上位のティラナックス +Arc Trail=電弧の痕跡 +Argent Sphinx=銀白のスフィンクス +Argentum Armor=アージェンタムの鎧 +Arrest=拘引 +Asceticism=苦行主義 +Assault Strobe=突撃のストロボ +Auriok Edgewright=オーリオックの刃工 +Auriok Replica=オーリオックの模造品 +Auriok Sunchaser=オーリオックの太陽追い +Barbed Battlegear=逆刺の戦具 +Barrage Ogre=連射のオーガ +Bellowing Tanglewurm=吠える絡みワーム +Blackcleave Cliffs=黒割れの崖 +Blackcleave Goblin=黒割れのゴブリン +Bladed Pinions=刃の翼 +Blade-Tribe Berserkers=刃族の狂戦士 +Bleak Coven Vampires=冷たき集いの吸血鬼 +Blight Mamba=荒廃のマンバ +Blistergrub=水膨れ地掘り +Bloodshot Trainee=血まなこの練習生 +Blunt the Assault=突撃の鈍化 +Bonds of Quicksilver=水銀の縛め +Carapace Forger=甲殻の鍛冶工 +Carnifex Demon=執行の悪魔 +Carrion Call=屍肉の呼び声 +Cerebral Eruption=知性の爆発 +Chimeric Mass=キマイラ的大群 +Chrome Steed=金属の駿馬 +Clone Shell=クローンの殻 +Contagion Clasp=伝染病の留め金 +Contagion Engine=伝染病エンジン +Contagious Nim=伝染病の屍賊 +Copperhorn Scout=銅角笛の斥候 +Copperline Gorge=銅線の地溝 +Copper Myr=銅のマイア +Corpse Cur=死体の野犬 +Corrupted Harvester=堕落した収穫者 +Culling Dais=選別の高座 +Cystbearer=嚢胞抱え +Darkslick Drake=闇滑りのドレイク +Darkslick Shores=闇滑りの岸 +Darksteel Axe=ダークスティールの斧 +Darksteel Juggernaut=ダークスティールの巨大戦車 +Darksteel Myr=ダークスティールのマイア +Darksteel Sentinel=ダークスティールの歩哨 +Dispense Justice=正義の施行 +Disperse=分散 +Dissipation Field=霧消の場 +Dross Hopper=ドロスバッタ +Echo Circlet=こだまの飾り輪 +Elspeth Tirel=エルズペス・ティレル +Embersmith=燃えさし鍛冶 +Engulfing Slagwurm=飲み込む金屑ワーム +Etched Champion=刻まれた勇者 +Exsanguinate=瀉血 +Ezuri, Renegade Leader=背教の主導者、エズーリ +Ezuri's Archers=エズーリの射手 +Ezuri's Brigade=エズーリの大部隊 +Ferrovore=鉄を食うもの +Flameborn Hellion=炎生まれのヘリオン +Flesh Allergy=肉体アレルギー +Flight Spellbomb=飛行の呪文爆弾 +Fulgent Distraction=燦爛たる放心 +Fume Spitter=煙霧吐き +Furnace Celebration=炉の式典 +Galvanic Blast=感電破 +Genesis Wave=起源の波 +Geth, Lord of the Vault=大霊堂の王、ゲス +Ghalma's Warden=ガルマの保護者 +Glimmerpoint Stag=微光角の鹿 +Glimmerpost=微光地 +Glint Hawk=きらめく鷹 +Glint Hawk Idol=きらめく鷹の偶像 +Goblin Gaveleer=ゴブリンの小槌打ち +Golden Urn=黄金の甕 +Gold Myr=金のマイア +Golem Artisan=ゴーレムの職工 +Golem Foundry=ゴーレムの鋳造所 +Golem's Heart=ゴーレムの心臓 +Grafted Exoskeleton=生体融合外骨格 +Grand Architect=大建築家 +Grasp of Darkness=闇の掌握 +Grindclock=研磨時計 +Halt Order=停止命令 +Hand of the Praetors=法務官の手 +Heavy Arbalest=大石弓 +Hoard-Smelter Dragon=蔵製錬のドラゴン +Horizon Spellbomb=地平線の呪文爆弾 +Ichorclaw Myr=胆液爪のマイア +Ichor Rats=胆液の鼠 +Indomitable Archangel=不退転の大天使 +Inexorable Tide=容赦無い潮流 +Infiltration Lens=浸透のレンズ +Instill Infection=感染の賦活 +Iron Myr=鉄のマイア +Kemba, Kha Regent=王の摂政、ケンバ +Kemba's Skyguard=ケンバの空護衛 +Koth of the Hammer=槌のコス +Kuldotha Forgemaster=カルドーサの鍛冶場主 +Kuldotha Phoenix=カルドーサのフェニックス +Kuldotha Rebirth=カルドーサの再誕 +Leaden Myr=鉛のマイア +Leonin Arbiter=レオニンの裁き人 +Liege of the Tangle=絡み森の主 +Lifesmith=生命鍛冶 +Liquimetal Coating=液鋼の塗膜 +Livewire Lash=活線の鞭 +Loxodon Wayfarer=ロクソドンの旅人 +Lumengrid Drake=ルーメングリッドのドレイク +Lux Cannon=光明の大砲 +Melt Terrain=地形の融解 +Memnite=メムナイト +Memoricide=記憶殺し +Mimic Vat=ミミックの大桶 +Mindslaver=精神隷属器 +Molder Beast=腐食獣 +Molten Psyche=溶鉄の精神 +Molten-Tail Masticore=溶鉄の尾のマスティコア +Moriok Reaver=モリオックの肉裂き +Moriok Replica=モリオックの模造品 +Mox Opal=オパールのモックス +Myr Battlesphere=マイアの戦闘球 +Myr Galvanizer=マイアの感電者 +Myr Propagator=マイアの繁殖者 +Myr Reservoir=マイアの貯蔵庫 +Myrsmith=マイア鍛冶 +Necrogen Censer=屍気の香炉 +Necrogen Scudder=屍気を飛ばすもの +Necropede=屍百足 +Necrotic Ooze=壊死のウーズ +Neurok Invisimancer=ニューロックの透術士 +Neurok Replica=ニューロックの模造品 +Nihil Spellbomb=虚無の呪文爆弾 +Nim Deathmantle=屍賊の死のマント +Ogre Geargrabber=オーガの装具奪い +Origin Spellbomb=起源の呪文爆弾 +Oxidda Daredevil=オキシダの向こう見ず +Oxidda Scrapmelter=オキシダの屑鉄溶かし +Painful Quandary=痛ましい苦境 +Painsmith=苦痛鍛冶 +Palladium Myr=パラジウムのマイア +Panic Spellbomb=恐慌の呪文爆弾 +Perilous Myr=危険なマイア +Plague Stinger=疫病のとげ刺し +Plated Seastrider=板金鎧の海うろつき +Platinum Emperion=白金の帝像 +Precursor Golem=先駆のゴーレム +Prototype Portal=試作品の扉 +Psychic Miasma=精神の瘴気 +Putrefax=化膿獣 +Quicksilver Gargantuan=水銀のガルガンチュアン +Ratchet Bomb=漸増爆弾 +Razorfield Thresher=剃刀ヶ原の打つもの +Razor Hippogriff=剃刀のヒポグリフ +Razorverge Thicket=剃刀境の茂み +Relic Putrescence=秘宝の腐敗 +Revoke Existence=存在の破棄 +Riddlesmith=謎鍛冶 +Rusted Relic=錆びた秘宝 +Rust Tick=錆ダニ +Saberclaw Golem=剣爪のゴーレム +Salvage Scout=回収の斥候 +Scoria Elemental=岩滓の精霊 +Scrapdiver Serpent=屑鉄潜りの海蛇 +Screeching Silcaw=金切り声のシルカウ +Seachrome Coast=金属海の沿岸 +Seize the Initiative=主導権の奪取 +Semblance Anvil=類似の金床 +Shape Anew=新たな造形 +Shatter=粉砕 +Silver Myr=銀のマイア +Skinrender=皮裂き +Skithiryx, the Blight Dragon=荒廃のドラゴン、スキジリクス +Sky-Eel School=空長魚の群れ +Slice in Twain=真っ二つ +Snapsail Glider=嵌め乗りの滑空者 +Soliton=ソリトン +Soul Parry=魂の受け流し +Spikeshot Elder=トゲ撃ちの古老 +Steady Progress=着実な進歩 +Steel Hellkite=鋼のヘルカイト +Stoic Rebuttal=冷静な反論 +Strata Scythe=地層の鎌 +Strider Harness=闊歩するものの装具 +Sunblast Angel=太陽破の天使 +Sunspear Shikari=太陽の槍のシカール +Sword of Body and Mind=肉体と精神の剣 +Sylvok Lifestaff=シルヴォクの生命杖 +Sylvok Replica=シルヴォクの模造品 +Tainted Strike=汚れた一撃 +Tangle Angler=絡み森の鮟鱇 +Tel-Jilad Defiance=テル=ジラードの抵抗 +Tel-Jilad Fallen=テル=ジラードの堕ちたる者 +Tempered Steel=鍛えられた鋼 +Throne of Geth=ゲスの玉座 +Thrummingbird=かき鳴らし鳥 +Tower of Calamities=災難の塔 +Trigon of Corruption=堕落の三角護符 +Trigon of Infestation=感染の三角護符 +Trigon of Mending=回復の三角護符 +Trigon of Rage=憤怒の三角護符 +Trigon of Thought=思考の三角護符 +Trinket Mage=粗石の魔道士 +True Conviction=真実の確信 +Tumble Magnet=転倒の磁石 +Tunnel Ignus=トンネルのイグナス +Turn Aside=取り繕い +Turn to Slag=金屑化 +Twisted Image=よじれた映像 +Untamed Might=荒々しき力 +Vault Skyward=空への跳躍 +Vector Asp=媒介のアスプ +Vedalken Certarch=ヴィダルケンのセルターチ +Venser's Journal=ヴェンセールの日誌 +Venser, the Sojourner=滞留者ヴェンセール +Vigil for the Lost=失われし者への祈り +Viridian Revel=ヴィリジアンのお祭り騒ぎ +Volition Reins=決断の手綱 +Vulshok Heartstoker=ヴァルショクの心臓焚き +Vulshok Replica=ヴァルショクの模造品 +Wall of Tanglecord=絡み線の壁 +Whitesun's Passage=白の太陽の通過 +Wing Puncture=風の突き刺し +Withstand Death=死への抵抗 +Wurmcoil Engine=ワームとぐろエンジン diff --git a/projects/mtg/bin/Res/lang/jp_cards.txt b/projects/mtg/bin/Res/lang/jp_cards.txt index 7809aeba6..20a26afb7 100644 --- a/projects/mtg/bin/Res/lang/jp_cards.txt +++ b/projects/mtg/bin/Res/lang/jp_cards.txt @@ -1,229 +1,229 @@ -Abuna Acolyte=sFN[`[1̂vC[1lΏۂƂB̃^[Aɂɗ^_[W1_yB sFA[eBt@NgEN[`[1̂ΏۂƂB̃^[Aɂɗ^_[W2_yB -Accorder's Shield=ĂN[`[+0/+3̏C󂯂ƂƂɌxB R -Acid Web Spider=B _̑̒w偂ɏoƂAi1‚ΏۂƂBȂ͂j󂵂Ă悢B +Abuna Acolyte=T:クリーチャー1体かプレイヤー1人を対象とする。このターン、次にそれに与えられるダメージを1点軽減する。 T:アーティファクト・クリーチャー1体を対象とする。このターン、次にそれに与えられるダメージを2点軽減する。 +Accorder's Shield=装備しているクリーチャーは+0/+3の修整を受けるとともに警戒を持つ。 装備3 +Acid Web Spider=到達 酸の巣の蜘蛛が戦場に出たとき、装備品1つを対象とする。あなたはそれを破壊してもよい。 Alpha Tyrranax= -Arc Trail=N[`[1̂vC[1lΏۂƂÃN[`[1̂vC[1lΏۂƂBdʂ̍Ղ͂̑O҂2_̃_[W^Ǎ҂1_̃_[W^B -Argent Sphinx=s p \tF┒̃XtBNXǕB ̏IXebv̊JnɁAȂ̃Rg[Őɖ߂B ̔\͂́AȂ3ˆȏ̃A[eBt@NgRg[Ăꍇɂ̂݋NłB -Argentum Armor=ĂN[`[+6/+6̏C󂯂B ĂN[`[U邽сAp[}lg1‚ΏۂƂAj󂷂B U -Arrest=G`giN[`[j G`gĂN[`[͍UubNłA̋N^\͂͋NłȂB -Asceticism=ȂRg[N[`[́AȂ̑ΐ푊肪Rg[\͂̑ΏۂɂȂȂB PfFN[`[1̂ΏۂƂAĐB -Assault Strobe=N[`[1̂ΏۂƂB̓^[I܂œiU𓾂Bi͐搧Uƒʏ2̐퓬_[W^Bj -Auriok Edgewright=p\I[IbN̐nH́AȂ3ˆȏ̃A[eBt@NgRg[Ă邩iUB -Auriok Replica=vCI[IbN̖͑i𐶂тɕF̃^[AȂI񂾔1‚Ȃɗ^邷ׂẴ_[WyB -Auriok Sunchaser=p\Ȃ3ˆȏ̃A[eBt@NgRg[Ă邩AI[IbN̑zǂ+2/+2̏C󂯂ƂƂɔs B -Barbed Battlegear=ĂN[`[+4/-1̏C󂯂B Q -Barrage Ogre=sCA[eBt@Ng1тɕFN[`[1̂vC[1lΏۂƂBA˂̃I[K͂2_̃_[W^B -Bellowing Tanglewurm=ЊdĩN[`[̓A[eBt@NgEN[`[Ƌʂ̐FƒN[`[ȊOɂ̓ubNȂBj ȂRg[鑼̗΂̃N[`[͈ЊdB -Blackcleave Cliffs=ȂRg[Ă鑼̓yn3ˆȏł邩ÅR̓^bvԂŐɏoB sFȂ̃}iEv[ɂaqB -Blackcleave Goblin=U ĩN[`[́AN[`[-1/-1JE^[̌`Ń_[W^AvC[ɓŃJE^[̌`Ń_[W^Bj -Bladed Pinions=ĂN[`[͔s Ɛ搧UB Q -Blade-Tribe Berserkers=p\n̋mɏoƂAȂ3ˆȏ̃A[eBt@NgRg[ĂꍇAn̋m̓^[I܂+3/+3̏C󂯂ƂƂɑU𓾂B -Bleak Coven Vampires=p\₽W̋zSɏoƂAȂ3ˆȏ̃A[eBt@NgRg[ĂꍇAvC[1lΏۂƂB̃vC[4_̃CtAȂ4_̃Ct𓾂B -Blight Mamba=ĩN[`[́AN[`[-1/-1JE^[̌`Ń_[W^AvC[ɓŃJE^[̌`Ń_[W^Bj PfFrp̃}oĐB -Blistergrub=n cn@肪ꂩ炢ꂩ̕nɒuꂽƂAeΐ푊͂ꂼ2_̃CtB -Bloodshot Trainee=sFN[`[1̂ΏۂƂB܂Ȃ̗K͂4_̃_[W^B ̔\͂́A܂Ȃ̗K̃p[4ȏ̏ꍇ̂݋NłB -Blunt the Assault=Ȃ͐ɏoĂN[`[1̂ɂ‚1_̃Ct𓾂B ̃^[ɗ^邷ׂĂ̐퓬_[WyB -Bonds of Quicksilver=uiȂ͂̎AȂCX^gƂȂ炢‚łĂ悢Bj G`giN[`[j G`gĂN[`[́ÃRg[[̃A^bvEXebvɃA^bvȂB -Carapace Forger=p\bk̒bH́AȂ3ˆȏ̃A[eBt@NgRg[Ă邩+2/+2̏C󂯂B -Carnifex Demon=s s̈́A-1/-1JE^[2’uꂽԂŐɏoB aCs̈-1/-1JE^[1Ž菜F̊eN[`[̏-1/-1JE^[1’uB -Carrion Call=—΂1/1̍EN[`[Eg[N2̐ɏoBi̓N[`[-1/-1JE^[̌`Ń_[W^AvC[ɓŃJE^[̌`Ń_[W^Bj -Cerebral Eruption=ΐ푊1lΏۂƂB̃vC[͎̃Cu[̈ԏ̃J[hJB m̔͂̃vC[Ƃ̃vC[Rg[eN[`[ɁǍJꂽJ[h̓_Ō}iERXgɓ_̃_[W^B ɂynJ[hJꂽꍇAm̔I[i[̎Dɖ߂B -Chimeric Mass=L}CIQ́A~σJE^[w’uꂽԂŐɏoB PF^[I܂ŁAL}CIQ́ũN[`[̃p[ƃ^tlX́Aꂼꂻ̏ɒuĂ~σJE^[̐ɓBv\zEA[eBt@NgEN[`[ɂȂB -Chrome Steed=p\̏xńAȂ3ˆȏ̃A[eBt@NgRg[Ă邩+2/+2̏C󂯂B -Clone Shell=\N[̊kɏoƂAȂ̃Cu[̈ԏォ4̃J[hāA1𗠌ɒǕǍセ̎cȂ̃Cu[̈ԉɖ]ޏԂŒuB N[̊kꂩ炢ꂩ̕nɒuꂽƂA̒ǕꂽJ[h\ɂB ꂪN[`[EJ[hłꍇAȂ̃Rg[ŐɏoB -Contagion Clasp=`a̗ߋɏoƂAN[`[1̂ΏۂƂȀ-1/-1JE^[1’uB SCsFBsBiȂ̓JE^[̒uĂp[}lgvC[]ސIсǍセꂼɁȀɂłɒuĂJE^[̂1ނ1’uBj -Contagion Engine=`aGWɏoƂAvC[1lΏۂƂB̃vC[Rg[eN[`[̏-1/-1JE^[1‚’uB SCsFBsǍĂёBsBiȂ̓JE^[̒uĂp[}lgvC[]ސIсǍセꂼɁȀɂłɒuĂJE^[̂1ނ1’uB ̌AJԂBj -Contagious Nim=ĩN[`[́AN[`[-1/-1JE^[̌`Ń_[W^AvC[ɓŃJE^[̌`Ń_[W^Bj -Copperhorn Scout=pJ̐ˌ󂪍U邽сAȂRg[鑼̊eN[`[A^bvB -Copperline Gorge=ȂRg[Ă鑼̓yn3ˆȏł邩A̒na̓^bvԂŐɏoB sFȂ̃}iEv[ɂqfB -Copper Myr=sFȂ̃}iEv[ɂfB -Corpse Cur=ĩN[`[́AN[`[-1/-1JE^[̌`Ń_[W^AvC[ɓŃJE^[̌`Ń_[W^Bj ̖̂쌢ɏoƂAȂ̕nɂ銴ƒN[`[EJ[h1ΏۂƂBȂ͂Ȃ̎Dɖ߂Ă悢B -Corrupted Harvester=aCN[`[1̐тɕF—n҂ĐB -Culling Dais=sCN[`[1̐тɕFIʂ̍̏ɒ~σJE^[1’uB PCIʂ̍𐶂тɕFIʂ̍̏ɒuĂ~σJE^[1‚ɂ‚J[h1B -Cystbearer=ĩN[`[́AN[`[-1/-1JE^[̌`Ń_[W^AvC[ɓŃJE^[̌`Ń_[W^Bj -Darkslick Drake=s Ŋ̃hCNꂩ炢ꂩ̕nɒuꂽƂAJ[h1B -Darkslick Shores=ȂRg[Ă鑼̓yn3ˆȏł邩AŊ݂̊̓^bvԂŐɏoB sFȂ̃}iEv[ɂtaB -Darksteel Axe=_[NXeB[͔̕j󂳂ȂBi"j󂷂"Əꂽʂł́A͔j󂳂ȂBj ĂN[`[+2/+0̏C󂯂B Q -Darksteel Juggernaut=_[NXeB[̋Ԃ̃p[ƃ^tlX́AꂼꂠȂRg[A[eBt@Ng̑ɓB _[NXeB[̋Ԃ͔͂j󂳂ꂸA”\Ȃ疈^[UB -Darksteel Myr=_[NXeB[̃}CA͔j󂳂ȂBiv_[W"j󂷂"ʂł͔͂j󂳂ȂB ̃^tlX0ȉłꍇ́A̓I[i[̕nɒuBj -Darksteel Sentinel=uiȂ͂̎AȂCX^gƂȂ炢‚łĂ悢Bj x _[NXeB[͔̕j󂳂ȂBiv_[W"j󂷂"ʂł͔͂j󂳂ȂB ̃^tlX0ȉłꍇ́A̓I[i[̕nɒuBj -Dispense Justice=vC[1lΏۂƂB̃vC[͍UN[`[1̐тɕB p\Ȃ3ˆȏ̃A[eBt@NgRg[ĂꍇAɂ̃vC[͍UN[`[2̐тɕB -Disperse=ynłȂp[}lg1‚ΏۂƂAI[i[̎Dɖ߂B -Dissipation Field=ꂩ̃p[}lgȂɃ_[W^邽сAI[i[̎Dɖ߂B -Dross Hopper=N[`[1̐тɕFhXob^̓^[I܂Ŕs 𓾂B -Echo Circlet=ĂN[`[́A1̂̃N[`[ubNłB P -Elspeth Tirel=+2F Ȃ͂ȂRg[N[`[1̂ɂ‚1_̃Ct𓾂B -2F 1/1̕mEN[`[Eg[N3̐ɏoB -5F ynƃg[Nׂ̂Ẵp[}lgj󂷂 B -Embersmith=ȂA[eBt@Ng1邽сAN[`[1̂vC[1lΏۂƂBȂ͂Ȃ͂PxĂ悢B ꍇARb͂1_̃_[W^B -Engulfing Slagwurm=ݍދ[N[`[1̂ubN邩N[`[1̂ɃubNꂽԂɂȂ邽сÃN[`[j󂷂B Ȃ͂̃N[`[̃^tlXɓ_̃Ct𓾂B -Etched Champion=p\܂ꂽE҂́AȂ3ˆȏ̃A[eBt@NgRg[Ă邩AveNViׂĂ̐Fj B -Exsanguinate=eΐ푊͂ꂼw_̃CtB Ȃ͂ɂ莸ꂽCtɓ_̃Ct𓾂B -Ezuri, Renegade Leader=fF̃Gt1̂ΏۂƂAĐB QfffFȂRg[GtEN[`[́A^[I܂+3/+3̏C󂯂ƂƂɃgv𓾂B -Ezuri's Archers=BĩN[`[͔s ƒN[`[ubNłBj GY[̎ˎ肪s ƒN[`[1̃ubN邽сAGY[̎ˎ̓^[I܂+3/+0̏C󂯂B -Ezuri's Brigade=p\Ȃ3ˆȏ̃A[eBt@NgRg[Ă邩AGY[̑啔+4/+4̏C󂯂ƂƂɃgvB -Ferrovore=qCA[eBt@Ng1тɕFSĤ́A^[I܂+3/+0̏C󂯂B -Flameborn Hellion=U ܂̃wI͉”\Ȃ疈^[UB -Flesh Allergy=̃AM[邽߂̒ljRXgƂāAN[`[1̐тɕB N[`[1̂ΏۂƂAj󂷂B ̃Rg[[́Ã^[Aꂩ炷ׂĂ̕nɒuꂽN[`[̐ɓ_̃CtB -Flight Spellbomb=sCs ̎e𐶂тɕFN[`[1̂ΏۂƂB̓^[I܂Ŕs 𓾂B s ̎eꂩ炢ꂩ̕nɒuꂽƂAȂ͂txĂ悢B ꍇAJ[h1B -Fulgent Distraction=N[`[2̂ΏۂƂB ^bvǍセ炩炷ׂĂ̑i͂B -Fume Spitter=f𐶂тɕFN[`[1̂ΏۂƂȀ-1/-1JE^[1’uB -Furnace Celebration=Ȃ̃p[}lg𐶂тɕ邽сAN[`[1̂vC[1lΏۂƂBȂ͂QxĂ悢B ꍇAF̎T͂2_̃_[W^B -Galvanic Blast=N[`[1̂vC[1lΏۂƂBdj͂2_̃_[W^B p\Ȃ3ˆȏ̃A[eBt@NgRg[Ă邩AɊdj͂̃N[`[vC[4_̃_[W^B -Genesis Wave=Ȃ̃Cu[̈ԏォw̃J[hJB Ȃ͂̒̓_Ō}iERXgwȉłp[}lgEJ[hA]ޖɏoĂ悢B ̌AɂJĐɏoȂׂẴJ[hȂ̕nɒuB -Geth, Lord of the Vault=ЊdwaFꂩ̑ΐ푊̕nɂ_Ō}iERXgẃAA[eBt@NgEJ[h1N[`[EJ[h1ΏۂƂAȂ̃Rg[Ń^bvԂŐɏoB ̌ÃvC[́ÃCu[̈ԏォw̃J[h̕nɒuB -Ghalma's Warden=p\K}̕ی҂́AȂ3ˆȏ̃A[eBt@NgRg[Ă邩+2/+2̏C󂯂B -Glimmerpoint Stag=x p̎ɏoƂÃp[}lg1‚ΏۂƂAǕB ̏IXebv̊JnɁÃJ[hI[i[̃Rg[ŐɏoB -Glimmerpost=nɏoƂAȂ͐ɏoĂ_1‚ɂ‚1_̃Ct𓾂B sFȂ̃}iEv[ɂPB -Glint Hawk Idol=̃A[eBt@Ng1‚Ȃ̃Rg[Őɏo邽сAȂ́u߂̋́A^[I܂Ŕs 2/2̃A[eBt@NgEN[`[ɂȂBvIł悢B vF߂̋́A^[I܂Ŕs 2/2̃A[eBt@NgEN[`[ɂȂB -Glint Hawk=s ߂邪ɏoƂAȂRg[A[eBt@Ng1‚I[i[̎Dɖ߂ȂA𐶂тɕB -Goblin Gaveleer=gv SȕƑł́Aɂ‚Ă鑕i1‚ɂ‚+2/+0̏C󂯂B -Golden Urn=Ȃ̃AbvL[v̊JnɁAȂ͉P̏ɒ~σJE^[1’uĂ悢B sCP𐶂тɕFȂ͉PɒuĂ~σJE^[̐ɓ_̃Ct𓾂B -Gold Myr=sFȂ̃}iEv[ɂvB -Golem Artisan=QFA[eBt@NgEN[`[1̂ΏۂƂB̓^[I܂+1/+1̏C󂯂B QFA[eBt@NgEN[`[1̂ΏۂƂB̓^[I܂ŁAs gvÛȂI1‚𓾂B -Golem Foundry=ȂA[eBt@Ng1邽сAȂ̓S[̒̏ɒ~σJE^[1’uĂ悢B S[̒~σJE^[3Ž菜FF3/3̃S[EA[eBt@NgEN[`[Eg[N1̐ɏoB -Golem's Heart=ꂩ̃vC[A[eBt@Ng1邽сAȂ1_̃Ct𓾂Ă悢B -Grafted Exoskeleton=ĂN[`[+2/+2̏C󂯂ƂƂɊBi̓N[`[-1/-1JE^[̌`Ń_[W^AvC[ɓŃJE^[̌`Ń_[W^Bj ̗ZOiꂩ̃p[}lg͂邽сÃp[}lg𐶂тɕB Q -Grand Architect=ȂRg[鑼̐‚̃N[`[+1/+1̏C󂯂B tFA[eBt@NgEN[`[1̂ΏۂƂB^[I܂ŁA͐‚ɂȂB ȂRg[A^bvԂ̐‚̃N[`[1̃^bvFȂ̃}iEv[ɂQB ̃}íAA[eBt@Ng邽߂AA[eBt@Ng̔\͂N邽߂ɂ̂ݎxB -Grasp of Darkness=N[`[1̂ΏۂƂB̓^[I܂-4/-4̏C󂯂B -Grindclock=sFv̏ɒ~σJE^[1’uB sFvC[1lΏۂƂB̃vC[̃Cu[̈ԏォw̃J[h̃vC[̕nɒuBw͂̌v̏ɒuĂ~σJE^[̐ɓB -Halt Order=A[eBt@Ng1‚ΏۂƂAłB J[h1B -Hand of the Praetors=ĩN[`[́AN[`[-1/-1JE^[̌`Ń_[W^AvC[ɓŃJE^[̌`Ń_[W^Bj ȂRg[鑼̊ƒN[`[+1/+1̏C󂯂B ȂƒN[`[1邽сAvC[1lΏۂƂB̃vC[͓ŃJE^[1“B -Heavy Arbalest=ĂN[`[́ÃRg[[̃A^bvEXebvɃA^bvȂB ĂN[`[́usFN[`[1̂vC[1lΏۂƂB̃N[`[͂2_̃_[W^BvB S -Hoard-Smelter Dragon=s RqFA[eBt@Ng1‚ΏۂƂAj󂷂B B̃hS̓^[I܂+w/+0̏C󂯂Bw͂̃A[eBt@Ng̓_Ō}iERXgɓB -Horizon Spellbomb=QCsCn̎e𐶂тɕFȂ̃Cu[{ynJ[h1TAJĂȂ̎DɉB ̌゠Ȃ̃Cu[؂蒼B n̎eꂩ炢ꂩ̕nɒuꂽƂAȂ͂fxĂ悢B ꍇAJ[h1B -Ichorclaw Myr=ĩN[`[́AN[`[-1/-1JE^[̌`Ń_[W^AvC[ɓŃJE^[̌`Ń_[W^Bj _t܂̃}CAubNꂽԂɂȂ邽сA̓^[I܂+2/+2̏C󂯂B -Ichor Rats=ĩN[`[́AN[`[-1/-1JE^[̌`Ń_[W^AvC[ɓŃJE^[̌`Ń_[W^Bj _t̑lɏoƂAevC[͂ꂼŃJE^[1“B -Indomitable Archangel=s p\Ȃ3ˆȏ̃A[eBt@NgRg[Ă邩AȂRg[A[eBt@Ng͔핢B -Inexorable Tide=Ȃ1邽сABsBiȂ̓JE^[̒uĂp[}lgvC[]ސIсǍセꂼɁȀɂłɒuĂJE^[̂1ނ1’uBj -Infiltration Lens=ĂN[`[N[`[1̂ɃubNꂽԂɂȂ邽сAȂ̓J[h2Ă悢B P -Instill Infection=N[`[1̂ΏۂƂȀ-1/-1JE^[1’uB J[h1B -Iron Myr=sFȂ̃}iEv[ɂqB -Kemba, Kha Regent=Ȃ̃AbvL[v̊JnɁA̐ېAPoɂ‚Ă鑕i1‚ɂ‚A2/2̔LEN[`[Eg[N1̐ɏoB -Kemba's Skyguard=s PőqɏoƂAȂ2_̃Ct𓾂B -Koth of the Hammer=+1F R1‘ΏۂƂAA^bvB ̓^[I܂ŁAԂ4/4̃G^EN[`[ɂȂB ͓ynłB -2F ȂRg[R1‚ɂ‚AȂ̃}iEv[ɂqB -5F Ȃ́uȂRg[ŔwsFN[`[1̂vC[1lΏۂƂB̓yn͂1_̃_[W^BxBv–͂𓾂B -Kuldotha Forgemaster=sCA[eBt@Ng3тɕFȂ̃Cu[A[eBt@NgEJ[h1TAɏoB ̌゠Ȃ̃Cu[؂蒼B -Kuldotha Phoenix=s AU p \SFȂ̕nɂJh[T̃tFjbNXɖ߂B ̔\͂́AȂ̃AbvL[v̊ԂɁAȂ3ˆȏ̃A[eBt@NgRg[Ăꍇɂ̂݋NłB -Kuldotha Rebirth=Jh[T̍Ēa邽߂̒ljRXgƂāAA[eBt@Ng1тɕB Ԃ1/1̃SuEN[`[Eg[N3̐ɏoB -Leaden Myr=sFȂ̃}iEv[ɂaB -Leonin Arbiter=vC[̓Cu[TȂB ̃vC[QxĂ悢BȂA^[I܂ŁÃvC[͂̌ʂ𖳎B -Liege of the Tangle=gv ݐX̎傪ꂩ̃vC[ɐ퓬_[W^邽сA]ސ̂ȂRg[ynΏۂƂBȂ͂̏ɁAꂼoJE^[1‚’uĂ悢B ̊eyńAoJE^[uꑱĂ邩A΂8/8̃G^EN[`[łB ͓ynłB -Lifesmith=ȂA[eBt@Ng1邽сAȂ͂PxĂ悢B ꍇAȂ3_̃Ct𓾂B -Liquimetal Coating=sFp[}lg1‚ΏۂƂB^[I܂ŁA͑̃^CvɉăA[eBt@NgɂȂB -Livewire Lash=ĂN[`[+2/+0̏C󂯂ƂƂɁũN[`[1‚̑ΏۂɂȂ邽сAN[`[1̂vC[1lΏۂƂB̃N[`[͂2_̃_[W^vB Q +Arc Trail=クリーチャー1体かプレイヤー1人を対象とし、他のクリーチャー1体かプレイヤー1人を対象とする。電弧の痕跡はその前者に2点のダメージを与え、その後者に1点のダメージを与える。 +Argent Sphinx=飛行 金属術 —U:銀白のスフィンクスを追放する。 次の終了ステップの開始時に、それをあなたのコントロール下で戦場に戻す。 この能力は、あなたが3つ以上のアーティファクトをコントロールしている場合にのみ起動できる。 +Argentum Armor=装備しているクリーチャーは+6/+6の修整を受ける。 装備しているクリーチャーが攻撃するたび、パーマネント1つを対象とし、それを破壊する。 装備6 +Arrest=エンチャント(クリーチャー) エンチャントされているクリーチャーは攻撃したりブロックしたりできず、それの起動型能力は起動できない。 +Asceticism=あなたがコントロールするクリーチャーは、あなたの対戦相手がコントロールする呪文や能力の対象にならない。 1G:クリーチャー1体を対象とし、それを再生する。 +Assault Strobe=クリーチャー1体を対象とする。それはターン終了時まで二段攻撃を得る。(それは先制攻撃と通常の2回の戦闘ダメージを与える。) +Auriok Edgewright=金属術—オーリオックの刃工は、あなたが3つ以上のアーティファクトをコントロールしているかぎり二段攻撃を持つ。 +Auriok Replica=W,オーリオックの模造品を生け贄に捧げる:このターン、あなたが選んだ発生源1つがあなたに与えるすべてのダメージを軽減する。 +Auriok Sunchaser=金属術—あなたが3つ以上のアーティファクトをコントロールしているかぎり、オーリオックの太陽追いは+2/+2の修整を受けるとともに飛行 を持つ。 +Barbed Battlegear=装備しているクリーチャーは+4/-1の修整を受ける。 装備2 +Barrage Ogre=T,アーティファクトを1つ生け贄に捧げる:クリーチャー1体かプレイヤー1人を対象とする。連射のオーガはそれに2点のダメージを与える。 +Bellowing Tanglewurm=威嚇(このクリーチャーはアーティファクト・クリーチャーかそれと共通の色を持つクリーチャー以外にはブロックされない。) あなたがコントロールする他の緑のクリーチャーは威嚇を持つ。 +Blackcleave Cliffs=あなたがコントロールしている他の土地が3つ以上であるかぎり、黒割れの崖はタップ状態で戦場に出る。 T:あなたのマナ・プールにBかRを加える。 +Blackcleave Goblin=速攻 感染(このクリーチャーは、クリーチャーに-1/-1カウンターの形でダメージを与え、プレイヤーに毒カウンターの形でダメージを与える。) +Bladed Pinions=装備しているクリーチャーは飛行 と先制攻撃を持つ。 装備2 +Blade-Tribe Berserkers=金属術—刃族の狂戦士が戦場に出たとき、あなたが3つ以上のアーティファクトをコントロールしている場合、刃族の狂戦士はターン終了時まで+3/+3の修整を受けるとともに速攻を得る。 +Bleak Coven Vampires=金属術—冷たき集いの吸血鬼が戦場に出たとき、あなたが3つ以上のアーティファクトをコントロールしている場合、プレイヤー1人を対象とする。そのプレイヤーは4点のライフを失い、あなたは4点のライフを得る。 +Blight Mamba=感染(このクリーチャーは、クリーチャーに-1/-1カウンターの形でダメージを与え、プレイヤーに毒カウンターの形でダメージを与える。) 1G:荒廃のマンバを再生する。 +Blistergrub=沼渡り 水膨れ地掘りが戦場からいずれかの墓地に置かれたとき、各対戦相手はそれぞれ2点のライフを失う。 +Bloodshot Trainee=T:クリーチャー1体を対象とする。血まなこの練習生はそれに4点のダメージを与える。 この能力は、血まなこの練習生のパワーが4以上の場合のみ起動できる。 +Blunt the Assault=あなたは戦場に出ているクリーチャー1体につき1点のライフを得る。 このターンに与えられるすべての戦闘ダメージを軽減する。 +Bonds of Quicksilver=瞬速(あなたはこの呪文を、あなたがインスタントを唱えられるときならいつでも唱えてよい。) エンチャント(クリーチャー) エンチャントされているクリーチャーは、それのコントローラーのアンタップ・ステップにアンタップしない。 +Carapace Forger=金属術—甲殻の鍛冶工は、あなたが3つ以上のアーティファクトをコントロールしているかぎり+2/+2の修整を受ける。 +Carnifex Demon=飛行 執行の悪魔は、-1/-1カウンターが2個置かれた状態で戦場に出る。 B,執行の悪魔から-1/-1カウンターを1個取り除く:他の各クリーチャーの上に-1/-1カウンターを1個置く。 +Carrion Call=感染を持つ緑の1/1の昆虫・クリーチャー・トークンを2体戦場に出す。(それらはクリーチャーに-1/-1カウンターの形でダメージを与え、プレイヤーに毒カウンターの形でダメージを与える。) +Cerebral Eruption=対戦相手1人を対象とする。そのプレイヤーは自分のライブラリーの一番上のカードを公開する。 知性の爆発はそのプレイヤーとそのプレイヤーがコントロールする各クリーチャーに、その公開されたカードの点数で見たマナ・コストに等しい点数のダメージを与える。 これにより土地カードが公開された場合、知性の爆発をオーナーの手札に戻す。 +Chimeric Mass=キマイラ的大群は、蓄積カウンターがX個置かれた状態で戦場に出る。 1:ターン終了時まで、キマイラ的大群は「このクリーチャーのパワーとタフネスは、それぞれそれの上に置かれている蓄積カウンターの数に等しい。」を持つ構築物・アーティファクト・クリーチャーになる。 +Chrome Steed=金属術—金属の駿馬は、あなたが3つ以上のアーティファクトをコントロールしているかぎり+2/+2の修整を受ける。 +Clone Shell=刻印—クローンの殻が戦場に出たとき、あなたのライブラリーの一番上から4枚のカードを見て、1枚を裏向きに追放し、その後その残りをあなたのライブラリーの一番下に望む順番で置く。 クローンの殻が戦場からいずれかの墓地に置かれたとき、その追放されたカードを表向きにする。 それがクリーチャー・カードである場合、それをあなたのコントロール下で戦場に出す。 +Contagion Clasp=伝染病の留め金が戦場に出たとき、クリーチャー1体を対象とし、それの上に-1/-1カウンターを1個置く。 4,T:増殖を行う。(あなたはカウンターの置かれているパーマネントやプレイヤーを望む数だけ選び、その後それぞれに、その上にすでに置かれているカウンターのうち1種類を1個置く。) +Contagion Engine=伝染病エンジンが戦場に出たとき、プレイヤー1人を対象とする。そのプレイヤーがコントロールする各クリーチャーの上に-1/-1カウンターを1個ずつ置く。 4,T:増殖を行い、その後再び増殖を行う。(あなたはカウンターの置かれているパーマネントやプレイヤーを望む数だけ選び、その後それぞれに、その上にすでに置かれているカウンターのうち1種類を1個置く。 その後、それを繰り返す。) +Contagious Nim=感染(このクリーチャーは、クリーチャーに-1/-1カウンターの形でダメージを与え、プレイヤーに毒カウンターの形でダメージを与える。) +Copperhorn Scout=銅角笛の斥候が攻撃するたび、あなたがコントロールする他の各クリーチャーをアンタップする。 +Copperline Gorge=あなたがコントロールしている他の土地が3つ以上であるかぎり、銅線の地溝はタップ状態で戦場に出る。 T:あなたのマナ・プールにRかGを加える。 +Copper Myr=T:あなたのマナ・プールにGを加える。 +Corpse Cur=感染(このクリーチャーは、クリーチャーに-1/-1カウンターの形でダメージを与え、プレイヤーに毒カウンターの形でダメージを与える。) 死体の野犬が戦場に出たとき、あなたの墓地にある感染を持つクリーチャー・カード1枚を対象とする。あなたはそれをあなたの手札に戻してもよい。 +Corrupted Harvester=B,クリーチャーを1体生け贄に捧げる:堕落した収穫者を再生する。 +Culling Dais=T,クリーチャーを1体生け贄に捧げる:選別の高座の上に蓄積カウンターを1個置く。 1,選別の高座を生け贄に捧げる:選別の高座の上に置かれていた蓄積カウンター1個につきカードを1枚引く。 +Cystbearer=感染(このクリーチャーは、クリーチャーに-1/-1カウンターの形でダメージを与え、プレイヤーに毒カウンターの形でダメージを与える。) +Darkslick Drake=飛行 闇滑りのドレイクが戦場からいずれかの墓地に置かれたとき、カードを1枚引く。 +Darkslick Shores=あなたがコントロールしている他の土地が3つ以上であるかぎり、闇滑りの岸はタップ状態で戦場に出る。 T:あなたのマナ・プールにUかBを加える。 +Darksteel Axe=ダークスティールの斧は破壊されない。("破壊する"と書かれた効果では、それは破壊されない。) 装備しているクリーチャーは+2/+0の修整を受ける。 装備2 +Darksteel Juggernaut=ダークスティールの巨大戦車のパワーとタフネスは、それぞれあなたがコントロールするアーティファクトの総数に等しい。 ダークスティールの巨大戦車はは破壊されず、可能なら毎ターン攻撃する。 +Darksteel Myr=ダークスティールのマイアは破壊されない。(致死ダメージや"破壊する"効果ではそれは破壊されない。 それのタフネスが0以下である場合は、それはオーナーの墓地に置かれる。) +Darksteel Sentinel=瞬速(あなたはこの呪文を、あなたがインスタントを唱えられるときならいつでも唱えてよい。) 警戒 ダークスティールの歩哨は破壊されない。(致死ダメージや"破壊する"効果ではそれは破壊されない。 それのタフネスが0以下である場合は、それはオーナーの墓地に置かれる。) +Dispense Justice=プレイヤー1人を対象とする。そのプレイヤーは攻撃クリーチャーを1体生け贄に捧げる。 金属術—あなたが3つ以上のアーティファクトをコントロールしている場合、代わりにそのプレイヤーは攻撃クリーチャーを2体生け贄に捧げる。 +Disperse=土地でないパーマネント1つを対象とし、それをオーナーの手札に戻す。 +Dissipation Field=いずれかのパーマネントがあなたにダメージを与えるたび、それをオーナーの手札に戻す。 +Dross Hopper=クリーチャーを1体生け贄に捧げる:ドロスバッタはターン終了時まで飛行 を得る。 +Echo Circlet=装備しているクリーチャーは、さらに1体のクリーチャーをブロックできる。 装備1 +Elspeth Tirel=+2: あなたはあなたがコントロールするクリーチャー1体につき1点のライフを得る。 -2: 白の1/1の兵士・クリーチャー・トークンを3体戦場に出す。 -5: 土地とトークンを除く他のすべてのパーマネントを破壊する 。 +Embersmith=あなたがアーティファクト呪文を1つ唱えるたび、クリーチャー1体かプレイヤー1人を対象とする。あなたはあなたは1を支払ってもよい。 そうした場合、燃えさし鍛冶はそれに1点のダメージを与える。 +Engulfing Slagwurm=飲み込む金屑ワームがクリーチャー1体をブロックするかクリーチャー1体にブロックされた状態になるたび、そのクリーチャーを破壊する。 あなたはそのクリーチャーのタフネスに等しい点数のライフを得る。 +Etched Champion=金属術—刻まれた勇者は、あなたが3つ以上のアーティファクトをコントロールしているかぎり、プロテクション(すべての色) を持つ。 +Exsanguinate=各対戦相手はそれぞれX点のライフを失う。 あなたはこれにより失われたライフに等しい点数のライフを得る。 +Ezuri, Renegade Leader=G:他のエルフ1体を対象とし、それを再生する。 2GGG:あなたがコントロールするエルフ・クリーチャーは、ターン終了時まで+3/+3の修整を受けるとともにトランプルを得る。 +Ezuri's Archers=到達(このクリーチャーは飛行 を持つクリーチャーをブロックできる。) エズーリの射手が飛行 を持つクリーチャーを1体ブロックするたび、エズーリの射手はターン終了時まで+3/+0の修整を受ける。 +Ezuri's Brigade=金属術—あなたが3つ以上のアーティファクトをコントロールしているかぎり、エズーリの大部隊は+4/+4の修整を受けるとともにトランプルを持つ。 +Ferrovore=R,アーティファクトを1つ生け贄に捧げる:鉄を食うものは、ターン終了時まで+3/+0の修整を受ける。 +Flameborn Hellion=速攻 炎生まれのヘリオンは可能なら毎ターン攻撃する。 +Flesh Allergy=肉体アレルギーを唱えるための追加コストとして、クリーチャーを1体生け贄に捧げる。 クリーチャー1体を対象とし、それを破壊する。 それのコントローラーは、このターン、戦場からすべての墓地に置かれたクリーチャーの数に等しい点数のライフを失う。 +Flight Spellbomb=T,飛行 の呪文爆弾を生け贄に捧げる:クリーチャー1体を対象とする。それはターン終了時まで飛行 を得る。 飛行 の呪文爆弾が戦場からいずれかの墓地に置かれたとき、あなたはUを支払ってもよい。 そうした場合、カードを1枚引く。 +Fulgent Distraction=クリーチャー2体を対象とする。 それらをタップし、その後それらからすべての装備品をはずす。 +Fume Spitter=煙霧吐きを生け贄に捧げる:クリーチャー1体を対象とし、それの上に-1/-1カウンターを1個置く。 +Furnace Celebration=あなたが他のパーマネントを生け贄に捧げるたび、クリーチャー1体かプレイヤー1人を対象とする。あなたは2を支払ってもよい。 そうした場合、炉の式典はそれに2点のダメージを与える。 +Galvanic Blast=クリーチャー1体かプレイヤー1人を対象とする。感電破はそれに2点のダメージを与える。 金属術—あなたが3つ以上のアーティファクトをコントロールしているかぎり、代わりに感電破はそのクリーチャーやプレイヤーに4点のダメージを与える。 +Genesis Wave=あなたのライブラリーの一番上からX枚のカードを公開する。 あなたはその中の点数で見たマナ・コストがX以下であるパーマネント・カードを、望む枚数戦場に出してもよい。 その後、これにより公開されて戦場に出されなかったすべてのカードをあなたの墓地に置く。 +Geth, Lord of the Vault=威嚇XB:いずれかの対戦相手の墓地にある点数で見たマナ・コストがXの、アーティファクト・カード1枚かクリーチャー・カード1枚を対象とし、それをあなたのコントロール下でタップ状態で戦場に出す。 その後、そのプレイヤーは、自分のライブラリーの一番上からX枚のカードを自分の墓地に置く。 +Ghalma's Warden=金属術—ガルマの保護者は、あなたが3つ以上のアーティファクトをコントロールしているかぎり+2/+2の修整を受ける。 +Glimmerpoint Stag=警戒 微光角の鹿が戦場に出たとき、他のパーマネント1つを対象とし、それを追放する。 次の終了ステップの開始時に、そのカードをオーナーのコントロール下で戦場に出す。 +Glimmerpost=微光地が戦場に出たとき、あなたは戦場に出ている神座1つにつき1点のライフを得る。 T:あなたのマナ・プールに1を加える。 +Glint Hawk Idol=他のアーティファクトが1つあなたのコントロール下で戦場に出るたび、あなたは「きらめく鷹の偶像は、ターン終了時まで飛行 を持つ2/2のアーティファクト・クリーチャーになる。」を選んでもよい。 W:きらめく鷹の偶像は、ターン終了時まで飛行 を持つ2/2のアーティファクト・クリーチャーになる。 +Glint Hawk=飛行 きらめく鷹が戦場に出たとき、あなたがコントロールするアーティファクト1つをオーナーの手札に戻さないかぎり、それを生け贄に捧げる。 +Goblin Gaveleer=トランプル ゴブリンの小槌打ちは、それにつけられている装備品1つにつき+2/+0の修整を受ける。 +Golden Urn=あなたのアップキープの開始時に、あなたは黄金の甕の上に蓄積カウンターを1個置いてもよい。 T,黄金の甕を生け贄に捧げる:あなたは黄金の甕に置かれていた蓄積カウンターの数に等しい点数のライフを得る。 +Gold Myr=T:あなたのマナ・プールにWを加える。 +Golem Artisan=2:アーティファクト・クリーチャー1体を対象とする。それはターン終了時まで+1/+1の修整を受ける。 2:アーティファクト・クリーチャー1体を対象とする。それはターン終了時まで、飛行 かトランプルか速攻のうちあなたが選んだ1つを得る。 +Golem Foundry=あなたがアーティファクト呪文を1つ唱えるたび、あなたはゴーレムの鋳造所の上に蓄積カウンターを1個置いてもよい。 ゴーレムの鋳造所から蓄積カウンターを3個取り除く:無色の3/3のゴーレム・アーティファクト・クリーチャー・トークンを1体戦場に出す。 +Golem's Heart=いずれかのプレイヤーがアーティファクト呪文を1つ唱えるたび、あなたは1点のライフを得てもよい。 +Grafted Exoskeleton=装備しているクリーチャーは+2/+2の修整を受けるとともに感染を持つ。(それはクリーチャーに-1/-1カウンターの形でダメージを与え、プレイヤーに毒カウンターの形でダメージを与える。) 生体融合外骨格がいずれかのパーマネントからはずれるたび、そのパーマネントを生け贄に捧げる。 装備2 +Grand Architect=あなたがコントロールする他の青のクリーチャーは+1/+1の修整を受ける。 U:アーティファクト・クリーチャー1体を対象とする。ターン終了時まで、それは青になる。 あなたがコントロールするアンタップ状態の青のクリーチャーを1体タップする:あなたのマナ・プールに2を加える。 このマナは、アーティファクト呪文を唱えるためか、アーティファクトの能力を起動するためにのみ支払える。 +Grasp of Darkness=クリーチャー1体を対象とする。それはターン終了時まで-4/-4の修整を受ける。 +Grindclock=T:研磨時計の上に蓄積カウンターを1個置く。 T:プレイヤー1人を対象とする。そのプレイヤーのライブラリーの一番上からX枚のカードをそのプレイヤーの墓地に置く。Xはその研磨時計の上に置かれている蓄積カウンターの数に等しい。 +Halt Order=アーティファクト呪文1つを対象とし、それを打ち消す。 カードを1枚引く。 +Hand of the Praetors=感染(このクリーチャーは、クリーチャーに-1/-1カウンターの形でダメージを与え、プレイヤーに毒カウンターの形でダメージを与える。) あなたがコントロールする他の感染を持つクリーチャーは+1/+1の修整を受ける。 あなたが感染を持つクリーチャー呪文を1つ唱えるたび、プレイヤー1人を対象とする。そのプレイヤーは毒カウンターを1個得る。 +Heavy Arbalest=装備しているクリーチャーは、それのコントローラーのアンタップ・ステップにアンタップしない。 装備しているクリーチャーは「T:クリーチャー1体かプレイヤー1人を対象とする。このクリーチャーはそれに2点のダメージを与える。」を持つ。 装備4 +Hoard-Smelter Dragon=飛行 3R:アーティファクト1つを対象とし、それを破壊する。 蔵製錬のドラゴンはターン終了時まで+X/+0の修整を受ける。Xはそのアーティファクトの点数で見たマナ・コストに等しい。 +Horizon Spellbomb=2,T,地平線の呪文爆弾を生け贄に捧げる:あなたのライブラリーから基本土地カードを1枚探し、それを公開してあなたの手札に加える。 その後あなたのライブラリーを切り直す。 地平線の呪文爆弾が戦場からいずれかの墓地に置かれたとき、あなたはGを支払ってもよい。 そうした場合、カードを1枚引く。 +Ichorclaw Myr=感染(このクリーチャーは、クリーチャーに-1/-1カウンターの形でダメージを与え、プレイヤーに毒カウンターの形でダメージを与える。) 胆液爪のマイアがブロックされた状態になるたび、それはターン終了時まで+2/+2の修整を受ける。 +Ichor Rats=感染(このクリーチャーは、クリーチャーに-1/-1カウンターの形でダメージを与え、プレイヤーに毒カウンターの形でダメージを与える。) 胆液の鼠が戦場に出たとき、各プレイヤーはそれぞれ毒カウンターを1個得る。 +Indomitable Archangel=飛行 金属術—あなたが3つ以上のアーティファクトをコントロールしているかぎり、あなたがコントロールするアーティファクトは被覆を持つ。 +Inexorable Tide=あなたが呪文を1つ唱えるたび、増殖を行う。(あなたはカウンターの置かれているパーマネントやプレイヤーを望む数だけ選び、その後それぞれに、その上にすでに置かれているカウンターのうち1種類を1個置く。) +Infiltration Lens=装備しているクリーチャーがクリーチャー1体にブロックされた状態になるたび、あなたはカードを2枚引いてもよい。 装備1 +Instill Infection=クリーチャー1体を対象とし、それの上に-1/-1カウンターを1個置く。 カードを1枚引く。 +Iron Myr=T:あなたのマナ・プールにRを加える。 +Kemba, Kha Regent=あなたのアップキープの開始時に、王の摂政、ケンバにつけられている装備品1つにつき、白の2/2の猫・クリーチャー・トークンを1体戦場に出す。 +Kemba's Skyguard=飛行 ケンバの空護衛が戦場に出たとき、あなたは2点のライフを得る。 +Koth of the Hammer=+1: 山を1つ対象とし、それをアンタップする。 それはターン終了時まで、赤の4/4のエレメンタル・クリーチャーになる。 それは土地でもある。 -2: あなたがコントロールする山1つにつき、あなたのマナ・プールにRを加える。 -5: あなたは「あなたがコントロールする山は『T:クリーチャー1体かプレイヤー1人を対象とする。この土地はそれに1点のダメージを与える。』を持つ。」を持つ紋章を得る。 +Kuldotha Forgemaster=T,アーティファクトを3つ生け贄に捧げる:あなたのライブラリーからアーティファクト・カードを1枚探し、それを戦場に出す。 その後あなたのライブラリーを切り直す。 +Kuldotha Phoenix=飛行 、速攻 金属術 —4:あなたの墓地にあるカルドーサのフェニックスを戦場に戻す。 この能力は、あなたのアップキープの間に、あなたが3つ以上のアーティファクトをコントロールしている場合にのみ起動できる。 +Kuldotha Rebirth=カルドーサの再誕を唱えるための追加コストとして、アーティファクトを1つ生け贄に捧げる。 赤の1/1のゴブリン・クリーチャー・トークンを3体戦場に出す。 +Leaden Myr=T:あなたのマナ・プールにBを加える。 +Leonin Arbiter=プレイヤーはライブラリーから探せない。 いずれのプレイヤーも2を支払ってもよい。そうしたなら、ターン終了時まで、そのプレイヤーはこの効果を無視する。 +Liege of the Tangle=トランプル 絡み森の主がいずれかのプレイヤーに戦闘ダメージを与えるたび、望む数のあなたがコントロールする土地を対象とする。あなたはそれらの上に、それぞれ覚醒カウンターを1個ずつ置いてもよい。 それらの各土地は、覚醒カウンターが置かれ続けているかぎり、緑の8/8のエレメンタル・クリーチャーである。 それらは土地でもある。 +Lifesmith=あなたがアーティファクト呪文を1つ唱えるたび、あなたは1を支払ってもよい。 そうした場合、あなたは3点のライフを得る。 +Liquimetal Coating=T:パーマネント1つを対象とする。ターン終了時まで、それは他のタイプに加えてアーティファクトになる。 +Livewire Lash=装備しているクリーチャーは+2/+0の修整を受けるとともに「このクリーチャーが呪文1つの対象になるたび、クリーチャー1体かプレイヤー1人を対象とする。このクリーチャーはそれに2点のダメージを与える」を持つ。 装備2 Loxodon Wayfarer= -Lumengrid Drake=s p\[Obh̃hCNɏoƂAȂ3ˆȏ̃A[eBt@NgRg[ĂꍇAN[`[1̂ΏۂƂAI[i[̎Dɖ߂B -Lux Cannon=sF̑C̏ɒ~σJE^[1’uB sC̑C~σJE^[3Ž菜Fp[}lg1‚ΏۂƂAj󂷂B -Melt Terrain=yn1‚ΏۂƂAj󂷂B n`̗Z͂̓yñRg[[2_̃_[W^B +Lumengrid Drake=飛行 金属術—ルーメングリッドのドレイクが戦場に出たとき、あなたが3つ以上のアーティファクトをコントロールしている場合、クリーチャー1体を対象とし、それをオーナーの手札に戻す。 +Lux Cannon=T:光明の大砲の上に蓄積カウンターを1個置く。 T,光明の大砲から蓄積カウンターを3個取り除く:パーマネント1つを対象とし、それを破壊する。 +Melt Terrain=土地1つを対象とし、それを破壊する。 地形の融解はその土地のコントローラーに2点のダメージを与える。 Memnite= -Memoricide=vC[1lΏۂƂBynłȂJ[h1Žw肷B ̃vC[̕nƎDƃCu[A̖OƒJ[h]ޖTAǕB ̌ÃvC[͎̃Cu[؂蒼B -Mimic Vat=\g[NłȂN[`[1̐ꂩ炢ꂩ̕nɒu邽сAȂ͂̃J[hǕĂ悢BꍇA~~bN̑剱ɂǕꂽ̊eJ[hI[i[̕nɖ߂B RCsF̒ǕĂJ[h̃Rs[łg[N1̐ɏoB͑U𓾂B ̏IXebv̊JnɁAǕB -Mindslaver=SCsC_ꑮ𐶂тɕFvC[1lΏۂƂBȂ͂̃vC[̎̃^[Rg[BiȂ͂̃vC[邱Ƃ̂łJ[hׂČāÃvC[sׂĂ̌sBj -Molder Beast=gv A[eBt@Ng1ꂩ炢ꂩ̕nɒu邽сAHb̓^[I܂+2/+0̏C󂯂B -Molten Psyche=evC[́A̎D̃Cu[ɉĐ؂蒼Ǎセ̖ɓJ[hB p\Ȃ3ˆȏ̃A[eBt@NgRg[ĂꍇAnS̐_͊eΐ푊ɁÃ^[ɂ̃vC[J[h̖ɓ_̃_[W^B -Molten-Tail Masticore=Ȃ̃AbvL[v̊JnɁAȂJ[h1̂ĂȂAnS̔̃}XeBRA𐶂тɕB SCȂ̕nɂN[`[EJ[h1ǕFN[`[1̂vC[1lΏۂƂBnS̔̃}XeBRA͂4_̃_[W^B QFnS̔̃}XeBRAĐB +Memoricide=プレイヤー1人を対象とする。土地でないカード名を1つ指定する。 そのプレイヤーの墓地と手札とライブラリーから、その名前を持つカードを望む枚数探し、それらを追放する。 その後、そのプレイヤーは自分のライブラリーを切り直す。 +Mimic Vat=刻印—トークンでないクリーチャーが1体戦場からいずれかの墓地に置かれるたび、あなたはそのカードを追放してもよい。そうした場合、ミミックの大桶により追放された他の各カードをオーナーの墓地に戻す。 3,T:その追放されているカードのコピーであるトークンを1体戦場に出す。それは速攻を得る。 次の終了ステップの開始時に、それを追放する。 +Mindslaver=4,T,精神隷属器を生け贄に捧げる:プレイヤー1人を対象とする。あなたはそのプレイヤーの次のターンをコントロールする。(あなたはそのプレイヤーが見ることのできるカードをすべて見て、そのプレイヤーが行うすべての決定を行う。) +Molder Beast=トランプル アーティファクトが1つ戦場からいずれかの墓地に置かれるたび、腐食獣はターン終了時まで+2/+0の修整を受ける。 +Molten Psyche=各プレイヤーは、自分の手札を自分のライブラリーに加えて切り直し、その後その枚数に等しいカードを引く。 金属術—あなたが3つ以上のアーティファクトをコントロールしている場合、溶鉄の精神は各対戦相手に、このターンにそのプレイヤーが引いたカードの枚数に等しい点数のダメージを与える。 +Molten-Tail Masticore=あなたのアップキープの開始時に、あなたがカードを1枚捨てないかぎり、溶鉄の尾のマスティコアを生け贄に捧げる。 4,あなたの墓地にあるクリーチャー・カードを1枚追放する:クリーチャー1体かプレイヤー1人を対象とする。溶鉄の尾のマスティコアはそれに4点のダメージを与える。 2:溶鉄の尾のマスティコアを再生する。 Moriok Reaver= -Moriok Replica=PaCIbN̖͑i𐶂тɕFȂ̓J[h2A2_̃CtB -Mox Opal=p \sFȂ̃}iEv[ɁADȐF1F̃}i1_B ̔\͂́AȂ3ˆȏ̃A[eBt@NgRg[Ăꍇɂ̂݋NłB -Myr Battlesphere=}CA̐퓬ɏoƂAF1/1̃}CAEA[eBt@NgEN[`[Eg[N4̐ɏoB }CA̐퓬U邽сAȂ͂ȂRg[A^bvԂ̃}CAw̃^bvĂ悢B ꍇA}CA̐퓬̓^[I܂+w/+0̏C󂯂ƂƂɁAhvC[ɂw_̃_[W^B -Myr Galvanizer=ȂRg[鑼̃}CAEN[`[+1/+1̏C󂯂B PCsFȂRg[鑼̊e}CAA^bvB -Myr Propagator=RCsF}CA̔ɐB҂̃Rs[łg[N1̐ɏoB -Myr Reservoir=sFȂ̃}iEv[ɂQB ̃}íA}CA邽߂A}CA̔\͂N邽߂ɂ̂ݎxB RCsFȂ̕nɂ}CAEJ[h1ΏۂƂAȂ̎Dɖ߂B -Myrsmith=ȂA[eBt@Ng1邽сAȂ͂PxĂ悢B ꍇAF1/1̃}CAEA[eBt@NgEN[`[Eg[N1̐ɏoB -Necrogen Censer=rC̍F́A~σJE^[2’uꂽԂŐɏoB sCrC̍F~σJE^[1Ž菜FvC[1lΏۂƂB̃vC[2_̃CtB -Necrogen Scudder=s rC΂̂ɏoƂAȂ3_̃CtB -Necropede=ĩN[`[́AN[`[-1/-1JE^[̌`Ń_[W^AvC[ɓŃJE^[̌`Ń_[W^Bj rSꂩ炢ꂩ̕nɒuꂽƂAN[`[1̂ΏۂƂBȂ͂̏-1/-1JE^[1’uĂ悢B -Necrotic Ooze=󎀂̃E[YɏoĂ邩Aׂ͂Ă̕nɂ邷ׂẴN[`[EJ[h̋N^\͂B -Neurok Invisimancer=j[bN̓pm̓ubNȂB j[bN̓pmɏoƂAN[`[1̂ΏۂƂB̃^[A̓ubNȂB -Neurok Replica=PtCj[bN̖͑i𐶂тɕFN[`[1̂ΏۂƂAI[i[̎Dɖ߂B -Nihil Spellbomb=sC̎e𐶂тɕFvC[1lΏۂƂÃvC[̕nɂ邷ׂẴJ[hǕB ̎eꂩ炢ꂩ̕nɒuꂽƂAȂ͂axĂ悢B ꍇAJ[h1B -Nim Deathmantle=ĂN[`[+2/+2̏C󂯂ƂɈЊdÃ]rłB g[NłȂN[`[1̐ꂩ炠Ȃ̕nɒu邽сAȂ͂SxĂ悢B ꍇÃJ[hɖ߂Ar̎̃}gɂ‚B S -Ogre Geargrabber=I[K̑DU邽сAꂩ̑ΐ푊肪Rg[鑕i1‚ΏۂƂA^[I܂ł̃Rg[𓾂B I[K̑Dɂ‚B Ȃ̑ĩRg[ƂA͂B -Origin Spellbomb=PCsCN̎e𐶂тɕFF1/1̃}CAEA[eBt@NgEN[`[Eg[N1̐ɏoB N̎eꂩ炢ꂩ̕nɒuꂽƂAȂ͂vxĂ悢B ꍇAJ[h1B -Oxidda Daredevil=A[eBt@Ng1тɕFILV_̌̓^[I܂őU𓾂B -Oxidda Scrapmelter=ILV_̋SnɏoƂAA[eBt@Ng1‚ΏۂƂAj󂷂B -Painful Quandary=ꂩ̑ΐ푊肪1邽сÃvC[̓J[h1̂ĂȂ5_̃CtB -Painsmith=ȂA[eBt@Ng1邽сAN[`[1̂ΏۂƂBȂ́u̓^[I܂+2/+0̏C󂯂ƂƂɐڎ𓾂BvIł悢B -Palladium Myr=sFȂ̃}iEv[ɂQB -Panic Spellbomb=sCQ̎e𐶂тɕFN[`[1̂ΏۂƂB̃^[Ał̓ubNłȂB Q̎eꂩ炢ꂩ̕nɒuꂽƂAȂ͂qxĂ悢B ꍇAJ[h1B -Perilous Myr=댯ȃ}CAꂩ炢ꂩ̕nɒuꂽƂAN[`[1̂vC[1lΏۂƂB댯ȃ}CA͂2_̃_[W^B -Plague Stinger=s ĩN[`[́AN[`[-1/-1JE^[̌`Ń_[W^AvC[ɓŃJE^[̌`Ń_[W^Bj +Moriok Replica=1B,モリオックの模造品を生け贄に捧げる:あなたはカードを2枚引き、2点のライフを失う。 +Mox Opal=金属術 —T:あなたのマナ・プールに、好きな色1色のマナ1点を加える。 この能力は、あなたが3つ以上のアーティファクトをコントロールしている場合にのみ起動できる。 +Myr Battlesphere=マイアの戦闘球が戦場に出たとき、無色の1/1のマイア・アーティファクト・クリーチャー・トークンを4体戦場に出す。 マイアの戦闘球が攻撃するたび、あなたはあなたがコントロールするアンタップ状態のマイアをX体タップしてもよい。 そうした場合、マイアの戦闘球はターン終了時まで+X/+0の修整を受けるとともに、防御プレイヤーにX点のダメージを与える。 +Myr Galvanizer=あなたがコントロールする他のマイア・クリーチャーは+1/+1の修整を受ける。 1,T:あなたがコントロールする他の各マイアをアンタップする。 +Myr Propagator=3,T:マイアの繁殖者のコピーであるトークンを1体戦場に出す。 +Myr Reservoir=T:あなたのマナ・プールに2を加える。 このマナは、マイア呪文を唱えるためか、マイアの能力を起動するためにのみ支払える。 3,T:あなたの墓地にあるマイア・カード1枚を対象とし、それをあなたの手札に戻す。 +Myrsmith=あなたがアーティファクト呪文を1つ唱えるたび、あなたは1を支払ってもよい。 そうした場合、無色の1/1のマイア・アーティファクト・クリーチャー・トークンを1体戦場に出す。 +Necrogen Censer=屍気の香炉は、蓄積カウンターが2個置かれた状態で戦場に出る。 T,屍気の香炉から蓄積カウンターを1個取り除く:プレイヤー1人を対象とする。そのプレイヤーは2点のライフを失う。 +Necrogen Scudder=飛行 屍気を飛ばすものが戦場に出たとき、あなたは3点のライフを失う。 +Necropede=感染(このクリーチャーは、クリーチャーに-1/-1カウンターの形でダメージを与え、プレイヤーに毒カウンターの形でダメージを与える。) 屍百足が戦場からいずれかの墓地に置かれたとき、クリーチャー1体を対象とする。あなたはそれの上に-1/-1カウンターを1個置いてもよい。 +Necrotic Ooze=壊死のウーズが戦場に出ているかぎり、それはすべての墓地にあるすべてのクリーチャー・カードの起動型能力を持つ。 +Neurok Invisimancer=ニューロックの透術士はブロックされない。 ニューロックの透術士が戦場に出たとき、クリーチャー1体を対象とする。このターン、それはブロックされない。 +Neurok Replica=1U,ニューロックの模造品を生け贄に捧げる:クリーチャー1体を対象とし、それをオーナーの手札に戻す。 +Nihil Spellbomb=T,虚無の呪文爆弾を生け贄に捧げる:プレイヤー1人を対象とし、そのプレイヤーの墓地にあるすべてのカードを追放する。 虚無の呪文爆弾が戦場からいずれかの墓地に置かれたとき、あなたはBを支払ってもよい。 そうした場合、カードを1枚引く。 +Nim Deathmantle=装備しているクリーチャーは+2/+2の修整を受けるともに威嚇を持ち、黒のゾンビである。 トークンでないクリーチャーが1体戦場からあなたの墓地に置かれるたび、あなたは4を支払ってもよい。 そうした場合、そのカードを戦場に戻し、屍賊の死のマントをそれにつける。 装備4 +Ogre Geargrabber=オーガの装具奪いが攻撃するたび、いずれかの対戦相手がコントロールする装備品1つを対象とし、ターン終了時までそれのコントロールを得る。 それをオーガの装具奪いにつける。 あなたがその装備品のコントロールを失ったとき、それをはずす。 +Origin Spellbomb=1,T,起源の呪文爆弾を生け贄に捧げる:無色の1/1のマイア・アーティファクト・クリーチャー・トークンを1体戦場に出す。 起源の呪文爆弾が戦場からいずれかの墓地に置かれたとき、あなたはWを支払ってもよい。 そうした場合、カードを1枚引く。 +Oxidda Daredevil=アーティファクトを1つ生け贄に捧げる:オキシダの向こう見ずはターン終了時まで速攻を得る。 +Oxidda Scrapmelter=オキシダの屑鉄溶かしが戦場に出たとき、アーティファクト1つを対象とし、それを破壊する。 +Painful Quandary=いずれかの対戦相手が呪文を1つ唱えるたび、そのプレイヤーはカードを1枚捨てないかぎり5点のライフを失う。 +Painsmith=あなたがアーティファクト呪文を1つ唱えるたび、クリーチャー1体を対象とする。あなたは「それはターン終了時まで+2/+0の修整を受けるとともに接死を得る。」を選んでもよい。 +Palladium Myr=T:あなたのマナ・プールに2を加える。 +Panic Spellbomb=T,恐慌の呪文爆弾を生け贄に捧げる:クリーチャー1体を対象とする。このターン、それではブロックできない。 恐慌の呪文爆弾が戦場からいずれかの墓地に置かれたとき、あなたはRを支払ってもよい。 そうした場合、カードを1枚引く。 +Perilous Myr=危険なマイアが戦場からいずれかの墓地に置かれたとき、クリーチャー1体かプレイヤー1人を対象とする。危険なマイアはそれに2点のダメージを与える。 +Plague Stinger=飛行 感染(このクリーチャーは、クリーチャーに-1/-1カウンターの形でダメージを与え、プレイヤーに毒カウンターの形でダメージを与える。) Plated Seastrider= -Platinum Emperion=Ȃ̃Ct̑ʂ͕ωȂBiȂ̓Ct𓾂邱ƂƂłȂB Ȃ̓Ct0_ȊOxƂłȂBj -Precursor Golem=̃S[ɏoƂAF3/3̃S[EA[eBt@NgEN[`[Eg[N2̐ɏoB ꂩ̃vC[AS[1݂̂̂ΏۂƂACX^g\[T[1邽сÃvC[͂̎A̎Ώۂɂł鑼̊eS[1̂ɂ‚1Rs[B ꂼ̃Rs[́ÃS[̂ʁX̂̂ΏۂƂB -Prototype Portal=\i̔ɏoƂAȂ͂Ȃ̎DɂA[eBt@NgEJ[h1ǕĂ悢B wCsF̒ǕĂJ[h̃Rs[łg[N1ɏoB w͂̃J[h̓_Ō}iERXgɓB -Psychic Miasma=vC[1lΏۂƂB̃vC[̓J[h1̂ĂB ɂynJ[ĥĂꂽꍇA_ᏋCI[i[̎Dɖ߂B -Putrefax=gvAU ĩN[`[́AN[`[-1/-1JE^[̌`Ń_[W^AvC[ɓŃJE^[̌`Ń_[W^Bj IXebv̊JnɁA^b𐶂тɕB -Quicksilver Gargantuan=Ȃ́ũKK`A7/7̂܂܂ł邱ƂāAɏoĂ邢ꂩ̃N[`[̃Rs[ƂĐɏoBvIł悢B -Ratchet Bomb=sFQȅɒ~σJE^[1’uB sCQe𐶂тɕF_Ō}iERXgQȅɒuĂ~σJE^[̐ɓynłȂep[}lgj󂷂B +Platinum Emperion=あなたのライフの総量は変化しない。(あなたはライフを得ることも失うこともできない。 あなたはライフを0点以外支払うことができない。) +Precursor Golem=先駆のゴーレムが戦場に出たとき、無色の3/3のゴーレム・アーティファクト・クリーチャー・トークンを2体戦場に出す。 いずれかのプレイヤーが、ゴーレム1体のみを対象とする、インスタント呪文かソーサリー呪文を1つ唱えるたび、そのプレイヤーはその呪文を、その呪文が対象にできる他の各ゴーレム1体につき1回コピーする。 それぞれのコピーは、それらのゴーレムのうち別々のものを対象とする。 +Prototype Portal=刻印—試作品の扉が戦場に出たとき、あなたはあなたの手札にあるアーティファクト・カードを1枚追放してもよい。 X,T:その追放されているカードのコピーであるトークンを1つ戦場に出す。 Xはそのカードの点数で見たマナ・コストに等しい。 +Psychic Miasma=プレイヤー1人を対象とする。そのプレイヤーはカードを1枚捨てる。 これにより土地カードが捨てられた場合、精神の瘴気をオーナーの手札に戻す。 +Putrefax=トランプル、速攻 感染(このクリーチャーは、クリーチャーに-1/-1カウンターの形でダメージを与え、プレイヤーに毒カウンターの形でダメージを与える。) 終了ステップの開始時に、化膿獣を生け贄に捧げる。 +Quicksilver Gargantuan=あなたは「水銀のガルガンチュアンは7/7のままであることを除いて、戦場に出ているいずれかのクリーチャーのコピーとして戦場に出る。」を選んでもよい。 +Ratchet Bomb=T:漸増爆弾の上に蓄積カウンターを1個置く。 T,漸増爆弾を生け贄に捧げる:点数で見たマナ・コストが漸増爆弾の上に置かれていた蓄積カウンターの数に等しい土地でない各パーマネントを破壊する。 Razorfield Thresher= -Razor Hippogriff=s 䓁̃q|OtɏoƂAȂ̕nɂA[eBt@NgEJ[h1ΏۂƂAȂ̎Dɖ߂B Ȃ͂̃J[h̓_Ō}iERXgɓ_̃Ct𓾂B -Razorverge Thicket=ȂRg[Ă鑼̓yn3ˆȏł邩A䓁̖΂݂̓^bvԂŐɏoB sFȂ̃}iEv[ɂfvB -Relic Putrescence=G`giA[eBt@Ngj G`gĂA[eBt@Ng^bvԂɂȂ邽сÃRg[[͓ŃJE^[1“B -Revoke Existence=A[eBt@Ng1‚G`g1‚ΏۂƂAǕB -Riddlesmith=ȂA[eBt@Ng1邽сAȂ̓J[h1Ă悢BꍇAJ[h1̂ĂB -Rusted Relic=p\Kт́AȂ3ˆȏ̃A[eBt@NgRg[Ă邩5/5̃S[EA[eBt@NgEN[`[łB -Rust Tick=Ȃ́AȂ̃A^bvEXebvɎK_jA^bvȂƂIł悢B PCsFA[eBt@Ng1‚ΏۂƂA^bvB ͎K_j^bvԂł葱邩ÃRg[[̃A^bvEXebvɃA^bvȂB -Saberclaw Golem=qF܂̃S[̓^[I܂Ő搧U𓾂B -Salvage Scout=vC̐ˌ𐶂тɕFȂ̕nɂA[eBt@NgEJ[h1ΏۂƂAȂ̎Dɖ߂B +Razor Hippogriff=飛行 剃刀のヒポグリフが戦場に出たとき、あなたの墓地にあるアーティファクト・カード1枚を対象とし、それをあなたの手札に戻す。 あなたはそのカードの点数で見たマナ・コストに等しい点数のライフを得る。 +Razorverge Thicket=あなたがコントロールしている他の土地が3つ以上であるかぎり、剃刀境の茂みはタップ状態で戦場に出る。 T:あなたのマナ・プールにGかWを加える。 +Relic Putrescence=エンチャント(アーティファクト) エンチャントされているアーティファクトがタップ状態になるたび、それのコントローラーは毒カウンターを1個得る。 +Revoke Existence=アーティファクト1つかエンチャント1つを対象とし、それを追放する。 +Riddlesmith=あなたがアーティファクト呪文を1つ唱えるたび、あなたはカードを1枚引いてもよい。そうした場合、カードを1枚捨てる。 +Rusted Relic=金属術—錆びた秘宝は、あなたが3つ以上のアーティファクトをコントロールしているかぎり5/5のゴーレム・アーティファクト・クリーチャーである。 +Rust Tick=あなたは、あなたのアンタップ・ステップに錆ダニをアンタップしないことを選んでもよい。 1,T:アーティファクト1つを対象とし、それをタップする。 それは錆ダニがタップ状態であり続けるかぎり、それのコントローラーのアンタップ・ステップにアンタップしない。 +Saberclaw Golem=R:剣爪のゴーレムはターン終了時まで先制攻撃を得る。 +Salvage Scout=W,回収の斥候を生け贄に捧げる:あなたの墓地にあるアーティファクト・カード1枚を対象とし、それをあなたの手札に戻す。 Scoria Elemental= -Scrapdiver Serpent=S̊Cւ́AhvC[A[eBt@NgRg[Ă邩ubNȂB -Screeching Silcaw=s p\؂萺̃VJEꂩ̃vC[ɐ퓬_[W^邽сAȂ3ˆȏ̃A[eBt@NgRg[ĂꍇÃvC[͎̃Cu[̈ԏォ4̃J[h̕nɒuB -Seachrome Coast=ȂRg[Ă鑼̓yn3ˆȏł邩AC݂̉̓^bvԂŐɏoB sFȂ̃}iEv[ɂvtB -Seize the Initiative=N[`[1̂ΏۂƂB̓^[I܂+1/+1̏C󂯂ƂƂɐ搧U𓾂B -Semblance Anvil=\ގ̋ɏoƂAȂ͂Ȃ̎DɂynłȂJ[h1ǕĂ悢B Ȃ̒ǕĂJ[hƋʂ̃J[hE^CvŽ邽߂̃RXg͂QȂȂB -Shape Anew=A[eBt@Ng1‚ΏۂƂB̃Rg[[͂𐶂тɕB̃vC[́ÃCu[̃J[hԏォAA[eBt@NgEJ[hJ܂ŌJB ̃vC[͂̃J[hɏoǍAɂJꂽׂ̂ẴJ[h̃Cu[ɉĐ؂蒼B -Shatter=A[eBt@Ng1‚ΏۂƂAj󂷂B -Silver Myr=sFȂ̃}iEv[ɂtB -Skinrender=􂫂ɏoƂAN[`[1̂ΏۂƂȀ-1/-1JE^[3’uB -Skithiryx, the Blight Dragon=s ĩN[`[́AN[`[-1/-1JE^[̌`Ń_[W^AvC[ɓŃJE^[̌`Ń_[W^Bj aFrp̃hSAXLWNX̓^[I܂őU𓾂B aaFrp̃hSAXLWNXĐB -Sky-Eel School=s 󒷋̌QꂪɏoƂAJ[h1ǍJ[h1̂ĂB -Slice in Twain=A[eBt@Ng1‚G`g1‚ΏۂƂAj󂷂B J[h1B -Snapsail Glider=p\Ƃߏ̊҂́AȂ3ˆȏ̃A[eBt@NgRg[Ă邩s B -Soliton=tF\gA^bvB -Soul Parry=N[`[1̂2̑ΏۂƂB̃^[A炩^邷ׂẴ_[WyB -Spikeshot Elder=PqqFN[`[1̂vC[1lΏۂƂBgQ̌ØV͂ɁAg̃p[ɓ_̃_[W^B -Steady Progress=BsBiȂ̓JE^[̒uĂp[}lgvC[]ސIсǍセꂼɁȀɂłɒuĂJE^[̂1ނ1’uBj J[h1B -Steel Hellkite=s QF|̃wJCg̓^[I܂+1/+0̏C󂯂B wF̃^[A|̃wJCgɐ퓬_[W^ꂽvC[Rg[_Ō}iERXgw̓ynłȂep[}lgj󂷂B ̔\͂́A^[1̂݋NłB -Stoic Rebuttal=p\Ȃ3ˆȏ̃A[eBt@NgRg[ĂꍇAÂȔ_邽߂̃RXg͂PȂȂB 1‚ΏۂƂAłB -Strata Scythe=\nẘɏoƂAȂ͂Ȃ̃Cu[ynJ[h1TAǕǍ゠Ȃ̃Cu[؂蒼B ĂN[`[́A̒ǕĂJ[hƓOɏoĂyn1‚ɂ‚+1/+1̏C󂯂B R -Strider Harness=ĂN[`[+1/+1̏C󂯂ƂƂɑUB P -Sunblast Angel=s zj̓VgɏoƂAׂẴ^bvԂ̃N[`[j󂷂B -Sunspear Shikari=z̑̃VJ[Ă邩A͐搧UJB -Sword of Body and Mind=ĂN[`[́A+2/+2̏C󂯂ƂƂɃveNVi΁j ƃveNVij B ĂN[`[ꂩ̃vC[ɐ퓬_[W^邽сAȂ͗΂2/2̘TEN[`[Eg[N1̐ɏoÃvC[͎̃Cu[̈ԏォ10̃J[h̃vC[̕nɒuB Q -Sylvok Lifestaff=ĂN[`[+1/+0̏C󂯂B ĂN[`[ꂩ̕nɒu邽сAȂ3_̃Ct𓾂B P -Sylvok Replica=fCVHN̖͑i𐶂тɕFA[eBt@Ng1‚G`g1‚ΏۂƂAj󂷂B -Tainted Strike=N[`[1̂ΏۂƂB̓^[I܂+1/+0̏C󂯂ƂƂɊ𓾂BĩN[`[́AN[`[-1/-1JE^[̌`Ń_[W^AvC[ɓŃJE^[̌`Ń_[W^Bj -Tangle Angler=ĩN[`[́AN[`[-1/-1JE^[̌`Ń_[W^AvC[ɓŃJE^[̌`Ń_[W^Bj fFN[`[1̂ΏۂƂB̃^[A͉”\Ȃ痍ݐX߂ubNB -Tel-Jilad Defiance=N[`[1̂ΏۂƂB̓^[I܂ŃveNViA[eBt@Ngj 𓾂B J[h1B -Tel-Jilad Fallen=veNViA[eBt@Ngj ĩN[`[́AN[`[-1/-1JE^[̌`Ń_[W^AvC[ɓŃJE^[̌`Ń_[W^Bj -Tempered Steel=ȂRg[A[eBt@NgEN[`[+2/+2̏C󂯂B -Throne of Geth=sCA[eBt@Ng1тɕFBsBiȂ̓JE^[̒uĂp[}lgvC[]ސIсǍセꂼɁȀɂłɒuĂJE^[̂1ނ1’uBj -Thrummingbird=s ‚炵ꂩ̃vC[ɐ퓬_[W^邽сABsBiȂ̓JE^[̒uĂp[}lgvC[]ސIсǍセꂼɁȀɂłɒuĂJE^[̂1ނ1’uBj -Tower of Calamities=WCsFN[`[1̂ΏۂƂBГ̓͂12_̃_[W^B -Trigon of Corruption=—̎Op아́A~σJE^[3’uꂽԂŐɏoB aaCsF—̎Op아̏ɒ~σJE^[1’uB QCsC—̎Op아~σJE^[1Ž菜FN[`[1̂ΏۂƂȀ-1/-1JE^[1’uB -Trigon of Infestation=̎Op아́A~σJE^[3’uꂽԂŐɏoB ffCsF̎Op아̏ɒ~σJE^[1’uB QCsC̎Op아~σJE^[1Ž菜F—΂1/1̍EN[`[Eg[N1̐ɏoB -Trigon of Mending=񕜂̎Op아́A~σJE^[3’uꂽԂŐɏoB vvCsF񕜂̎Op아̏ɒ~σJE^[1’uB QCsC񕜂̎Op아~σJE^[1Ž菜FvC[1lΏۂƂB̃vC[3_̃Ct𓾂B -Trigon of Rage={̎Op아́A~σJE^[3’uꂽԂŐɏoB qqCsF{̎Op아̏ɒ~σJE^[1’uB QCsC{̎Opł~σJE^[1Ž菜FN[`[1̂ΏۂƂB̓^[I܂+3/+0̏C󂯂B -Trigon of Thought=vl̎Op아́A~σJE^[3’uꂽԂŐɏoB ttCsFvl̎Op아̏ɒ~σJE^[1’uB QCsCvl̎Op아~σJE^[1Ž菜FJ[h1B -Trinket Mage=e΂̖mɏoƂAȂ͎̃Cu[_Ō}iERXg1ȉ̃A[eBt@NgEJ[h1TAJĂȂ̎DɉĂ悢B ꍇAȂ̃Cu[؂蒼B -True Conviction=ȂRg[N[`[͓iUJB -Tumble Magnet=]|̎΂́A~σJE^[3’uꂽԂŐɏoB sC]|̎΂~σJE^[1Ž菜FA[eBt@Ng1‚N[`[1̂ΏۂƂA^bvB -Tunnel Ignus=yn1‚ꂩ̑ΐ푊̃Rg[Őɏo邽сÃ^[̃vC[̓yñRg[ŐɏoĂꍇAgl̃COiX͂̃vC[3_̃_[W^B -Turn Aside=ȂRg[p[}lgΏۂƂ1‚ΏۂƂAłB -Turn to Slag=N[`[1̂ΏۂƂB͂5_̃_[W^B ɂ‚Ă邷ׂĂ̑ij󂷂B -Twisted Image=N[`[1̂ΏۂƂB^[I܂ŁÃp[ƃ^tlXւB J[h1B -Untamed Might=N[`[1̂ΏۂƂB̓^[I܂+w/+w̏C󂯂B -Vault Skyward=N[`[1̂ΏۂƂB̓^[I܂Ŕs 𓾂B A^bvB -Vector Asp=aF}̃AXv́A^[I܂Ŋ𓾂Bi̓N[`[-1/-1JE^[̌`Ń_[W^AvC[ɓŃJE^[̌`Ń_[W^Bj -Vedalken Certarch=sFA[eBt@Ng1‚N[`[1̂yn1‚ΏۂƂA^bvB ̔\͂́AȂ3ˆȏ̃A[eBt@NgRg[Ăꍇɂ̂݋NłB -Venser's Journal=Ȃ̎D̏͂ȂȂB Ȃ̃AbvL[v̊JnɁAȂ͂Ȃ̎D̃J[h1ɂ‚1_̃Ct𓾂B -Venser, the Sojourner=+2F ȂI[i[łp[}lg1‚ΏۂƂAǕB ̏IXebv̊JnɁAȂ̃Rg[Őɖ߂B -1F ̃^[AN[`[̓ubNȂB -8F Ȃ́uȂ1邽сAp[}lg1‚ΏۂƂAǕBv–͂𓾂B -Vigil for the Lost=ȂRg[N[`[1̐ꂩ炢ꂩ̕nɒu邽сAȂ͂wxĂ悢B ꍇAȂ͂w_̃Ct𓾂B -Viridian Revel=A[eBt@Ng1ꂩ炢ꂩ̑ΐ푊̕nɒu邽сAȂ̓J[h1Ă悢B -Volition Reins=G`gip[}lgj f̎jɏoƂAꂪG`gĂp[}lg^bvԂ̏ꍇAA^bvB Ȃ̓G`gĂp[}lgRg[B -Vulshok Heartstoker=@VN̐SɏoƂAN[`[1̂ΏۂƂB̓^[I܂+2/+0̏C󂯂B -Vulshok Replica=PqC@VN̖͑i𐶂тɕFvC[1lΏۂƂB@VN̖͑i͂̃vC[3_̃_[W^B -Wall of Tanglecord=hq fFݐ̕ǂ̓^[I܂œB𓾂Bi͔s ƒN[`[ubNłBj -Whitesun's Passage=Ȃ5_̃Ct𓾂B -Wing Puncture=ȂRg[N[`[1̂ƁAs ƒN[`[1̂ΏۂƂB̑O҂͂̌҂ɁAg̃p[ɓ_̃_[W^B -Withstand Death=N[`[1̂ΏۂƂB̃^[A͔j󂳂ȂBiv_[W"j󂷂"ʂł͔͂j󂳂ȂB ̃^tlX0ȉłꍇ́A̓I[i[̕nɒuBj -Wurmcoil Engine=ڎAJ [ƂGWꂩ炢ꂩ̕nɒuꂽƂAڎ–F3/3̃[EA[eBt@NgEN[`[Eg[N1̂ƁAJ–F3/3̃[EA[eBt@NgEN[`[Eg[N1̐ɏoB +Scrapdiver Serpent=屑鉄潜りの海蛇は、防御プレイヤーがアーティファクトをコントロールしているかぎりブロックされない。 +Screeching Silcaw=飛行 金属術—金切り声のシルカウがいずれかのプレイヤーに戦闘ダメージを与えるたび、あなたが3つ以上のアーティファクトをコントロールしている場合、そのプレイヤーは自分のライブラリーの一番上から4枚のカードを自分の墓地に置く。 +Seachrome Coast=あなたがコントロールしている他の土地が3つ以上であるかぎり、金属海の沿岸はタップ状態で戦場に出る。 T:あなたのマナ・プールにWかUを加える。 +Seize the Initiative=クリーチャー1体を対象とする。それはターン終了時まで+1/+1の修整を受けるとともに先制攻撃を得る。 +Semblance Anvil=刻印—類似の金床が戦場に出たとき、あなたはあなたの手札にある土地でないカードを1枚追放してもよい。 あなたがその追放されているカードと共通のカード・タイプを持つ呪文を唱えるためのコストは2少なくなる。 +Shape Anew=アーティファクト1つを対象とする。それのコントローラーはそれを生け贄に捧げる。そのプレイヤーは、自分のライブラリーのカードを一番上から、アーティファクト・カードが公開されるまで公開し続ける。 そのプレイヤーはそのカードを戦場に出し、その後、これにより公開された他のすべてのカードを自分のライブラリーに加えて切り直す。 +Shatter=アーティファクト1つを対象とし、それを破壊する。 +Silver Myr=T:あなたのマナ・プールにUを加える。 +Skinrender=皮裂きが戦場に出たとき、クリーチャー1体を対象とし、それの上に-1/-1カウンターを3個置く。 +Skithiryx, the Blight Dragon=飛行 感染(このクリーチャーは、クリーチャーに-1/-1カウンターの形でダメージを与え、プレイヤーに毒カウンターの形でダメージを与える。) B:荒廃のドラゴン、スキジリクスはターン終了時まで速攻を得る。 BB:荒廃のドラゴン、スキジリクスを再生する。 +Sky-Eel School=飛行 空長魚の群れが戦場に出たとき、カードを1枚引き、その後カードを1枚捨てる。 +Slice in Twain=アーティファクト1つかエンチャント1つを対象とし、それを破壊する。 カードを1枚引く。 +Snapsail Glider=金属術—嵌め乗りの滑空者は、あなたが3つ以上のアーティファクトをコントロールしているかぎり飛行 を持つ。 +Soliton=U:ソリトンをアンタップする。 +Soul Parry=クリーチャーを1体か2体対象とする。このターン、それらから与えられるすべてのダメージを軽減する。 +Spikeshot Elder=1RR:クリーチャー1体かプレイヤー1人を対象とする。トゲ撃ちの古老はそれに、自身のパワーに等しい点数のダメージを与える。 +Steady Progress=増殖を行う。(あなたはカウンターの置かれているパーマネントやプレイヤーを望む数だけ選び、その後それぞれに、その上にすでに置かれているカウンターのうち1種類を1個置く。) カードを1枚引く。 +Steel Hellkite=飛行 2:鋼のヘルカイトはターン終了時まで+1/+0の修整を受ける。 X:このターン、鋼のヘルカイトに戦闘ダメージを与えられたプレイヤーがコントロールする点数で見たマナ・コストがXの土地でない各パーマネントを破壊する。 この能力は、毎ターン1回のみ起動できる。 +Stoic Rebuttal=金属術—あなたが3つ以上のアーティファクトをコントロールしている場合、冷静な反論を唱えるためのコストは1少なくなる。 呪文1つを対象とし、それを打ち消す。 +Strata Scythe=刻印—地層の鎌が戦場に出たとき、あなたはあなたのライブラリーから土地カードを1枚探し、それを追放し、その後あなたのライブラリーを切り直す。 装備しているクリーチャーは、その追放されているカードと同じ名前を持つ戦場に出ている土地1つにつき+1/+1の修整を受ける。 装備3 +Strider Harness=装備しているクリーチャーは+1/+1の修整を受けるとともに速攻を持つ。 装備1 +Sunblast Angel=飛行 太陽破の天使が戦場に出たとき、すべてのタップ状態のクリーチャーを破壊する。 +Sunspear Shikari=太陽の槍のシカールが装備しているかぎり、それは先制攻撃と絆魂を持つ。 +Sword of Body and Mind=装備しているクリーチャーは、+2/+2の修整を受けるとともにプロテクション(緑) とプロテクション(青) を持つ。 装備しているクリーチャーがいずれかのプレイヤーに戦闘ダメージを与えるたび、あなたは緑の2/2の狼・クリーチャー・トークンを1体戦場に出し、そのプレイヤーは自分のライブラリーの一番上から10枚のカードをそのプレイヤーの墓地に置く。 装備2 +Sylvok Lifestaff=装備しているクリーチャーは+1/+0の修整を受ける。 装備しているクリーチャーがいずれかの墓地に置かれるたび、あなたは3点のライフを得る。 装備1 +Sylvok Replica=G,シルヴォクの模造品を生け贄に捧げる:アーティファクト1つかエンチャント1つを対象とし、それを破壊する。 +Tainted Strike=クリーチャー1体を対象とする。それはターン終了時まで+1/+0の修整を受けるとともに感染を得る。(このクリーチャーは、クリーチャーに-1/-1カウンターの形でダメージを与え、プレイヤーに毒カウンターの形でダメージを与える。) +Tangle Angler=感染(このクリーチャーは、クリーチャーに-1/-1カウンターの形でダメージを与え、プレイヤーに毒カウンターの形でダメージを与える。) G:クリーチャー1体を対象とする。このターン、それは可能なら絡み森の鮟鱇をブロックする。 +Tel-Jilad Defiance=クリーチャー1体を対象とする。それはターン終了時までプロテクション(アーティファクト) を得る。 カードを1枚引く。 +Tel-Jilad Fallen=プロテクション(アーティファクト) 感染(このクリーチャーは、クリーチャーに-1/-1カウンターの形でダメージを与え、プレイヤーに毒カウンターの形でダメージを与える。) +Tempered Steel=あなたがコントロールするアーティファクト・クリーチャーは+2/+2の修整を受ける。 +Throne of Geth=T,アーティファクトを1つ生け贄に捧げる:増殖を行う。(あなたはカウンターの置かれているパーマネントやプレイヤーを望む数だけ選び、その後それぞれに、その上にすでに置かれているカウンターのうち1種類を1個置く。) +Thrummingbird=飛行 かき鳴らし鳥がいずれかのプレイヤーに戦闘ダメージを与えるたび、増殖を行う。(あなたはカウンターの置かれているパーマネントやプレイヤーを望む数だけ選び、その後それぞれに、その上にすでに置かれているカウンターのうち1種類を1個置く。) +Tower of Calamities=8,T:クリーチャー1体を対象とする。災難の塔はそれに12点のダメージを与える。 +Trigon of Corruption=堕落の三角護符は、蓄積カウンターが3個置かれた状態で戦場に出る。 BB,T:堕落の三角護符の上に蓄積カウンターを1個置く。 2,T,堕落の三角護符から蓄積カウンターを1個取り除く:クリーチャー1体を対象とし、それの上に-1/-1カウンターを1個置く。 +Trigon of Infestation=感染の三角護符は、蓄積カウンターが3個置かれた状態で戦場に出る。 GG,T:感染の三角護符の上に蓄積カウンターを1個置く。 2,T,感染の三角護符から蓄積カウンターを1個取り除く:感染を持つ緑の1/1の昆虫・クリーチャー・トークンを1体戦場に出す。 +Trigon of Mending=回復の三角護符は、蓄積カウンターが3個置かれた状態で戦場に出る。 WW,T:回復の三角護符の上に蓄積カウンターを1個置く。 2,T,回復の三角護符から蓄積カウンターを1個取り除く:プレイヤー1人を対象とする。そのプレイヤーは3点のライフを得る。 +Trigon of Rage=憤怒の三角護符は、蓄積カウンターが3個置かれた状態で戦場に出る。 RR,T:憤怒の三角護符の上に蓄積カウンターを1個置く。 2,T,憤怒の三角版から蓄積カウンターを1個取り除く:クリーチャー1体を対象とする。それはターン終了時まで+3/+0の修整を受ける。 +Trigon of Thought=思考の三角護符は、蓄積カウンターが3個置かれた状態で戦場に出る。 UU,T:思考の三角護符の上に蓄積カウンターを1個置く。 2,T,思考の三角護符から蓄積カウンターを1個取り除く:カードを1枚引く。 +Trinket Mage=粗石の魔道士が戦場に出たとき、あなたは自分のライブラリーから点数で見たマナ・コストが1以下のアーティファクト・カードを1枚探し、公開してあなたの手札に加えてもよい。 そうした場合、あなたのライブラリーを切り直す。 +True Conviction=あなたがコントロールするクリーチャーは二段攻撃と絆魂を持つ。 +Tumble Magnet=転倒の磁石は、蓄積カウンターが3個置かれた状態で戦場に出る。 T,転倒の磁石から蓄積カウンターを1個取り除く:アーティファクト1つかクリーチャー1体を対象とし、それをタップする。 +Tunnel Ignus=土地が1ついずれかの対戦相手のコントロール下で戦場に出るたび、このターンそのプレイヤーが他の土地を自分のコントロール下で戦場に出していた場合、トンネルのイグナスはそのプレイヤーに3点のダメージを与える。 +Turn Aside=あなたがコントロールするパーマネントを対象とする呪文1つを対象とし、それを打ち消す。 +Turn to Slag=クリーチャー1体を対象とする。金屑化はそれに5点のダメージを与える。 それにつけられているすべての装備品を破壊する。 +Twisted Image=クリーチャー1体を対象とする。ターン終了時まで、それのパワーとタフネスを入れ替える。 カードを1枚引く。 +Untamed Might=クリーチャー1体を対象とする。それはターン終了時まで+X/+Xの修整を受ける。 +Vault Skyward=クリーチャー1体を対象とする。それはターン終了時まで飛行 を得る。 それをアンタップする。 +Vector Asp=B:媒介のアスプは、ターン終了時まで感染を得る。(それはクリーチャーに-1/-1カウンターの形でダメージを与え、プレイヤーに毒カウンターの形でダメージを与える。) +Vedalken Certarch=T:アーティファクト1つかクリーチャー1体か土地1つを対象とし、それをタップする。 この能力は、あなたが3つ以上のアーティファクトをコントロールしている場合にのみ起動できる。 +Venser's Journal=あなたの手札の上限はなくなる。 あなたのアップキープの開始時に、あなたはあなたの手札のカード1枚につき1点のライフを得る。 +Venser, the Sojourner=+2: あなたがオーナーであるパーマネント1つを対象とし、それを追放する。 次の終了ステップの開始時に、それをあなたのコントロール下で戦場に戻す。 -1: このターン、クリーチャーはブロックされない。 -8: あなたは「あなたが呪文を1つ唱えるたび、パーマネント1つを対象とし、それを追放する。」を持つ紋章を得る。 +Vigil for the Lost=あなたコントロールするクリーチャーが1体戦場からいずれかの墓地に置かれるたび、あなたはXを支払ってもよい。 そうした場合、あなたはX点のライフを得る。 +Viridian Revel=アーティファクトが1つ戦場からいずれかの対戦相手の墓地に置かれるたび、あなたはカードを1枚引いてもよい。 +Volition Reins=エンチャント(パーマネント) 決断の手綱が戦場に出たとき、それがエンチャントされているパーマネントがタップ状態の場合、アンタップする。 あなたはエンチャントされているパーマネントをコントロールする。 +Vulshok Heartstoker=ヴァルショクの心臓焚きが戦場に出たとき、クリーチャー1体を対象とする。それはターン終了時まで+2/+0の修整を受ける。 +Vulshok Replica=1R,ヴァルショクの模造品を生け贄に捧げる:プレイヤー1人を対象とする。ヴァルショクの模造品はそのプレイヤーに3点のダメージを与える。 +Wall of Tanglecord=防衛 G:絡み線の壁はターン終了時まで到達を得る。(それは飛行 を持つクリーチャーをブロックできる。) +Whitesun's Passage=あなたは5点のライフを得る。 +Wing Puncture=あなたがコントロールするクリーチャー1体と、飛行 を持つクリーチャー1体を対象とする。その前者はその後者に、自身のパワーに等しい点数のダメージを与える。 +Withstand Death=クリーチャー1体を対象とする。このターン、それは破壊されない。(致死ダメージや"破壊する"効果ではそれは破壊されない。 それのタフネスが0以下である場合は、それはオーナーの墓地に置かれる。) +Wurmcoil Engine=接死、絆魂 ワームとぐろエンジンが戦場からいずれかの墓地に置かれたとき、接死を持つ無色の3/3のワーム・アーティファクト・クリーチャー・トークンを1体と、絆魂を持つ無色の3/3のワーム・アーティファクト・クリーチャー・トークンを1体戦場に出す。 diff --git a/projects/mtg/include/WFont.h b/projects/mtg/include/WFont.h index ad1fe5e1c..46400dad0 100644 --- a/projects/mtg/include/WFont.h +++ b/projects/mtg/include/WFont.h @@ -18,7 +18,7 @@ namespace Fonts }; // when using gbk languages and we need to keep around single byte font variants, - // the single byte fonts will be offset by this value + // the single byte fonts will be offset by this value const unsigned int kSingleByteFontOffset = 100; } @@ -75,27 +75,29 @@ class WFBFont : public WFont { public: WFBFont(int inFontID, const char *fontname, int lineheight, bool useVideoRAM=false); + WFBFont(int inFontID) : WFont(inFontID) {}; // Legacy : remove it when possible ~WFBFont(); - void DrawString(const char *s, float x, float y, int align=JGETEXT_LEFT, float leftOffset = 0, float width = 0); void DrawString(std::string s, float x, float y, int align=JGETEXT_LEFT, float leftOffset = 0, float width = 0); void SetColor(PIXEL_TYPE color); PIXEL_TYPE GetColor() const {return mColor0;}; void SetScale(float scale); float GetScale() const; float GetHeight() const; - float GetStringWidth(const char *s) const; + virtual float GetStringWidth(const char *s) const; void SetTracking(float tracking) {}; void SetBase(int base) {}; - virtual int GetCode(const u8 *ch, bool *dualByteFont) const = 0; + virtual void DrawString(const char *s, float x, float y, int align=JGETEXT_LEFT, float leftOffset = 0, float width = 0); + virtual int GetCode(const u8 *ch, int *charLength) const = 0; virtual int GetMana(const u8 *ch) const = 0; -private: - static JRenderer * mRenderer; + protected: + static JRenderer* mRenderer; - u8 * mEngFont; - u8 * mChnFont; + u16* mIndex; + u8* mStdFont; + u8* mExtraFont; PIXEL_TYPE mColor0; PIXEL_TYPE mColor; @@ -116,26 +118,28 @@ private: u32 * mCharBuffer; - int PreCacheChar(const u8 *ch); + virtual int PreCacheChar(const u8 *ch); }; class WGBKFont : public WFBFont { public: - WGBKFont(int inFontID, const char *fontname, int lineheight, bool useVideoRAM=false) - : WFBFont(inFontID, fontname, lineheight, useVideoRAM) {}; + WGBKFont(int inFontID, const char *fontname, int lineheight, bool useVideoRAM = false); - int GetCode(const u8 *ch, bool *dualByteFont) const; + int PreCacheChar(const u8 *ch); + float GetStringWidth(const char *s) const; + void DrawString(const char *s, float x, float y, int align=JGETEXT_LEFT, float leftOffset = 0, float width = 0); + int GetCode(const u8 *ch, int *charLength) const; int GetMana(const u8 *ch) const; }; -class WSJISFont : public WFBFont +class WUFont : public WFBFont { public: - WSJISFont(int inFontID, const char *fontname, int lineheight, bool useVideoRAM=false) + WUFont(int inFontID, const char *fontname, int lineheight, bool useVideoRAM = false) : WFBFont(inFontID, fontname, lineheight, useVideoRAM) {}; - int GetCode(const u8 *ch, bool *dualByteFont) const; + int GetCode(const u8 *ch, int *charLength) const; int GetMana(const u8 *ch) const; }; diff --git a/projects/mtg/src/CardPrimitive.cpp b/projects/mtg/src/CardPrimitive.cpp index 7cdd68304..310a06c31 100644 --- a/projects/mtg/src/CardPrimitive.cpp +++ b/projects/mtg/src/CardPrimitive.cpp @@ -57,9 +57,7 @@ const vector& CardPrimitive::formattedText() { std::string s = text; std::string::size_type found = s.find_first_of("{}"); - // XXX: neofonts don't use {} for mana cost because some Shift-JIS character's - // second byte equals to the value of '{' or '}'. - while (!neofont && found!=string::npos) + while (found!=string::npos) { s[found] = '/'; found = s.find_first_of("{}", found + 1); @@ -74,7 +72,7 @@ const vector& CardPrimitive::formattedText() u8 * src = (u8 *)s.c_str(); if (neofont) { len = 0; - std::string::size_type limit = 24; + std::string::size_type limit = 24; while (*src != 0) { if (*src > 0x80) { // Non-ASCII if (len + 2 > limit && !(((*src & 0xF0) == 0xA0) && ((*(src+1) & 0xF0) == 0xA0))) break; diff --git a/projects/mtg/src/Translate.cpp b/projects/mtg/src/Translate.cpp index fa3fa59cd..b94cdea06 100644 --- a/projects/mtg/src/Translate.cpp +++ b/projects/mtg/src/Translate.cpp @@ -139,7 +139,7 @@ void Translator::init() { string name = JGE_GET_RES("lang/") + lang + ".txt"; if (fileExists(name.c_str())){ - // fixup for Chinese language support. + // fixup for multibyte support. std::transform(lang.begin(), lang.end(), lang.begin(), ::tolower); if (lang.compare("cn") == 0 || lang.compare("jp") == 0) neofont = true; @@ -151,7 +151,6 @@ void Translator::init() { initCards(); initDecks(); - } string _(string toTranslate){ diff --git a/projects/mtg/src/WFont.cpp b/projects/mtg/src/WFont.cpp index acd8b8561..d17d45c67 100644 --- a/projects/mtg/src/WFont.cpp +++ b/projects/mtg/src/WFont.cpp @@ -1,611 +1,1012 @@ -#include "PrecompiledHeader.h" - -#include "WFont.h" -#include "WResourceManager.h" -#include "JFileSystem.h" - -#define ISGBK(c) ((c) > 0x80 || (c) < 0x30 || (c) == '-' || (c) == '/') - -static PIXEL_TYPE gencolor(int id, PIXEL_TYPE color) -{ - unsigned int a, r, g, b, r0, g0, b0; -#if defined (WIN32) || defined (LINUX) - a = (color >> 24) & 0xFF; - r = (color >> 16) & 0xFF; - g = (color >> 8) & 0xFF; - b = (color >> 0) & 0xFF; -#else // PSP -# if defined (ABGR8888) - a = (color >> 24) & 0xFF; - b = (color >> 16) & 0xFF; - g = (color >> 8) & 0xFF; - r = (color >> 0) & 0xFF; -# elif defined (ABGR5551) - a = ((color >> 15) & 0x01) << 7; - b = ((color >> 10) & 0x1F) << 3; - g = ((color >> 5) & 0x1F) << 3; - r = ((color >> 0) & 0x1F) << 3; -# elif defined (ABGR4444) - a = ((color >> 12) & 0x0F) << 4; - b = ((color >> 8) & 0x0F) << 4; - g = ((color >> 4) & 0x0F) << 4; - r = ((color >> 0) & 0x0F) << 4; -# endif -#endif - r0 = g0 = b0 = 255; - - switch (id) { - case Fonts::MAIN_FONT: // simon 245, 228, 156 - r0 = 245; g0 = 228; b0 = 156; - break; - case Fonts::MENU_FONT: // f3 255, 252, 175 - r0 = 255; g0 = 252; b0 = 175; - break; - case Fonts::MAGIC_FONT: // magic 219, 255, 151 - r0 = 219; g0 = 255; b0 = 151; - break; - case Fonts::SMALLFACE_FONT: // smallface 255, 255, 255 - r0 = 255; g0 = 255; b0 = 255; - break; - default: - ; - } - r = r * r0 / 255; - g = g * g0 / 255; - b = b * b0 / 255; - - return ARGB(a,r,g,b); -} - -// - -JRenderer * WFBFont::mRenderer = NULL; - -WLBFont::WLBFont(int inFontID, const char *fontname, int lineheight, bool useVideoRAM) - : WFont(inFontID) -{ - string path(fontname); - if (path.size() > 4 ) path = path.substr(0, path.size() - 4); //some stupid manipulation because of the way Font works in JGE - it = NEW JLBFont(path.c_str(), lineheight, useVideoRAM); -} - -WFBFont::WFBFont(int inFontID, const char *fontname, int lineheight, bool useVideoRAM) - : WFont(inFontID) -{ - mRenderer = JRenderer::GetInstance(); - - mCharBuffer = NULL; - mSprites = NULL; - mGBCode = NULL; - mCurr = 0; - - char tmpFileName[32], engFileName[32]; - strcpy(tmpFileName, fontname); - char * ep = strrchr(tmpFileName, '.'); - *ep = '\0'; - sprintf(engFileName, "%s.asc", tmpFileName); - JFileSystem *fileSys = JFileSystem::GetInstance(); - int size = 0; - - if (!fileSys->OpenFile(fontname)) - return; - size = fileSys->GetFileSize(); - mChnFont = NEW u8[size]; - fileSys->ReadFile(mChnFont, size); - fileSys->CloseFile(); - - if (!fileSys->OpenFile(engFileName)) - return; - size = fileSys->GetFileSize(); - mEngFont = NEW u8[size]; - fileSys->ReadFile(mEngFont, size); - fileSys->CloseFile(); - - mColor0 = ARGB(255, 255, 255, 255); - mColor = mColor0; - mFontSize = lineheight; - mScale = 1.0f; - - // using 4-bit(half-byte) to store 1 pixel - mBytesPerRow = static_cast(mFontSize / 2); - mBytesPerChar = static_cast(mBytesPerRow*mFontSize); - - mCacheImageWidth = 256; - mCacheImageHeight = 256; - mCol = mCacheImageWidth / mFontSize; - mRow = mCacheImageHeight / mFontSize; - mCacheSize = mCol * mRow; - - mSprites = NEW JQuad*[mCacheSize]; - mGBCode = NEW int[mCacheSize]; - -#if defined (WIN32) || defined (LINUX) - mCharBuffer = NEW u32[mFontSize*mFontSize]; -#endif - - mTexture = mRenderer->CreateTexture(mCacheImageWidth, mCacheImageHeight, true); - - int index = 0; - for (int y = 0; y < mRow; y++) { - for (int x = 0; x(x*mFontSize), - static_cast(y*mFontSize), - static_cast(mFontSize), - static_cast(mFontSize)); - mSprites[index]->SetHotSpot(static_cast(mFontSize / 2), static_cast(mFontSize / 2)); - index++; - } - } -} - -WFBFont::~WFBFont() -{ - SAFE_DELETE(mEngFont); - SAFE_DELETE(mChnFont); - SAFE_DELETE(mTexture); - - if (mSprites) { - for (int i = 0; i < mCacheSize; i++) { - if (mSprites[i]) - delete mSprites[i]; - } - delete [] mSprites; - } - - if (mGBCode) - delete [] mGBCode; - - if (mCharBuffer) - delete [] mCharBuffer; -} - -#if defined (WIN32) || defined (LINUX) -#else -static void SwizzlePlot(u8* out, PIXEL_TYPE color, int i, int j, unsigned int width) -{ - unsigned int rowblocks = (width >> 4); - - unsigned int blockx = (i >> 4); - unsigned int blocky = (j >> 3); - - unsigned int x = (i - (blockx << 4)); - unsigned int y = (j - (blocky << 3)); - unsigned int block_index = blockx + ((blocky) * rowblocks); - unsigned int block_address = block_index << 7; - - u8* p = out + (block_address + x + (y << 4)); - PIXEL_TYPE* dest = (PIXEL_TYPE *)p; - *dest = color; -} -#endif - -int WFBFont::PreCacheChar(const u8 *ch) -{ - int code; - bool dualByteFont = true; - u8 * src; - unsigned int size, offset; - u8 gray; - -#if 0 - if (*ch > 0xA0 && *(ch + 1) > 0xA0) - // get offset to the proper character bits (GB2312 encoding) - code = (((u32)(*ch - 0xA1)) * 0x5E + ((u32)(*(ch + 1) - 0xA1))); - else if (*ch > 0x80) { - // get offset to the character space's bits (GBK encoding) - code = 0; - } - else { - code = ((u32)*ch)|0x10000; - dualByteFont = false; - } -#else - code = this->GetCode(ch, &dualByteFont); -#endif - - if (mGBCode[mCurr] != -1) { - for (int i = 0; i < mCacheSize; i++) { - if (mGBCode[i] == code) - return i; - } - } - int index = mCurr++; - if (mCurr >= mCacheSize) - mCurr = 0; - -#if defined (WIN32) || defined (LINUX) - int x = 0; - int y = 0; - memset(mCharBuffer, 0, sizeof(u32) * mFontSize * mFontSize); -#else - u8* pTexture = (u8*) mTexture->mBits; - int x; - int y = (int)mSprites[index]->mY; -#endif - - if (dualByteFont) { - size = mFontSize; - src = mChnFont + code * mBytesPerChar; - offset = 0; - } - else { - size = mFontSize / 2; - src = mEngFont + (code - 0x10000) * (mFontSize * size / 2); - offset = 0; - } - - // set up the font texture buffer - for (unsigned int i = 0; i < mFontSize; i++) { -#if defined (WIN32) || defined (LINUX) - x = 0; -#else - x = (int)mSprites[index]->mX; -#endif - unsigned int j = 0; -#if 1 - for (; j < offset; j++) { -#if defined (WIN32) || defined (LINUX) - mCharBuffer[y * mFontSize + x] = ARGB(0, 0, 0, 0); -#else - SwizzlePlot(pTexture, ARGB(0, 0, 0, 0), x * PIXEL_SIZE, y, mTexture->mTexWidth * PIXEL_SIZE); -#endif - x++; - } -#endif - for (; j < offset + size; j++) { - // as 4-bit(half-byte) stores 1 pixel - // get out the proper data according to the even or odd quality of the counter - gray = src[(i * size + j - offset) / 2]; - gray = ((j - offset) & 1) ? (gray & 0xF0) : ((gray & 0x0F) << 4); - if (gray) gray |= 0x0F; -#if defined (WIN32) || defined (LINUX) - mCharBuffer[y * mFontSize + x] = ARGB(gray, 255, 255, 255); -#else - SwizzlePlot(pTexture, ARGB(gray, 255, 255, 255), x * PIXEL_SIZE, y, mTexture->mTexWidth * PIXEL_SIZE); -#endif - x++; - } - for (; j < mFontSize; j++) { -#if defined (WIN32) || defined (LINUX) - mCharBuffer[y * mFontSize + x] = ARGB(0, 0, 0, 0); -#else - SwizzlePlot(pTexture, ARGB(0, 0, 0, 0), x * PIXEL_SIZE, y, mTexture->mTexWidth * PIXEL_SIZE); -#endif - x++; - } - y++; - } - - mGBCode[index] = code; - -#if defined (WIN32) || defined (LINUX) - x = (int)mSprites[index]->mX; - y = (int)mSprites[index]->mY; - glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, mFontSize, mFontSize, GL_RGBA, GL_UNSIGNED_BYTE, mCharBuffer); -#else - sceKernelDcacheWritebackAll(); -#endif - return index; -} - -void WFBFont::DrawString(const char *s, float x, float y, int align, float leftOffset, float width) -{ - unsigned char c = *(unsigned short *)s & 0xFF; - if (ISGBK(c) || (s[1] == ':' && s[2] == ' ')) {} - else { - // tricky: the single byte font is always mFontID + kSingleByteFontOffset! - // See WResourceManager::InitFonts() - WFont * mFont = resources.GetWFont(mFontID + Fonts::kSingleByteFontOffset); - mFont->SetScale(GetScale()); - mFont->SetColor(GetColor()); - mFont->DrawString(s, x, y, align, leftOffset, width); - return; - } - - u8 * str = (u8 *)s; - - // (0, 0) refers to the center of the word, so fix it to the upper-left corner - x += (mFontSize * mScale) / 2; - y += (mFontSize * mScale) / 2; - switch (align) { - case JGETEXT_RIGHT: - x -= GetStringWidth(s); - break; - case JGETEXT_CENTER: - x -= GetStringWidth(s) / 2; - break; - case JGETEXT_LEFT: - default: - break; - } - - mRenderer->BindTexture(mTexture); - - u8 * src = str; - float xx = x; - float yy = y; - int index = 0; - - bool dualByteFont=true; - - while (*src != 0) { - if (yy > SCREEN_HEIGHT_F) // don't render or count outside the buttom of viewport - return; - else if (yy + mFontSize < 0.0f) { // don't render when outside the top of viewport, but counted - if (*src < 0x20) { // control characters - if (*src == 0x0a) { // NEWLINE - xx = x; - yy += (mFontSize*mScale); - } - src += 1; - } - else { - if (*src > 0x80) // Chinese (GBK) and Japanese (SJIS) characters - src += 2; - else - src += 1; - - xx += (mFontSize*mScale); - - if (xx >= 480) { - xx = x; - yy += (mFontSize*mScale); - } - } - } - else { - if (*src < 0x20) { // control characters - if (*src == 0x0a) { // NEWLINE - xx = x; - yy += (mFontSize * mScale); - } - src += 1; - } - else { - int mana = -1; - if (*src > 0x80) { // Chinese (GBK) and Japanese (SJIS) characters - mana = this->GetMana(src); - index = PreCacheChar(src); - src += 2; - dualByteFont = true; - } - else { - index = PreCacheChar(src); - src += 1; - dualByteFont = false; - } - - // fix for leftoffset and witdth's setting - float xPos, yPos, charWidth, charHeight; - mSprites[index]->GetTextureRect(&xPos, &yPos, &charWidth, &charHeight); - float xPos0 = xPos; - float charWidth0 = charWidth; - float delta = (dualByteFont) ? (charWidth * mScale) : (charWidth * mScale / 2); - if (leftOffset) { - if (leftOffset < 0) { - xx -= leftOffset; - leftOffset = 0; - } - else if (leftOffset - delta > 0) { - leftOffset -= delta; - continue; - } - else { - xPos += leftOffset / mScale; - delta -= leftOffset; - leftOffset = 0; - charWidth = delta / mScale; - } - } - else if (width) { - if (xx > x + width) - return; - if (xx + delta > x + width) { - delta = x + width - xx; - charWidth = delta / mScale; - } - } - - if (mana >= 0) { - int mana2 = -1; - if (*src == '/' && (mana2 = this->GetMana(src+1)) >= 0) { // hybrid mana cost - src += 3; - unsigned char t = (JGE::GetInstance()->GetTime() / 3) & 0xFF; - unsigned char v = t + 127; - float scale = 0.05f * cosf(2*M_PI*((float)t)/256.0f); - if (scale < 0) { - mRenderer->RenderQuad(manaIcons[mana], xx + 3 * sinf(2*M_PI*((float)t)/256.0f), yy + 3 * cosf(2*M_PI*((float)(t-35))/256.0f), 0, 0.5f * mScale, 0.5f * mScale); - mRenderer->RenderQuad(manaIcons[mana2], xx + 3 * sinf(2*M_PI*((float)v)/256.0f), yy + 3 * cosf(2*M_PI*((float)(v-35))/256.0f), 0, 0.5f * mScale, 0.5f * mScale); - } - else { - mRenderer->RenderQuad(manaIcons[mana2], xx + 3 * sinf(2*M_PI*((float)v)/256.0f), yy + 3 * cosf(2*M_PI*((float)(v-35))/256.0f), 0, 0.5f * mScale, 0.5f * mScale); - mRenderer->RenderQuad(manaIcons[mana], xx + 3 * sinf(2*M_PI*((float)t)/256.0f), yy + 3 * cosf(2*M_PI*((float)(t-35))/256.0f), 0, 0.5f * mScale, 0.5f * mScale); - } - mana = Constants::MTG_NB_COLORS + 1; // donot draw colorless cost in hybrid mana cost - } - else - mRenderer->RenderQuad(manaIcons[mana], xx, yy, 0, 0.5f * mScale, 0.5f * mScale); - mRenderer->BindTexture(mTexture); // manaIcons use different texture, so we need to rebind it. - } - - if (mana <= 0) { - mSprites[index]->SetTextureRect(xPos, yPos, charWidth, charHeight); - mSprites[index]->SetColor(mColor); - mRenderer->RenderQuad(mSprites[index], xx, yy, 0, mScale, mScale); - mSprites[index]->SetTextureRect(xPos0, yPos, charWidth0, charHeight); - } - - xx += delta; - - if (xx >= 480) { - xx = x; - yy += (mFontSize * mScale); - } - } - } - } -} - -void WFBFont::DrawString(std::string s, float x, float y, int align, float leftOffset, float width) -{ - DrawString(s.c_str(),x,y,align,leftOffset,width); -} - -void WFBFont::SetColor(PIXEL_TYPE color) -{ - mColor0 = color; - mColor = gencolor(mFontID, color); -} - -float WFBFont::GetStringWidth(const char *s) const -{ - unsigned char c = *(unsigned short *)s & 0xFF; - - if (ISGBK(c)) { - u8 * src = (u8 *)s; - float xx = 0; - bool dualByteFont = true; - - while (*src != 0) { - if (*src > 0x80) { // Chinese and Japanese - src += 2; - dualByteFont = true; - } - else { // Latin 1 - src += 1; - dualByteFont = false; - } - if (dualByteFont) - xx += (mFontSize * mScale); - else - xx += (mFontSize * mScale) / 2; - } - return xx; - } - else { - WFont * mFont = resources.GetWFont(mFontID + Fonts::kSingleByteFontOffset); - mFont->SetScale(GetScale()); - return mFont->GetStringWidth(s); - } -} - -void WFBFont::SetScale(float scale) -{ - mScale = scale; -} - -float WFBFont::GetScale() const {return mScale;} -float WFBFont::GetHeight() const {return (mFontSize * mScale);} - -int WGBKFont::GetCode(const u8 *ch, bool *dualByteFont) const -{ - int code = 0; - *dualByteFont = true; - - if (*ch > 0xA0 && *(ch + 1) > 0xA0) { - // get offset to the proper character bits (GB2312 encoding) - code = (((u32)(*ch - 0xA1)) * 0x5E + ((u32)(*(ch + 1) - 0xA1))); - } - else if (*ch > 0x80) { - // get offset to the character space's bits (GBK encoding) - code = 0; - } - else { - code = ((u32)*ch)|0x10000; - *dualByteFont = false; - } - return code; -} - -int WGBKFont::GetMana(const u8 *ch) const -{ - int mana = -1; - - if (*ch != 0xa3) return mana; - switch (*(ch+1)) { - case 0xC7: - mana = Constants::MTG_COLOR_GREEN; - break; - case 0xD5: - mana = Constants::MTG_COLOR_BLUE; - break; - case 0xD2: - mana = Constants::MTG_COLOR_RED; - break; - case 0xC2: - mana = Constants::MTG_COLOR_BLACK; - break; - case 0xD7: - mana = Constants::MTG_COLOR_WHITE; - break; - case 0xD4: // T - case 0xD8: // X - case 0xD9: // Y - mana = Constants::MTG_UNCOLORED; - break; - default: - if (*(ch+1) >= 0xB0 && *(ch+1) <= 0xB9) - mana = Constants::MTG_UNCOLORED; - } - return mana; -} - -int WSJISFont::GetCode(const u8 *ch, bool *dualByteFont) const -{ - int code = 0; - *dualByteFont = true; - - if (*ch > 0xDF && *(ch + 1) > 0x3F) { - // get offset to the proper character bits (ShiftJIS encoding 2nd part) - code = (((u32)(*ch - 0xE0 + 0x1F)) * 0xBD + ((u32)(*(ch + 1) - 0x40))); - } - else if (*ch > 0x80 && *(ch + 1) > 0x3F) { - // get offset to the proper character bits (ShiftJIS encoding 1st part) - code = (((u32)(*ch - 0x81)) * 0xBD + ((u32)(*(ch + 1) - 0x40))); - } - else if (*ch > 0x80) { - // get offset to the character space's bits (ShiftJIS encoding) - code = 0; - } - else { - code = ((u32)*ch)|0x10000; - *dualByteFont = false; - } - return code; -} - -int WSJISFont::GetMana(const u8 *ch) const -{ - int mana = -1; - - if (*ch != 0x82) return mana; - switch (*(ch+1)) { - case 0x66: - mana = Constants::MTG_COLOR_GREEN; - break; - case 0x74: - mana = Constants::MTG_COLOR_BLUE; - break; - case 0x71: - mana = Constants::MTG_COLOR_RED; - break; - case 0x61: - mana = Constants::MTG_COLOR_BLACK; - break; - case 0x76: - mana = Constants::MTG_COLOR_WHITE; - break; - case 0x73: // T - case 0x77: // X - case 0x78: // Y - mana = Constants::MTG_UNCOLORED; - break; - default: - if (*(ch+1) >= 0x4F && *(ch+1) <= 0x58) - mana = Constants::MTG_UNCOLORED; - } - return mana; -} - +#include "PrecompiledHeader.h" + +#include "WFont.h" +#include "WResourceManager.h" +#include "JFileSystem.h" + +#define ISGBK(c) ((c) > 0x80 || (c) < 0x30 || (c) == '-' || (c) == '/') + +static PIXEL_TYPE gencolor(int id, PIXEL_TYPE color) +{ + unsigned int a, r, g, b, r0, g0, b0; +#if defined (WIN32) || defined (LINUX) + a = (color >> 24) & 0xFF; + r = (color >> 16) & 0xFF; + g = (color >> 8) & 0xFF; + b = (color >> 0) & 0xFF; +#else // PSP +# if defined (ABGR8888) + a = (color >> 24) & 0xFF; + b = (color >> 16) & 0xFF; + g = (color >> 8) & 0xFF; + r = (color >> 0) & 0xFF; +# elif defined (ABGR5551) + a = ((color >> 15) & 0x01) << 7; + b = ((color >> 10) & 0x1F) << 3; + g = ((color >> 5) & 0x1F) << 3; + r = ((color >> 0) & 0x1F) << 3; +# elif defined (ABGR4444) + a = ((color >> 12) & 0x0F) << 4; + b = ((color >> 8) & 0x0F) << 4; + g = ((color >> 4) & 0x0F) << 4; + r = ((color >> 0) & 0x0F) << 4; +# endif +#endif + r0 = g0 = b0 = 255; + + switch (id) { + case Fonts::MAIN_FONT: // simon 245, 228, 156 + r0 = 245; g0 = 228; b0 = 156; + break; + case Fonts::MENU_FONT: // f3 255, 252, 175 + r0 = 255; g0 = 252; b0 = 175; + break; + case Fonts::MAGIC_FONT: // magic 219, 255, 151 + r0 = 219; g0 = 255; b0 = 151; + break; + case Fonts::SMALLFACE_FONT: // smallface 255, 255, 255 + r0 = 255; g0 = 255; b0 = 255; + break; + default: + ; + } + r = r * r0 / 255; + g = g * g0 / 255; + b = b * b0 / 255; + + return ARGB(a,r,g,b); +} + +static inline bool doubleWidthChar(const u8* const src) +{ + // Determination of this is done with < 0xC0, which is not + // right but okay for now (in particular it will return 2 + // for european accented characters) + return *src >= 0xC0; +} + +static inline bool GBKDoubleWidthChar(const u8* const src) +{ + // Determination of this is done with < 0xC0, which is not + // right but okay for now (in particular it will return 2 + // for european accented characters) + return *src >= 0x80; +} + +// This returns the size in bytes of a character. +// The 4 first bits of the leading byte indicate the length. +// The zeroes in the middle match the 10xx forms, which are +// only found in trailing bytes. +static inline int charWidth(const u8 s) +{ + // The following is the "correct" one, but if called on incorrect strings + // the presence of 0's may create an infinite loop, so replace them with + // 1's. This may happen when changing from chinese to japanese because the + // encoding for chinese is not regular. + // static const int sizes[] = {1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 2, 2, 3, 4}; + static const int sizes[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 3, 4}; +#if 0 + // Reactivate to support being called on trailing bytes. This is not needed at the moment + // as this function will always be passed leading bytes. + while (0 == sizes[s >> 4]) --s; +#endif + return sizes[s >> 4]; +} + + +// + +JRenderer * WFBFont::mRenderer = NULL; + +WLBFont::WLBFont(int inFontID, const char *fontname, int lineheight, bool useVideoRAM) + : WFont(inFontID) +{ + string path(fontname); + if (path.size() > 4 ) path = path.substr(0, path.size() - 4); //some stupid manipulation because of the way Font works in JGE + it = NEW JLBFont(path.c_str(), lineheight, useVideoRAM); +} + +WFBFont::WFBFont(int inFontID, const char *fontname, int lineheight, bool useVideoRAM) + : WFont(inFontID) +{ + mRenderer = JRenderer::GetInstance(); + + mCharBuffer = NULL; + mSprites = NULL; + mGBCode = NULL; + mCurr = 0; + + char tmpFileName[32], engFileName[32]; + strcpy(tmpFileName, fontname); + char * ep = strrchr(tmpFileName, '.'); + *ep = '\0'; + sprintf(engFileName, "%s.asc", tmpFileName); + JFileSystem *fileSys = JFileSystem::GetInstance(); + int size = 0; + struct { + unsigned short chars; + unsigned char width; + unsigned char height; + } sizeStr = {0, 0, 0}; + + if (!fileSys->OpenFile(engFileName)) + return; + size = fileSys->GetFileSize(); + mStdFont = NEW u8[size]; + fileSys->ReadFile(mStdFont, size); + fileSys->CloseFile(); + + if (!fileSys->OpenFile(fontname)) + return; + fileSys->ReadFile(&sizeStr, 4); // Works only for little-endian machines (PSP and PC are) + size = sizeStr.chars * sizeStr.width * sizeStr.height / 2; + mExtraFont = NEW u8[size]; // 4 bits for a pixel + mIndex = NEW u16[65536]; + fileSys->ReadFile(mIndex, 65536 * sizeof(u16)); + fileSys->ReadFile(mExtraFont, size); + fileSys->CloseFile(); + + mColor0 = ARGB(255, 255, 255, 255); + mColor = mColor0; + mFontSize = lineheight; + mScale = 1.0f; + + // using 4-bit(half-byte) to store 1 pixel + mBytesPerRow = static_cast(mFontSize / 2); + mBytesPerChar = static_cast(mBytesPerRow*mFontSize); + + mCacheImageWidth = 256; + mCacheImageHeight = 256; + mCol = mCacheImageWidth / mFontSize; + mRow = mCacheImageHeight / mFontSize; + mCacheSize = mCol * mRow; + + mSprites = NEW JQuad*[mCacheSize]; + mGBCode = NEW int[mCacheSize]; + +#if defined (WIN32) || defined (LINUX) + mCharBuffer = NEW u32[mFontSize*mFontSize]; +#endif + + mTexture = mRenderer->CreateTexture(mCacheImageWidth, mCacheImageHeight, true); + + int index = 0; + for (int y = 0; y < mRow; y++) { + for (int x = 0; x < mCol; x++) { + mGBCode[index] = -1; + mSprites[index] = NEW JQuad(mTexture, + static_cast(x*mFontSize), + static_cast(y*mFontSize), + static_cast(mFontSize), + static_cast(mFontSize)); + mSprites[index]->SetHotSpot(static_cast(mFontSize / 2), static_cast(mFontSize / 2)); + index++; + } + } +} + +WFBFont::~WFBFont() +{ + SAFE_DELETE(mStdFont); + SAFE_DELETE(mExtraFont); + SAFE_DELETE(mTexture); + + if (mSprites) { + for (int i = 0; i < mCacheSize; i++) { + if (mSprites[i]) + delete mSprites[i]; + } + delete [] mSprites; + } + + if (NULL != mIndex) delete[] mIndex; + + if (mGBCode) + delete [] mGBCode; + + if (mCharBuffer) + delete [] mCharBuffer; +} + +#if defined (WIN32) || defined (LINUX) +#else +static void SwizzlePlot(u8* out, PIXEL_TYPE color, int i, int j, unsigned int width) +{ + unsigned int rowblocks = (width >> 4); + + unsigned int blockx = (i >> 4); + unsigned int blocky = (j >> 3); + + unsigned int x = (i - (blockx << 4)); + unsigned int y = (j - (blocky << 3)); + unsigned int block_index = blockx + ((blocky) * rowblocks); + unsigned int block_address = block_index << 7; + + u8* p = out + (block_address + x + (y << 4)); + PIXEL_TYPE* dest = (PIXEL_TYPE *)p; + *dest = color; +} +#endif + +int WFBFont::PreCacheChar(const u8 *ch) +{ + int code; + int charLength = 1; + u8 * src; + unsigned int size, offset; + u8 gray; + + code = this->GetCode(ch, &charLength); + + if (mGBCode[mCurr] != -1) + for (int i = 0; i < mCacheSize; i++) + if (mGBCode[i] == code) + return i; + + int index = mCurr++; + if (mCurr >= mCacheSize) + mCurr = 0; + +#if defined (WIN32) || defined (LINUX) + int x = 0; + int y = 0; + memset(mCharBuffer, 0, sizeof(u32) * mFontSize * mFontSize); +#else + u8* pTexture = (u8*) mTexture->mBits; + int x; + int y = (int)mSprites[index]->mY; +#endif + + if (doubleWidthChar(ch)) { + if (mIndex) code = mIndex[code]; + size = mFontSize; + src = mExtraFont + code * mBytesPerChar; + offset = 0; + } + else { + size = mFontSize / 2; + src = mStdFont + code * (mFontSize * size / 2); + offset = 0; + } + + // set up the font texture buffer + for (unsigned int i = 0; i < mFontSize; i++) { +#if defined (WIN32) || defined (LINUX) + x = 0; +#else + x = (int)mSprites[index]->mX; +#endif + unsigned int j = 0; +#if 1 + for (; j < offset; j++) { +#if defined (WIN32) || defined (LINUX) + mCharBuffer[y * mFontSize + x] = ARGB(0, 0, 0, 0); +#else + SwizzlePlot(pTexture, ARGB(0, 0, 0, 0), x * PIXEL_SIZE, y, mTexture->mTexWidth * PIXEL_SIZE); +#endif + x++; + } +#endif + for (; j < offset + size; j++) { + // as 4-bit(half-byte) stores 1 pixel + // get out the proper data according to the even or odd quality of the counter + gray = src[(i * size + j - offset) / 2]; + gray = ((j - offset) & 1) ? (gray & 0xF0) : ((gray & 0x0F) << 4); + if (gray) gray |= 0x0F; +#if defined (WIN32) || defined (LINUX) + mCharBuffer[y * mFontSize + x] = ARGB(gray, 255, 255, 255); +#else + SwizzlePlot(pTexture, ARGB(gray, 255, 255, 255), x * PIXEL_SIZE, y, mTexture->mTexWidth * PIXEL_SIZE); +#endif + x++; + } + for (; j < mFontSize; j++) { +#if defined (WIN32) || defined (LINUX) + mCharBuffer[y * mFontSize + x] = ARGB(0, 0, 0, 0); +#else + SwizzlePlot(pTexture, ARGB(0, 0, 0, 0), x * PIXEL_SIZE, y, mTexture->mTexWidth * PIXEL_SIZE); +#endif + x++; + } + y++; + } + + mGBCode[index] = code; + +#if defined (WIN32) || defined (LINUX) + x = (int)mSprites[index]->mX; + y = (int)mSprites[index]->mY; + glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, mFontSize, mFontSize, GL_RGBA, GL_UNSIGNED_BYTE, mCharBuffer); +#else + sceKernelDcacheWritebackAll(); +#endif + return index; +} + +void WFBFont::DrawString(const char *s, float x, float y, int align, float leftOffset, float width) +{ + u8 * str = (u8 *)s; + if (*str < 0x80) { + // tricky: the single byte font is always mFontID + kSingleByteFontOffset! + // See WResourceManager::InitFonts() + WFont * mFont = resources.GetWFont(mFontID + Fonts::kSingleByteFontOffset); + mFont->SetScale(GetScale()); + mFont->SetColor(GetColor()); + mFont->DrawString(s, x, y, align, leftOffset, width); + return; + } + + // (0, 0) refers to the center of the word, so fix it to the upper-left corner + x += (mFontSize * mScale) / 2; + y += (mFontSize * mScale) / 2; + // Warning : non-left alignment is not supported for multiline strings + // (this is because GetStringWidth is not aware of line breaks). + switch (align) { + case JGETEXT_RIGHT: + x -= GetStringWidth(s); + break; + case JGETEXT_CENTER: + x -= GetStringWidth(s) / 2; + break; + case JGETEXT_LEFT: + default: + break; + } + + mRenderer->BindTexture(mTexture); + + u8 * src = str; + float xx = x; + float yy = y; + int index = 0; + + while (*src != 0) { + if (yy > SCREEN_HEIGHT_F) // don't render or count outside the buttom of viewport + return; + else if (yy + mFontSize < 0.0f) { // don't render when outside the top of viewport, but counted + if (*src < 0x20) { // control characters + if (*src == 0x0a) { // NEWLINE + xx = x; + yy += (mFontSize*mScale); + } + src += 1; + } + else { + xx += (mFontSize*mScale); + + if (xx >= width) { + xx = x; + yy += (mFontSize*mScale); + } + } + } + else { + if (*src < 0x20) { // control characters + if (*src == 0x0a) { // NEWLINE + xx = x; + yy += (mFontSize * mScale); + } + src += 1; + } + else { + int mana = this->GetMana(src); + bool doubleW = doubleWidthChar(src); + index = PreCacheChar(src); + src += charWidth(*src); + + // fix for leftoffset and width's setting + float xPos, yPos, charW, charHeight; + mSprites[index]->GetTextureRect(&xPos, &yPos, &charW, &charHeight); + float xPos0 = xPos; + float charW0 = charW; + float delta = doubleW ? (charW * mScale) : (charW * mScale / 2); + if (leftOffset) { + if (leftOffset < 0) { + xx -= leftOffset; + leftOffset = 0; + } + else if (leftOffset - delta > 0) { + leftOffset -= delta; + continue; + } + else { + xPos += leftOffset / mScale; + delta -= leftOffset; + leftOffset = 0; + charW = delta / mScale; + } + } + else if (width) { + if (xx > x + width) + return; + if (xx + delta > x + width) { + delta = x + width - xx; + charW = delta / mScale; + } + } + + if (mana >= 0) { + int mana2 = -1; + if (*src == '/' && (mana2 = this->GetMana(src+1)) >= 0) { // hybrid mana cost + src += 1 + charWidth(*src); + unsigned char t = (JGE::GetInstance()->GetTime() / 3) & 0xFF; + unsigned char v = t + 127; + float scale = 0.05f * cosf(2*M_PI*((float)t)/256.0f); + if (scale < 0) { + mRenderer->RenderQuad(manaIcons[mana], xx + 3 * sinf(2*M_PI*((float)t)/256.0f), yy + 3 * cosf(2*M_PI*((float)(t-35))/256.0f), 0, 0.5f * mScale, 0.5f * mScale); + mRenderer->RenderQuad(manaIcons[mana2], xx + 3 * sinf(2*M_PI*((float)v)/256.0f), yy + 3 * cosf(2*M_PI*((float)(v-35))/256.0f), 0, 0.5f * mScale, 0.5f * mScale); + } + else { + mRenderer->RenderQuad(manaIcons[mana2], xx + 3 * sinf(2*M_PI*((float)v)/256.0f), yy + 3 * cosf(2*M_PI*((float)(v-35))/256.0f), 0, 0.5f * mScale, 0.5f * mScale); + mRenderer->RenderQuad(manaIcons[mana], xx + 3 * sinf(2*M_PI*((float)t)/256.0f), yy + 3 * cosf(2*M_PI*((float)(t-35))/256.0f), 0, 0.5f * mScale, 0.5f * mScale); + } + mana = Constants::MTG_NB_COLORS + 1; // do not draw colorless cost in hybrid mana cost + } + else + mRenderer->RenderQuad(manaIcons[mana], xx, yy, 0, 0.5f * mScale, 0.5f * mScale); + mRenderer->BindTexture(mTexture); // manaIcons use different texture, so we need to rebind it. + } + + if (mana <= 0) { + mSprites[index]->SetTextureRect(xPos, yPos, charW, charHeight); + mSprites[index]->SetColor(mColor); + mRenderer->RenderQuad(mSprites[index], xx, yy, 0, mScale, mScale); + mSprites[index]->SetTextureRect(xPos0, yPos, charW0, charHeight); + } + + xx += delta; + + if (xx >= 480) { + xx = x; + yy += (mFontSize * mScale); + } + } + } + } +} + +void WFBFont::DrawString(std::string s, float x, float y, int align, float leftOffset, float width) +{ + DrawString(s.c_str(),x,y,align,leftOffset,width); +} + +void WFBFont::SetColor(PIXEL_TYPE color) +{ + mColor0 = color; + mColor = gencolor(mFontID, color); +} + +float WFBFont::GetStringWidth(const char *s) const +{ + u8 * src = (u8 *)s; + int width = 0; + + if (doubleWidthChar(src)) { + while (*src != 0) { + // Add the number of single-char widths according to whether + // this is a single or double-width char. + width += (doubleWidthChar(src)) ? 2 : 1; + src += charWidth(*src); + } + return width * mFontSize * mScale / 2; + } + else { + WFont * mFont = resources.GetWFont(mFontID + Fonts::kSingleByteFontOffset); + mFont->SetScale(GetScale()); + return mFont->GetStringWidth(s); + } + +} + +void WFBFont::SetScale(float scale) +{ + mScale = scale; +} + +float WFBFont::GetScale() const {return mScale;} +float WFBFont::GetHeight() const {return (mFontSize * mScale);} + +// Legacy : GBK encoding +WGBKFont::WGBKFont(int inFontID, const char *fontname, int lineheight, bool useVideoRAM) : + WFBFont(inFontID) +{ + mRenderer = JRenderer::GetInstance(); + + mCharBuffer = NULL; + mSprites = NULL; + mGBCode = NULL; + mCurr = 0; + + char tmpFileName[32], engFileName[32]; + strcpy(tmpFileName, fontname); + char * ep = strrchr(tmpFileName, '.'); + *ep = '\0'; + sprintf(engFileName, "%s.asc", tmpFileName); + JFileSystem *fileSys = JFileSystem::GetInstance(); + int size = 0; + + if (!fileSys->OpenFile(fontname)) + return; + size = fileSys->GetFileSize(); + mExtraFont = NEW u8[size]; + fileSys->ReadFile(mExtraFont, size); + fileSys->CloseFile(); + + if (!fileSys->OpenFile(engFileName)) + return; + size = fileSys->GetFileSize(); + mStdFont = NEW u8[size]; + fileSys->ReadFile(mStdFont, size); + fileSys->CloseFile(); + + mIndex = 0; + + mColor0 = ARGB(255, 255, 255, 255); + mColor = mColor0; + mFontSize = lineheight; + mScale = 1.0f; + + // using 4-bit(half-byte) to store 1 pixel + mBytesPerRow = static_cast(mFontSize / 2); + mBytesPerChar = static_cast(mBytesPerRow*mFontSize); + + mCacheImageWidth = 256; + mCacheImageHeight = 256; + mCol = mCacheImageWidth / mFontSize; + mRow = mCacheImageHeight / mFontSize; + mCacheSize = mCol * mRow; + + mSprites = NEW JQuad*[mCacheSize]; + mGBCode = NEW int[mCacheSize]; + +#if defined (WIN32) || defined (LINUX) + mCharBuffer = NEW u32[mFontSize*mFontSize]; +#endif + + mTexture = mRenderer->CreateTexture(mCacheImageWidth, mCacheImageHeight, true); + + int index = 0; + for (int y = 0; y < mRow; y++) { + for (int x = 0; x < mCol; x++) { + mGBCode[index] = -1; + mSprites[index] = NEW JQuad(mTexture, + static_cast(x*mFontSize), + static_cast(y*mFontSize), + static_cast(mFontSize), + static_cast(mFontSize)); + mSprites[index]->SetHotSpot(static_cast(mFontSize / 2), static_cast(mFontSize / 2)); + index++; + } + } +} + +int WGBKFont::PreCacheChar(const u8 *ch) +{ + int code; + int charLength = 1; + u8 * src; + unsigned int size, offset; + u8 gray; + +#if 0 + if (*ch > 0xA0 && *(ch + 1) > 0xA0) { + // get offset to the proper character bits (GB2312 encoding) + code = (((u32)(*ch - 0xA1)) * 0x5E + ((u32)(*(ch + 1) - 0xA1))); + charLength = 2; + } + else if (*ch > 0x80) { + // get offset to the character space's bits (GBK encoding) + code = 0; + charLength = 2; + } + else { + code = ((u32)*ch); + charLength = 1; + } +#else + code = this->GetCode(ch, &charLength); +#endif + + if (mGBCode[mCurr] != -1) + for (int i = 0; i < mCacheSize; i++) + if (mGBCode[i] == code) + return i; + + int index = mCurr++; + if (mCurr >= mCacheSize) + mCurr = 0; + +#if defined (WIN32) || defined (LINUX) + int x = 0; + int y = 0; + memset(mCharBuffer, 0, sizeof(u32) * mFontSize * mFontSize); +#else + u8* pTexture = (u8*) mTexture->mBits; + int x; + int y = (int)mSprites[index]->mY; +#endif + + if (mIndex) code = mIndex[code]; + + if (GBKDoubleWidthChar(ch)) { + size = mFontSize; + src = mExtraFont + code * mBytesPerChar; + offset = 0; + } + else { + size = mFontSize / 2; + src = mStdFont + code * (mFontSize * size / 2); + offset = 0; + } + + // set up the font texture buffer + for (unsigned int i = 0; i < mFontSize; i++) { +#if defined (WIN32) || defined (LINUX) + x = 0; +#else + x = (int)mSprites[index]->mX; +#endif + unsigned int j = 0; +#if 1 + for (; j < offset; j++) { +#if defined (WIN32) || defined (LINUX) + mCharBuffer[y * mFontSize + x] = ARGB(0, 0, 0, 0); +#else + SwizzlePlot(pTexture, ARGB(0, 0, 0, 0), x * PIXEL_SIZE, y, mTexture->mTexWidth * PIXEL_SIZE); +#endif + x++; + } +#endif + for (; j < offset + size; j++) { + // as 4-bit(half-byte) stores 1 pixel + // get out the proper data according to the even or odd quality of the counter + gray = src[(i * size + j - offset) / 2]; + gray = ((j - offset) & 1) ? (gray & 0xF0) : ((gray & 0x0F) << 4); + if (gray) gray |= 0x0F; +#if defined (WIN32) || defined (LINUX) + mCharBuffer[y * mFontSize + x] = ARGB(gray, 255, 255, 255); +#else + SwizzlePlot(pTexture, ARGB(gray, 255, 255, 255), x * PIXEL_SIZE, y, mTexture->mTexWidth * PIXEL_SIZE); +#endif + x++; + } + for (; j < mFontSize; j++) { +#if defined (WIN32) || defined (LINUX) + mCharBuffer[y * mFontSize + x] = ARGB(0, 0, 0, 0); +#else + SwizzlePlot(pTexture, ARGB(0, 0, 0, 0), x * PIXEL_SIZE, y, mTexture->mTexWidth * PIXEL_SIZE); +#endif + x++; + } + y++; + } + + mGBCode[index] = code; + +#if defined (WIN32) || defined (LINUX) + x = (int)mSprites[index]->mX; + y = (int)mSprites[index]->mY; + glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, mFontSize, mFontSize, GL_RGBA, GL_UNSIGNED_BYTE, mCharBuffer); +#else + sceKernelDcacheWritebackAll(); +#endif + return index; +} + +void WGBKFont::DrawString(const char *s, float x, float y, int align, float leftOffset, float width) +{ + unsigned char c = *(unsigned short *)s & 0xFF; + if (ISGBK(c) || (s[1] == ':' && s[2] == ' ')) {} + else { + // tricky: the single byte font is always mFontID + kSingleByteFontOffset! + // See WResourceManager::InitFonts() + WFont * mFont = resources.GetWFont(mFontID + Fonts::kSingleByteFontOffset); + mFont->SetScale(GetScale()); + mFont->SetColor(GetColor()); + mFont->DrawString(s, x, y, align, leftOffset, width); + return; + } + + u8 * str = (u8 *)s; + + // (0, 0) refers to the center of the word, so fix it to the upper-left corner + x += (mFontSize * mScale) / 2; + y += (mFontSize * mScale) / 2; + switch (align) { + case JGETEXT_RIGHT: + x -= GetStringWidth(s); + break; + case JGETEXT_CENTER: + x -= GetStringWidth(s) / 2; + break; + case JGETEXT_LEFT: + default: + break; + } + + mRenderer->BindTexture(mTexture); + + u8 * src = str; + float xx = x; + float yy = y; + int index = 0; + + bool dualByteFont=true; + + while (*src != 0) { + if (yy > SCREEN_HEIGHT_F) // don't render or count outside the buttom of viewport + return; + else if (yy + mFontSize < 0.0f) { // don't render when outside the top of viewport, but counted + if (*src < 0x20) { // control characters + if (*src == 0x0a) { // NEWLINE + xx = x; + yy += (mFontSize*mScale); + } + src += 1; + } + else { + if (*src > 0x80) // 2-bytes char + src += 2; + else + src += 1; + + xx += (mFontSize*mScale); + + if (xx >= 480) { + xx = x; + yy += (mFontSize*mScale); + } + } + } + else { + if (*src < 0x20) { // control characters + if (*src == 0x0a) { // NEWLINE + xx = x; + yy += (mFontSize * mScale); + } + src += 1; + } + else { + int mana = -1; + if (*src > 0x80) { // 2-bytes char + mana = this->GetMana(src); + index = PreCacheChar(src); + src += 2; + dualByteFont = true; + } + else { + index = PreCacheChar(src); + src += 1; + dualByteFont = false; + } + + // fix for leftoffset and witdth's setting + float xPos, yPos, charW, charHeight; + mSprites[index]->GetTextureRect(&xPos, &yPos, &charW, &charHeight); + float xPos0 = xPos; + float charW0 = charW; + float delta = (dualByteFont) ? (charW * mScale) : (charW * mScale / 2); + if (leftOffset) { + if (leftOffset < 0) { + xx -= leftOffset; + leftOffset = 0; + } + else if (leftOffset - delta > 0) { + leftOffset -= delta; + continue; + } + else { + xPos += leftOffset / mScale; + delta -= leftOffset; + leftOffset = 0; + charW = delta / mScale; + } + } + else if (width) { + if (xx > x + width) + return; + if (xx + delta > x + width) { + delta = x + width - xx; + charW = delta / mScale; + } + } + + if (mana >= 0) { + int mana2 = -1; + if (*src == '/' && (mana2 = this->GetMana(src+1)) >= 0) { // hybrid mana cost + src += 3; + unsigned char t = (JGE::GetInstance()->GetTime() / 3) & 0xFF; + unsigned char v = t + 127; + float scale = 0.05f * cosf(2*M_PI*((float)t)/256.0f); + if (scale < 0) { + mRenderer->RenderQuad(manaIcons[mana], xx + 3 * sinf(2*M_PI*((float)t)/256.0f), yy + 3 * cosf(2*M_PI*((float)(t-35))/256.0f), 0, 0.5f * mScale, 0.5f * mScale); + mRenderer->RenderQuad(manaIcons[mana2], xx + 3 * sinf(2*M_PI*((float)v)/256.0f), yy + 3 * cosf(2*M_PI*((float)(v-35))/256.0f), 0, 0.5f * mScale, 0.5f * mScale); + } + else { + mRenderer->RenderQuad(manaIcons[mana2], xx + 3 * sinf(2*M_PI*((float)v)/256.0f), yy + 3 * cosf(2*M_PI*((float)(v-35))/256.0f), 0, 0.5f * mScale, 0.5f * mScale); + mRenderer->RenderQuad(manaIcons[mana], xx + 3 * sinf(2*M_PI*((float)t)/256.0f), yy + 3 * cosf(2*M_PI*((float)(t-35))/256.0f), 0, 0.5f * mScale, 0.5f * mScale); + } + mana = Constants::MTG_NB_COLORS + 1; // donot draw colorless cost in hybrid mana cost + } + else + mRenderer->RenderQuad(manaIcons[mana], xx, yy, 0, 0.5f * mScale, 0.5f * mScale); + mRenderer->BindTexture(mTexture); // manaIcons use different texture, so we need to rebind it. + } + + if (mana <= 0) { + mSprites[index]->SetTextureRect(xPos, yPos, charW, charHeight); + mSprites[index]->SetColor(mColor); + mRenderer->RenderQuad(mSprites[index], xx, yy, 0, mScale, mScale); + mSprites[index]->SetTextureRect(xPos0, yPos, charW0, charHeight); + } + + xx += delta; + + if (xx >= 480) { + xx = x; + yy += (mFontSize * mScale); + } + } + } + } +} + +float WGBKFont::GetStringWidth(const char *s) const +{ + unsigned char c = *(unsigned short *)s & 0xFF; + + if (ISGBK(c)) { + u8 * src = (u8 *)s; + float xx = 0; + bool dualByteFont = true; + + while (*src != 0) { + if (*src > 0x80) { // Chinese and Japanese + src += 2; + dualByteFont = true; + } + else { // Latin 1 + src += 1; + dualByteFont = false; + } + if (dualByteFont) + xx += (mFontSize * mScale); + else + xx += (mFontSize * mScale) / 2; + } + return xx; + } + else { + WFont * mFont = resources.GetWFont(mFontID + Fonts::kSingleByteFontOffset); + mFont->SetScale(GetScale()); + return mFont->GetStringWidth(s); + } +} + +int WGBKFont::GetCode(const u8 *ch, int *charLength) const +{ + int code = 0; + *charLength = 2; + + if (*ch > 0xA0 && *(ch + 1) > 0xA0) { + // get offset to the proper character bits (GB2312 encoding) + code = (((u32)(*ch - 0xA1)) * 0x5E + ((u32)(*(ch + 1) - 0xA1))); + } + else if (*ch > 0x80) { + // get offset to the character space's bits (GBK encoding) + code = 0; + } + else { + code = ((u32)*ch); + *charLength = 1; + } + return code; +} + +int WGBKFont::GetMana(const u8 *ch) const +{ + int mana = -1; + + if (*ch != 0xa3) return mana; + switch (*(ch+1)) { + case 0xC7: + mana = Constants::MTG_COLOR_GREEN; + break; + case 0xD5: + mana = Constants::MTG_COLOR_BLUE; + break; + case 0xD2: + mana = Constants::MTG_COLOR_RED; + break; + case 0xC2: + mana = Constants::MTG_COLOR_BLACK; + break; + case 0xD7: + mana = Constants::MTG_COLOR_WHITE; + break; + case 0xD4: // T + case 0xD8: // X + case 0xD9: // Y + mana = Constants::MTG_UNCOLORED; + break; + default: + if (*(ch+1) >= 0xB0 && *(ch+1) <= 0xB9) + mana = Constants::MTG_UNCOLORED; + } + return mana; +} + +int WUFont::GetCode(const u8 *ch, int *charLength) const +{ + int code = 0; + + // This assumes the string is valid. We could test for + // validity by ensuring all trailing bytes are & 0xC0 == F0 + // and that no first byte is. + + // For a description of the binary representation, look at wikipedia://utf-8 + + if ((*ch & 0xF8) == 0xF0) { // Four bytes + *charLength = 4; + code = ((*ch * 0x7) << 18) + ((*(ch+1) & 0x3F) << 12) + ((*(ch+2) & 0x3F) << 6) + ((*(ch+3) * 0x3F)); + } + else if ((*ch & 0xF0) == 0xE0) { // Three bytes + *charLength = 3; + code = ((*ch & 0xF) << 12) + ((*(ch+1) & 0x3F) << 6) + ((*(ch+2) & 0x3F)); + } + else if ((*ch & 0xE0) == 0xC0) { // Two bytes + *charLength = 2; + code = ((*ch & 0x1F) << 6) + ((*(ch+2) & 0x3F)); + } + else { + *charLength = 1; + code = *ch; + } + return code; +} + +int WUFont::GetMana(const u8 *ch) const +{ + /* + * Reactivate the following code to be able to use + * single-width characters too, if needed. + **/ + /* + switch (*ch) + { + case 0x67: return Constants::MTG_COLOR_GREEN; + case 0x75: return Constants::MTG_COLOR_BLUE; + case 0x72: return Constants::MTG_COLOR_RED; + case 0x62: return Constants::MTG_COLOR_BLACK; + case 0x77: return Constants::MTG_COLOR_WHITE; + case 0x74: + case 0x78: + case 0x79: return Constants::MTG_UNCOLORED; + default: + if (*ch >= 0x30 && *ch <= 0x39) + return Constants::MTG_UNCOLORED; + } + */ + if (*ch != 0xef || *(ch+1) != 0xbc) return -1; + ch += 2; + switch (*ch) { + case 0xa7: // G : 0xefbca7 + return Constants::MTG_COLOR_GREEN; + case 0xb5: // U : 0xefbcb5 + return Constants::MTG_COLOR_BLUE; + case 0xb2: // R : 0xefbcb2 + return Constants::MTG_COLOR_RED; + case 0xa2: // B : 0xefbca2 + return Constants::MTG_COLOR_BLACK; + case 0xb7: // W : 0xefbcb7 + return Constants::MTG_COLOR_WHITE; + case 0xb4: // T : 0xefbcb4 + case 0xb8: // X : 0xefbcb8 + case 0xb9: // Y : 0xefbcb9 + return Constants::MTG_UNCOLORED; + default: + if (*ch >= 0x90 && *ch <= 0x99) + return Constants::MTG_UNCOLORED; + } + return -1; +} diff --git a/projects/mtg/src/WResourceManager.cpp b/projects/mtg/src/WResourceManager.cpp index b696ac28b..4c937b2b0 100644 --- a/projects/mtg/src/WResourceManager.cpp +++ b/projects/mtg/src/WResourceManager.cpp @@ -24,7 +24,7 @@ namespace { const std::string kExtension_png(".png"); const std::string kExtension_gbk(".gbk"); - const std::string kExtension_sjis(".sjis"); + const std::string kExtension_font(".font"); } int WResourceManager::RetrieveError(){ @@ -861,7 +861,7 @@ void WResourceManager::InitFonts(const std::string& inLang) if (inLang.compare("jp") == 0) { - mFontFileExtension = kExtension_sjis; + mFontFileExtension = kExtension_font; LoadWFont("simon", 12, Fonts::MAIN_FONT); LoadWFont("f3", 16, Fonts::MENU_FONT); LoadWFont("magic", 16, Fonts::MAGIC_FONT); @@ -899,21 +899,15 @@ WFont* WResourceManager::LoadWFont(const string& inFontname, int inFontHeight, i string mFontName = inFontname + mFontFileExtension; string path = graphicsFile(mFontName); - - if (mFontFileExtension == kExtension_gbk) - { + + if (mFontFileExtension == kExtension_font) + font = NEW WUFont(inFontID, path.c_str(), inFontHeight, true); + else if (mFontFileExtension == kExtension_gbk) font = NEW WGBKFont(inFontID, path.c_str(), inFontHeight, true); - } - else if (mFontFileExtension == kExtension_sjis) - { - font = NEW WSJISFont(inFontID, path.c_str(), inFontHeight, true); - } else - { font = NEW WLBFont(inFontID, path.c_str(), inFontHeight, true); - } mWFontMap[inFontID] = font; - + return font; }