Wizardry1/Apple/解析メモ
日本語化されたバージョンの解析情報は多いけど、Apple版の情報は少ないので、ここにメモしておきます。 TIPSなどはWizardry参照。
モンスター関連は多いので別ページに分けています。
参考リンク
-
Re-engineered: Wizardry III, Legacy of Llylgamyn - Google Groups
-
Sophistication and Simplicity: The Life and Times of the Apple II Computer
-
Dungeons and Desktops: The History of Computer Role-Playing Games
型
- INTEGER 16bit
- TWIZLONG 48bit (INTEGER*3)
- 実際にはRECORD型で LOW,MID,HIGHの3つの変数に分かれている。
- 10000進法。LOW,MID,HIGHは各々0..9999の値を持つ。
- 加減乗除、BCDからの変換関数を定義して計算を行っている。
乱数
UCSD Pascal の RANDOM は 0..32767 までの乱数を返す。 Wizardryでは 0..9 までの乱数を生成する場合、 (RANDOM MOD 10) と計算している。このため厳密には小さい数値が出やすいはず(言い出したらキリがない話だが)。
- C FAQ 13
- 13.16: ある範囲の整数からなる乱数はどうやったら生成することができるか
- 乱数発生器の多くで下位のビットは悲惨なほどランダムでない
- C++ - 【C】srand(time(NULL))をしても同じ乱数が生成される|teratail
キャラクター作成
BONUS POINT
国内版よりもボーナス期待値が少ない。振り直しは程々に。
- 7..10の乱数を作成
- while (値が20未満 && 1/11の確率)なら 10 を加算する。
- 従って、ボーナス値は 7,8,9,10, 17,18,19,20, 27,28,29 のいずれかとなる。
- FC版は 5..9 に 5%の確率で+10 (cf. Wizardry(NES) 解析 - キャラメイク)
(プログラムはLOR,NINもいきなり作れるように書かれているが、実際にはBPが足りないので作れない)
AGE,GOLD
- AGE: INTEGER: 18*52+乱数(0..299) 週単位
- GOLD: TWIZLONG: 90 + 乱数(0..99)
SPELL
- MAGE, BISHOP
- 1:HALITO, 3:KATINO を覚えている。MPは2
- PRIEST
- 23:DIOS, 24:BADIOS を覚えている。MPは2
HP (INTEGER)
- FIG,LOR: 10
- PRI: 8
- THI,BIS,NIN: 5
- MAGE: 4
- SAM: 16
上記をVITで補正
- 3: -2
- 4,5: -1
- 16: +1
- 17: +2
- 18: +3
補正後の値に50%の確率で9/10を乗ずる。2回繰り返す。
- (例:VIT18のFIGを作成した場合、HPは13,11,9 のいずれかになる)
- (例:VIT補正のないMAGEを作成した場合、HPは4,3,2のいずれかになる)
HP<2 なら 2にする。
キャラクターLEVEL UP
GAIN/LOST
各々の特性値ごとに計算。若ければ上がりやすいし、高齢なら下がりやすい。
- 乱数(0..3)<>0 なら、
- 乱数(0..129)<年齢なら (特性値LOST)
- 特性値==18 && 乱数(0..6)!=4 なら何もしない
- その他は特性値-1
- その他は 特性値==18でなければ特性値+1
- 乱数(0..129)<年齢なら (特性値LOST)
加齢による特性値LOSTにより VIT=2 になったら、キャラクターLOST。 VIT以外は範囲チェックをしていないので、加齢により値が減少すると 2→1→0→31 と変化する。 (pascalが 0..18 of INTEGERを 5bitで扱ってると思われる)
IBM-PC版と同じようなバグがあるけど、年齢が若いうちは特性値LOSTの割合が少ないので発覚していないものと思われる。 (IBM-PC版は若くても特性値がLOSTしやすいので、かなり厳しい)
HP
- 新レベル数だけ下記を繰り返し、合計を新HPとする。
- SAMは新レベル数+1回
- FIG,LOR: 1d10 + 補正値
- PRI,SAM: 1d8 + 補正値
- THI,BIS,NIN: 1d6 + 補正値
- MAG: 1d4 + 補正値
- 補正値は VIT: 3なら-2, 4,5なら-1, 16なら+1, 17なら+2, 18なら+3
- VITはGAIN/LOST後の値。
- 補正後に1以下になるなら、1にする
- 新HP<=現HPなら、HP+1
レベル10、VIT18 のFIGTHERなら、10d10 + 3*10 → 50+30=80 程度のHPが期待できる。
LEARN NEW SPELL
基本
- Level 1のSPELLを覚えるレベル、レベルごとの差の2つのパラメータがある。
- MAG,PRI: 0,2
- BIS: 0,4 (M), 3,4 (P)
- LOR: 3,2
- NIN: 3,3
- Level 1 SPELLの数 = キャラクタのレベル-覚えるレベル
- Level 2 SPELLの数 = Level 1 SPELLの数-レベルごとの差
例:
- MAGE,PRIEST Level
- 1: 2/0/0/0/0/ 0/0 (KATINO,HALITO, DIOS,BADIOSは必ず覚えているため特例)
- 2: 2/0/0/0/0/ 0/0
- 3: 3/1/0/0/0/ 0/0
- 4: 4/2/0/0/0/ 0/0
- 5: 5/3/1/0/0/ 0/0
- (中略)
- 12: 9/9/8/6/4 2/0
- 13: 9/9/9/7/5/ 3/1
- BISHOP
- 1M: 2/0/0/0/0/ 0/0 P: 0/0/0/0/0/ 0/0
- 2M: 2/0/0/0/0/ 0/0 P: 0/0/0/0/0/ 0/0
- 3M: 3/0/0/0/0/ 0/0 P: 0/0/0/0/0/ 0/0
- 4M: 4/0/0/0/0/ 0/0 P: 1/0/0/0/0/ 0/0
- 5M: 5/1/0/0/0/ 0/0 P: 2/0/0/0/0/ 0/0
- (以下略)
覚えるSPELL
- 覚えるSPELL数>0であるレベルごとに
- 覚えていないSPELLごとに、
- 乱数(0..29)<IQまたはPIETY or そのレベルでは1つも覚えていない なら、 そのSPELLを覚える
- 覚えていないSPELLごとに、
従って、レベルごとの先頭のSPELLは覚えられるレベルに上がった時は必ず覚える。 (例:PRIEST,MAGEがL3に上がったら、DILTO/MATUは必ず覚える。PRIESTの必須スペルはMATUじゃなくてMONTINOにして欲しかった)。
取得可能レベルになれば、必ず覚えるSPELL
- MAGE
- HALITO,KATINO, DILTO, MAHALITO, MORLIS, MAMORLIS, LAKANITO, MALOR
- PRIEST
- DIOS,BADIOS, MATU, LOMILWA, DIAL, DIALMA, LORTO, MALIKTO
覚えたSPELLの数がMPを超える場合は、MPはSPELLの数となる。
戦闘
友好的なモンスター
- パーティ内にGOODが1人以上いること
- モンスターのTYPEによって、友好になる確率が異なる (3-30%)
- 友好的な場合、モンスターは IDENTIFY済み
- FIGHTを選ぶと、GOODキャラクターが1/2000の確率でEVILになる
- EVILがGOODになることはない (移植版とは違う)
- ソース上 ALIGN := GOOD が書かれているのは、キャラクタ作成時だけ。
- ALIGN := EVIL はキャラクタ作成時と、有効的なモンスターと戦った時。
攻撃回数
値は 1-10まで。10を超えない。装備をEQUIPするとき(EQUIPCHR)に計算される(レベルアップのタイミングではない)
- FIG,SAM,LOR
- 1 + (レベル/5)
- NIN
- 1 + (レベル/5) + 1
- その他
- 1
ITEMの攻撃回数が上記より多ければ、ITEM側の値を使う ( max(基本,ITEM) )。
攻撃速度
後で書く
- Player
- Monster
- 驚いていなければ、乱数(0..7)+2
攻撃の表記
表示が異なるだけでダメージが変わるわけではない。
-
モンスターの種類により表示が異なる(DAM2ME)
- 0-5,10,11: SWINGS/THRUSTS/STABS/SLASHES/CHOPS
- 6,8,12,13: TEARS/RIPS/GNAWS/BITES/CLAWS
- 7,9: 上記2つを半々で表示
-
人間側(DAM2ENEMY)
- SWINGS/THRUSTS/STABS/SLASHES/CHOPS
モンスターの攻撃
後で書く
逃げる(Run)
自パーティ:
- 人数とSTRにより計算
- 4-6人: 38-3*階層
- 1-3人: 38-3*階層 + 20 - 5*人数
- 自パーティのOKなキャラクターのSTR合計>OKなモンスターのSTR合計 なら +20
- 10Fなら無条件に 計算値=-1
乱数(0..99)>上記の結果なら逃走失敗。つまり 10Fでは絶対に逃げられない。
- 6人パーティ、9Fなら 38-3*9 = 11%。STRが高くても31%。
- 6人パーティ、1Fなら 38-3*1 = 35%。STRが高くても55%。
モンスター:
- 逃走フラグが0なら逃げない
- 自パーティのOKなキャラクターのSTR合計>OKなモンスターのSTR合計 なら
- 乱数(0..99)<65 なら逃走
全滅 BADSTUFF
- 所持金は半分になる
- 所持品はそれぞれ 乱数(0..20)>LUCK なら消える
- 乱数(0..49)<階層 なら完全にLOST 。 10Fであれば20%の確率
- LOSTするかどうかは全滅時に決定。
状態
POISONED
毒の効果は整数値。POISON NEEDLEを食らうと+1。GAS BOMB、攻撃による毒化では1になる。
-
POISON NEEDLE → GAS BOMB なら毒効果は 1
-
GAS BOMB → POISON NEEDLE なら毒効果は 2
呪文
呪文は内部ではハッシュ値で管理されている。完全ハッシュではない。違う綴りでも呪文として受け付ける場合がある。 (例:TILTOWAIT→ SZYZYQ, AKPZZZ など)
入力された呪文文字列全体をハッシュ計算し、事前計算済みの配列を線形検索している。キャンプなど一部の呪文しか使えないところでは、ハッシュ値の直接比較も行なっている。
部分文字列を組み合わせて云々と書いてあるサイトがあるが、そんな面倒臭いことは行なっていない。そもそもメモリも少ないし、乗除算もないCPUなのよ。
MILWA/LOMILWA
微妙に処理が異なる。
- MILWA: ライトの点灯時間を 30+1d30 伸ばす。
- LOMILWA: ライトの点灯時間を 32000 にする。
ちなみに LofL のMILWAは 点灯時間を30+1d15 にするため、LOMILWAの効果をMILWAで上書きできてしまう。
点灯時間LIGHTはInteger(16bit)なので、LOMILWA後にMILWAを繰り返すと桁溢れするはず。LofLでMILWAの効果が変更されたのはそのためだろうか?
DI/KADORT
- 乱数(0..99)<4*VIT なら成功
- 成功しても VIT==3ならLOST, それ以外ならVIT-1
- 失敗したら、 DEAD→ASHES→LOST
VIT==3のキャラクターをDIするとLOSTするし、KADORTしてもLOST。 VIT<3 なら問題ない... (これはLofLも同様。移植版ではVIT<3がLOSTに修正されているようだ)
MALOR (TELEPORT)
- 最下層(10F):BOUNCE
- 20x20外、11Fより深い:ROCK - LOSTする
- 0Fより浅い:VOLCANO - 全員DEAD
- (0,0,0) 城
- その他0F:MOAT
- 0..24の乱数>AGILITYならDEAD
戦闘中 MALOR (SMALOR)
乱数で浅い階層に移動するのだが、最深部に行くようなコードがある。何か変。大小比較が逆か?
- 移動先X,Y座標は 0..19 の乱数
- 階層移動(この部分、間違ってるような。LofLとも違うし)
- while(乱数0..99<30) なら1階上(浅い階)へ移動
- さらに while(乱数0..99<10) なら1階上(浅い階)へ移動
- 迷宮最下層(SCNTOC.RECPERDK[ZMAZE])未満なら迷宮最下層になるように補正(?)
- 移動先が地上なら勝利チェックし、城へ戻る
- それ以外は迷宮内へ移動
HAMAN/MAHAMAN
- 13レベル以上しか使えない、詠唱後レベルが1つ下がる
- MAHAMANで追加されるはずの2つの効果は、BUGにより使われない
- 効果が乱数により選ばれる。
- 他機種の移植版では乱数により選ばれた3つの効果から1つを選べるが、Apple版はプレイヤーが介入できる余地がない。
- そのため、モンスターを黙らせるには延々とMAHAMANを唱える必要がある。下がるレベルを考えると割りに合わないと思う。
- しかも詠唱後、(乱数 mod レベル)==5 なら SPELL BOOKのSPELLを各々50%の確率で忘れる (BUT HIS SPELL BOOKS ARE MANGLED!)
Apple版 Wiz1のHAMAN/MAHAMANはバグのため使い物にならないと思う。LofLでは修正されてるっぽい。
-
BUG: RANDOM MOD (3 * MAHAMFLG) と書くべきところを、RANDOM MOD 3 * MAHAMFLG と書いている。MAHAMFLGは6(HAMAN), 7(MAHAMAN)。
- 本来の意図は HAMANで0-17, MAHAMANで0-20の乱数を生成する事だが…
- RANDOM MOD 3 で 0,1,2 の乱数を生成したあとで、6か7を掛けるコードになっている。結果は0,6,12 (HAMAN) と 0,7,14 (MAHAMAN)から選択される。
- cf. Mac GUI :: Re: Wizardry re-engineering
-
HAMAN
- 0: HAMCURE : DIALKO'S PARTY 3 TIMES - 全員にDIALKO、HP+9d8
- 6: HAMHEAL: HEALS PARTY! - 全員にMADI
- 12: HAMMAGIC: ZAPS MONSTER MAGIC RESISTANCE! - モンスターの魔法抵抗を無くす
-
MAHAMAN
- 0: (HAMANに同じ)
- 7: HAMSILEN: SILENCES MONSTERS! - モンスターを 其々5+乱数(0..4)の間黙らせる。
- 14: HAMTELEP: DESTROYS MONSTERS! - 全モンスターをDEADにする
-
BUGにより使われない効果
- 17:HAMPROT: SHIELDS PARTY - 全員のACを-10に (-10未満はそのまま)
- 18:HAMALIVE: RESSURECTS AND HEALS PARTY! - LOSTでなければ、生き返り+MADI
詠唱回数に制限があるように書いてあるページもあるが、そんなことはない。 MAHAMANを唱えてまでGREATER DAEMONを養殖する意味は無さげ...
- AD&D の limited wish, wish 相当 http://beoline.nobody.jp/zakkinh.html#091201
- 50回試しても出ない効果がある、という事例。罪作りなbugだ
MORLIS/MAMORIS
- 敵のACを3上げる。4ではない。無効化されない。
- 4上げると書かれているのは、どの書籍だっけ? 少なくとも Apple版のマニュアルではなさそう。
manual には MORISは “The effects are the same as s double strength DILTO spell.” と書かれてる。(sは原文ママ。typoだと思う) DILTOの項には具体的なAC減少数は記載されていない。 また、MAMORISの項は “Mamorlis causes all monsters to fear the party.” だけである。
実際には DILTO は敵グループのACを2上げ、MORILS/MAMORISは3上げる。doubleと書かれているが2倍になっていない。
TILTOWAIT
manual には “This spell will do from 10-100 hits point of damage.” と書かれてるが、実際は 10d15 ダメージ。
モンスター
see. Wizardry1/Apple/解析メモ/Monsters
モンスターの種類
モンスターの特性
以下はINTEGER
- MAG SPELLS: SPELLのLEVEL
- 唱える時に乱数(0..99)>30なら1レベル下げる。
- 以下、2つある呪文は乱数(0..99)>33なら1番目、他は後者の呪文をCAST
- 1: KATINO, HALITO
- 2: DILTO, HALITO (NES版は DILTO,SOPICなのでApple版のバグかも)
- 3: MOLITO, MAHALITO
- 4: DALTO, LAHALITO
- 5: LAHALITO, MADALTO
- 6: MADALTO, ZILWAN
- 7: TILTOWAIT
- ↑LEVELが合ってないSPELLがいくつかあるけど、意図的なのだろうか。NES版等も同様のようだ
- PRI SPELLS
- (MAGのようなレベル下げ処理なし)
- 以下、2つある呪文は乱数(0..99)>33なら1番目、他は後者の呪文をCAST
- 1: BADIOS
- 2: MONTINO
- 3: BADIOS,BADIAL
- 4: BADIAL
- 5: BADIALMA, BADI
- 6: LORTO, MABADI
- 7: MABADI
- BREATH
- 乱数(0..99)<60 でBREATH
- UNAFFECT - 呪文無効化率
以下はフラグ (BOOLEAN)
- WEPVSTY3 0..15
- SPPC 0..15
- 0: STONE
- 1: POISON
- 2: PARALYZE
- 3: CRITICALLY HIT
- 4: 眠る
- 5: 逃げる
- (別記)
- 6: 仲間を呼ぶ
- グループ内が5匹未満、乱数(0..99)<75 なら呼ぶ
モンスターの魔法に対する無効化・抵抗率
複数の敵に対するHIT呪文に限り、モンスターの属性が影響する (MAHALITO,LAHATITO,DALTO...)。 ダイスの個数が半分+1になる。 4d8 なら 3d8、 10d15 なら 6d15
-
0: LORTO, MALIKTO, MOLITO, TILTOWAIT (NONE/FRIENDS)
-
1: LITOKAN, MAHALITO, LAHALITO, (FIRE)
-
2: DALTO, MADALTO, (COLD)
-
LEVEL
-
UNAFFCT
- HIT POINTを減らす魔法に対する抵抗力
- (UNAFFCT>0 && 乱数(0..99)<UNAFFCT) または 乱数(0..99)<UNAFFCT で無効
- 2度チェックしているのでUNAFFCTが大きくなると、かなり当たりにくくなる
-
HOLD (MANIFO)
- 乱数(0..99)< 50+10*level で無効
-
SILENT (MONTINO)
- 乱数(0..99)<10*level で無効
-
SLAIN (BADI)
- 乱数(0..99)<10*Level で無効
-
SLEEP (KATINO)
- 乱数(0..99)<10*Level で無効
-
HITS (HALITO,LAHALITO,TILTOWAIT... BADIOS,BADIAL,...)
- 乱数(0..99)<UNAFFCT を2度チェック
-
ZILWAN
- 内部的には HITS, 10d200 として処理。
-
LAKANITO
- 乱数(0..99)<6*敵レベル で無効
-
MABADI
- 無効化されない
-
DILTO/MORIS/MAMORIS
- 無効化されない
例:
- WERDNA (Level 10, AC -7, UNAFFCT 70%)
- HITS系は9%しか当たらない (30%*30%)
- LAKANITOは40%当たる
- MABADIは必中
- VAMPIRE LORD (Level 20, AC -5, UNAFFCT 0%)
- HITS系は当たる
- LAKANITO/MONTINOは効かない
- GREATER DAEMON (Level 11, AC -3, UNAFFCT 95%)
- HITS系は0.25%しか当たらない
- LAKANITOは34%当たる
- MONTINOは効かない
アイテム
WEAPON
-
LS+2 > WERE SLAYER > LS+1 > DRAGON SLAYER
- DRAGON SLAYERの存在価値って... / テーブルの値が間違ってるんじゃないかなー、これ
-
THEVES DAGGER (or ESS+3) > MAGE MASHER > SS+1
Special Power
KoD/LofL以降で出てくる能力も含まれている。
- 0:Special Power無し
- 1-6:其々 ST, IQ, PI, VT, AG, LK を1増やす
- STR:MURASAMA BLADE
- IQ:MIND STONE (KoD)
- PIETY:STONE OF PIETY (KoD)
- LUCK:BLARNEY STONE (KoD), RABBIT'S FOOT (LoL)
- 7-12: 同、減らす
- STR:BAG OF EMERALDS (Lo
- PIETY:BOOK OF DEMONS (LoL)
- 13:20歳以上なら1歳若返る
- STONE OF YOUTH (KoD)
- 14:1歳加齢
- BAG OF GARNETS (LoL)
- 15:SAMRAIになる
- 16:LORDになる
- METAMORPH RING (KoD)
- 17:NINJAになる
- THIEVES DAGGER, BUTTERFLY KNIFE (LoL)
- 18:+50K GOLD
- 19:+50K EXP
- AMULET OF SKILL (KoD)
- 20:LOSTする
- DAMIEN STONE (KoD), AMULET OF SKILL (KoD)
- 21:全ステータスを正常に(MADI)
- 22:最大HPを+1 - SHURIKEN
- 23:パーティのHPを満タンに (BUGアリ)
- LORDS GARB, WERDNA'S AMULET
- STAFF OF CURING (KoD),
- ??:GREAT MAGE WAND (KoD)
- ??:COIN OF POWER (KoD)
EQUIP (EQUIPCHR)
- 20 - (level/5) - (luck/6) を計算。1未満は1に。
- class, race による補正を引く。1未満は1に。 (調査中)
拾う
- 特殊アイテムは、すでに持っているキャラクターは拾わない (BLUE RIBBONなど)
IDENTIFY
- 所有物ごとに IDENTIF : BOOLEAN フラグを持っている
- 鑑定の際の入力文字の範囲チェックがミスっている
- REPEAT - UNTIL (文字>0) OR (文字<=所持数) になっている
- 正しくは OR ではなく AND
- IDENTIFYで操作するレコード位置は ORD(INCHAR) - ORD('0') で求めている
- 鑑定に成功すると該当の持ち物の IDENTIF : BOOLEAN ビットを立てる
- 0-8以外の文字を入力した場合、鑑定に成功するとBISHOPの持ち物レコード以外のデータが書き換えられてしまう
- 有名なのは SUPER BISHOP だが、それ以外の入力(英字など)でも、何かが書き換えられているはず http://www.tk421.net/wizardry/wiz1walk.shtml
CHEST/TRAP
呪文と異なり 罠名は素直に文字列比較されている。
出現頻度
種類
- 0: TRAPLESS CHEST
- 1: POISON NEEDLE
- 2: GAS BOMB
- 3:
- 3-0 STUNNER
- 3-1 EXPLODING BOX
- 3-2 SPLINTERS
- 3-3 BLADES
- 3-4 STUNNER
- 4: TELEPORTER
- 5: ANTI-MAGE
- 6: ANTI-PRIEST
- 7: ALARM
INSPECT
- 1つの宝箱につき1人1回まで (2回目は YOU ALREADY LOOKED!)
- 乱数(0..99)が下記の値以下なら成功。ただし最大95まで (必ず 5%は失敗)。
- THIEF: AGI*6
- NINJA: AGI*4
- その他: AGI
- 失敗した場合、乱数(0..19)>AGIなら開封してしまう
- その他は乱数(0..7, 0..4)を答える
- クラスによって回答が異なることはない。
- cf. Wizardry(NES) 解析 - 宝箱開封
CALFO
乱数(0..99)<95 なら正解。その他は乱数(0..7, 0..4)を答える。
DISARM
- THIEF,NINJA
- 乱数(0..69)< level-階層+50 なら成功
- その他
- 乱数(0..69)< level-階層 なら成功
- 開封失敗時
- 乱数(0..19)<AGIならDISARM FAILED、その他はYOU SET IT OFF!
OPEN
罠があっても、乱数(0..999)<level なら何事もなく開けられる。
罠(ANTIPM)
- 1: POISON - 1ターンごとに受けるダメージ+1
- 2: GAS - 全員に対して 乱数(0..19)<LUCKSKIL[3] であれば、1ターンごとに受けるダメージ=1
- POISONを複数回受けてダメージが2以上担っている場合は軽減されてしまう
- 3: CROSSBOW BOLT,EXPLODING BOX,SPLINTERS,BLADES,STUNNER へ
- 4: TELEPORTER - ランダムに同一階の(0..19,0..19)へ移動。パーティーの向きも乱数により変化。
- 5: ANTI-MAGE, 6: ANTI-PRIEST
- 下表参照
- 7: ALARM
MAGE/SAMURAIはANTI-MAGE時、 PRIEST/BISHOPはANTI-PRIESTのときに影響を受ける。 乱数(0..19)<LUCKSKIL[4]が成立するかどうかで影響が異なる。
クラス | 成立 | 不成立 |
---|---|---|
MAGE | PARALYZED | STONED |
SAMURAI | - | PARALYZED |
PRIEST | PARALYZED | STONED |
BISHOP | - | PARALYZED |
CROSSBOW BOLT,EXPLODING BOX,SPLINTERS,BLADES,STUNNER の威力は階層によっても異なる。
- 0:CROSSBOW BOLT - 1人に 階層d8。 10Fなら10d8
- 1:EXPLODING BOX - 各々に 50%の確率で階層d8、50%*50%に階層d5
- 2:SPLINTERS - 各々に 70%の確率で階層d6、30%*70%に階層d4
- 3:BLADES - 各々に 30%の確率で階層d12、70%*30%に階層d7
- 4:STUNNER - PARALYZE。回避できない
saving throw (0-4): 運勢値,LUCKSKIL[0..4]
5種類、値は1以上 (0..31)
- 基本値は 20 - (level/5) - (LUCK/6)
- これに CLASSとRACEによる補正がかかる。補正後1未満になるなら1にする。
補正: EQUIPCHR 基本的には少ないほど有利なはずだが
-
FIG: -3,0,0,0,0
-
MAG: 0,0,0,0,-3
-
PRI: 0,-3,0,0,0
-
THI: 0,0,0,-3,0
-
BIS: 0,-2,-2,0,-2
-
SAM: -2,0,0,0,-2
-
LOR: -2,-2,0,0,0
-
NIN: -3,-2,-4,-3,-2
-
HUMAN: -1,0,0,0,0
-
ELF: 0,0,-2,0,0
-
DWARF: 0,0,0,-4,0
-
GOME: 0,-2,0,0,0
-
HOBBIT: 0,0,0,0,-3
-
0: RESULT
- 攻撃による POISONED, PARALYZED - 乱数(0..19)>savingなら影響を受けない
- CRITICALLY HIT - 乱数(0..19)>saving or 乱数(0..100)>Level*2(最大50)なら、影響を受けない
-
1:攻撃によるSTONED
- 乱数(0..19)>saving なら影響を受けない
-
2: (未使用??)
-
3: Breath: DOBREATH
- 乱数(0..19)>saving なら Breathのダメージが半分になる。端数切り上げ。
-
3: GAS BOMB: DOTRAPDM
- 各々のキャラクターごとに、乱数(0..19)<savingならPOISONED。なぜかここは "<" にて判定。
- Wizardry(NES) 解析 - 宝箱罠 では「先頭キャラ の運勢値4」となっていて AppleII 版と異なる。
- 各々のキャラクターごとに、乱数(0..19)<savingならPOISONED。なぜかここは "<" にて判定。
-
4: Spell: DOSILENC
- 魔法による SILENCED:100-5*saving (party)、10*敵Level (enemy monster)
- 乱数0..99が指定した値未満なら、影響を受けない
- レベル10以上のモンスターは黙らせられない? GREATER DAEMOはレベル11...
- 魔法による SILENCED:100-5*saving (party)、10*敵Level (enemy monster)
-
4: ANTI-PRIEST/MAGE: ANTIPM
- 影響を受けるclassのとき、乱数(0..19)<savingならPARALYZED, 失敗するとSTONED
- SAMRAI,BISHOPは乱数(0..19)'''<'''saving なら何も起こらない。失敗するとPARALYZED
- レベル上がったほうが影響を受けやすくなってるような...
POISON/STONEは排他に見える。既にPOISONならSTONEにならない??? POISON NEEDLE, STUNNERは回避できない。
その他
乱数(0..99)が下記の値未満で回避。
- HELD(ASLEEP):50+10*level (敵味方共に)
- SLAIN:10*level (敵味方共に)
- 10 Level以上ならSLAINにならない...??
- SLEPT(KATINO):20*level
- 5 Level以上の敵にはKATINOは効かない...??
- HITS (HALITOなど)
- 計算式がおかしい気がする
- 魔法抵抗があれば、魔法抵抗値<乱数(0..99)のときにダメージを0にする
- さらに、魔法抵抗値>乱数(0..99)のときもダメージを0にする
- なので、モンスターの魔法抵抗はかなり高い
- POISON NEEDLEは回避できない (必ず+1される)
AD&D 参照。
- http://beoline.nobody.jp/kod.html#120324
- 上記サイトの記述はNES版解析を元にしており、AppleII版と異なる。AppleII版の方がAD&Dに近そう。
- NES版は移植に伴うバグがあることは有名
資料によっては運勢値1-5
その他乱数
- BISHOPのIDENTIFY
- 乱数(0..99)< 10+(5*level) なら SUCCESS
- 乱数(0..99)< 35-(3*level) なら EQUIP & CURSED
- cf. Wizardry(NES) 解析 - アイテム鑑定
MAP
cf. https://groups.google.com/d/msg/comp.sys.apple2/aI5ob1mLUwY/C0h8mGZiBIMJ
- SQRETYPE, (AUX0,AUX1,AUX2)
- 0: NORMAL
- 1: STAIRS to (Floor, North, East)
- 2: PIT (AUXはダメージ計算に用いる)
- 3: CHUTE to (Floor, North, East)
- 4: SPINNER (回転床)
- 5: DARK
- 6: TELEPORT to (Floor, North, East)
- 7: OUCHY (same as PIT)
- 8: BUTTONZ (elevator)
- (0, 最下層, 再上層)- 通常のエレベーター。1Fにあるのは (0,4,1), 4-9Fは (0,9,4)
- AUX0=1ならランダム
- 9: BOUNCE to (Floor, North, East)
- 10: FIZZLE (沈黙)
- 11: メッセージ (AUX2)
- 12: 特別な敵
メッセージサブタイプ(AUX2)
- 2-11:拾う、WADE、SEARCH(Y/N)、ランダムTELEPORT、ITEMによる通行許可、属性による通行許可、LIGHT、城に戻る、なぞなぞ、PAY GOLD
- WADE (0-6固定 または乱数(0..6))、DEADになる場合は元々ASHES/LOSTなら変化なし
- 0: 生き返る。最大HP-8。最大HP<=0ならDEAD
- 1: 1歳若返り。IQ,PIETYが3ならDEAD。IQとPIETYが1減る
- 2: 毒を受ける(毒カウントが1になる)
- 3,4,5: 各々 ASLEEP,PARALYZED,STONEDになる。
- 6: DEADなら、乱数(0..9)<3で生き返る。失敗するとASHES
謎
6FのE19N7に何かあるっぽいのだが...
- cf. WizardryArchives: The Lair of Werdna
- cf. Wizardry Fan Page by Snafaru - Mook Trivia - cf. 得物屋 - 得物屋BBS-38
移動
DISBAND
- LOSTXYL[1..3]にX,Y,深さを格納する
- 25週分 加齢する
- 2回で1年弱。頻繁に使うコマンドではないと思う
INSPECTかRECOVERで戻る。
TEMPLE of CANT
-
DEAD
- 乱数(0..99)> 50+(3*VIT) なら ASH
-
ASHES
- 乱数(0..99)> 40+(3*VIT) なら LOST
-
年齢は乱数(1..52)週加算される
-
DI/KADORT と異なり、VIT=3の条件判定はない
BUGS
- Mac GUI :: Re: Wizardry re-engineering
- bug.1 BUBBLY SLIME の画像が壊れている件
- "make a DUPLICATE/SCENARIO" がおかしい。マスターディスクには正しい画像があるが、デュプリケートディスクを作る際に壊している
- bug.2 MVCURSOR() の処理について
- bug.3 BISHOPのIdentify 時に呪われたアイテム名に -1 が表示される件
- bug.4 HAMAN と MAHAMANの問題
- bug.1 BUBBLY SLIME の画像が壊れている件
System & Program
Apple Pascal (UCSD p-system)で書かれている。
-
Apple II発売が1977年
-
Apple Pascalは1979年 (cf. Apple Pascal - Wikipedia)
-
Wizardry 1 発売が1981年 (開発に5年かかったとどこかで読んだ気がするが...)
メモリが圧倒的に足りないので、プログラムの一部は overlay されてて、適宜ディスクから読み出すようになっている。 (だから頻繁にアクセスが発生する。戦闘・キャンプ・店などに出入りするだけでディスクアクセスが発生するのはそのせい)
- ディスク容量も少なく(160KB)、アクセスには時間がかかる (cf. Disk II - Wikipedia)
- AppleIIで利用可能なメモリ(48KB)のうち、先頭16KB($0000-$4000)はシステムによって使われる(Hi-Res Graphics を1画面使う場合)。残り32KBに全てを納める必要がある。
- Apple Pascalのメモリマップは Apple Pascal Operating System Reference Manual P.255にある
- $B000以降はSYSTEM.PASCALが利用
- $AFFF〜スタックが利用
- Koダイヤモンドは砕けない
- 「内部データに比してもあまりにもディスクアクセスが多すぎたのは、実際はマシン性能以上に、Apple][版やPC版のコーディングがあまりにも稚拙すぎたためともいわれている」と書かれているが...
- そんなことはない。内部データは各ステップで保存するように明示されている(意図的に auto save している)。
- auto save に加えて、メモリ不足のための overlay処理、 monster等の個別データのフロッピーアクセスが遅くなった原因。エンカウント時に必ずディスクアクセスが入るのは、メモリ不足に起因している。
- ファミコン版はROMアクセスなので同じ処理をしても高速
- PC8801/FM-7などの国産8bit機はグラフィック用メモリ空間が別だし、ディスク容量も大きく・高速
ファミコン版は広告によると2メガROMなので、2Mbit=256Kbyteの領域が使えた。うち128KBがプログラム用なのでAppleII版の4倍以上の領域が使えた。
- NES研究室 : メモリマップ
- Wizardry(NES) プログラム基本仕様
- 「16K PRGROM 8個」「8K CHRROM 16個」(16*8 + 8*16 = 256KB)
- Wizardry (NES) Memory Map
- 「RAM ($0000-$07FF)」 (2KB)
他サイト・文書の誤ってると思われる記述
- ゲームカタログ@Wiki 〜クソゲーから名作まで〜 - Wizardry
- 「この「独特の言語」は実際にアップルのwizardryのプログラムの中で容量節約のためにユーザー定義関数として作られて使われていたらしい。「1-8の乱数を発生」など」
- ハッシュ値で扱われていたという話(これは正しい)に尾ひれがついたものと思われる。
- 内部では IF SPELL=DIOS THEN ... のように比較命令で素直に分岐している。Cみたいに関数の配列が使えれば、完全ハッシュを使って楽に書けただろうに。
- cf. Sandstorm:ウィザードリィの呪文名に関しての誤解と由来についての真説 - livedoor Blog(ブログ)
- 「この「独特の言語」は実際にアップルのwizardryのプログラムの中で容量節約のためにユーザー定義関数として作られて使われていたらしい。「1-8の乱数を発生」など」
その他
参考書
- Apple2 1976‐1986
- Sophistication and Simplicity: The Life and Times of the Apple II Computer
- ロールプレイングゲームサイド Vol.1
- ロールプレイングゲームサイド Vol.2
- Dungeons and Desktops: The History of Computer Role-Playing Games