戦闘モジュール3

忙しいのですごく簡単なスクリプトを書いてみる。行動順、回避、技などを考えなければ非常に楽である。
同じようなのを作ったのは2年以上前になるのか・・・月日が経つのは早い。
ゾークとローグのあいのこみたいなのを作りたいのだが、まずはこのくらい単純なものから作っていこうか。
前のやつはそのまま拡張して複雑なものを作れるものだが、最初からしっかりしたデータを作っていくのは面倒である。

(defun battle (data-a data-b)
  (let ((max-a (cadr data-a))
        (max-b (cadr data-b)))
    (while (and (plusp (cadr data-a))
                (plusp (cadr data-b)))
      (format t "~%〈~A ~A/~A   ~A ~A/~A〉~%"
        (car data-a) (cadr data-a) max-a
        (car data-b) (cadr data-b) max-b)
      (labels ((ndm (n m)
                 (let ((c 0))
                   (dotimes (a n (+ c n))
                     (incf c (random m)))))
               (damage (p1 p2)
                 (let ((dmg (max 0 (- (ndm (nth 2 p1) (nth 3 p1)) (nth 4 p2)))))
                   (if (zerop dmg)
                       (format t "~Aの攻撃! ~Aはダメージを受けていない!~%" (car p1) (car p2))
                     (progn (format t "~Aの攻撃! ~Aは~Aダメージを受けた!~%" (car p1) (car p2) dmg)
                       (decf (cadr p2) dmg))))))
        (damage data-a data-b)
        (damage data-b data-a))
      (refresh-screen)
      (do-events)))
  (if (plusp (cadr data-a))
      (format t "~%~Aは倒れた!~%~Aの勝利!" (car data-b) (car data-a))
    (if (plusp (cadr data-b))
        (format t "~%~Aは倒れた!~%~Aの勝利!" (car data-a) (car data-b))
      (format t "~%相打ちとなった!~%引き分けだ・・・"))))

;例 (名前 HP n m DEF) ダメージ計算: 攻撃側:nDm − 被ダメ側:DEF
(battle '("きのこ族" 30 2 6 2) '("たけのこ族" 50 1 7 3))
|
〈きのこ族 30/30   たけのこ族 50/50〉
きのこ族の攻撃! たけのこ族は3ダメージを受けた!
たけのこ族の攻撃! きのこ族はダメージを受けていない!

〈きのこ族 30/30   たけのこ族 47/50〉
きのこ族の攻撃! たけのこ族は4ダメージを受けた!
たけのこ族の攻撃! きのこ族は4ダメージを受けた!

...中略...

〈きのこ族 3/30   たけのこ族 19/50〉
きのこ族の攻撃! たけのこ族は7ダメージを受けた!
たけのこ族の攻撃! きのこ族は5ダメージを受けた!

きのこ族は倒れた!
たけのこ族の勝利!