Artifact [6a0636840a]

Artifact 6a0636840a8b227735b3f49d5d89357cf71d538e:


# limited move options

global pieceValTenjiku = Dict{String, Int64}("_" => 0, "bishop" => 10, "bishop general" => 21, "blind tiger" => 3, "copper general" => 2, "chariot soldier" => 18, "dog" => 1, "drunk elephant" => 3, "dragon horse" => 12, "dragon king" => 14, "ferocious leopard" => 3, "flying ox" => 16, "flying stag" => 9, "fire demon" => 83, "free boar" => 16, "free eagle" => 22, "gold general" => 3, "great general" => 45, "heavenly tetrarch" => 12, "horned falcon" => 19, "iron general" => 2, "king" => 500, "kirin" => 3, "lance" => 6, "lion hawk" => 25, "lion" => 18, "multi general" => 6, "knight" => 1, "pawn" => 1, "phoenix" => 3, "queen" => 22, "rook" => 12, "reverse chariot" => 6, "rook general" => 23, "silver general" => 2, "soaring eagle" => 18, "side mover" => 7, "side soldier" => 7, "vice general" => 39, "vertical mover" => 7, "vertical soldier" => 8, "water buffalo" => 17, "whale" => 10, "white horse" => 14)

global rangeJumpPriority = Dict{String, Int64}("_" => 0, "bishop" => 0, "bishop general" => 1, "blind tiger" => 0, "copper general" => 0, "chariot soldier" => 0, "dog" => 0, "drunk elephant" => 0, "dragon horse" => 0, "dragon king" => 0, "ferocious leopard" => 0, "flying ox" => 0, "flying stag" => 0, "fire demon" => 0, "free boar" => 0, "free eagle" => 0, "gold general" => 0, "great general" => 3, "heavenly tetrarch" => 0, "horned falcon" => 0, "iron general" => 0, "king" => 4, "kirin" => 0, "lance" => 0, "lion hawk" => 0, "lion" => 0, "multi general" => 0, "knight" => 0, "pawn" => 0, "phoenix" => 0, "queen" => 0, "rook" => 0, "reverse chariot" => 0, "rook general" => 1, "silver general" => 0, "soaring eagle" => 0, "side mover" => 0, "side soldier" => 0, "vice general" => 2, "vertical mover" => 0, "vertical soldier" => 0, "water buffalo" => 0, "whale" => 0, "white horse" => 0)

global pieceValChu = Dict{String, Int64}("_" => 0, "lion" => 20, "queen" => 12, "dragon king" => 8, "soaring eagle" => 11, "dragon horse" => 7, "horned falcon" => 10, "rook" => 6, "bishop" => 5, "vertical mover" => 4, "flying ox" => 8, "side mover" => 4, "free boar" => 8, "king" => 50, "phoenix" => 3, "kirin" => 3, "reverse chariot" => 3, "whale" => 5 , "lance" => 3, "white horse" => 7, "drunk elephant" => 3, "gold general" => 3, "ferocious leopard" => 3, "blind tiger" => 3, "flying stag" => 6, "silver general" => 2, "copper general" => 2, "go between" => 1, "pawn" => 1)

global pieceVal = Dict{String,Int64}("pawn"=>1, "pawn promoted" =>2, "lance" =>4, "lance promomted" =>5, "knight" =>6,
"knight promoted" =>7, "silver general" =>7,"silver general promoted" =>8, "gold general" =>8, "bishop" =>11, "rook" =>13, "bishop promoted" =>15, "rook promoted" =>17, "king"=>50)

global prStandard = Dict{String, String}("rook promoted" => "dragon king","bishop promoted" => "dragon horse","silver general promoted" => "gold general",
 	"knight promoted" => "gold general", "lance promoted" => "gold general", "pawn promoted" => "gold general")
global prTenjiku = Dict{String,String}("bishop promoted" => "dragon horse", "bishop general promoted" => "vice general",
 	"blind tiger promoted" => "flying stag", "chariot soldier promoted" => "heavenly tetrarch", "copper general promoted" => "side mover", "dog promoted" => "multi general",
  "dragon horse promoted" => "horned falcon", "dragon king promoted" => "soaring eagle", "drunk elephant promoted" => "king", "ferocious leopard promoted" => "bishop", 
  "go between promomted" => "drunk elephant", "gold general promoted" => "rook", "horned falcon promoted" => "bishop general", "iron general promoted" => "vertical soldier", "kirin promoted" => "lion",
  "knight promoted" => "side soldier", "lance promoted" => "white horse", "lion promoted" => "lion hawk", "pawn promoted" => "gold general", "phoenix promoted" => "queen", "queen promoted" => "free eagle",
  "reverse chariot promoted" => "whale", "rook promoted" => "dragon king", "rook general promoted" => "great general", "side mover promoted" => "free boar",
  "side soldier promoted" => "water buffalo", "silver general promoted" => "vertical mover", "soaring eagle promoted" => "rook general", "vertical mover promoted" => "flying ox",
  "vertical soldier promoted" => "chariot soldier", "water buffalo promoted" => "fire demon"  )

global defEmpty = "_"
global defBishop = "bishop"
global defBishopGeneral = "bishop general"
global defBlindTiger = "blind tiger"
global defCopperGeneral = "copper general"
global defChariotSoldier = "chariot soldier"
global defDog = "dog"
global defDrunkElephant = "drunk elephant"
global defDragonHorse = "dragon horse"
global defDragonKing = "dragon king"
global defFerociousLeopard = "ferocious leopard"
global defFlyingOx = "flying ox"
global defFlyingStag = "flying stag"
global defFireDemon = "fire demon"
global defFreeBoar = "free boar"
global defFreeEagle = "free eagle"
global defGoBetween = "go between"
global defGoldGeneral = "gold general"
global defGreatGeneral = "great general"
global defHeavenlyTetrarch = "heavenly tetrarch"
global defHornedFalcon = "horned falcon"
global defIronGeneral = "iron general"
global defKing = "king"
global defKirin = "kirin"
global defLance = "lance"
global defLionHawk = "lion hawk"
global defLion = "lion"
global defMultiGeneral = "multi general"
global defKnight = "knight"
global defPawn = "pawn"
global defPhoenix = "phoenix"
global defQueen = "queen"
global defRook = "rook"
global defReverseChariot = "reverse chariot"
global defRookGeneral = "rook general"
global defSilverGeneral = "silver general"
global defSoaringEagle = "soaring eagle"
global defSideMover = "side mover"
global defSideSoldier = "side soldier"
global defViceGeneral = "vice general"
global defVerticalMover = "vertical mover"
global defVerticalSoldier = "vertical soldier"
global defWaterBuffalo = "water buffalo"
global defWhale = "whale"
global defWhiteHorse = "white horse"


global defDummy = "D"
global defWhite = "Wh"
global defBlack = "Bl"

global tDim = 16
global cDim = 12
global sDim = 9
global mDim = 5
global dim = 16

global moveChoice = Array{Int64}(8)
#global tempMoveChoice1 = Array{Int64}(8)
#global tempMoveChoice2 = Array{Int64}(8) # Only used for double captures
global strength
global whitePrison = []
global blackPrison = []
global chessboard
global tempChessboard

type moveOffset
	row::Int64
	col::Int64
end

type piece
	display::String
	name::String
	side::AbstractString
	BAttack::Int
	WAttack::Int
	promote::Bool
end

moveOption = Array{moveOffset}(17)

moveOption[1] = moveOffset(-1, -1)
moveOption[2] = moveOffset(-1, 0)
moveOption[3] = moveOffset(-1, 1)
moveOption[4] = moveOffset(0, -1)
moveOption[5] = moveOffset(0, 0)
moveOption[6] = moveOffset(0, 1)
moveOption[7] = moveOffset(1, -1)
moveOption[8] = moveOffset(1, 0)
moveOption[9] = moveOffset(1, 1)
moveOption[10] = moveOffset(-2, -1)
moveOption[11] = moveOffset(-2, 1)
moveOption[12] = moveOffset(2, -1)
moveOption[13] = moveOffset(2, 1)
moveOption[14] = moveOffset(-1, -2)
moveOption[15] = moveOffset(-1, 2)
moveOption[16] = moveOffset(1, -2)
moveOption[17] = moveOffset(1, 2)

function moveFunctions(option::String)
	global chessboard
	if option == "update"
		for i in 1:dim
			for j in 1:dim
				chessboard[i, j].WAttack = 0
				chessboard[i, j].BAttack = 0
			end
		end
	end
	for i in 1:dim
		for j in 1:dim
			if chessboard[i, j].name == defBishop
				defBishopMove(i, j, option)
			elseif chessboard[i, j].name == defBishopGeneral
				defBishopGeneralMove(i, j, option)
			elseif chessboard[i, j].name == defBlindTiger
				defBlindTigerMove(i, j, option)
			elseif chessboard[i, j].name == defCopperGeneral
				defCopperGeneralMove(i, j, option)
			elseif chessboard[i, j].name == defChariotSoldier
				defChariotSoldierMove(i, j, option)
			elseif chessboard[i, j].name == defDog
				defDogMove(i, j, option)
			elseif chessboard[i, j].name == defDrunkElephant
				defDrunkElephantrMove(i, j, option)
			elseif chessboard[i, j].name == defDragonHorse
				defDragonHorseMove(i, j, option)
			elseif chessboard[i, j].name == defDragonKing
				defDragonKingMove(i, j, option)
			elseif chessboard[i, j].name == defFerociousLeopard
				defFerociousLeopardMove(i, j, option)
			elseif chessboard[i, j].name == defFireDemon
				defFireDemonMove(i, j, option)
			elseif chessboard[i, j].name == defFlyingOx
				defFlyingOxMove(i, j, option)
			elseif chessboard[i, j].name == defFlyingStag
				defFlyingStagMove(i, j, option)
			elseif chessboard[i, j].name == defFreeBoar
				defFreeBoarMove(i, j, option)
			elseif chessboard[i, j].name == defFreeEagle
				defFreeEagleMove(i, j, option)
			elseif chessboard[i, j].name == defGoldGeneral
				defGoldGeneralMove(i, j, option)
			elseif chessboard[i, j].name == defGreatGeneral
				defGreatGeneralMove(i, j, option)
			elseif chessboard[i, j].name == defHeavenlyTetrarch
				defHeavenlyTetrarchMove(i, j, option)
			elseif chessboard[i, j].name == defHornedFalcon
				defHornedFalconMove(i, j, option)
			elseif chessboard[i, j].name == defIronGeneral
				defIronGeneralMove(i, j, option)
			elseif chessboard[i, j].name == defKing
				defKingMove(i, j, option)
			elseif chessboard[i, j].name == defKirin
				defKirinMove(i, j, option)
			elseif chessboard[i, j].name == defLance
				defLanceMove(i, j, option)
			elseif chessboard[i, j].name == defLionHawk
				defLionHawkMove(i, j, option)
			elseif chessboard[i, j].name == defLion
				defLionMove(i, j, option)
			elseif chessboard[i, j].name == defMultiGeneral
				defMultiGeneralMove(i, j, option)
			elseif chessboard[i, j].name == defKnight
				defKnightMove(i, j, option)
			elseif chessboard[i, j].name == defPawn
				defPawnMove(i, j, option)
			elseif chessboard[i, j].name == defPhoenix
				defPhoenixMove(i, j, option)
			elseif chessboard[i, j].name == defQueen
				defQueenMove(i, j, option)
			elseif chessboard[i, j].name == defRook
				defRookMove(i, j, option)
			elseif chessboard[i, j].name == defReverseChariot
				defReverseChariotMove(i, j, option)
			elseif chessboard[i, j].name == defRookGeneral
				defRookGeneralMove(i, j, option)
			elseif chessboard[i, j].name == defSilverGeneral
				defGeneralMove(i, j, option)
			elseif chessboard[i, j].name == defSoaringEagle
				defSoaringEagleMove(i, j, option)
			elseif chessboard[i, j].name == defSideMover
				defSideMoverMove(i, j, option)
			elseif chessboard[i, j].name == defSideSoldier
				defSideSoldierMove(i, j, option)
			elseif chessboard[i, j].name == defViceGeneral
				defViceGeneralMove(i, j, option)
			elseif chessboard[i, j].name == defVerticalMover
				defVerticalMoverMove(i, j, option)
			elseif chessboard[i, j].name == defVerticalSoldier
				defVerticalSoldierMove(i, j, option)
			elseif chessboard[i, j].name == defWaterBuffalo
				defWaterBuffaloMove(i, j, option)
			elseif chessboard[i, j].name == defWhale
				defWhaleMove(i, j, option)
			elseif chessboard[i, j].name == defWhiteHorse
				defWhiteHorseMove(i, j, option)
			end
		end
	end
end

function update(srcRow::Int64, srcCol::Int64, destRow::Int64, destCol::Int64, option::String)
	global tempChessboard
	global chessboard
	if option == "demon update"
		for i in 1:9
			if i != 5
				tempRow = destRow + moveOption[i].row
				tempCol = destCol + moveOption[i].col
				if chessboard[srcRow, srcCol].side == defWhite
					tempChessboard[destRow, destCol].WAttack += 1
					if tempRow <= dim && tempRow >= 1 && tempCol <= dim && tempCol >= 1
						tempChessboard[destRow + moveOption[i].row, destCol + moveOption[i].col].WAttack += 1
					end
				elseif chessboard[srcRow, srcCol].side == defBlack
					tempChessboard[destRow, destCol].BAttack += 1
					if tempRow <= dim && tempRow >= 1 && tempCol <= dim && tempCol >= 1
						tempChessboard[destRow + moveOption[i].row, destCol + moveOption[i].col].BAttack += 1
					end
				end
			end
		end
	elseif option == "special update"
		if chessboard[srcRow, srcCol].side == defWhite
			tempChessboard[destRow, destCol].WAttack += 1
		elseif chessboard[srcRow, srcCol].side == defBlack
			tempChessboard[destRow, destCol].BAttack += 1
		end
	elseif option == "update"
		if chessboard[srcRow, srcCol].side == defWhite
			chessboard[destRow, destCol].WAttack += 1
		elseif chessboard[srcRow, srcCol].side == defBlack
			chessboard[destRow, destCol].BAttack += 1
		end
	end
end

function movePiece(srcRow::Int64, srcCol::Int64, destRow::Int64, destCol::Int64)
	pieceToMove = chessboard[srcRow, srcCol].name
	pieceToMoveSide = chessboard[srcRow, srcCol].side
	pieceAttacked = chessboard[destRow, destCol].name
	if pieceAttacked != pieceToMove || pieceAttack != defDummy
		gamewin = capturePiece(destRow, destCol)
	end
	add(destRow, destCol, pieceToMove, pieceToMoveSide)
	delete(srcRow, srcCol)
	return gamewin
end

function capturePiece(destRow::Int64, destCol::Int64)
	captured = chessboard[destRow, destCol]
	if captured.side == defBlack
		capturedArray = whitePrison # Record which side the piece is on being captured, prison is the colour of where drop can check from
	elseif captured.side == defWhite # Use splice!(array, object) splice returns the object that is removed
		capturedArray = blackPrison
	end
	if captured.name == defKing # gamewin
		push!(capturedArray, captured.name)
		return true
	elseif captured.name == defGGen # Does not promote
		push!(capturedArray, captured.name)
		return false
	#elseif 65 <= UInt32(captured.name) <= 90
	#	captured.name += 32 # Demote captured piece.
	#	push!(capturedArray, captured.name)
	#	return false
	end
	return false
end

# Copy move into moveChoice if it is better
function demonBurn(destRow::Int64, destCol::Int64, temp::Int64)
	for i in 1:9
		tempRow = destRow + moveOption[i].row
		tempCol = destCol + moveOption[i].col
		if tempRow <= dim && tempRow >= 1 && tempCol <= dim && tempCol >= 1
			if chessboard[tempRow, tempCol].side != defDummy && chessboard[srcRow, srcCol].side != chessboard[tempRow, tempCol].side
				temp += pieceValTen[chessboard[tempRow, tempCol].name]
			end
		end
	end
	return temp
end

# tempMoveChoice[1] is going to store the type of attack, 1 = single capture, 2 = double capture, 3 = vice general/fire demon
# Have not coded changing capturing chessboard
function capture(tempMoveChoice)
	global strength
	global moveChoice
	temp = 0
	if tempMoveChoice[1] == 1
		a = 4
		b = 5
		if dim == tDim
			temp = pieceValTen[chessboard[tempMoveChoice[a], tempMoveChoice[b]].name] - pieceValTen[chessboard[tempMoveChoice[2], tempMoveChoice[3]].name]
			if chessboard[tempMoveChoice[2], tempMoveChoice[3]].name == defFireDemon
				temp = demonBurn(tempMoveChoice[a], tempMoveChoice[b], temp)
			end		
		elseif dim == cDim
			temp = pieceValChu[chessboard[tempMoveChoice[a], tempMoveChoice[b]].name] - pieceValTen[chessboard[tempMoveChoice[2], tempMoveChoice[3]].name]
		else
			temp = pieceVal[chessboard[tempMoveChoice[a], tempMoveChoice[b]].name] - pieceValTen[chessboard[tempMoveChoice[2], tempMoveChoice[3]].name]
		end
		if chessboard[tempMoveChoice[a], tempMoveChoice[b]].side == defWhite # check if attack is safe
			if chessboard[tempMoveChoice[a], tempMoveChoice[b]].WAttack == 0
				if chessboard[tempMoveChoice[2], tempMoveChoice[3]].name == defKing && dim == tDim
					temp += 600
				elseif chessboard[tempMoveChoice[2], tempMoveChoice[3]].name == defKing && dim == cDim
					temp += 91
				elseif chessboard[tempMoveChoice[2], tempMoveChoice[3]].name == defKing
					temp += 68
				elseif dim == tDim
					temp += 500
				else
					temp += 50
				end
			end
		elseif chessboard[tempMoveChoice[a], tempMoveChoice[b]].side == defBlack
			if chessboard[tempMoveChoice[a], tempMoveChoice[b]].BAttack == 0
				if chessboard[tempMoveChoice[2], tempMoveChoice[3]].name == defKing && dim == tDim
					temp += 600
				elseif chessboard[tempMoveChoice[2], tempMoveChoice[3]].name == defKing && dim == cDim
					temp += 91
				elseif chessboard[tempMoveChoice[2], tempMoveChoice[3]].name == defKing
					temp += 68
				elseif dim == tDim
					temp += 500
				else
					temp += 50
				end
			end
		end
	elseif tempMoveChoice[1] == 2
		a = 4
		b = 5
		while a != 0 && b != 0
			if dim == tDim
				if temp == 0
					temp = pieceValTen[chessboard[tempMoveChoice[a], tempMoveChoice[b]].name] - pieceValTen[chessboard[tempMoveChoice[2], tempMoveChoice[3]].name]
				else
					temp += pieceValTen[chessboard[tempMoveChoice[a], tempMoveChoice[b]].name]	
				end
			elseif dim == cDim
				if temp == 0
					temp = pieceValChu[chessboard[tempMoveChoice[a], tempMoveChoice[b]].name] - pieceValTen[chessboard[tempMoveChoice[2], tempMoveChoice[3]].name]
				else
					temp += pieceValChu[chessboard[tempMoveChoice[a], tempMoveChoice[b]].name]
				end
			else
				if temp == 0
					temp = pieceVal[chessboard[tempMoveChoice[a], tempMoveChoice[b]].name] - pieceValTen[chessboard[tempMoveChoice[2], tempMoveChoice[3]].name]
				else
					temp += pieceVal[chessboard[tempMoveChoice[a], tempMoveChoice[b]].name]
				end
			end
			if tempMoveChoice[a + 2] == 0 && tempMoveChoice[b + 2] == 0
				if chessboard[tempMoveChoice[a], tempMoveChoice[b]].side == defWhite # check if attack is safe
					if chessboard[tempMoveChoice[a], tempMoveChoice[b]].WAttack == 0
						if chessboard[tempMoveChoice[2], tempMoveChoice[3]].name == defKing && dim == tDim
							temp += 600
						elseif chessboard[tempMoveChoice[2], tempMoveChoice[3]].name == defKing && dim == cDim
							temp += 91
						elseif chessboard[tempMoveChoice[2], tempMoveChoice[3]].name == defKing
							temp += 68
						elseif dim == tDim
							temp += 500
						else
							temp += 50
						end
					end
				elseif chessboard[tempMoveChoice[a], tempMoveChoice[b]].side == defBlack
					if chessboard[tempMoveChoice[a], tempMoveChoice[b]].BAttack == 0
						if chessboard[tempMoveChoice[2], tempMoveChoice[3]].name == defKing && dim == tDim
							temp += 600
						elseif chessboard[tempMoveChoice[2], tempMoveChoice[3]].name == defKing && dim == cDim
							temp += 91
						elseif chessboard[tempMoveChoice[2], tempMoveChoice[3]].name == defKing
							temp += 68
						elseif dim == tDim
							temp += 500
						else
							temp += 50
						end
					end
				end
			end
			a += 2
			b += 2
		end
	elseif tempMoveChoice[1] == 3
		a = 8
		b = 9
		while tempMoveChoice[a] == 0 && tempMoveChoice[b] == 0
			a -= 2
			a -= 2
		end
		if dim == tDim
			temp = pieceValTen[chessboard[tempMoveChoice[a], tempMoveChoice[b]].name] - pieceValTen[chessboard[tempMoveChoice[2], tempMoveChoice[3]].name]
			if chessboard[tempMoveChoice[2], tempMoveChoice[3]].name == defFireDemon
				temp = demonBurn(tempMoveChoice[a], tempMoveChoice[b], temp)
			end		
		elseif dim == cDim
			temp = pieceValChu[chessboard[tempMoveChoice[a], tempMoveChoice[b]].name] - pieceValTen[chessboard[tempMoveChoice[2], tempMoveChoice[3]].name]
		else
			temp = pieceVal[chessboard[tempMoveChoice[a], tempMoveChoice[b]].name] - pieceValTen[chessboard[tempMoveChoice[2], tempMoveChoice[3]].name]
		end
		if chessboard[tempMoveChoice[a], tempMoveChoice[b]].side == defWhite # check if attack is safe
			if chessboard[tempMoveChoice[a], tempMoveChoice[b]].WAttack == 0
				if chessboard[tempMoveChoice[2], tempMoveChoice[3]].name == defKing && dim == tDim
					temp += 600
				elseif chessboard[tempMoveChoice[2], tempMoveChoice[3]].name == defKing && dim == cDim
					temp += 91
				elseif chessboard[tempMoveChoice[2], tempMoveChoice[3]].name == defKing
					temp += 68
				elseif dim == tDim
					temp += 500
				else
					temp += 50
				end
			end
		elseif chessboard[tempMoveChoice[a], tempMoveChoice[b]].side == defBlack
			if chessboard[tempMoveChoice[a], tempMoveChoice[b]].BAttack == 0
				if chessboard[tempMoveChoice[2], tempMoveChoice[3]].name == defKing && dim == tDim
					temp += 600
				elseif chessboard[tempMoveChoice[2], tempMoveChoice[3]].name == defKing && dim == cDim
					temp += 91
				elseif chessboard[tempMoveChoice[2], tempMoveChoice[3]].name == defKing
					temp += 68
				elseif dim == tDim
					temp += 500
				else
					temp += 50
				end
			end
		end
	end
	if temp > strength
		storeMoveChoice = [tempMoveChoice[2], tempMoveChoice[3], tempMoveChoice[4], tempMoveChoice[5], tempMoveChoice[6], tempMoveChoice[7], tempMoveChoice[8], tempMoveChoice[9]]
		strength = temp
		moveChoice = deepcopy(tempMoveChoice)
		println(strength)
		println(moveChoice)
	end
end

function step(srcRow::Int64, srcCol::Int64, option::String, destRow::Int64, destCol::Int64)
	if destRow <= dim && destRow >= 1 && destCol <= dim && destCol >= 1
		if option == "update"
			update(srcRow, srcCol, destRow, destCol, option)
		end
		if option == "capture"
			tempMoveChoice = [1, srcRow, srcCol, destRow, destCol, 0, 0, 0, 0]
			capture(tempMoveChoice)
		end
	end
end

function stepMultiple(srcRow::Int64, srcCol::Int64, option::String, tempRow::Int64, tempCol::Int64, jumps::Int64, tempMoveChoice)
	global tempChessboard
	if jumps == 0
		return
	end
	saveMoveChoice = tempMoveChoice
	for i in 1:9
		if (chessboard[srcRow, srcCol].name == defFreeEagle && (i == 1 || i == 3 || i == 7 || i == 9)) || (chessboard[srcRow, srcCol].name != defFreeEagle && i != 5)
			tempMoveChoice = saveMoveChoice
			newTempRow = tempRow + moveOption[i].row
			newTempCol = tempCol + moveOption[i].col
			if newTempRow <= dim && newTempRow >= 1 && newTempCol <= dim && newTempCol >= 1
				if option == "special update" || option == "demon update"
					update(srcRow, srcCol, newTempRow, newTempCol, option)
				end
				if option == "capture"
					a = 4
					b = 5
					while tempMoveChoice[a] != 0 && tempMoveChoice[b] != 0
						a += 2
						b += 2
					end
					tempMoveChoice[a] = newTempRow
					tempMoveChoice[b] = newTempCol
					capture(tempMoveChoice)
				end
				if chessboard[srcRow, srcCol].name == defLion || chessboard[srcRow, srcCol].name == defLionHawk
					stepMultiple(srcRow, srcCol, option, newTempRow, newTempCol, jumps - 1, tempMoveChoice)
				elseif chessboard[newTempRow, newTempCol].side == defDummy
					stepMultiple(srcRow, srcCol, option, newTempRow, newTempCol, jumps - 1, tempMoveChoice)
				end
			end
		end
	end
end

function stepMultipleLinear(srcRow::Int64, srcCol::Int64, option::String, tempRow::Int64, tempCol::Int64, jumps::Int64, index::Int64, tempMoveChoice)
	global tempChessboard
	if jumps == 0
		return
	end
	saveMoveChoice = tempMoveChoice
	if jumps == 2
		newTempRow = tempRow + moveOption[index].row
		newTempCol = tempCol + moveOption[index].col
		if newTempRow <= dim && newTempRow >= 1 && newTempCol <= dim && newTempCol >= 1
			if option == "special update" || option == "demon update" || option == "update"
				update(srcRow, srcCol, newTempRow, newTempCol, option)
			end
			if option == "capture"
				tempMoveChoice[4] = newTempRow
				tempMoveChoice[5] = newTempCol
				capture(tempMoveChoice)
			end
			stepMultipleLinear(srcRow, srcCol, option, newTempRow, newTempCol, jumps - 1, index, tempMoveChoice)
		end
	elseif jumps == 1
		newTempRow = tempRow - moveOption[index].row ## igui
		newTempCol = tempCol - moveOption[index].col
			if option == "capture"
				tempMoveChoice[6] = newTempRow
				tempMoveChoice[7] = newTempCol
				capture(tempMoveChoice)
			end
		if chessboard[srcRow, srcCol].name != defHeavenlyTetrarch
			newTempRow = tempRow + moveOption[index].row
			newTempCol = tempCol + moveOption[index].col
			if newTempRow <= dim && newTempRow >= 1 && newTempCol <= dim && newTempCol >= 1
				if option == "update"
					update(srcRow, srcCol, newTempRow, newTempCol, option)
				end
				if option == "capture"
					tempMoveChoice[6] = newTempRow
					tempMoveChoice[7] = newTempCol
					capture(tempMoveChoice)
				end
			end
		end
	end
end
	
function rangeJump(srcRow::Int64, srcCol::Int64, option::String, index::Int64)
	tempRow = srcRow
	tempCol = srcCol
	while true
		tempRow = tempRow + moveOption[index].row
		tempCol = tempCol + moveOption[index].col
		if tempRow > dim || tempRow < 1 || tempCol > dim || tempCol < 1
			break
		end
		if option == "update" || option == "special update"
			update(srcRow, srcCol, tempRow, tempCol, option)
		end
		if chessboard[tempRow, tempCol].side != defDummy
			if option == "capture"
				tempMoveChoice = [1, srcRow, srcCol, tempRow, tempCol, 0, 0, 0, 0]
				capture(tempMoveChoice)
			end
		end	
		if rangeJumpPriority[chessboard[srcRow, srcCol].name] < rangeJumpPriority[chessboard[tempRow, tempCol].name] # Not jumpable
			break
		end	
	end
end

function range(srcRow::Int64, srcCol::Int64, option::String, tempRow::Int64, tempCol::Int64, index::Int64)	
	newTempRow = tempRow
	newTempCol = tempCol
	while true
		newTempRow = newTempRow + moveOption[index].row
		newTempCol = newTempCol + moveOption[index].col
		if newTempRow > dim || newTempRow < 1 || newTempCol > dim || newTempCol < 1
			break
		end
		if option == "update" || option == "special update" || option == "demon update"
			update(srcRow, srcCol, newTempRow, newTempCol, option)
		end
		if chessboard[newTempRow, newTempCol].side != defDummy
			if option == "capture"
				tempMoveChoice = [1, srcRow, srcCol, tempRow, tempCol, 0, 0, 0, 0]
				capture(tempMoveChoice)
			end
			break
		end
	end
end

function defKingMove(srcRow::Int64, srcCol::Int64, option::String)
	for i in 1:9
		if i != 5
			step(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col)
		end
	end
end

function defDrunkElephantMove(srcRow::Int64, srcCol::Int64, option::String)
	for i in 1:9
		if chessboard[srcRow, srcCol].side == defWhite && (i != 5 && i != 8) || chessboard[srcRow, srcCol].side == defBlack && (i != 2 && i != 5)
			step(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col)
		end
	end
end

function defViceGeneralMove(srcRow::Int64, srcCol::Int64, option::String)
	global tempChessboard
	if option == "update"
		option = "special update"
		tempChessboard = deepcopy(chessboard)
		for i in 1:dim
			for j in 1:dim
				tempChessboard[i, j].WAttack = 0
				tempChessboard[i, j].BAttack = 0
			end
		end
	end
	for i in 1:9
		if i == 1 || i == 3 || i == 7 || i == 9
			rangeJump(srcRow, srcCol, option, i)
		end
	end
	tempMoveChoice = [3, srcRow, srcCol, 0, 0, 0, 0, 0, 0]
	stepMultiple(srcRow, srcCol, option, srcRow, srcCol, 3, tempMoveChoice)
	if option == "special update"
		for i in 1:dim
			for j in 1:dim
				if i == srcRow && j == srcCol
				elseif chessboard[srcRow, srcCol].side == defWhite && tempChessboard[i, j].WAttack >= 1
					chessboard[i, j].WAttack += 1
				elseif chessboard[srcRow, srcCol].side == defBlack && tempChessboard[i, j].BAttack >= 1
					chessboard[i, j].BAttack += 1
				end
			end
		end
	end
end
	
function defGreatGeneralMove(srcRow::Int64, srcCol::Int64, option::String)
	for i in 1:9
		if i != 5
			rangeJump(srcRow, srcCol, option, i)
		end
	end
end

function defBishopGeneralMove(srcRow::Int64, srcCol::Int64, option::String)
	for i in 1:9
		if i == 1 || i == 3 || i == 7 || i == 9
			rangeJump(srcRow, srcCol, option, i)
		end
	end
end

function defRookGeneralMove(srcRow::Int64, srcCol::Int64, option::String)
	for i in 1:9
		if i == 2 || i == 4 || i == 6 || i == 8
			rangeJump(srcRow, srcCol, option, i)
		end
	end
end

function defHornedFalconMove(srcRow::Int64, srcCol::Int64, option::String)
	for i in 1:9
		if i != 5 && ((chessboard[srcRow, srcCol].side == defWhite && i != 2) || (chessboard[srcRow, srcCol].side == defBlack && i != 8))
			range(srcRow, srcCol, option, srcRow, srcCol, i)
		elseif (chessboard[srcRow, srcCol].side == defWhite && i == 2) || (chessboard[srcRow, srcCol].side == defBlack && i == 8)
			tempMoveChoice = [2, srcRow, srcCol, 0, 0, 0, 0, 0, 0]
			stepMultipleLinear(srcRow, srcCol, option, srcRow, srcCol, 2, i, tempMoveChoice)
		end
	end
end

function defSoaringEagleMove(srcRow::Int64, srcCol::Int64, option::String)
	for i in 1:9
		if i != 5 && ((chessboard[srcRow, srcCol].side == defWhite && i != 1 && i != 3) || (chessboard[srcRow, srcCol].side == defBlack && i != 7 && i != 9))
			range(srcRow, srcCol, option, srcRow, srcCol, i)
		elseif (chessboard[srcRow, srcCol].side == defWhite && (i == 1 || i == 3)) || (chessboard[srcRow, srcCol].side == defBlack && (i == 7 || i == 9))
			tempMoveChoice = [2, srcRow, srcCol, 0, 0, 0, 0, 0, 0]
			stepMultipleLinear(srcRow, srcCol, option, srcRow, srcCol, 2, i, tempMoveChoice)
		end
	end
end

function defDragonHorseMove(srcRow::Int64, srcCol::Int64, option::String)
	for i in 1:9
		if i == 1 || i == 3 || i == 7 || i == 9
			range(srcRow, srcCol, option, srcRow, srcCol, i)
		elseif i == 2 || i == 4 || i == 6 || i == 8
			step(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col)
		end
	end
end

function defDragonKingMove(srcRow::Int64, srcCol::Int64, option::String)
	for i in 1:9
		if i == 2 || i == 4 || i == 6 || i == 8 
			range(srcRow, srcCol, srcRow, srcCol, option, i)
		elseif i == 1 || i == 3 || i == 7 || i == 9
			step(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col)
		end
	end
end
		
function defBishopMove(srcRow::Int64, srcCol::Int64, option::String)
	for i in 1:9
		if i == 1 || i == 3 || i == 7 || i == 9
			range(srcRow, srcCol, option, srcRow, srcCol, i)
		end
	end
end

function defRookMove(srcRow::Int64, srcCol::Int64, option::String)
	for i in 1:9
		if i == 2 || i == 4 || i == 6 || i == 8 
			range(srcRow, srcCol, option, srcRow, srcCol, i)
		end
	end
end

function defFerociousLeopardMove(srcRow::Int64, srcCol::Int64, option::String)
	for i in 1:9
		if i != 4 && i != 5 && i != 6
			step(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col)
		end
	end
end

function defGoldGeneralMove(srcRow::Int64, srcCol::Int64, option::String)
	for i in 1:9
		if (chessboard[srcRow, srcCol].side == defWhite && (i != 5 && i != 7 && i != 9)) || (chessboard[srcRow, srcCol].side == defBlack && (i != 1 && i != 3 && i != 5))
			step(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col)
		end
	end
end

function defPawnMove(srcRow::Int64, srcCol::Int64, option::String)
	for i in 1:9
		if (chessboard[srcRow, srcCol].side == defWhite && i == 2) || (chessboard[srcRow, srcCol].side == defBlack && i == 8)
			step(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col)
		end
	end
end

function defFireDemonMove(srcRow::Int64, srcCol::Int64, option::String)
	global tempChessboard
	if option == "update" || option == "capture"
		if option == "update"
			option = "demon update"
		end
		tempChessboard = deepcopy(chessboard)
		for i in 1:dim
			for j in 1:dim
				tempChessboard[i, j].WAttack = 0
				tempChessboard[i, j].BAttack = 0
			end
		end
	end
	for i in 1:9
		if i != 2 && i != 5 && i != 8
			range(srcRow, srcCol, option, srcRow, srcCol, i)
		end
	end
	tempMoveChoice = [3, srcRow, srcCol, 0, 0, 0, 0, 0, 0]
	stepMultiple(srcRow, srcCol, option, srcRow, srcCol, 3, tempMoveChoice)
	if option == "demon update"
		for i in 1:dim
			for j in 1:dim
				if i == srcRow && j == srcCol
				elseif chessboard[srcRow, srcCol].side == defWhite && tempChessboard[i, j].WAttack >= 1
					chessboard[i, j].WAttack += 1
				elseif chessboard[srcRow, srcCol].side == defBlack && tempChessboard[i, j].BAttack >= 1
					chessboard[i, j].BAttack += 1
				end
			end
		end
	end
end

function defHeavenlyTetrarchMove(srcRow::Int64, srcCol::Int64, option::String) # Need Exceptions
	for i in 1:9
		if i != 5
			tempMoveChoice = [2, srcRow, srcCol, 0, 0, 0, 0, 0, 0]
			stepMultipleLinear(srcRow, srcCol, option, srcRow, srcCol, 2, i, tempMoveChoice)
		end
		if i != 4 && i != 5 && i != 6
			range(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col, i)
		elseif i == 4 || i == 6
			tempRow = srcRow + 2*moveOption[i].row
			tempCol = srcCol + 2*moveOption[i].col
			step(srcRow, srcCol, option, tempRow, tempCol)
			if tempRow <= dim && tempRow >= 1 && tempCol <= dim && tempCol >= 1
				if chessboard[tempRow, tempCol].side == defDummy
					step(srcRow, srcCol, option, srcRow + 3*moveOption[i].row, srcCol + 3*moveOption[i].col)
				end
			end
		end
	end
end
			
function defWaterBuffaloMove(srcRow::Int64, srcCol::Int64, option::String)
	for i in 1:9
		if i != 2 && i != 5 && i != 8
			range(srcRow, srcCol, option, srcRow, srcCol, i)
		elseif i == 2 || i == 8
			tempRow = srcRow + moveOption[i].row
			tempCol = srcCol + moveOption[i].col
			step(srcRow, srcCol, option, tempRow, tempCol)
			if tempRow <= dim && tempRow >= 1 && tempCol <= dim && tempCol >= 1
				if chessboard[tempRow, tempCol].side == defDummy
					step(srcRow, srcCol, option, srcRow + 2*moveOption[i].row, srcCol + 2*moveOption[i].col)
				end
			end
		end
	end
end

function defChariotSoldierMove(srcRow::Int64, srcCol::Int64, option::String)
	for i in 1:9
		if i != 4 && i != 5 && i != 6
			range(srcRow, srcCol, option, srcRow, srcCol, i)
		elseif i == 4 || i == 6
			tempRow = srcRow + moveOption[i].row
			tempCol = srcCol + moveOption[i].col
			step(srcRow, srcCol, option, tempRow, tempCol)
			if tempRow <= dim && tempRow >= 1 && tempCol <= dim && tempCol >= 1
				if chessboard[tempRow, tempCol].side == defDummy
					step(srcRow, srcCol, option, srcRow + 2*moveOption[i].row, srcCol + 2*moveOption[i].col)
				end
			end
		end
	end
end

function defSideSoldierMove(srcRow::Int64, srcCol::Int64, option::String)
	for i in 1:9
		if i == 4 || i == 6
			range(srcRow, srcCol, option, srcRow, srcCol, i)
		elseif i == 2 || i == 8
			tempRow = srcRow + moveOption[i].row
			tempCol = srcCol + moveOption[i].col
			step(srcRow, srcCol, option, tempRow, tempCol)
			if tempRow <= dim && tempRow >= 1 && tempCol <= dim && tempCol >= 1
				if chessboard[tempRow, tempCol].side == defDummy && ((chessboard[srcRow, srcCol].side == defWhite && i == 2) || (chessboard[srcRow, srcCol].side == defBlack && i == 8))
					step(srcRow, srcCol, option, srcRow + 2*moveOption[i].row, srcCol + 2*moveOption[i].col)
				end
			end
		end
	end
end
			
function defVerticalSoldierMove(srcRow::Int64, srcCol::Int64, option::String)
	for i in 1:9
		if (chessboard[srcRow, srcCol].side == defWhite && i == 2) || (chessboard[srcRow, srcCol].side == defBlack && i == 8)
			range(srcRow, srcCol, option, srcRow, srcCol, i)
		elseif i == 4 || i == 6 || i == 8
			tempRow = srcRow + moveOption[i].row
			tempCol = srcCol + moveOption[i].col
			step(srcRow, srcCol, option, tempRow, tempCol)
			if tempRow <= dim && tempRow >= 1 && tempCol <= dim && tempCol >= 1
				if chessboard[tempRow, tempCol].side == defDummy && (i == 4 || i == 6)
					step(srcRow, srcCol, option, srcRow + 2*moveOption[i].row, srcCol + 2*moveOption[i].col)
				end
			end
		end
	end
end

function defKnightMove(srcRow::Int64, srcCol::Int64, option::String)
	for i in 10:13
		if (chessboard[srcRow, srcCol].side == defWhite && (i == 10 || i == 11)) || (chessboard[srcRow, srcCol].side == defBlack && (i == 12 || i == 13))
			step(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col)
		end
	end
end

function defIronGeneralMove(srcRow::Int64, srcCol::Int64, option::String)
	for i in 1:9
		if (chessboard[srcRow, srcCol].side == defWhite && (i == 1 || i == 2 || i == 3)) || (chessboard[srcRow, srcCol].side == defBlack && (i == 7 || i == 8 || i == 9))
			step(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col)
		end
	end
end

function defFreeEagleMove(srcRow::Int64, srcCol::Int64, option::String) # Need Exceptions
	global tempChessboard
	if option == "update"
		option = "special update"
		tempChessboard = deepcopy(chessboard)
		for i in 1:dim
			for j in 1:dim
				tempChessboard[i, j].WAttack = 0
				tempChessboard[i, j].BAttack = 0
			end
		end
	end
	tempMoveChoice = [2, srcRow, srcCol, 0, 0, 0, 0, 0, 0]
	stepMultiple(srcRow, srcCol, option, srcRow, srcCol, 2, tempMoveChoice)
	for i in 1:9
		if i != 5
			range(srcRow, srcCol, option, srcRow, srcCol, i)		
		end
	end
	if option == "special update"
		for i in 1:dim
			for j in 1:dim
				if i == srcRow && j == srcCol
				elseif chessboard[srcRow, srcCol].side == defWhite && tempChessboard[i, j].WAttack >= 1
					chessboard[i, j].WAttack += 1
				elseif chessboard[srcRow, srcCol].side == defBlack && tempChessboard[i, j].BAttack >= 1
					chessboard[i, j].BAttack += 1
				end
			end
		end
	end
end

	

function defLionHawkMove(srcRow::Int64, srcCol::Int64, option::String)
	global tempChessboard
	if option == "update"
		option = "special update"
		tempChessboard = deepcopy(chessboard)
		for i in 1:dim
			for j in 1:dim
				tempChessboard[i, j].WAttack = 0
				tempChessboard[i, j].BAttack = 0
			end
		end
	end
	tempMoveChoice = [2, srcRow, srcCol, 0, 0, 0, 0, 0, 0]
	stepMultiple(srcRow, srcCol, option, srcRow, srcCol, 2, tempMoveChoice)
	for i in 1:9
		if i == 1 || i == 3 || i == 7 || i == 9
			range(srcRow, srcCol, option, srcRow, srcCol, i)
		end
	end
	if option == "special update"
		for i in 1:dim
			for j in 1:dim
				if i == srcRow && j == srcCol
				elseif chessboard[srcRow, srcCol].side == defWhite && tempChessboard[i, j].WAttack >= 1
					chessboard[i, j].WAttack += 1
				elseif chessboard[srcRow, srcCol].side == defBlack && tempChessboard[i, j].BAttack >= 1
					chessboard[i, j].BAttack += 1
				end
			end
		end
	end
end


function defQueenMove(srcRow::Int64, srcCol::Int64, option::String)
	for i in 1:9
		if i != 5
			range(srcRow, srcCol, option, srcRow, srcCol, i)
		end
	end
end

function defLionMove(srcRow::Int64, srcCol::Int64, option::String)
	global tempChessboard
	if option == "update"
		option = "special update"
		tempChessboard = deepcopy(chessboard)
		for i in 1:dim
			for j in 1:dim
				tempChessboard[i, j].WAttack = 0
				tempChessboard[i, j].BAttack = 0
			end
		end
	end
	tempMoveChoice = [2, srcRow, srcCol, 0, 0, 0, 0, 0, 0]
	stepMultiple(srcRow, srcCol, option, srcRow, srcCol, 2, tempMoveChoice)
	if option == "special update"
		for i in 1:dim
			for j in 1:dim
				if i == srcRow && j == srcCol
				elseif chessboard[srcRow, srcCol].side == defWhite && tempChessboard[i, j].WAttack >= 1
					chessboard[i, j].WAttack += 1
				elseif chessboard[srcRow, srcCol].side == defBlack && tempChessboard[i, j].BAttack >= 1
					chessboard[i, j].BAttack += 1
				end
			end
		end
	end
end

function defPhoenixMove(srcRow::Int64, srcCol::Int64, option::String)
	for i in 1:9
		if i == 2 || i == 4 || i == 6 || i == 8
			step(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col)
		elseif i == 1 || i == 3 || i == 7 || i == 9
			step(srcRow, srcCol, option, srcRow + 2*moveOption[i].row, srcCol + 2*moveOption[i].col)
		end
	end
end

function defKirinMove(srcRow::Int64, srcCol::Int64, option::String)
	for i in 1:9
		if i == 1 || i == 3 || i == 7 || i == 9
			step(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col)
		elseif i == 2 || i == 4 || i == 6 || i == 8
			step(srcRow, srcCol, option, srcRow + 2*moveOption[i].row, srcCol + 2*moveOption[i].col)
		end
	end
end

function defFreeBoarMove(srcRow::Int64, srcCol::Int64, option::String)
	for i in 1:9
		if i != 2 && i != 5 && i != 8
			range(srcRow, srcCol, option, srcRow, srcCol, i)
		end
	end
end

function defFlyingOxMove(srcRow::Int64, srcCol::Int64, option::String)
	for i in 1:9
		if i != 4 && i != 5 && i != 6
			range(srcRow, srcCol, option, srcRow, srcCol, i)
		end
	end
end

function defSideMoverMove(srcRow::Int64, srcCol::Int64, option::String)
	for i in 1:9
		if i == 4 || i == 6
			range(srcRow, srcCol, option, srcRow, srcCol, i)
		elseif i == 2 || i == 8
			step(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col)
		end
	end
end

function defVerticalMoverMove(srcRow::Int64, srcCol::Int64, option::String)
	for i in 1:9
		if i == 2 || i == 8
			range(srcRow, srcCol, option, srcRow, srcCol, i)
		elseif i == 4 || i == 6
			step(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col)
		end
	end
end

function defCopperGeneralMove(srcRow::Int64, srcCol::Int64, option::String)
	for i in 1:9
		if i == 2 || i == 8 || (chessboard[srcRow, srcCol].side == defWhite && (i == 1 || i == 3)) || (chessboard[srcRow, srcCol].side == defBlack && (i == 7 || i == 9))
			step(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col)
		end
	end
end

function defSilverGeneralMove(srcRow::Int64, srcCol::Int64, option::String)
	for i in 1:9
		if (i != 4 && i != 5 && i != 6) || (chessboard[srcRow, srcCol].side == defWhite && i != 8) || (chessboard[srcRow, srcCol].side == defBlack && i != 2)
			step(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col)
		end
	end
end

function defMultiGeneralMove(srcRow::Int64, srcCol::Int64, option::String)
	for i in 1:9
		if (chessboard[srcRow, srcCol].side == defWhite && (i == 2 || i == 7 || i == 9)) || (chessboard[srcRow, srcCol].side == defBlack && (i == 1 || i == 3 || i == 8))
			range(srcRow, srcCol, option, srcRow, srcCol, i)
		end
	end
end

function defFlyingStagMove(srcRow::Int64, srcCol::Int64, option::String)
	for i in 1:9
		if i == 2 || i == 8
			range(srcRow, srcCol, option, srcRow, srcCol, i)
		elseif i != 5
			step(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col)
		end
	end
end

function defDogMove(srcRow::Int64, srcCol::Int64, option::String)
	for i in 1:9
		if (chessboard[srcRow, srcCol].side == defWhite && (i == 2 || i == 7 || i == 9)) || (chessboard[srcRow, srcCol].side == defBlack && (i == 1 || i == 3 || i == 8))
			step(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col)
		end
	end
end
		
function defBlindTigerMove(srcRow::Int64, srcCol::Int64, option::String)
	for i in 1:9
		if i != 5 && ((chessboard[srcRow, srcCol].side == defWhite && i != 2) || (chessboard[srcRow, srcCol].side == defBlack && i != 8))
			step(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col)
		end
	end
end

function defWhiteHorseMove(srcRow::Int64, srcCol::Int64, option::String)
	for i in 1:9
		if i == 2 || i == 8 || (chessboard[srcRow, srcCol].side == defWhite && (i == 1 || i == 3)) || (chessboard[srcRow, srcCol].side == defBlack && (i == 7 || i == 9))
			range(srcRow, srcCol, option, srcRow, srcCol, i)
		end
	end
end

function defWhaleMove(srcRow::Int64, srcCol::Int64, option::String)
	for i in 1:9
		if i == 2 || i == 8 || (chessboard[srcRow, srcCol].side == defWhite && (i == 7 || i == 9)) || (chessboard[srcRow, srcCol].side == defBlack && (i == 1 || i == 3))
			range(srcRow, srcCol, option, srcRow, srcCol, i)
		end
	end
end

function defLanceMove(srcRow::Int64, srcCol::Int64, option::String)
	for i in 1:9
		if (chessboard[srcRow, srcCol].side == defWhite && i == 2) || (chessboard[srcRow, srcCol].side == defBlack && i == 8)
			range(srcRow, srcCol, option, srcRow, srcCol, i)
		end
	end
end

function defReverseChariotMove(srcRow::Int64, srcCol::Int64, option::String)
	for i in 1:9
		if i == 2 || i == 8
			range(srcRow, srcCol, option, srcRow, srcCol, i)
		end
	end
end

function createBoard()
	global chessboard
	grid = [piece("_", defEmpty, defDummy, false, false, false)]
	temp = deepcopy(grid)
	for i in 1:dim - 1
		temp = vcat(temp, deepcopy(grid))
	end
	chessboard = deepcopy(temp)
	for i in 1:dim -1
		chessboard = hcat(chessboard, deepcopy(temp))
	end
end

function add(srcRow::Int64, srcCol::Int64, piecetype::String, colour::String)
	chessboard[srcRow, srcCol].display = "X"
	chessboard[srcRow, srcCol].name = piecetype
	chessboard[srcRow, srcCol].side = colour
end

function delete(srcRow::Int64, srcCol::Int64)
	chessboard[srcRow, srcCol].display = "_"
	chessboard[srcRow,srcCol].name = defEmpty
	chessboard[srcRow,srcCol].side = defDummy
end

function printBoard()
	for i in 1:dim
		for j in 1:dim
			stringTest = chessboard[i,j].display
			print(" $stringTest")
		end
		println("")
	end
end

function printBoardBAttack()
	for i in 1:dim
		for j in 1:dim
			stringTest = chessboard[i,j].BAttack
			print(" $stringTest")
		end
		println("")
	end
end

function printBoardWAttack()
	for i in 1:dim
		for j in 1:dim
			stringTest = chessboard[i,j].WAttack
			print(" $stringTest")
		end
		println("")
	end
end

function prPromote(destRow::Int64, destCol::Int64)
  targetPie = chessboard[destRow,destCol]
  if !targetPie.promote #not promoted
    if dim == tDim && targetPie.name != defFireDemon && targetPie.name != defFreeEagle &&
      targetPie.name != defGreatGeneral && targetPie.name != defKing && targetPie.name != defLionHawk &&
      targetPie.name != defViceGeneral
      if targetPie.side == defWhite
        if destRow <= 5
          chessboard[destRow,destCol].name = chessboard[destRow,destCol].name *" promoted"
          chessboard[destRow,destCol].promote = true
          return true
        end
      elseif targetPie.side == defBlack
        if destRow >= 12
          chessboard[destRow,destCol].name = chessboard[destRow,destCol].name *" promoted"
          chessboard[destRow,destCol].promote = true
          return true
        end
      else
        return false
      end
    elseif dim == cDim && targetPie.name != defKing && targetPie.name != defQueen && targetPie.name != defLion
      if targetPie.side == defWhite
        if destRow <= 4
          chessboard[destRow,destCol].name = chessboard[destRow,destCol].name *" promoted"
          chessboard[destRow,destCol].promote = true
          return true
        end
      elseif targetPie.side == defBlack
        if destRow >= 9
          chessboard[destRow,destCol].name = chessboard[destRow,destCol].name *" promoted"
          chessboard[destRow,destCol].promote = true
          return true
        end
      else
        return false
      end
    elseif dim == sDim && get(prStandard,targetPie.name,"none") != "none"
      if targetPie.side == defWhite
        if destRow <= 3
          chessboard[destRow,destCol].name = chessboard[destRow,destCol].name *" promoted"
          chessboard[destRow,destCol].promote = true
          return true
        end
      elseif targetPie.side == defBlack
        if destRow >= 7
          chessboard[destRow,destCol].name = chessboard[destRow,destCol].name *" promoted"
          chessboard[destRow,destCol].promote = true
          return true
        end
      else
        return false
      end
    elseif dim == mDim && get(prStandard,targetPie.name,"none") != "none"
      if targetPie.side == defWhite
        if destRow <= 1
          chessboard[destRow,destCol].name = chessboard[destRow,destCol].name *" promoted"
          chessboard[destRow,destCol].promote = true
          return true
        end
      elseif targetPie.side == defBlack
        if destRow >= 5
          chessboard[destRow,destCol].name = chessboard[destRow,destCol].name *" promoted"
          chessboard[destRow,destCol].promote = true
          return true
        end
      else
        return false
      end
    end
  end
	return false
end

#

function autoPromote(destRow::Int64, destCol::Int64)  # Run function after pawn, lance or knight move. Check if auto promote.
	if chessboard[destRow, destCol].name == defPawn || chessboard[destRow, destCol].name == defLance
		if chessboard[destRow, destCol].side == defWhite
			if destRow == 1
			  prPromote(destRow, destCol)
				return true
			end
		elseif chessboard[destRow, destCol].side == defBlack
			if destRow == dim
				prPromote(destRow, destCol)
				return true
			end
		else
			return false
		end
	elseif dim != cDim && chessboard[destRow, destCol].name == defKnight
		if chessboard[destRow, destCol].side == defWhite
			if destRow <= 2
				prPromote(destRow, destCol)
				return true
			end
		elseif chessboard[destRow, destCol].side == defBlack
			if destRow >= dim - 1
				prPromote(destRow, destCol)
				return true
			end
		else
			return false
		end
	else
		return false
	end
	return false
end

createBoard()
add(7, 8, "lion", "Bl")
printBoard()
moveFunctions("capture")
printBoardBAttack()