// Enchant simulator Version1
// By Majoruka

// アイテム定義
var ITEM_WEAPON = 0;	// アイテムフラグ（武器）
var ITEM_ARMOR = 1;		// アイテムフラグ（防具）
var ITEM_SCROLL = 2;	// アイテムフラグ（スクロール）

// 強化スク定義
var SELECT_NONE = -1;
var SELECT_ZEL = 1;
var SELECT_DAI = 2;
var SELECT_bZEL = 3;
var SELECT_bDAI = 4;
var SELECT_cZEL = 5;
var SELECT_cDAI = 6;

var IMG_DIR = "image/";

// ItemTbl Itemフラグ,名前,Img,OE安全値,現在のOE値,蒸発回数
// ItemTbl Itemフラグ,名前,Img,Itemの種類,使用枚数,未使用
var arItems = new Array(
ITEM_ARMOR, "ボーン ヘルム", "SkullHelmet.gif", 0, 0, 0,
ITEM_ARMOR, "ボーン アーマー", "BoneArmor.gif", 0, 0, 0,
ITEM_ARMOR, "ボーン シールド", "BoneShield.gif", 0, 0, 0,
ITEM_ARMOR, "Ｔシャツ", "T-shirt.gif", 4, 0, 0,
ITEM_ARMOR, "エルブン プレート メイル", "EPM.gif", 6, 0, 0,
ITEM_ARMOR, "レッド ドラゴン スケイル メイル", "DSM.gif", 4, 0, 0,
ITEM_ARMOR, "インビジビリティ クローク", "COI.gif", 4, 0, 0,
ITEM_ARMOR, "マジック クローク", "COMR.gif", 4, 0, 0,
ITEM_ARMOR, "プロテクションクローク", "COP.gif", 4, 0, 0,
ITEM_ARMOR, "エルブン クローク", "EC.gif", 6, 0, 0,
ITEM_ARMOR, "エルブン シールド", "ES.gif", 6, 0, 0,
ITEM_ARMOR, "リフレクション シールド", "SoR.gif", 4, 0, 0,
ITEM_ARMOR, "ブレス オブ エルム", "BOE.gif", 6, 0, 0,
ITEM_ARMOR, "マジック ヘルム", "HOMR.gif", 4, 0, 0,
ITEM_ARMOR, "パワー グローブ", "PowerGloves.gif", 4, 0, 0,
ITEM_ARMOR, "アイアン ブーツ", "IronBoots.gif", 4, 0, 0,
ITEM_ARMOR, "アイアン グローブ", "IronGloves.gif", 4, 0, 0,
ITEM_WEAPON, "レイピア", "Rapier.gif", 6, 0, 0,
ITEM_WEAPON, "シルバー ロング ソード", "SLS.gif", 6, 0, 0,
ITEM_WEAPON, "ロングボウ", "LongBow.gif", 6, 0, 0,
ITEM_WEAPON, "刀", "Katana.gif", 6, 0, 0,
ITEM_WEAPON, "ツルギ", "Tsurugi.gif", 6, 0, 0,
ITEM_WEAPON, "マナ スタッフ", "Staff.gif", 6, 0, 0,
ITEM_WEAPON, "フォース スタッフ", "Staff.gif", 6, 0, 0,
ITEM_SCROLL, "武器強化スクロール", "DAI.gif", SELECT_DAI, 0, 0,
ITEM_SCROLL, "防具強化スクロール", "ZEL.gif", SELECT_ZEL, 0, 0,
ITEM_SCROLL, "武器強化スクロール", "bDAI.gif", SELECT_bDAI, 0, 0,
ITEM_SCROLL, "防具強化スクロール", "bZEL.gif", SELECT_bZEL, 0, 0,
ITEM_SCROLL, "武器強化スクロール", "cDAI.gif", SELECT_cDAI, 0, 0,
ITEM_SCROLL, "防具強化スクロール", "cZEL.gif", SELECT_cZEL, 0, 0
);

// Msg群
var MSG001 = "を選択しました。対象アイテムを選択してください。";
var MSG002W = "が一瞬蒼く光りました。";
var MSG002A = "が一瞬 銀色に光ります。";
var MSG003W = "がチラッと 蒼色に 光ります。";
var MSG003A = "がチラッと 銀色に 光ります。";
var MSG004W = "がしばらく強烈に蒼く光り、蒸発してなくなりました。";
var MSG004A = "が強烈に 銀色に光ったあと、蒸発してなくなりました。";
var MSG005 = "がしばらく強烈に光ったが、幸い無事にすみました。";
var MSG006 = "何も起きませんでした。";
var MSG007 = "が一瞬 黒く 光ります。";

var SelectItem;	// Select item Index

// Blessed enchant table
var bEnchantTbl = new Array(
1, 1, 2, 2, 3, 3,	// 0
1, 1, 2, 2, 3, 3,	// 1
1, 1, 2, 2, 3, 3,	// 2
1, 1, 1, 2, 2, 2,	// 3
1, 1, 1, 2, 2, 2,	// 4
1, 1, 1, 2, 2, 2,	// 5
1, 1, 1, 1, 1, 1	// 6-
);

function GetItemName(Value, Name)
{
	var Num = ((Value >= 0) ? '+': '') + Value;
	var Ret = Num + " " + Name;
	return Ret;
}


// 更新
function Update()
{
	var Index = 1;
	for (I = 0; I < arItems.length; I += 6) {
		var objTgt = document.getElementById('ItemBox' + Index);
		if (arItems[I] != ITEM_SCROLL) {
			objTgt.alt = GetItemName(arItems[I+4], arItems[I+1])  + '\n蒸発回数: ' + arItems[I+5];
		}
		else {
			objTgt.alt = arItems[I+1] + '\n使用回数: ' + arItems[I+4];
		}
		objTgt.src = IMG_DIR + arItems[I+2];
		Index++;
	}
}
function UpdateAlt(Index)
{
	var objTgt = document.getElementById('ItemBox' + (Index+1));
	if (arItems[Index*6] != ITEM_SCROLL) {
		objTgt.alt = GetItemName(arItems[Index*6+4], arItems[Index*6+1]) + '\n蒸発回数: ' + arItems[Index*6+5];
	}
	else {
		objTgt.alt = arItems[Index*6+1] + '\n使用回数: ' + arItems[Index*6+4];
	}
}

// エンチャント判定
function Enchant(Src, Dest)
{
	var MaxSafeEnchant = arItems[Dest * 6 + 3];
	var CurrentEnchant = arItems[Dest * 6 + 4];
	switch(arItems[Src * 6 + 3]) {
	case SELECT_ZEL:
		if (arItems[Dest * 6] != ITEM_ARMOR) {ItemNone();return;}
		if (MaxSafeEnchant <= CurrentEnchant) {
			// OE
			var OEVal = CurrentEnchant;
			if (MaxSafeEnchant == 0) OEVal += 2;
			if (Math.floor(Math.random() * OEVal)) {
				// ENE
				ItemEnd(Dest);
				break;
			}
			// +9over check
			if (CurrentEnchant >= 9) {
				if (Math.floor(Math.random() * 2)) {
					ItemUnchange(Dest);
					break;
				}
			}
		}
		ItemChange(Dest, 1);
		break;
	case SELECT_DAI:
		if (arItems[Dest * 6] != ITEM_WEAPON) {ItemNone();return;}
		if (MaxSafeEnchant <= CurrentEnchant) {
			// OE
			if (Math.floor(Math.random() * 3)) {
				// ENE
				ItemEnd(Dest);
				break;
			}
			// +9over check
			if (CurrentEnchant >= 9) {
				if (Math.floor(Math.random() * 2)) {
					ItemUnchange(Dest);
					break;
				}
			}
		}
		ItemChange(Dest, 1);
		break;
	case SELECT_bZEL:
		if (arItems[Dest * 6] != ITEM_ARMOR) {ItemNone();return;}
		if (MaxSafeEnchant <= CurrentEnchant) {
			// OE
			var OEVal = CurrentEnchant;
			if (MaxSafeEnchant == 0) OEVal += 2;
			if (Math.floor(Math.random() * OEVal)) {
				// ENE
				ItemEnd(Dest);
				break;
			}
			// +9over check
			if (CurrentEnchant >= 9) {
				if (Math.floor(Math.random() * 2)) {
					ItemUnchange(Dest);
					break;
				}
			}
		}
		var TblRef = CurrentEnchant < 0 ? 0: CurrentEnchant;
		var AddCount = bEnchantTbl[((TblRef > 6) ? 6: TblRef) * 6 + Math.floor(Math.random() * 6)];
		ItemChange(Dest, AddCount);
		break;
	case SELECT_bDAI:
		if (arItems[Dest * 6] != ITEM_WEAPON) {ItemNone();return;}
		if (MaxSafeEnchant <= CurrentEnchant) {
			// OE
			if (Math.floor(Math.random() * 3)) {
				// ENE
				ItemEnd(Dest);
				break;
			}
			// +9over check
			if (CurrentEnchant >= 9) {
				if (Math.floor(Math.random() * 2)) {
					ItemUnchange(Dest);
					break;
				}
			}
		}
		var TblRef = CurrentEnchant < 0 ? 0: CurrentEnchant;
		var AddCount = bEnchantTbl[((TblRef > 6) ? 6: TblRef) * 6 + Math.floor(Math.random() * 6)];
		ItemChange(Dest, AddCount);
		break;
	case SELECT_cZEL:
		if (arItems[Dest * 6] != ITEM_ARMOR) {ItemNone();return;}
		if (-6 >= CurrentEnchant) {
			// OE
			var OEVal = Math.abs(CurrentEnchant);
			if (Math.floor(Math.random() * OEVal)) {
				// ENE
				ItemEnd(Dest);
				break;
			}
		}
		ItemChange(Dest, -1);
		break;
	case SELECT_cDAI:
		if (arItems[Dest * 6] != ITEM_WEAPON) {ItemNone();return;}
		if (-6 >= CurrentEnchant) {
			// OE
			if (Math.floor(Math.random() * 3)) {
				// ENE
				ItemEnd(Dest);
				break;
			}
			// -9over check
			if (CurrentEnchant <= -9) {
				if (Math.floor(Math.random() * 2)) {
					ItemUnchange(Dest);
					break;
				}
			}
		}
		ItemChange(Dest, -1);
		break;
	}
	arItems[Src * 6 + 4]++;
	//いちいち選択しなおすの面倒なのでコメントアウト
	// SelectItem = SELECT_NONE;
}

function ItemEnd(Index)
{
	var Value = GetItemName(arItems[Index*6+4], arItems[Index*6+1]);
	if (arItems[Index*6] == ITEM_ARMOR) {
		OutputMsg(Value + MSG004A);
	}
	else {
		OutputMsg(Value + MSG004W);
	}
	arItems[Index*6+4] = 0;
	arItems[Index*6+5]++;
}
// 変化なし
function ItemUnchange(Index)
{
	var Value = GetItemName(arItems[Index*6+4], arItems[Index*6+1]);
	OutputMsg(Value + MSG005);
}

function ItemChange(Index, Add)
{
	var Value = GetItemName(arItems[Index*6+4], arItems[Index*6+1]);
	switch (Add) {
	case 1:
		OutputMsg(Value + ((arItems[Index*6] == ITEM_ARMOR) ? MSG002A: MSG002W));
		break;
	case -1:
		OutputMsg(Value + MSG007);
		break;
	case 2:
	case 3:
		OutputMsg(Value + ((arItems[Index*6] == ITEM_ARMOR) ? MSG003A: MSG003W));
	}
	arItems[Index * 6 + 4]+= Add;
}

function ItemNone()
{
	OutputMsg(MSG006)
}

function OutputMsg(Msg)
{
	var Output = document.getElementById('OutMsg').innerHTML;
	if (Output.length > 150) {
		Output = Output.substring(Output.length-150, Output.length);
	}
	document.getElementById('OutMsg').innerHTML = Output + '<br>' + Msg;
	window.status = Msg;
}

function Click(Index)
{
	if (arItems[Index * 6] == ITEM_SCROLL) {
		// Selected enchant scroll
		SelectItem = Index;
		OutputMsg(arItems[Index * 6 + 1] + MSG001);
	}
	else if (SelectItem != SELECT_NONE) {
		// Enchant!
		Enchant(SelectItem, Index);
		UpdateAlt(SelectItem);
		UpdateAlt(Index);
	}
}

// 初期化
function Reset()
{
	SelectItem = SELECT_NONE;
	for (I = 0; I < arItems.length; I += 6) {
		arItems[I + 4] = 0;
		arItems[I + 5] = 0;
	}
	Update();
}

// 初期表示時
function init()
{
	Reset();
}
