セッション卓1

「セッション卓1」の編集履歴(バックアップ)一覧に戻る

セッション卓1 - (2013/06/29 (土) 22:04:19) の編集履歴(バックアップ)


embedDiceBot = new function()
{
// 設定
var columnNumber = 2; // ダイス変換を行うカラムは何個目か
var formNumber = 3; // ダイス変換を行うフォームはソース中の何番目か

function diceInit() {
	// dice pattern
	dicePattern = new RegExp(/([\s\S]*)\[(\d+)(d)(\d+)([\d-+]+)?\]([\s\S]*)/i);

	columnNumber = columnNumber -1;
	formNumber = formNumber -1;
	targetForm = document.forms[formNumber];
	targetColumn = document.forms[formNumber].elements[columnNumber];

	result = [];
	sum = 0;
}

function pickupDice(diceArr) {
	preMsg = diceArr[1];
	diceNum = diceArr[2];
	diceNumber = diceArr[4];
	revision = diceArr[5];
	if (revision==undefined) {
		revision = '';
	}
	afterMsg = diceArr[6];

	if (diceNum<1) {
		alert('ダイスを何個振るか、1以上で指定してください');
		return false;
	}

	if (diceNumber<2) {
		alert('d2以下のダイスはありません');
		return false;
	}

	return true;
}

function diceGenerater(number){
	return Math.round(Math.random()*(number-1))+1;
}

function diceRoll() {
	for (var i=0; i<diceNum; i++) {
		result.push(diceGenerater(diceNumber));
		sum += result[i]
	}

	return result;
}

function revisionSum() {
	if (revision) {
		if (revision.match(/[-+]{2,}/)) {
			alert('+-が連続しています。');
			sum += revision;
			return false;
		}

		var revs = revision.match(/([-+])(\d+)/g);
		for (var j=0; j<revs.length; j++) {
			var op = revs[j].substr(0,1);
			var rev = revs[j].substr(1);
			if (op=='+') {
				sum = eval(sum) + eval(rev);
			} else if (op=='-') {
				sum = eval(sum) - eval(rev);
			} else {
				alert('式が正しくありません。');
				sum += revision;
				return false;
			}
		}
	}

	return sum;
}

function outputDiceResult() {
	return preMsg+'['+diceNum+dice[3]+diceNumber+revision+'] = ('
		+result.join(',')+') = '
		+sum
		+' '+afterMsg;
}

window.onload = function (){
	// Init
	diceInit();

	targetForm.onsubmit = function diceConvert() {
		var comment = targetColumn.value;

		if (comment!='' || comment==undefined) {
			dice = comment.match(dicePattern);

			if (dice!=null) {
				if (pickupDice(dice)==false) {
					return false;
				}

				// DiceRoll
				diceRoll();
				revisionSum();

				// output
				var convert = outputDiceResult();
				this.elements[1].value = convert;
			}

			return true;
		} else {
			return false;
		}

		return false;
	}
}
}