From 52489d9b9b2d7633f9b7caaed0ed1ea40972032b Mon Sep 17 00:00:00 2001 From: Sam Moore Date: Sat, 5 May 2012 21:10:31 +0800 Subject: [PATCH] [PRELIMINARY ROUND 2] Finally. BLERGH. --- agents/asmodeus/basic_python.pyc | Bin 0 -> 10802 bytes agents/asmodeus/path.pyc | Bin 0 -> 2111 bytes agents/basic_cpp/basic_cpp | Bin 0 -> 145014 bytes agents/basic_cpp/basic_cpp.o | Bin 0 -> 269696 bytes agents/celsius-v1.1.tar | Bin 0 -> 20480 bytes agents/celsius-v1.2.tar.gz | Bin 0 -> 5191 bytes agents/celsius1.1/celsius.py | 539 +++++++++++++++ agents/celsius1.1/info | 4 + agents/hunter/basic_python.pyc | Bin 0 -> 11452 bytes agents/peternlewis.zip | Bin 0 -> 14703 bytes agents/ramen.tar | Bin 0 -> 51200 bytes agents/ramen/28f56d3c_peternlewis.ramen | Bin 0 -> 48 bytes agents/ramen/ramen | Bin 0 -> 49073 bytes agents/ramen/src/Makefile | 25 + agents/ramen/src/ai.c | 874 ++++++++++++++++++++++++ agents/ramen/src/ai.o | Bin 0 -> 41552 bytes agents/ramen/src/ai.o.dep | 1 + agents/ramen/src/ai_common.h | 108 +++ agents/ramen/src/db.c | 258 +++++++ agents/ramen/src/db.o | Bin 0 -> 20832 bytes agents/ramen/src/db.o.dep | 1 + agents/ramen/src/interface.h | 70 ++ agents/ramen/src/main.c | 240 +++++++ agents/ramen/src/main.o | Bin 0 -> 19688 bytes agents/ramen/src/main.o.dep | 1 + agents/vixen/basic_python.pyc | Bin 0 -> 10751 bytes agents/vixen/path.pyc | Bin 0 -> 2093 bytes 27 files changed, 2121 insertions(+) create mode 100644 agents/asmodeus/basic_python.pyc create mode 100644 agents/asmodeus/path.pyc create mode 100755 agents/basic_cpp/basic_cpp create mode 100644 agents/basic_cpp/basic_cpp.o create mode 100644 agents/celsius-v1.1.tar create mode 100644 agents/celsius-v1.2.tar.gz create mode 100755 agents/celsius1.1/celsius.py create mode 100644 agents/celsius1.1/info create mode 100644 agents/hunter/basic_python.pyc create mode 100644 agents/peternlewis.zip create mode 100644 agents/ramen.tar create mode 100644 agents/ramen/28f56d3c_peternlewis.ramen create mode 100755 agents/ramen/ramen create mode 100644 agents/ramen/src/Makefile create mode 100644 agents/ramen/src/ai.c create mode 100644 agents/ramen/src/ai.o create mode 100644 agents/ramen/src/ai.o.dep create mode 100644 agents/ramen/src/ai_common.h create mode 100644 agents/ramen/src/db.c create mode 100644 agents/ramen/src/db.o create mode 100644 agents/ramen/src/db.o.dep create mode 100644 agents/ramen/src/interface.h create mode 100644 agents/ramen/src/main.c create mode 100644 agents/ramen/src/main.o create mode 100644 agents/ramen/src/main.o.dep create mode 100644 agents/vixen/basic_python.pyc create mode 100644 agents/vixen/path.pyc diff --git a/agents/asmodeus/basic_python.pyc b/agents/asmodeus/basic_python.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4338c88ee0ea8a0e8eed17b454241cbb2e932868 GIT binary patch literal 10802 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 KpmA)Ot=j*1I(-QM literal 0 HcmV?d00001 diff --git a/agents/basic_cpp/basic_cpp b/agents/basic_cpp/basic_cpp new file mode 100755 index 0000000000000000000000000000000000000000..70af5d61e6f12454ce340a7c2233a52e97a6e603 GIT binary patch literal 145014 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

2BL=p0{bUE^+MV-IT}b!MN|AlJkCY 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 literal 0 HcmV?d00001 diff --git a/agents/celsius-v1.2.tar.gz b/agents/celsius-v1.2.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..7e220da3fb8b8dcdc0feb24473613f017b7d3722 GIT binary patch literal 5191 zcmcJPRa6v=qJ;;fLAs=dkVd*&U?fGlV+I%+qz7pMK{`Z!x`vVt85o8d8fgS2Bt%jH z=^o~ub=N%)_vt*Hw{PvW_S*YpZ(tG;(c7EySAa*3P)~oiK>ue!V#4CW0T4gHp`x4r zifqe`zypaz!!vCz9jd_VykH|=PZygH&1ar2X{Xg)pEaz*O0^!RjndNF}A0BXgj zyE#rC9(@`Jq7vrEC8*iesL;*ejC_sh;_!hg!s#PdyxuznjBV1|&y3!E6!b84LxLrR zU^*mQYI$GD5&l{`D=d=_p*~y$O4wEQc5N?^OTAJey6u_PsO!C6wXJ)=#9uYP!Nhm7 zj(_>K{(In-A_xX6Ze9cGYY(0A+G7vvceQDid;KxHNv4XVVc)dL9PjQoZ?~dsr&)rb zXwIP0{uGP7`=X9g3Fy`HQEIF(vKMwNl~@%8h#=7ZA%*a8xk7R}$CH0Zc}f3h8F{!u zp+8CwIi_6pM+7LP-8?6=)w9`!4|qln?da1!uO+gpoJcKmIs!DY(hyW1J4&~5(WCrJ z-gZip!Fq`Lb3nCP5sz`?bC?P4A1IsEgTBhT=R77=4!_N5`6$>gq*=K-Pf^H;p1kO)(DJW`4ahysB>9Zghe84GVh2p>BFHs+q%)YdDB; z1?rjB96roBtp6l*Y?0p4OPz!2MZ|!`bon$d2AJ=8Hws4bf@YWCSd_EN$U*YN)XV|d zg#NnIaX9d2X(GHS*@`@f&z&@iH7Vlg>z~x9!+#)mcs=BZv~89kgD6%?A;QMkwx-wt z@+EmNxjpW1e-D7oD{6ZK--5K)f3a|~DSS3VC!o^|#qa52@i;%as;OnYoA=HX?N*k{ z@;8Ewo&jut0gkO{(nI{p;A*|a1Nl|wQu&b-yj2Ct%x&K(<+KfITV$ck;ig430g5488zP)6$|Y=tYv@qbeF0$IZ2 zHq!^6^Yf>^V*O>+#t~e98#$u$lIr)L0-g)F#$6*$*b(6v#RygPh(DNi>Zep@maASB0(P-eLjv z20I?U9k`=R8#pY-_{mXE&zAyoWM8DfA(3s}gL1?J?24mS1TE1qbj9A0>-KH4ma`HJvK_DEwPAD_hI$9W3x2iN;sM z5Zt_O>d}*-^{FJ)!>XvYq5`|!w^yJx7CS=CS2VKpTU*{j3C?vb`;fimHh7ON_SdOoJrcp^dd4(mHCW zJ1sJWvz!wQhPJ|7i%FR5jkWjs9%#@HF?z24kLV@s4q4lsTrM@WI}&y-3B?zApYsx- ziJKgGYpA5*asGa!KMsf6+b2g)jwV?O#?n`PBHS&OK0cyKaS{vk)uL?Kqgn%QkCWJ$ zo#GQva>eVHHaU*XDU6(mKy=%bYBp>{e!FsOje>W%a9mSL$+Jx)bL4^)+ZimBvZ1nR zjWKu{8|fEh%5!ggc0$*n-YMN2Vhxs=qeE>DT)YvRXkmkSz8bUL!(?f2r z9q=4%CT_k}$#f@cu1}{m zsTP1E&}Wk;fh3sJyo|oEavec`FD75gjI@Ui2@351GKFf*#a0EdtBR?w&3<{_tnM%T zB~Di4#+AC7D;$>iFv)TSq0c`MZW{Pho-}IItSc7PxezC>OrX(4�+x+u-&*;24LU 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 0: + return len(ranks) - 2 - ranks.index(self.rank) + else: + return 0 + + def scariness(self, other): + scare = scaretable[ranks.index(self.rank)][ranks.index(other.rank)] + if scare > 0: + scare = scare * 1 + return scare + + def getOverride(self, other): + return overrides[ranks.index(self.rank)][ranks.index(other.rank)] + + def getHeatmap(self, x,y,w,h): + if (x < 0) or (x >= w) or (y < 0) or (y >= h): + return 10 + else: + return self.heatmap[x][y] + + def validSquare(self, x, y, width, height, board): + if x < 0: + return False + if y < 0: + return False + if x >= width: + return False + if y >= height: + return False + if board[x][y] != None and board[x][y].colour == self.colour: + return False + if board[x][y] != None and board[x][y].rank == '#': + return False + return True + + def generateHeatmap(self, width, height, board): + self.heatmap = [] + newmap = [] + for x in range(0,width): + self.heatmap.append([]) + newmap.append([]) + for y in range(0,height): + self.heatmap[x].append(0) + newmap[x].append(0) + if board[x][y] == None: + self.heatmap[x][y] = 0 + continue + if board[x][y].colour == self.colour: + if board[x][y].rank == 'F': + self.heatmap[x][y] = -5 # + self.valuedRank() # Defend our flag + else: + self.heatmap[x][y] = self.scariness(board[x][y]) + + # Make pieces prefer to stay where they are + #self.heatmap[self.x][self.y] = -0.5 + + for i in range(0,min(30,len(self.positions))): + p = self.positions[len(self.positions)-1-i] + if board[p[0]][p[1]] != None: + self.heatmap[p[0]][p[1]] += 0.2 * ((50 - i)/50) + + + + for n in range(0,8): + for x in range(0,width): + for y in range(0,height): + if self.heatmap[x][y] != 0: + newmap[x][y] = self.heatmap[x][y] + continue + newmap[x][y] = 0 #self.heatmap[x][y] * 0.2 + if self.validSquare(x-1,y,width,height,board): + newmap[x][y] += self.heatmap[x-1][y] * 0.2 + else: + newmap[x][y] += 0 #self.heatmap[x][y] * 0.1 + if self.validSquare(x+1,y,width,height,board): + newmap[x][y] += self.heatmap[x+1][y] * 0.2 + else: + newmap[x][y] += 0 #self.heatmap[x][y] * 0.1 + if self.validSquare(x,y-1,width,height,board): + newmap[x][y] += self.heatmap[x][y-1] * 0.2 + else: + newmap[x][y] += 0 #self.heatmap[x][y] * 0.1 + if self.validSquare(x,y+1,width,height,board): + newmap[x][y] += self.heatmap[x][y+1] * 0.2 + else: + newmap[x][y] += 0 #self.heatmap[x][y] * 0.1 + self.heatmap = newmap + + def debugPrintHeat(self,w,h): + """ For debug purposes only. Prints the board to stderr. + Does not indicate difference between allied and enemy pieces + Unknown (enemy) pieces are shown as '?' + """ + sys.stderr.write("Pos: " + str(self.x) + ", " + str(self.y) + " -- rank: " + str(self.rank) + "\n") + for y in range(0, h): + for x in range(0, w): + if (self.heatmap[x][y] - self.heatmap[self.x][self.y] > 0.0): + sys.stderr.write("O") + elif (self.heatmap[x][y] - self.heatmap[self.x][self.y] == 0.0): + sys.stderr.write("X") + elif (self.heatmap[x][y] - self.heatmap[self.x][self.y] < 0.0): + sys.stderr.write(".") + else: + sys.stderr.write(" ") + sys.stderr.write("\n") + sys.stderr.write("\n") + + + + +def valuedRank(rank): + if ranks.count(rank) > 0: + return len(ranks) - 2 - ranks.index(rank) + else: + return 0 + + + +class SulixAI: + """ + BasicAI class to play a game of stratego + Implements the protocol correctly. Stores the state of the board in self.board + Only makes random moves. + Override method "MakeMove" for more complex moves + """ + def __init__(self): + """ Constructs the BasicAI agent, and starts it playing the game """ + #sys.stderr.write("BasicAI __init__ here...\n"); + self.turn = 0 + self.board = [] + self.units = [] + self.enemyUnits = [] + + self.total_turns = 0 + + self.totalAllies = {'B':6,'1':1,'2':1,'3':2,'4':3,'5':4,'6':4,'7':4,'8':5,'9':8,'s':1,'F':1} + self.totalEnemies = {'B':6,'1':1,'2':1,'3':2,'4':3,'5':4,'6':4,'7':4,'8':5,'9':8,'s':1,'F':1} + self.hiddenEnemies = {'B':6,'1':1,'2':1,'3':2,'4':3,'5':4,'6':4,'7':4,'8':5,'9':8,'s':1,'F':1} + self.hiddenAllies = {'B':6,'1':1,'2':1,'3':2,'4':3,'5':4,'6':4,'7':4,'8':5,'9':8,'s':1,'F':1} + self.lastMoved = None + + + + def Setup(self): + """ Implements Setup part of protocol. Always uses the same setup. Override to create custom setups """ + #sys.stderr.write("BasicAI Setup here...\n"); + setup = sys.stdin.readline().split(' ') + if len(setup) != 4: + sys.stderr.write("BasicAI setup fails, expected 4 tokens, got " + str(len(setup)) + " "+str(setup) + "\n") + self.colour = setup[0] + self.opponentName = setup[1] + self.width = int(setup[2]) + self.height = int(setup[3]) + for x in range(0, self.width): + self.board.append([]) + for y in range(0, self.height): + self.board[x].append(None) + if self.colour == "RED": + print "FB8sB979B8\nBB99555583\n6724898974\nB314676699" + elif self.colour == "BLUE": + print "B314676699\n6724898974\nBB99555583\nFB8sB979B8" + return True + + def MoveCycle(self): + #sys.stderr.write("BasicAI MakeMove here...\n"); + if self.InterpretResult() == False or self.ReadBoard() == False or self.MakeMove() == False: + return False + self.turn += 1 + return self.InterpretResult() + + def MakeMove(self): + """ Randomly moves any moveable piece, or prints "NO_MOVE" if there are none """ + #TODO: Over-ride this function in base classes with more complex move behaviour + + #sys.stderr.write("Sulix's AI makes a move...\n") + #self.debugPrintBoard() + + if len(self.units) <= 0: + return False + + index = random.randint(0, len(self.units)-1) + startIndex = index + + directions = ("UP", "DOWN", "LEFT", "RIGHT") + bestdir = 0 + bestScare = 999 + bestpiece = None + while True: + piece = self.units[index] + + if piece != None and piece.mobile(): + dirIndex = random.randint(0, len(directions)-1) + startDirIndex = dirIndex + piece.generateHeatmap(self.width, self.height, self.board) + currentScary = piece.getHeatmap(piece.x, piece.y, self.width, self.height) * 0 + piece.turnCount*0 #Perhaps just look for the best move + piece.turnCount = piece.turnCount + 1 + while True: + #sys.stderr.write("Trying index " + str(dirIndex) + "\n") + p = move(piece.x, piece.y, directions[dirIndex],1) + if p[0] >= 0 and p[0] < self.width and p[1] >= 0 and p[1] < self.height: + target = self.board[p[0]][p[1]] + if target == None or (target.colour != piece.colour and target.colour != "NONE" and target.colour != "BOTH"): + scare = piece.getHeatmap(p[0], p[1],self.width, self.height) - currentScary + override = 0 + if target != None: + override = piece.getOverride(target) + + if (self.total_turns % 250 < 15) and (self.total_turns > 250): + scare += random.randint(0, 5) + + + if override == 1: + scare = 999 + elif override == -1: + piece.turnCount = 0 + print str(piece.x) + " " + str(piece.y) + " " + directions[dirIndex] + return True + + + + + if scare < bestScare: + bestdir = dirIndex + bestScare = scare + bestpiece = piece + + dirIndex = (dirIndex + 1) % len(directions) + if startDirIndex == dirIndex: + break + + + index = (index + 1) % len(self.units) + if startIndex == index: + if bestScare != 999: + bestpiece.turnCount = 0 + print str(bestpiece.x) + " " + str(bestpiece.y) + " "+directions[bestdir] +# bestpiece.debugPrintHeat(self.width, self.height) + return True + else: + print "SURRENDER" + return True + + + def ReadBoard(self): + """ Reads in the board. + On the very first turn, sets up the self.board structure + On subsequent turns, the board is simply read, but the self.board structure is not updated here. + """ + #sys.stderr.write("BasicAI ReadBoard here...\n"); + for y in range(0,self.height): + row = sys.stdin.readline().strip() + if len(row) < self.width: + sys.stderr.write("Row has length " + str(len(row)) + " vs " + str(self.width) + "\n") + return False + for x in range(0,self.width): + if self.turn == 0: + if row[x] == '.': + pass + elif row[x] == '#': + self.board[x][y] = Piece(oppositeColour(self.colour), '?',x,y) + self.enemyUnits.append(self.board[x][y]) + elif row[x] == '+': + self.board[x][y] = Piece("NONE", '+', x, y) + else: + self.board[x][y] = Piece(self.colour, row[x],x,y) + self.units.append(self.board[x][y]) + else: + pass + return True + + + def InterpretResult(self): + """ Interprets the result of a move, and updates the board. + The very first move is ignored. + On subsequent moves, the self.board structure is updated + """ + + self.total_turns = self.total_turns + 1 + + #sys.stderr.write("BasicAI InterpretResult here...\n") + result = sys.stdin.readline().split(' ') + #sys.stderr.write(" Read status line \"" + str(result) + "\"\n") + if self.turn == 0: + return True + + if result[0].strip() == "QUIT": #Make sure we exit when the manager tells us to! + return False + + if result[0].strip() == "NO_MOVE": #No move was made, don't need to update anything + return True + + if len(result) < 4: #Should be at least 4 tokens (X Y DIRECTION OUTCOME) in any other case + return False + + x = int(result[0].strip()) + y = int(result[1].strip()) + + + # The piece moved! It's not a bomb + if self.board[x][y].rank == '?': + self.board[x][y].rank = '!' + #sys.stderr.write(" Board position " + str(x) + " " + str(y) + " is OK!\n") + + direction = result[2].strip() + + multiplier = 1 + outcome = result[3].strip() + outIndex = 3 + if is_integer(outcome): + multiplier = int(outcome) + outcome = result[4].strip() + outIndex = 4 + + p = move(x,y,direction, multiplier) + + # It's a scout! I saw it move. + if multiplier > 1: + self.board[x][y].rank = '9' + + #Determine attacking piece + attacker = self.board[x][y] + self.board[x][y] = None + + if attacker == None: + return False + + lastMoved = attacker + + defender = self.board[p[0]][p[1]] + + #Update attacker's position (Don't overwrite the board yet though) + + attacker.x = p[0] + attacker.y = p[1] + attacker.positions.insert(0, (attacker.x, attacker.y)) + + + #Determine ranks of pieces if supplied + if len(result) >= outIndex + 3: + if defender == None: + return False + attacker.rank = result[outIndex+1].strip() + if attacker.beenRevealed == False: + if attacker.colour == self.colour: + self.hiddenAllies[attacker.rank] -= 1 + elif attacker.colour == oppositeColour(self.colour): + self.hiddenEnemies[attacker.rank] -= 1 + attacker.beenRevealed = True + defender.rank = result[outIndex+2].strip() + if defender.beenRevealed == False: + if defender.colour == self.colour: + self.hiddenAllies[defender.rank] -= 1 + elif defender.colour == oppositeColour(self.colour): + self.hiddenEnemies[defender.rank] -= 1 + + defender.beenRevealed = True + + + + if outcome == "OK": + self.board[p[0]][p[1]] = attacker + + elif outcome == "KILLS": + self.board[p[0]][p[1]] = attacker + + if defender.colour == self.colour: + self.totalAllies[defender.rank] -= 1 + self.units.remove(defender) + elif defender.colour == oppositeColour(self.colour): + self.totalEnemies[defender.rank] -= 1 + self.enemyUnits.remove(defender) + + elif outcome == "DIES": + if attacker.colour == self.colour: + self.totalAllies[attacker.rank] -= 1 + self.units.remove(attacker) + elif attacker.colour == oppositeColour(self.colour): + self.totalEnemies[attacker.rank] -= 1 + self.enemyUnits.remove(attacker) + + elif outcome == "BOTHDIE": + self.board[p[0]][p[1]] = None + + if defender.colour == self.colour: + self.totalAllies[defender.rank] -= 1 + self.units.remove(defender) + elif defender.colour == oppositeColour(self.colour): + self.totalEnemies[defender.rank] -= 1 + self.enemyUnits.remove(defender) + + if attacker.colour == self.colour: + self.totalAllies[attacker.rank] -= 1 + self.units.remove(attacker) + elif attacker.colour == oppositeColour(self.colour): + self.totalEnemies[attacker.rank] -= 1 + self.enemyUnits.remove(attacker) + + elif outcome == "FLAG": + #sys.stderr.write(" Game over!\n") + return False + elif outcome == "ILLEGAL": + #sys.stderr.write(" Illegal move!\n") + return False + else: + #sys.stderr.write(" Don't understand outcome \"" + outcome + "\"!\n"); + return False + + #sys.stderr.write(" Completed interpreting move!\n"); + return True + + + + def debugPrintBoard(self): + """ For debug purposes only. Prints the board to stderr. + Does not indicate difference between allied and enemy pieces + Unknown (enemy) pieces are shown as '?' + """ + for y in range(0, self.height): + for x in range(0, self.width): + if self.board[x][y] == None: + sys.stderr.write("."); + else: + sys.stderr.write(str(self.board[x][y].rank)); + sys.stderr.write("\n") + +if __name__ == "__main__": + sulixAI = SulixAI() + if sulixAI.Setup(): + while sulixAI.MoveCycle(): + pass + diff --git a/agents/celsius1.1/info b/agents/celsius1.1/info new file mode 100644 index 0000000..aedb008 --- /dev/null +++ b/agents/celsius1.1/info @@ -0,0 +1,4 @@ +celsius.py +David Gow +python +Generates a heatmap of the board, and uses this to control pieces. diff --git a/agents/hunter/basic_python.pyc b/agents/hunter/basic_python.pyc new file mode 100644 index 0000000000000000000000000000000000000000..158229fa785d60f2aedf6278736b52fb44ece0a9 GIT binary patch literal 11452 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�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 +#include +#include +#include +#include +#include "interface.h" +#include "ai_common.h" + +// === CONSTANTS === +//! \brief Maximum recusion depth +#define MAX_SEARCH_DEPTH 5 + +//! \brief Threshold before repeat modifier is applied +#define REPEAT_THRESHOLD 3 +//! \brief Modifier applied to a repeated move +#define REPEAT_MOVE_MODIFY(score) do{score /= (giNumRepeatedMove <= 5 ? 2 : 10); score -= giNumRepeatedMove*10;}while(0); + +//! \brief Number of moves by this AI before the defensive modifier kicks in +#define DEFENSIVE_THRESHOLD 20 +//! \brief Modifier applied to offensive moves when > DEFENSIVE_THRESHOLD defensive moves have been done in a row +#define DEFENSIVE_MODIFY(score) do{score *= 1+(giTurnsSinceLastTake/15);}while(0) +/** + * \name AI move outcome scores + * \{ + */ +#define OC_LOSE -100 +#define OC_DRAW 0 +#define OC_UNK 40 +#define OC_WIN 100 +#define OC_FLAG 150 +/** + * \} + */ + +// === PROTOTYPES === +// - Wrapper and Initialisation +void AI_Initialise(enum eColours Colour, const char *Opponent); +void AI_HandleMove(int bMyMove, const tMove *Move); +void UpdateStates(const tMove *OpponentMove); +void AI_DoMove(tMove *MyMove); +// - Management +tPiece *GetPieceByPos(int X, int Y); +void MovePieceTo(tPiece *Piece, int X, int Y); +void UpdateRank(tPiece *Piece, char RankChar); +void PieceExposed(tPiece *Piece); +void RemovePiece(tPiece *Piece); +// -- AI Core + int GetBestMove(tPlayerStats *Attacker, tPlayerStats *Defender, tMove *Move, int Level); + int GetPositionScore(tPlayerStats *Attacker, tPlayerStats *Defender, int Level, int X, int Y, tPiece *Piece); + int GetScore(tPiece *This, tPiece *Target); + int GetRawScore(tPiece *This, tPiece *Target); +// -- Helpers +static inline int GetOutcome(int Attacker, int Defender); +static inline int ABS(int Val); +static inline int RANGE(int Min, int Val, int Max); + +// === GLOBALS === +enum eColours gMyColour; +tPiece gBlockPiece = {.Team = 2}; + int giGameStateSize; +tGameState *gpCurrentGameState; +BOOL gbFirstTurn = true; +//tPiece **gaBoardPieces; +const char *gsOpponentDbFilename; +// -- State variables to avoid deadlocking + int giNumRepeatedMove; + int giTurnsSinceLastTake; +tMove gLastMove; +tPiece *gLastMove_Target, *gLastMove_Piece; + +// === CODE === +void AI_Initialise(enum eColours Colour, const char *Opponent) +{ + gMyColour = Colour; + + // TODO: Get opponent filename + gsOpponentDbFilename = DB_GetOpponentFile(Opponent); + + // Select setup +// setup_id = rand() % 3; + int setup_id = 1; + switch( setup_id ) + { +// case 0: // Bomb-off (dick move) +// // 39 pieces, bombs blocking gates, high level pieces backing up +// { +// const char *setup[] = { +// "8.88979993\n", +// "6689995986\n", +// "F72434s174\n", +// "BB56BB55BB\n" +// }; +// if( Colour == COLOUR_RED ) +// for(int i = 0; i < 4; i ++ ) printf(setup[i]); +// else +// for(int i = 4; i --; ) printf(setup[i]); +// break; +// } + case 1: + { + const char *setup[] = { + "FB8sB479B8\n", + "BB31555583\n", + "6724898974\n", + "967B669999\n" + }; + if( Colour == COLOUR_RED ) + for(int i = 0; i < 4; i ++ ) printf(setup[i]); + else + for(int i = 4; i --; ) printf(setup[i]); + } + break ; + default: + exit(1); + } + + + giGameStateSize = sizeof(tGameState) + giBoardHeight*giBoardWidth*sizeof(tPieceRef); + gpCurrentGameState = calloc( giGameStateSize, 1 ); + gpCurrentGameState->Opponent.Colour = !Colour; + gpCurrentGameState->MyExposed.Colour = Colour; + gpCurrentGameState->MyActual.Colour = Colour; +// gaBoardPieces = calloc( giBoardHeight*giBoardWidth, sizeof(tPiece*) ); +} + +void AI_int_InitialiseBoardState(void) +{ + int piece_index = 0; + int my_piece_index = 0; + for( int y = 0; y < giBoardHeight; y ++ ) + { + for( int x = 0; x < giBoardWidth; x ++ ) + { + tPiece *p; + char b; + + b = gaBoardState[y*giBoardWidth+x]; + + if( b == '.' ) continue ; + if( b == '+' ) + { + gpCurrentGameState->BoardState[ y*giBoardWidth+x ].Team = 3; + continue ; + } + + if( b == '#' ) + { + if( piece_index >= N_PIECES ) { + piece_index ++; + continue ; + } + p = &gpCurrentGameState->Opponent.Pieces[piece_index++]; + p->Rank = RANK_UNKNOWN; + p->X = x; p->StartX = x; + p->Y = y; p->StartY = y; + p->bHasMoved = false; + p->Team = !gMyColour; + gpCurrentGameState->BoardState[ y*giBoardWidth+x ].Team = 2; + gpCurrentGameState->BoardState[ y*giBoardWidth+x ].Index = piece_index - 1; + DEBUG("Enemy at %i,%i", x, y); + } + else + { + if( my_piece_index >= N_PIECES ) { + my_piece_index ++; + continue ; + } + p = &gpCurrentGameState->MyActual.Pieces[my_piece_index++]; + p->X = x; + p->Y = y; + p->Team = gMyColour; + UpdateRank(p, b); + gpCurrentGameState->MyActual.nRanks[p->Rank] ++; + gpCurrentGameState->BoardState[ y*giBoardWidth+x ].Team = 1; + gpCurrentGameState->BoardState[ y*giBoardWidth+x ].Index = my_piece_index - 1; + } + + + } + } + gpCurrentGameState->Opponent.nPieces = piece_index; + if( piece_index > N_PIECES ) + DEBUG("GAH! Too many opposing pieces (%i > 40)", piece_index); + if( my_piece_index > N_PIECES ) + DEBUG("GAH! Too many of my pieces (%i > 40)", my_piece_index); + + // Catch for if I don't put enough pieces out (shouldn't happen) + while( my_piece_index < N_PIECES ) { + gpCurrentGameState->MyActual.Pieces[my_piece_index].bDead = true; + gpCurrentGameState->MyActual.Pieces[my_piece_index].Rank = RANK_UNKNOWN; + my_piece_index ++; + } + + // Load guesses at what each piece is + DB_LoadGuesses(gsOpponentDbFilename, !gMyColour); + gpCurrentGameState->Opponent.bGuessValid = true; +} + +void AI_HandleMove(int bMyMove, const tMove *Move) +{ + if( gbFirstTurn ) + { + gbFirstTurn = false; + + AI_int_InitialiseBoardState(); + + // Reverse the first move + if( Move->dir != DIR_INVAL ) + { + tPiece *p; + switch(Move->dir) + { + case DIR_INVAL: ASSERT(Move->dir != DIR_INVAL); break; + case DIR_LEFT: p = GetPieceByPos( Move->x-1, Move->y ); break ; + case DIR_RIGHT: p = GetPieceByPos( Move->x+1, Move->y ); break ; + case DIR_UP: p = GetPieceByPos( Move->x, Move->y-1 ); break ; + case DIR_DOWN: p = GetPieceByPos( Move->x, Move->y+1 ); break ; + } + MovePieceTo( p, Move->x, Move->y ); + p->StartX = Move->x; + p->StartY = Move->y; + } + } + + if(Move->result == RESULT_VICTORY) + { + // TODO: Distiguish between victory conditions? + // - Note flag location? + + // TODO: Save back initial board state + DB_WriteBackInitialState(gsOpponentDbFilename, !gMyColour, gpCurrentGameState->Opponent.Pieces); + } + + if( !bMyMove ) + { + if( Move->dir != DIR_INVAL ) + UpdateStates(Move); + } + else + { + tPiece *p = GetPieceByPos(Move->x, Move->y); + ASSERT(p); + + int newx = p->X, newy = p->Y; + switch(Move->dir) + { + case DIR_INVAL: break; + case DIR_LEFT: newx -= Move->dist; break; + case DIR_RIGHT: newx += Move->dist; break; + case DIR_UP: newy -= Move->dist; break; + case DIR_DOWN: newy += Move->dist; break; + } + tPiece *target = GetPieceByPos(newx, newy); + + switch(Move->result) + { + case RESULT_ILLEGAL: break; + case RESULT_INVAL: break; + case RESULT_OK: + MovePieceTo(p, newx, newy); + break; + case RESULT_KILL: + UpdateRank(target, Move->defender); + RemovePiece(target); + MovePieceTo(p, newx, newy); + PieceExposed(p); // TODO: Update oponent's view + giTurnsSinceLastTake = 0; + break; + case RESULT_DIES: + case RESULT_VICTORY: + UpdateRank(target, Move->defender); + PieceExposed(p); + RemovePiece(p); + giTurnsSinceLastTake = 0; + break; + case RESULT_BOTHDIE: + UpdateRank(target, Move->defender); + PieceExposed(p); + RemovePiece(p); + RemovePiece(target); + giTurnsSinceLastTake = 0; + break; + } + } +} + +void UpdateStates(const tMove *OpponentMove) +{ + // --- Get moved piece, update position --- + tPiece *moved_piece = GetPieceByPos(OpponentMove->x, OpponentMove->y); + // - Sanity + ASSERT( moved_piece ); + ASSERT( moved_piece->Team == !gMyColour ); + // - Only scouts can move multiple squares + if( moved_piece->Rank == RANK_UNKNOWN && OpponentMove->dist > 1 ) + UpdateRank(moved_piece, '9'); + // - Update position + int newx = moved_piece->X, newy = moved_piece->Y; + switch(OpponentMove->dir) + { + case DIR_INVAL: break; + case DIR_LEFT: newx -= OpponentMove->dist; break; + case DIR_RIGHT: newx += OpponentMove->dist; break; + case DIR_UP: newy -= OpponentMove->dist; break; + case DIR_DOWN: newy += OpponentMove->dist; break; + } + tPiece *my_piece = GetPieceByPos(newx, newy); + + // Check if one of my pieces has been taken + switch( OpponentMove->result ) + { + case RESULT_ILLEGAL: break; + case RESULT_INVAL: break; + case RESULT_OK: + MovePieceTo(moved_piece, newx, newy); + break; + case RESULT_KILL: + case RESULT_VICTORY: + UpdateRank(moved_piece, OpponentMove->attacker); + PieceExposed(my_piece); + RemovePiece(my_piece); + MovePieceTo(moved_piece, newx, newy); + break; + case RESULT_DIES: + UpdateRank(moved_piece, OpponentMove->attacker); + PieceExposed(my_piece); + RemovePiece(moved_piece); + break; + case RESULT_BOTHDIE: + UpdateRank(moved_piece, OpponentMove->attacker); + RemovePiece(moved_piece); + PieceExposed(my_piece); + RemovePiece(my_piece); + break; + } + + // Update rank if revealed + if( moved_piece->Rank == RANK_UNKNOWN ) + UpdateRank(moved_piece, gaBoardState[moved_piece->Y*giBoardWidth+moved_piece->X]); + + // - Update piece states + DEBUG("Updating piece states"); + for( int y = 0; y < giBoardHeight; y ++ ) + { + for( int x = 0; x < giBoardWidth; x ++ ) + { + char c = gaBoardState[y*giBoardWidth+x]; + if( c == '.' ) continue; + if( c == '+' ) continue; + tPiece *p = GetPieceByPos(x, y); + if(!p) DEBUG("c = %c", c); + ASSERT(p); + if( p->Team == gMyColour ) continue ; + if( p->Rank == RANK_UNKNOWN && c != '#' ) + UpdateRank(p, c); + } + } +} + +void AI_DoMove(tMove *MyMove) +{ +#if 1 + // Sanity checks + for( int i = 0; i < N_PIECES; i ++ ) + { + tPiece *p = &gpCurrentGameState->MyActual.Pieces[i]; + if(p->bDead) continue; + + if( p != GetPieceByPos(p->X, p->Y) ) { + DEBUG("Piece %p(%i,%i R%i) not at stated position", + p, p->X, p->Y, p->Rank); + } + } +#endif + + DEBUG("Deciding on move"); + GetBestMove(&gpCurrentGameState->MyActual, &gpCurrentGameState->Opponent, MyMove, 0); +} + +tPiece *GetPieceByPos(int X, int Y) +{ + tPieceRef *pr = &gpCurrentGameState->BoardState[Y*giBoardWidth+X]; + switch( pr->Team ) + { + case 0: return NULL; + case 1: return &gpCurrentGameState->MyActual.Pieces[ (int)pr->Index ]; + case 2: return &gpCurrentGameState->Opponent.Pieces[ (int)pr->Index ]; + case 3: return &gBlockPiece; + } + return NULL; +} + +void MovePieceTo(tPiece *Piece, int X, int Y) +{ + DEBUG("Moved %p(%i,%i) to (%i,%i)", + Piece, Piece->X, Piece->Y, X, Y); + + gpCurrentGameState->BoardState[Y*giBoardWidth + X] + = gpCurrentGameState->BoardState[Piece->Y*giBoardWidth + Piece->X]; + gpCurrentGameState->BoardState[Piece->Y*giBoardWidth + Piece->X].Team = 0; + + Piece->X = X; + Piece->Y = Y; + + if( !Piece->bHasMoved ) + { + if( Piece->Team == gMyColour ) + { + gpCurrentGameState->MyExposed.nMoved ++; + } + else + { + gpCurrentGameState->Opponent.nMoved ++; + } + } + + Piece->bHasMoved = true; +} + +void UpdateRank(tPiece *Piece, char RankChar) +{ + enum eRanks rank; + + rank = CharToRank(RankChar); + + if( Piece->Rank == rank ) + return ; + + if( Piece->Rank != RANK_UNKNOWN ) + { + if(Piece->Rank != rank ) + { + DEBUG("Rank of piece %p(%i,%i) has changed, was %i now %i", + Piece, Piece->X, Piece->Y, Piece->Rank, rank); + Piece->Rank = rank; + } + return ; + } + + if( Piece->Team == !gMyColour && rank != RANK_UNKNOWN ) + { + if( gpCurrentGameState->Opponent.nRanks[rank] >= MAX_RANK_COUNTS[rank] ) { + DEBUG("ERROR: Bookkeeping failed, >%i units of rank %i on board", + MAX_RANK_COUNTS[rank], rank); + } + DEBUG("Found a %i", rank); + gpCurrentGameState->Opponent.nRanks[rank] ++; + if( gpCurrentGameState->Opponent.nIdentified == gpCurrentGameState->Opponent.nPieces ) { + DEBUG("ERROR: Bookkeeping failed, >%i units identified", + gpCurrentGameState->Opponent.nPieces); + } + gpCurrentGameState->Opponent.nIdentified ++; + + if( Piece->GuessedRank != RANK_UNKNOWN && Piece->GuessedRank != rank ) + { + fprintf(stderr, "Assumption failed, saved %c != act %c", + cRANK_CHARS[Piece->GuessedRank], cRANK_CHARS[rank]); + gpCurrentGameState->Opponent.bGuessValid = false; + } + + } + Piece->Rank = rank; + if( Piece->Team == !gMyColour ) + { + // Expensive? What's that? + DB_WriteBackInitialState(gsOpponentDbFilename, !gMyColour, gpCurrentGameState->Opponent.Pieces); + } +} + +void PieceExposed(tPiece *Piece) +{ + ASSERT(Piece->Team == gMyColour); + if( Piece->bExposed == false ) + { + gpCurrentGameState->MyExposed.nRanks[Piece->Rank] ++; + gpCurrentGameState->MyExposed.nIdentified ++; + Piece->bExposed = true; + } +} + +/** + * \brief Remove a piece from the board + */ +void RemovePiece(tPiece *Piece) +{ + tPlayerStats *owner; + gpCurrentGameState->BoardState[Piece->Y*giBoardWidth + Piece->X].Team = 0; + if( Piece->Team == !gMyColour ) { + owner = &gpCurrentGameState->Opponent; + } + else { + owner = &gpCurrentGameState->MyExposed; + gpCurrentGameState->MyActual.nRanks[Piece->Rank] --; + } + owner->nKilledRanks[Piece->Rank] ++; + owner->nRanks[Piece->Rank] --; + owner->nIdentified --; + owner->nPieces --; + Piece->bDead = true; +} + +// ---------------------------------------------------------------------------- +// - AI Core +// ---------------------------------------------------------------------------- +#define TARGET_GRID_W 10 +#define TARGET_GRID_H 10 +#define TARGET_GRID_SIZE (TARGET_GRID_W*TARGET_GRID_H) +typedef struct sGridSlot { + tPiece *p; + char dist; + char complexity; + enum eDirections firstdir; + char firstdist; + char bDirect; +} tTargetGrid[TARGET_GRID_SIZE]; +int GetTargetsFrom(tPiece *Piece, tTargetGrid *grid) +{ + int n_targets; + + memset(*grid, 0, sizeof(*grid)); + + int cur_dist = 1; + int b_updates = 0; + + void _check_dir(struct sGridSlot *pgs, struct sGridSlot *gs, int x, int y, enum eDirections dir) + { + if( !gs ) return ; + if( gs->dist ) return ; + if( pgs->p ) return ; + + tPiece *p = GetPieceByPos(x, y); + if( p && (p == &gBlockPiece || p->Team == Piece->Team) ) + p = (void*)-1; + gs->dist = cur_dist + 1; + gs->p = p; + DEBUG("%p at %i,%i %i away", p, x, y, cur_dist); + if( pgs->firstdir == DIR_INVAL || (pgs->firstdir == dir && pgs->bDirect) ) { + gs->bDirect = 1; + gs->firstdir = dir; + gs->firstdist = pgs->firstdist + 1; + } + else { + gs->firstdist = pgs->firstdist; + gs->firstdir = pgs->firstdir; + gs->bDirect = 0; + } + b_updates = 1; + } + + (*grid)[ Piece->X + Piece->Y * TARGET_GRID_W ].dist = -1; + + do { + b_updates = 0; + for( int i = 0; i < TARGET_GRID_SIZE; i ++ ) + { + int x = i % TARGET_GRID_W; + int y = i / TARGET_GRID_H; + struct sGridSlot *gs = &(*grid)[i]; + + struct sGridSlot *gs_u = NULL, *gs_d = NULL; + struct sGridSlot *gs_l = NULL, *gs_r = NULL; + + if( !gs->dist ) continue ; + + // Get adjacent cells + if( y > 0 ) + gs_u = &(*grid)[i - TARGET_GRID_W]; + if( x > 0 ) + gs_l = &(*grid)[i - 1]; + if( y < TARGET_GRID_H - 1 ) + gs_d = &(*grid)[i + TARGET_GRID_W]; + if( x < TARGET_GRID_W - 1 ) + gs_r = &(*grid)[i + 1]; + + _check_dir(gs, gs_u, x, y-1, DIR_UP); + _check_dir(gs, gs_d, x, y+1, DIR_DOWN); + _check_dir(gs, gs_l, x-1, y, DIR_LEFT); + _check_dir(gs, gs_r, x+1, y, DIR_RIGHT); + } + + cur_dist ++; + } while(b_updates); + +#if SHOW_TARGET_MAP + fprintf(stderr, "%p Type %c\n", Piece, cRANK_CHARS[Piece->Rank]); + for( int i = 0; i < 10*10; i ++ ) + { + tPiece *np = (*grid)[i].p; + if( i == Piece->X + Piece->Y * TARGET_GRID_W ) + fprintf(stderr, "?"); + else if( (*grid)[i].dist == 0 ) + fprintf(stderr, "#"); // Unreachable + else if( !np ) + fprintf(stderr, " "); // Empty + else if( np == (void*)-1 ) + fprintf(stderr, "."); // My team/block + else + fprintf(stderr, "X"); // Viable target! + if( i % 10 == 9 ) + fprintf(stderr, "\n"); + } +#endif + + DEBUG("Getting targets"); + n_targets = 0; + for( int i = 0; i < TARGET_GRID_SIZE; i ++ ) + { + if( (*grid)[i].p == (void*)-1 ) + (*grid)[i].p = NULL; + if( (*grid)[i].p ) { + DEBUG("Target (%i,%i) %p %i dist", + i%10, i/10, (*grid)[i].p, (*grid)[i].dist); + (*grid)[i].dist -= 1; + n_targets ++; + } + } + + return n_targets; +} + +int GetBestMove(tPlayerStats *Attacker, tPlayerStats *Defender, tMove *Move, int Level) +{ + // Avoid infinite recursion + if( Level == MAX_SEARCH_DEPTH ) return 1; + + int best_score = INT_MIN; + tMove best_move; + tPiece *best_p = NULL; + tPiece *best_target = NULL; + tTargetGrid grid; + + // - Check possible moves + for( int i = 0; i < N_PIECES; i ++ ) + { + tPiece *p = &Attacker->Pieces[i]; + int p_score = 0; // Piece score + struct sGridSlot *bt_gs = NULL; + int bt_score; // Best target score + + // Dead, ignore + if( p->bDead ) + continue ; + // These cannot move + if( p->Rank == RANK_BOMB || p->Rank == RANK_FLAG ) + continue ; + + // Get what pieces are able to be attacked from this piece + int nt = GetTargetsFrom(p, &grid); + DEBUG("(%i,%i) %i targets", p->X, p->Y, nt); + if( nt <= 0 ) continue ; + + // Find the best target of those + for( int j = 0; j < TARGET_GRID_SIZE; j ++ ) + { + struct sGridSlot *gs = &grid[j]; + if( !gs->p ) continue ; + + int t_score = GetScore(p, gs->p); + +#if 1 + if( gs->p == gLastMove_Target && p == gLastMove_Piece && giNumRepeatedMove > REPEAT_THRESHOLD) + { + REPEAT_MOVE_MODIFY(t_score); + } +#endif + + // TODO: For scouts, use gs->complexity + // TODO: Don't use a linear relationship on distance + p_score += t_score / (gs->dist < 2 ? 1 : 2); + + // Best target + if( !bt_gs || t_score > bt_score ) { + bt_score = t_score; + bt_gs = gs; + } + } + + DEBUG("p_score = %i, bt_score = %i", p_score, bt_score); + + // Best move is towards that piece + if( best_move.dir == DIR_INVAL || best_score < p_score ) + { + best_move.dir = bt_gs->firstdir; + best_move.x = p->X; + best_move.y = p->Y; + best_move.dist = (p->Rank == RANK_SCOUT) ? bt_gs->firstdist : 1; + best_score = p_score; + best_p = p; + best_target = bt_gs->p; + } + } + + + if( Move ) + { + ASSERT(best_move.dir != DIR_INVAL); + *Move = best_move; + + if( ((Move->dir-1)^1) == gLastMove.dir-1 && Move->dist == gLastMove.dist + && Move->x == gLastMove.x && Move->y == gLastMove.y ) + { + giNumRepeatedMove ++; + DEBUG("Up to %i repititions", giNumRepeatedMove); + } + else + giNumRepeatedMove = 0; + + // TODO: Recurse once on this to determine what the other team will do + // Record that move, then check when the move is performed to see if we were right. + + gLastMove = *Move; + gLastMove_Target = best_target; + gLastMove_Piece = best_p; + giTurnsSinceLastTake ++; + } + + DEBUG("best_score = %i", best_score); + + return best_score; +} + +/** + * \brief + */ +int GetScore(tPiece *This, tPiece *Target) +{ + tPlayerStats *attacker, *defender; + int score; + + if( This->Team == gMyColour ) { + defender = &gpCurrentGameState->Opponent; + attacker = &gpCurrentGameState->MyExposed; + } + else { + attacker = &gpCurrentGameState->Opponent; + defender = &gpCurrentGameState->MyExposed; + } + + score = GetRawScore(This, Target); + + if( This->Team == gMyColour ) + { + switch( This->Rank ) + { + case RANK_MARSHAL: // Marshal has balls of steel if the spy and enemy marshal are dead + if( defender->nKilledRanks[RANK_MARSHAL] && defender->nKilledRanks[RANK_SPY] ) + score *= 2; + break; + case RANK_GENERAL: // General always attacks! + score *= 2; + break; + case RANK_SCOUT: + score = score * gpCurrentGameState->MyActual.nRanks[RANK_SCOUT] / MAX_RANK_COUNTS[RANK_SCOUT] + score; + break; + default: + break; + } + } + + return score; +} + +int GetRawScore(tPiece *This, tPiece *Target) +{ + tPlayerStats *this_team, *target_team; + + ASSERT( This->Team != Target->Team ); + + if( This->Team == gMyColour ) { + target_team = &gpCurrentGameState->Opponent; + this_team = &gpCurrentGameState->MyExposed; + } + else { + this_team = &gpCurrentGameState->Opponent; + target_team = &gpCurrentGameState->MyExposed; + } + + // Both ranks known, used fixed rules + if( This->Rank != RANK_UNKNOWN && Target->Rank != RANK_UNKNOWN ) + { + return GetOutcome(This->Rank, Target->Rank); + } + // If it's our move, and the guesses are valid, then use the guess + else if( This->Team == gMyColour + && gpCurrentGameState->Opponent.bGuessValid + && Target->GuessedRank != RANK_UNKNOWN + ) + { + return GetOutcome(This->Rank, Target->GuessedRank); + } + else + { + int sum = 0; + int max = Target->bHasMoved ? RANK_SPY : RANK_FLAG; + int count = 0; + + if( target_team->nIdentified >= target_team->nPieces ) { + DEBUG("%i >= %i, what the fsck", + target_team->nIdentified, target_team->nPieces); + } + ASSERT(target_team->nPieces > target_team->nIdentified); + + for( int i = RANK_MARSHAL; i <= max; i ++ ) + { + int n_unk = MAX_RANK_COUNTS[i] - (target_team->nRanks[i] + target_team->nKilledRanks[i]); + if( n_unk == 0 ) + continue ; + ASSERT( n_unk > 0 ); + + // TODO: Fiddle with outcome score depending on respective ranks + sum += n_unk * GetOutcome(This->Rank, i); + count += n_unk; + } + +// if( Target->bHasMoved ) +// sum /= target_team->nPieces - target_team->nMoved; +// else +// sum /= target_team->nPieces - target_team->nIdentified; + sum /= count; + + if( sum > OC_FLAG ) { + fprintf(stderr, "sum (%i) > OC_WIN (%i) -- nUnIdent=%i\n", + sum, OC_WIN, target_team->nPieces - target_team->nIdentified); + ASSERT( sum <= OC_FLAG ); + } + + return sum - ABS(sum) / 10; + } +} + +static inline int GetOutcome(int Attacker, int Defender) +{ + if( Attacker == 0 ) return OC_UNK; + if( Defender == 0 ) return OC_UNK; + + if( Defender == RANK_FLAG ) + return OC_FLAG; + + if( Attacker != RANK_MINER && Defender == RANK_BOMB ) + return OC_LOSE; + if( Attacker == RANK_MINER && Defender == RANK_BOMB ) + return OC_WIN; + + if( Attacker == RANK_SPY && Defender == RANK_MARSHAL ) + return OC_WIN; + + if( Attacker == Defender ) + return OC_DRAW; + + if( Attacker < Defender ) + return OC_WIN; + else + return OC_LOSE; +} + + +static inline int ABS(int Val) +{ + return Val < 0 ? -Val : Val; +} + +static inline int RANGE(int Min, int Val, int Max) +{ + return Min <= Val && Val <= Max; +} + diff --git a/agents/ramen/src/ai.o b/agents/ramen/src/ai.o new file mode 100644 index 0000000000000000000000000000000000000000..39db28eb021287e1d2d121e2124522a45c0fc592 GIT binary patch literal 41552 zcmeHwdwf*Ywf{ad2^=7hU;?6`1j17x0Yn}mnuH8YAV6+ND&QmJF(kQ!B+bl_(3Xb| zXvPsGT3gy$;c9Q?wm#@BrBP7>BB0WW)oQA!)S`xlwy4y`%Dw#7+Iy{;ot-)A@ALco zKA-!?J(_d&`tG&YUTf{O_t}q=u*p*}-(^{XFH2k}Vico7G#AFw*)o|eE)hdTi8uT~ zxVy!3KKWVC`A}y@sJpPKD%|dkB)ouJ7f!aJw5}CxE_@WVx$&{6Edd{SZHf4p+tvpk zGury%Bdg8E$Aq?i_!!mJA0L;t4ZufgTM|B!+Tbp_66NE?=TQZ3=uCEa!!d6-*dFm5 z3!_}&jdGtmMM)F=b4x*(3ip$e&g*J4%H@?@Eb;NUCns;%;b3QKbhVvr%{`Sz?^VXL3 z;9HR)C^;fkPJZGblt{c3jJDd9$|}RV<5^VPFvqJhQN`r%9!%c%yKo9Yk&xK4h2c2$#LmNJSPDXM?9z0LuQ^{2rYKRa|WT)S3=s`Q&CT++j9n#-Im}= z-X~f-7dCIWkeR&YJV=MsmB9&IvotUHiIPrt$r*3O@4UAj90ukc&MQoGpMFJgXC!ZZ z8>$IyI5~b}zmVsob$TCUkO1#CZ*#I43D%BY-Oo*n^F?BdQh5Wv?J^8!s$@`8Y8ZJ!xYSmr6Si-Nm7oUlg zoDBWh@>aa)z4ZWE*;4FHIQ?g7+9_$;DeE*^8a1uuEVN0)bLva1J0-2tOhQ9cTadcR z&z4+}$v2|$K~WPaIU6ZT3cm{Ktb(2wDQK}n2dpqQ0@C4v?RGCidNmW&FN0Ini7iRC zp6X?5m$g0QIb$jQ*`71WcOCw(3l~D3&M4HGeAgoYvB;8>U`*F?Zv@=%C5}iu3HgV! zhk+_z!FV3>kDx3O@|=P$32uK#sS|5sX-(L4*5S=K4q0kESq1~jEE-Uf_sIfV+LO1e zfUrC)Db<6(>+O;31Q5ODIvKH&40R_Y-+`S-9|vQsTaQ83)2JeO;mLO({ged4@Aep0 zp1S~-?2cGGd0)1b{A{~7QUb|~lArw@_&adq0uVXj>=$T+VUKg!N&AN&oLQnOj|%>upNtdj_SdN{S@j_!S)`g)icu&pQ2_bW4wEpXY=dh7gw0;`wOvhL2!2 zbtiB_>dNFTAxK3^PW0;kp$(m8dOcWhdISZ2*%p0 ztMB%%gzexLoNy@@%=Vm2zH1u1qC%b%QRqbSU8w*;PxNX%aRT(j4w_+hEsGBCUp4>1 z0j?9{7-q`Dq>^$H*9pCVUsX~gdeuL|f@yxV?T0w$g%@VWli)w-M~A)P_f*7%4ox8S z!W+(ngHVwi(7fBWPfr6^OCtFRp5hj5@L03gosx(xU6<&;zUUS*58Bu0$^OtkRSpY2q|DFv8&xA|Z5^cKn zn)~K6(GXsIHuB8`HH}Js;$v?F=zi93y%jIhoYh*AFOtHUsdWzBFt zxsWEG$xplljy)T>Xj|Igp7VO_^ZFc|XWrnp6lllUGMmTE*$1&Rx83MG^2-r@CfQ{J{YxCeh)(<*<*R@O} z%7wKY3u3ht8OyBG<}wSsmJLRfbcYW>yre{m?@ZXX5GK_Czyzc{C0uYDu1|Y#B}CHh z+_n%V=)?q(bsO+>gCsR??}n&VKtdFdQVwU^+EQi;_~ayPj&y`eUJoxmo(B_$g79l{ z%A369tc+$)hZ<&+xBf}dC%qBj1z&7^1L#P}@d$J;9&^30?uOE5MIgg_D?H!|;B@6I zyi~jqcO*Lvy0r~kD`#;56PcG3YPZ4%fuW;C_Tmn(=&V<+(ND_PP5{OL4<_e$js>S< z8nhX_r9ChK3mwiLjH{0h+|`iwVs45iGo@>+DpQz(d@b^EG9r09R1p*+j?A+mnnd(f z2Jt;b8%(Ob;coEK4lr*Q$l3AKD%ga27Omrn$`Q|_DBy@^w?reJT@f6Wc0~#k!pC86 z!a8oX<9r~pc!yVQSiqY@?N=Pmv+WC1@Q7zGmOuR$jP=EPpQ>8DdUg2dKmL5+pRVxH z1KlGh9*jy0zl1~>W?pgl!mmy|5I!3A?8gctp1o$Bv`5koEpb#T?6lcMOA%b-7K2Wq z4g1ALaA|y@lV!xH?U$pW4Q*oMXl8{O46G;N-4->QROkSa_9jP>iJHjcAkyB{LnLhU z^cHzC;@Q8=dm&QN=8fEpLnpkWgS+y>pXA70Mm1P=etsST5E(7Sc)SNAZqyOuamm=W ztpOy0KW~N@MTv_+;!8Pl7c=~7_!DA&n3+K;GDBz4m~pRDV_pZ$a+b0eHYD~|B;Vcd zzfq@0F@QafMm)Q*m%R_WB1b%Xu$6e%?I)0i7eu^Zg8fz78|uCg9O=YxB*8{mPT5!< zUPjrG;28&& z!W({O*k>>!4F4)cKJK^S5#E*n_s}zVPYm{#4nBP=Y)T#R;EQ%MgzPSO;{L4cYushj zR^(PGQ0@$J(D&LIY&+sPL=sf+t92kuC6l+l2|*4`rj|1UlDE91(@Du&ogeMx4e(0Ng7A2o)tigBO_#} z*9(lLtD+T?3#}MBm|7hM4H*{D$npse5mW$UCM+A*8-e$%N=C9%qURyI zz0u?@N*Yq3ZM?T0!d}a>DL7ey*+U1s7jfw9(3XwC%Q-4>IzYk7lcUbA5e$W4v&P5; z_7W+sN6$KMR!}AZ+;VUQ#zH9I%?d68^lT&>$1m_7CTk%%{Z-%jt|@qf)vWYPWb>o2 z`h!K>d5UWx zzve2iTlH&p)luD55Xe1q(M>o`fr%3#2?}8nPGEQSbzjT$&uQA@4J%>=yd4LzR{$=i_t z(-EExoxxRFU^(6m6{dW(3Q!Na6BZ8Aqpw5l5J6`w5A40b9rt17d4{KR4op(-{)T+( zouIfn751FCb;F78L7|O}J>7xI>1#RI%*hEKeX--&KFN?RL|=R$yPaye2Mrj2r7a-)4OF5M^HXQR@YtUv3o(FlpcLjLSyp~3mKZon zC}{(v z5Eo~HU@Sg9DL)lGk=+N23`>kw?}F+t$+WIdV!jyHrNBiVL$2Y|dypdrfRir*XJ4ig zDED$;A+xZ=NGbuUAekPmCUJaHteR0&4RMVo8AN92g>)OnkPXB)mMo2m_V!1O#>HU0 z@OXexQQ+3$2{99|Pr4QkktgZ^+93QFK`6N1w@+z|{|6 zk(gqY!^4$9W@knW7l zmZGOx#ge{_=xNsDAlsc0B6^1PtfX6rzTWz_heAr1tKNcA^WdL$dxumcTd@iF;*}4oiFrT>?V~Ku=>5T2xW{m2+%GwU+~j zDcguSMvyMiwIxA;P_=l0vTZTju<-HFT zvyzvCCvVCxCw?O#kNF=Cu*q@NJ1!f=I$zGl5E#9S+oo$w=iJ0K!oc zym(y+uAPuOq(Qh6Ws1jVS09(sOO4O2zC`wuqnFEesm_z6$bOWoMsHVtA_qfPM#l`r zx?BTXzksTeX2b0O{7BDLh>J1L%CNAF<6WNu>#&MyV3GQ?)(YIx0C9!#VHWu}c!OQ4 z@-ZCTt@}3-i35zgb{|i9yhgYJs(iKRB>;2R zsoYv9orLxN0!m4H-K_oXakVdjU{MORC<%p%3M;C(cV+8^>rR!qymw}^aNVUcZ|a>1 zO@24Fy{mQA<>kV4k8*E48cZI>Z{Xrw(B#Ucub}LhhhM=rJ9@a6)AoT`mqUGTsrs_x zI1O??SGitg@_D5=Ie@6*k*JR=(Ne6-@eR@kY8})E+B#ju#dz(TQBC`gfNhj4J>F7^ z?%t%NT_L5R;) zh1$j}7p^TN`KB=|V#M;%4UNKeyM;`y)@o=g9F3@%TH~AY-%(RqNu5;7w zn5CS8V|QO0heh&tl1o|}b+VRt99Ch*0x-Z2oTL!>lUYu*?LX(qDA;JgV)9Q(1~W7G^+uZ`AK%CICw z`h_Adl5!IKA|puwsZqf0!IIdzeN#^!iP*YSH}LctTkZxgjE2~rM)v+2l8GPqI+-9@kK_)v_`SFKFg}k2Q19 zxtV7qb2A5B7%0%pwW`^f-W;W|!@FC%*KocHgL7+?a^E6L@1ijIwhKG9yY=iwmH!>t zUg%jxZy01p)-%hT|8x1Q?*LI@f z3}*i-T=!FMoPieG^!wCEh03lU5;rsgT-4Ftac+U#(H3||MRY5T9ZXUzyeHeo)w*0& z!{jPOo}^l9xkk6!v1@OG<%DWOw;Nw??$+I#deXbdYl&_Z6C9q3hVbm&ME>Af;Tq*u z@6v+NYs;W3j3$yilR;#hmjX2Km6Y3icA+esO!?BUcwegFLYsC>5Jl`1vn7&lCT&6z0rug6qzQ)yM z6+R^cA_Q2~<<78L?R7!zYF?S(au3V=;68g=&^_!a`-3Xiq%>F7rS_ZlV|Lc3=iKWu z-2)#C1%vyavp?Kf?aD~KaaYx%m98sOA={oCvKIm5%DNb_%+%JMFWRFZ4>0#lu1S`A zeY!o#eU+X0N|tM4Dr78JYrpyC)K5QLcjHI){NS9yX%S})gRbH zU87T7Gt;1!rcXcp^snRWDfTbyxhw6^)Arn_cisrkr*}@l`_t~4r`*HSn_hB_PIJvn zb>*koRkl`cDwdP{_FP#&-rTisxGzb6%yrGs{rl|?cJ8#NKv}3h)xF-nc5b%288uI~ zGn-z%*L6kee!KB9@BKbWRJpCZ|Hix)oD9?G^U#?U!6xX|22VL&eRXg|4?V zI{yCnXS;56jlaZx`r;n8h3rVd+r+@=*-7K=*UGE7TF^g|MBXFL7B%MJ3aR& zpV<&PQy;U3*ek(VH`*)aPMJH!HGZHwY2nvI$B+`(_FKMxW=S4?R@d2s&!8XpI-O$x)A)gVp{M6mkT;7 z2R{yRNZ=3l2KQX<&GzTc2kd{Z|MkHC6c5bL zo#oG+K67?1oM7eVUN!Y}ZThU)vu4kn-e1g~F*A3@jM;GY7dgw8d5Vhj zmo7=4pOatU$xEM{zPNs!Z}N4p$VneHH$5-Es5F1cH*yNn%L3_R{nw1G=^uRoq0Mp1 zH)yQ?Q`{0y&$VD@Wobi=ufo?`<2ZI{{FARM_LZ$opF1~wRMq13^XhBsgN?mq{QopQ z#}AX*hCoeyUHa;>np$7wq;!87*poiC0-LR@0$K}a332QwM2lk<#5W*LxpJRBP>N2- z{F2y+Q?9tW#!uCOX2oTVRlWexv6zZeE+9Ee1K{b&*VRd_{pr`G_k{B+eRYAF)iq#w zOjvxo>q>)lYe2vhofEv6K4EOlM8KEME4?9qiJ~S?POmGelfvg>$j9>|7QJ>Z7Mov? zvp^S04bLwbmuOPQl7Qp81uwu-I2}?DVC&>z3X$@`d0V19O*W_Rh+!$5-cOarlf`-X z@f=>L7pL1}SPG|KBL(Bh;=I?RJWV#I-;7}?oc^B8b@sNA^S&SDX|g%}!x)yr>2%n; z!7H9#oHr`U(`0jcObkom^m9?Hw_cpr9_4AWIsJSLOX2hu*o1M?i}SWdd75lax5Tg% zPB+6x5Kgi#KTVps~NKY&%dlPu2rFv`1-6&6!&FMeJuoOm`Rd7CUs&%K{|N|YNvOD9;6}X?P*hg8M&Mq%%o`i(tn0@&4RME%A932-|~re#2V%W8yn$88O;(W5H6oz)94Qr2OI0e zCrJC3HZ;`N0bd^E)cWc`kg&nkRW(b3Ym0mhK5$f}RPu6(VoCop*tzf(l!2VGH9j#N zGmw&O3w5egSuIxe0F~w#K$GA{H7||%DyjsB1d-7PdVF4WS)-_Gtf@pVEe!@>pTsBR zM8z-tSLbVL7I0hN%P*z=>iWh&d2qE@u%sk?Ub@_p5vBP{OVOXD0nvyJ3Ogvi#zqMP zYpJiUQj`S(Wfg0DjbiP3HF<=9tMoN%&El7~Hf7#lsy!wjZT5!BStD&*J3an_DHf8Fxtg7SY2CR77!KnL2#EJ)mT`k(%ga)k0=k6f=5w-a%fj5Q(gvR zNr7*juU3@SuU-v;1WsW^eN!E@IxdI`JoAgyDyRU$xHSoP|q^xS}FY zo>)?fURovs6c>Kzoe*YKHF0`T15VK?uA(cj9$g*vZS<8@Ds3@fYJJT$f%T%a&et5^ zwpzMKlvY&xAfEBeiUU^U%Ya>+vs|hKfmE`jc$uicz629|*pWo(DsE&_R@4w^>@gJO za6gcZpSyH%u7K@G=po=FZJ_b14z3S^C|&gk>1x$YVy%fiL$#SGUl8>9{jklA9UPOs zN*TZ?L57PIuy{QWw~N>3R0M*sD_+isS}nvI0i|BdrVqg7dEi&!FRU$F?`y>Of?wcj zPf)ZGp>S>;qwijQgPag};ZSC6X&538cQG$`LTeo+x@gf@Z5|FRcW>AFB! zd99D5P&&FG-&0cTS(3A)7+XVskw}ARY*<#ff@2^r-?J>Lf$SPpW!g)zszwqw)Kmtl zMF8SlF1WZbj47T4Fd9U|4M#xP1akP4qnI3S$qy7u(hzjgPN+9lw79ucuV5j`5=0 zTPBCQxT~VE(?tb2aTa} zM@8ydl)u1RETUD*J}8GS2tXVJaFC8JyhW)WUszh}#kvx9&!|UAsng+WVsSnU=yJ4H z3YRQdv_v`xm-7vx4nv|+l+&=8$6Yw?WFR&*Dn;kO@P(sONui*Zno=KMtm#pcFdFJg zRjc|1t>a;?QCcY~>w^&9LIp8GwRi(N{G~x0xXNnkM1^$aJa10XGJ5+>6LpJfYGKQR z+7i1`MSX2>Z5{MC&}znX&lwk6#i8MEm6A$^p7^JLk6$z_3#TuT}*WM2E(qVw{!J}NW=L|}jce`sK?ipj= zEcn4|Hm!v(R z>vqMsHQBY0Y z>iQl4oEQ2CXslNf6eo;cJs2B;1v#6qKW^nS2_qlmtp+tS2hvmq@K2nqO5pAZDN?&a*JYFF29(BJ_97y z!%GI)K0uEn9K%DucG3D$o*!!&=~^0-xEMj1X8B`O9(nZ3)O9LkQpo6Rg3GT|E1hVb z$(!d;e%vTk1XsZNWtP7lGEJS3|71{=N=a8w^dGj7>Aw=dOqp2X$5-JU{yv)F7?ZaU zc;eN6_I_Dh_9;wZ{aCkI|7yTcrr{>BY9@ei6&rz-F45Sn43hEcx4)-&3Sr@n7uJtS zv;I23Oq&1_d*|X^h~;=Ns9h%SM#wWUWKWu>3cY7!8l+ecZ1MD8zDt$oI7j_)`_RLR)~{;meMi0o@$rS;IaptODekzMAb&g$BW`p~s?6Q%ZKN{XQR{nZ zI0|_4uPx#(|DEP}Al$uO9?@i134`4XFAV2TH%DD(& zUcz}lmE#0pu$K-akkBr-92qo#l5W{!v^vZFo-`wbd7XUR_ zd~$(XjGq{egSGaZK&8qZ_!|l5c;)9-lEdZM40|wei5`U$AMfA0M-W-X4ybSFZ?BhczC)4p6P(kalmsO@CAUQo_uB~*CwD< zg#&*B@$=b~Tq6Mgw;lNJBz`_elMErbqgmH$~)hvh3dgS^BGvwETy|((aMfJSczHn@>Fmw9VQ>N*A>i9is z?BGE^bTAJb;v6>U2Muxe6?(74<8F&a_cyei4&FTAGY8uG=(!z}ms^VG19ZB9XB(oS z5jG}P!}hD(O`#pA9-CnmWwp4_!fn+r-KFcXou(ZIL8S%tWtD2*(r;`8(ZRxMQlsa_ z1a8U5eF`{X0x37(=|L{6(`bW9o>duJ_u3hgEXf<2u^k(zB6`LIY2`O{1hv+;7I(P; zRr{Kdh@LoM48bM87=|aDU&*(n7eTnbuO4!qgzrH3Q%drBSi?taIQJ6>S1FVEx!--nf1Pbld@hdc3kK1cBT$i8kfHykeKh<#E zKfls&94pvA&uRFT8h%*Ab$ve6aD0`qoO1^L1&uTR)bI%!e?}q@aPj!Ciu^d6@aUSK z@NB}-pEx(?dKVh}(}{nj#-FM2S8BN4zqV?4md5|61OA!={!a&d3@%LILj9+}59_~D z!*xGbYPjBxeht^#af60W)#N{@;nOr6f43Pg)JM1XRl?c-+2qd-jbHcw`vyPz{}YX0 z_y2hf*Zn`XuT&=*4=q%06XB+w_Z$3si2vsrzwYN3HC!Jbey`!Ub;j*-TElfYf7fta zOEUi#8jgD(-4y?q*~%`|U$1wfhU;>!)^J^)IU26ZU#a1`{M8z+%Wu?hUH(P~e2a$b z^**EFdi?x`aE_l&YM0kFem#EPHTXGx{;Kio@zbs0<2C;$;)V!Z=x4pZ3?-cP8AjvL zWg5S(&v=8M^_i*h>-ywqxUNr)hU@KeFX24y;a`cs>y*Z?`&0h;9LQ(>&BQ+p4T1~p z)#G!9hU@j_YPcQ`OEg@MhjIo*X8WjaGn3ChU@ZQ z*KnQxw1!XA^!!Z2$7;CxlOD>SS7`VgbUa+>XI)N?hU;>gG+b}TI|#?>F@$+sy<6kg z<8X(;&vCe0_4n6C4cGl} zuZHXVKXAbJYWNJT-eVfB%lU(b>-vu#2!-K7{dNAO4tNvc*j~5?%-8oE_#e=4y*Do|&=YLwmb^ez$T%UKn zuHpK;>kAFn;0Pp4x6>|GW!dD|B4slS@6U0kVxmO7;kz%?IIlcXKDO@LFM2= zd?x&`oF!Bk@!1+)s^KFwe2s>uYj~4}k|27AFp99{Gn-OqvzkokJD6b=gqn>)4 zylU`socvMa*W;v1!}T~BiH!so%GZz5XBjw!typZ}Y;T2u!ygcq*IEtN{j<&i-)P`G zuf9*iQBSV-K?7$!A2D!xO^E;0aJ_w>(eQLl{_`4+^I@*{m;?TqhU@*pihlFo^L>=$ zfRA**uW-N@X!tdno;PT?uFnn)N0r&G-5QSLc{=>yb((OF&q9jNvl_o1pZ_%YIX?T- z#wEs^9-nC%uE*yn4cGObq~W^$Gac}S4tR+JzDvXPdVj9rdc7ktxZz^|@Okby!p;6W z#o%ZEWNZAoe->)E?w@kP`TeW35aJ<2eh0PJe`s>__WGs4&-y&C@$35hM#FV|GO?4u z#eU!;-m3{W{ZOdky8K%VITL6f!Kd--`qvx$tUv#09y8v;njBq!sz&NhE|d1~_9G4PG#yjlbQF5%xa@C_vAI|iPL zgAiQbRgb7$g|yG`0|Rd+yZ+t4&k?=Xz*m!;=MB7;^!%NH{}=iBj|ToE$vJD_>TlP= zKkRGZj}Scw8yqff$8luuWd^=Rv583r{sq;G=gD}noW-OkpN}wpjQCa<{NsqOHt_eT zU78F$Lh|`92D1E5i2r_r|7L0z{uY$^`;xtT4gUA(MGk-HwTE5TDN?*{;B!d+DFd${ zJ!p|2~RWd`w1Uo;13W!-M}9vJkP*OsJ)5}oc9fV23}0|)*ASYB&XTH zhZ26ff#YxI;q_eu$8&kS-Z${ylAO~9E+>k>f7ZZ1AUXdq@PiZ&=MDS|;_plKu>W7B zes__9b3e~B@Y~4GMF##j$>(zhmfs|;6{61I=kufu2L30~Cv4y!kv;bq_&UPxH*ns6 z|B-=jCI9@Jfe)ef+HK(DN&a2~{|Vtw8TcH+4;c7UPXg;rGd)e>L8~nS-&#xLd zes_e|dj|eD(*LgpK9cx9H}G4C?n8F4J|{>{nt}g{+H16d&nJ9}f&ZN7>kNDg`MG zk5F7aXW;h`&F9^0?-U_#cRWiGj0Sw;1?DvbWB_r_%Vjf$*rFxM2m?Rs+9;Hd=mU;FE~| zVFT|&{7)MAEaE?4;GYtHnsD~BpW@_WgP;BRxqO!|*9@OucKY2Y&mzuv&N5?)F;KCs@aD9+Xx{H(v^Z)T9}~{{&qxJj;riUbXVXS?+CY`h{JF%B z|G*kvj9*Fog@m)8-=gtzm4QD)c)fuiCw!xU^Y?l85YF`$Q@!6e@IiPu1J^!74zGI; z8vGnrFBv%h{>JY#IoQ5Dk9}Liv3)mDyLTCQ3EB09f%80Mz#!B%wtl&p`pa+w=W~K9 z4g56CL*^Lx^;GX71Lt$78x5TM%NoMj&o$&vzk&aZ&X4aj@F4NuYv2zM|9=q9ak5jH zFP=2;1>}bp4g7Ml_d`See^b4GHSoz)Zvr+RTx?f=I(JVp@R7uyK{)IAYtmKGDq@j&X(mDj8n22F~BJe%ru#Kl4rl=l#qd82C|&+n*V@ zpYVNzv)@?%XAPWxAM&s!2a^Hv&np_P+x4D-vt55P@MZMAxM1MCzc7ftCt*GRMCYo@zl6>;iw!)1mdI_1Lt$eziM)@-Xv--_3yaF#y9@% zF_pgOLAz*53MnC`63+hlkjAmO2LE))EyN;&zmo9f20owk@frB@gf|*E{~p371HXsl z-$gj;PeYH)x!>UbnEEgO?MmdQp-1xn+~CiYDEuC{CZC2RnRCG4pG58ZTaBOJ6A$bzL5t1Ve-!; zji0)ffVUa=D5Bd9d;-x& z4LpnJ;|4y1=ney)OY}(t&m+3iz!wpH*1(I1?l$lhM9U5YX^tO`2Rod!NKij~oP&v4~2F`K{9q{E2_$mXhQ{qLnfwTMu2fWz<-|T?5 zIN;kI@Es2LE(d(K1HQ)rZ*#!g9q^+L_;Clk!vR0(fOk6JXC3fv2b>2@%+}-0roq(2 zQylPN4tTl)KEVO!^C+|4Sq}W!4!G9=FLc0{JK(Dv@M;H~_g75)n;rN!JK!x2_;v?; zhXcOL0pIO_?{UD}9PoAr{HTGiqH%-2_hA1_r1?NKt#26TbJGR`zlZpn4SXNrn+^OO z!uhDV&>$#Wk z;|9M?@;eONL-IgQ0Rjd%*);9@^0N{Dny zVE3RdB9UtiJVf+z1LyO~fPwQl-F5@#bGk +#include +#include "ai_common.h" +#include +#include + +#define TAG_BOARDSTATE 0x7342 + +typedef struct sTag +{ + uint16_t Tag; + uint16_t Length; +} tTag; + +typedef struct sSavedBoardState +{ + uint8_t W, H; + uint16_t Count; + char NormalisedBoard[]; +} tSavedBoardState; + +// === PROTOTYPES === +tSavedBoardState *DB_int_ReadState(FILE *fp, off_t *offset); +void DB_int_AppendTag(FILE *fp, uint16_t Tag, uint16_t Size, void *Data); + +// === CODE === +char *DB_GetOpponentFile(const char *Opponent) +{ + uint32_t checksum = 0; + + { + int ofs = 0; + const char *str = Opponent; + while( *str ) + { + checksum ^= *str << ofs; + str ++; + ofs += 5; + ofs %= 32 - 5; + } + } + + const char *filename = NULL; + int filenamelen = 0; + { + const char *last_slash = NULL; + const char *last_dot = NULL; + const char *str = Opponent; + while( *str ) + { + if(*str == '/') last_slash = str; + if(*str == '.') last_dot = str; + str ++; + } + filename = last_slash + 1; + if( last_slash > last_dot ) + filenamelen = str - filename; + else + filenamelen = last_dot - filename; + } + + int len = snprintf(NULL, 0, "%08x_%.*s.ramen", checksum, filenamelen, filename); + char *ret = malloc(len+1); + snprintf(ret, len+1, "%08x_%.*s.ramen", checksum, filenamelen, filename); +// fprintf(stderr, "DB File = '%s'\n", ret); + return ret; +} + +void DB_LoadGuesses(const char *DBFile, enum eColours Colour) +{ + FILE *fp; + off_t offset = 0; + tSavedBoardState *saved_board = NULL; + + fp = fopen(DBFile, "r+"); + if(!fp) return ; + + // Read board states, checking for a same state + while( (saved_board = DB_int_ReadState(fp, &offset)) ) + { + if( saved_board->W != giBoardWidth ) + continue ; + if( saved_board->H != giBoardHeight ) + continue ; + break; + } + + // TODO: Combine counts of how many times a state has been played + + if( saved_board ) + { + char bs[giBoardWidth*4]; + int ofs = 0; + + + if( Colour != COLOUR_RED ) + { + ofs = giBoardHeight-4; + char *bs2 = saved_board->NormalisedBoard; + memcpy(bs + giBoardWidth*0, bs2 + giBoardWidth*(4-1), giBoardWidth); + memcpy(bs + giBoardWidth*1, bs2 + giBoardWidth*(4-2), giBoardWidth); + memcpy(bs + giBoardWidth*2, bs2 + giBoardWidth*(4-3), giBoardWidth); + memcpy(bs + giBoardWidth*3, bs2 + giBoardWidth*(4-4), giBoardWidth); + } + else + { + memcpy(bs, saved_board->NormalisedBoard, giBoardWidth*4); + } +// for( int i = 0; i < 4; i ++ ) { +// fprintf(stderr, "%.*s\n", giBoardWidth, bs + giBoardWidth*i); +// } + + // Set guessed ranks + for( int i = 0; i < giBoardWidth*4; i ++ ) + { + tPiece *p = GetPieceByPos(i % giBoardWidth, i/giBoardWidth + ofs ); +// fprintf(stderr, "%c", bs[i]); +// if(i % giBoardWidth == giBoardWidth-1) +// fprintf(stderr, "\n"); + if( bs[i] == '\0' && p ) + break; + if( bs[i] != '\0' && !p ) + break; + if( p ) + p->GuessedRank = CharToRank(bs[i]); + } + } + + fclose(fp); +} + +void DB_WriteBackInitialState(const char *DBFile, enum eColours Colour, tPiece *Pieces) +{ + char bs[giBoardHeight*giBoardWidth]; + memset(bs, 0, sizeof(bs)); + + for( int i = 0; i < N_PIECES; i ++ ) + { + if( Pieces[i].StartY < 0 ) continue ; + char *bp = &bs[ Pieces[i].StartY*giBoardWidth + Pieces[i].StartX ]; + + if( *bp != '\0' ) + { + // Oops? + } + else + { + *bp = cRANK_CHARS[ Pieces[i].Rank ]; + } + } + + // Normalise board to RED + if( Colour != COLOUR_RED ) + { + memcpy(bs + giBoardWidth*0, bs + giBoardWidth*(giBoardHeight-1), giBoardWidth); + memcpy(bs + giBoardWidth*1, bs + giBoardWidth*(giBoardHeight-2), giBoardWidth); + memcpy(bs + giBoardWidth*2, bs + giBoardWidth*(giBoardHeight-3), giBoardWidth); + memcpy(bs + giBoardWidth*3, bs + giBoardWidth*(giBoardHeight-4), giBoardWidth); + } + + + off_t offset; + tSavedBoardState *saved_board; + FILE *fp = fopen(DBFile, "r+"); + if( !fp ) { + fp = fopen(DBFile, "w"); + } + + // Read board states, checking for a same state + while( (saved_board = DB_int_ReadState(fp, &offset)) ) + { +// fprintf(stderr, "DBG: %i == %i? and %i == %i\n", +// saved_board->W, giBoardWidth, saved_board->H, giBoardHeight +// ); + + if( saved_board->W != giBoardWidth ) + continue ; + if( saved_board->H != giBoardHeight ) + continue ; + + BOOL b_different = false; + + for( int i = 0; i < 4*giBoardWidth; i ++ ) + { + if( saved_board->NormalisedBoard[i] == '#' || bs[i] == '#' ) + continue ; + if( saved_board->NormalisedBoard[i] != bs[i] ) { + fprintf(stderr, "DBG: '%c' != '%c'\n", saved_board->NormalisedBoard[i], bs[i]); + b_different = true; + break; + } + } + + if( b_different ) continue ; + + break; + } + + if( saved_board ) + { + saved_board->Count ++; + fseek(fp, offset, SEEK_SET); + // Merge + for( int i = 0; i < 4*giBoardWidth; i ++ ) + { + if( saved_board->NormalisedBoard[i] == '#' ) + saved_board->NormalisedBoard[i] = bs[i]; + } + // Write back + fwrite(saved_board, sizeof(*saved_board) + giBoardWidth*4, 1, fp); + } + else + { + saved_board = malloc( sizeof(*saved_board) + giBoardWidth*4 ); + saved_board->W = giBoardWidth; + saved_board->H = giBoardHeight; + saved_board->Count = 1; + memcpy(saved_board->NormalisedBoard, bs, 4*giBoardWidth); + DB_int_AppendTag(fp, TAG_BOARDSTATE, sizeof(*saved_board) + giBoardWidth*4, saved_board); + } + free(saved_board); + + fclose(fp); +} + +tSavedBoardState *DB_int_ReadState(FILE *fp, off_t *offset) +{ + tTag tag; + tSavedBoardState *ret = NULL; + + do { + if( fread(&tag, sizeof(tag), 1, fp) != 1 ) + break ; + if( tag.Tag == TAG_BOARDSTATE ) + { + *offset = ftell(fp); + ret = malloc(tag.Length); + fread(ret, tag.Length, 1, fp); + } + fseek(fp, tag.Length, SEEK_CUR); + } while(!ret); + + return ret; +} + +void DB_int_AppendTag(FILE *fp, uint16_t Tag, uint16_t Size, void *Data) +{ + fseek(fp, 0, SEEK_END); + fwrite(&Tag, sizeof(uint16_t), 1, fp); + fwrite(&Size, sizeof(uint16_t), 1, fp); + fwrite(Data, Size, 1, fp); +} diff --git a/agents/ramen/src/db.o b/agents/ramen/src/db.o new file mode 100644 index 0000000000000000000000000000000000000000..28ca7ce077ada44f31332078ce40fe09bd5b57cb GIT binary patch literal 20832 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 +#include +#include +#include +#include "interface.h" + +// === CONSTANTS === +static const char *DIR_NAMES[] = {"INVL", "LEFT", "RIGHT", "UP", "DOWN"}; + +// === PROTOTYPES === + int main(int argc, char *argv[]); +void GetMove(char *line, tMove *Move); +void ReadBoardState(FILE *stream, char *dest); + int RunRegex(regex_t *regex, const char *string, int nMatches, regmatch_t *matches, const char *errorMessage); +void CompileRegex(regex_t *regex, const char *pattern, int flags); + +// === GLOBALS === +regex_t gRegex_move; +regex_t gRegex_res; + int giBoardWidth; + int giBoardHeight; +char *gaBoardState; + +// === CODE === +int main(int argc, char *argv[]) +{ + setbuf(stdin, NULL); + setbuf(stdout, NULL); + + // $X $Y $DIRECTION [$MULTIPLIER=1] $OUTCOME + CompileRegex(&gRegex_move, "([0-9]+) ([0-9]+) ([A-Z]+)( [0-9]+)? (.*)", REG_EXTENDED); + // (KILLS|DIES|BOTHDIE) $ATTACKER_RANK $DEFENDER_RANK + CompileRegex(&gRegex_res, "([A-Z_]+) (.) (.)", REG_EXTENDED); + + { + int colour_id; + char colour[6]; + char opponent[128]; + fscanf(stdin, "%s %s %i %i", colour, opponent, &giBoardWidth, &giBoardHeight); + + if( strcmp(colour, "RED") == 0 ) + colour_id = COLOUR_RED; + else if( strcmp(colour, "BLUE") == 0 ) + colour_id = COLOUR_BLUE; + else { + fprintf(stderr, "Oops... nutty manager, colour = %s\n", colour); + colour_id = COLOUR_RED; + } + + DEBUG("colour=%i, opponent='%s', dims = %ix%i", colour_id, opponent, giBoardWidth, giBoardHeight); + + AI_Initialise(colour_id, opponent); + } + + gaBoardState = malloc(giBoardWidth*giBoardHeight); + + for( ;; ) + { + tMove mymove, opponent_move; + char line[32]; + +// DEBUG("Waiting for move"); + ASSERT( fgets(line, sizeof(line), stdin) != NULL ); +// DEBUG("pm line = '%s'", line); + + if( strcmp(line, "\n") == 0 ) + continue ; + + if( strcmp(line, "START\n") == 0 ) + { +// DEBUG("New game"); + ReadBoardState(stdin, gaBoardState); + // TODO: Check if this hasn't happened before + opponent_move.x = 0; + opponent_move.y = 0; + opponent_move.dist = 0; + opponent_move.dir = 0; + } + else if( strncmp(line, "QUIT", 4) == 0 ) + { + // TODO: Result? + break ; + } + else if( strcmp(line, "VICTORY_FLAG\n") == 0 ) + { + // I win! + break; + } + else + { +// DEBUG("GetMove"); + GetMove(line, &opponent_move); +// DEBUG("Read board state"); + ReadBoardState(stdin, gaBoardState); + } + DEBUG("Opposing move %i,%i dir %i dist %i", + opponent_move.x, opponent_move.y, opponent_move.dir, opponent_move.dist); + + // Silly opponent, you lost + if( opponent_move.result == RESULT_VICTORY ) + break; + + // Determine move + AI_HandleMove(0, &opponent_move); + AI_DoMove(&mymove); + DEBUG("Chose move %i,%i %i %i", mymove.x, mymove.y, mymove.dir, mymove.dist); + printf("%i %i %s %i\n", mymove.x, mymove.y, DIR_NAMES[mymove.dir], mymove.dist); + + // Get result of the move + ASSERT( fgets(line, sizeof(line), stdin) != NULL ); +// DEBUG("res line = '%s'", line); +// + GetMove(line, &mymove); + AI_HandleMove(1, &mymove); + + // I WON! + if( mymove.result == RESULT_VICTORY ) + break; + +// DEBUG("Move over"); + } + + return 0; +} + +void GetMove(char *line, tMove *Move) +{ + regmatch_t matches[1+5]; + + // regex (\d+) (\d+) ([A-Z]*)(?: (\d+))? + RunRegex(&gRegex_move, line, 1+5, matches, "Move line"); + + char *xstr = line + matches[1].rm_so; + char *ystr = line + matches[2].rm_so; + char *dirstr = line + matches[3].rm_so; + + Move->x = atoi(xstr); + Move->y = atoi(ystr); +// DEBUG("(%i,%i)", Move->x, Move->y); + // Direction + if( strncmp(dirstr, "UP", 2) == 0 ) + Move->dir = DIR_UP; + else if( strncmp(dirstr, "DOWN", 4) == 0 ) + Move->dir = DIR_DOWN; + else if( strncmp(dirstr, "LEFT", 4) == 0 ) + Move->dir = DIR_LEFT; + else if( strncmp(dirstr, "RIGHT", 5) == 0 ) + Move->dir = DIR_RIGHT; + else { + fprintf(stderr, "Is the manager nuts? Dir = %.*s unk\n", + matches[3].rm_eo + matches[3].rm_so, dirstr + ); + fprintf(stderr, "line = '%s'\n", line); + Move->dir = DIR_INVAL; + } + if( matches[4].rm_so >= 0 ) + Move->dist = atoi(line + matches[4].rm_so + 1); + else + Move->dist = 1; + + // Outcome + char *outcome = line + matches[5].rm_so; + if( strncmp(outcome, "OK", 2) == 0 ) + Move->result = RESULT_OK; + else if( strncmp(outcome, "ILLEGAL", 7) == 0 ) + Move->result = RESULT_ILLEGAL; + else if( strncmp(outcome, "VICTORY_FLAG", 12) == 0 ) + Move->result = RESULT_VICTORY; + else if( strncmp(outcome, "VICTORY_ATTRITION", 17) == 0 ) + Move->result = RESULT_VICTORY; + else + { + regmatch_t res_matches[3+1]; + RunRegex(&gRegex_res, outcome, 3+1, res_matches, "Result portion"); + + char *res_str = outcome + res_matches[1].rm_so; + if( strncmp(res_str, "KILLS ", 6) == 0 ) + Move->result = RESULT_KILL; + else if( strncmp(res_str, "DIES ", 5) == 0 ) + Move->result = RESULT_DIES; + else if( strncmp(res_str, "BOTHDIE ", 8) == 0 ) + Move->result = RESULT_BOTHDIE; + else { + fprintf(stderr, "Is the manager nuts? Result = %.*s\n", + res_matches[1].rm_eo + res_matches[1].rm_so, res_str + ); + Move->result = RESULT_INVAL; + } + + Move->attacker = *(outcome + res_matches[2].rm_so); + Move->defender = *(outcome + res_matches[3].rm_so); + } +} + +void ReadBoardState(FILE *stream, char *dest) +{ + for( int i = 0; i < giBoardHeight; i ++ ) + { + char tmp[giBoardWidth+2]; + fgets(tmp, sizeof(tmp), stream); + DEBUG("BS %.*s", giBoardWidth, tmp); + memcpy(dest+i*giBoardWidth, tmp, giBoardWidth); + } +} + +int RunRegex(regex_t *regex, const char *string, int nMatches, regmatch_t *matches, const char *errorMessage) +{ + int ret; + + ret = regexec(regex, string, nMatches, matches, 0); + if( ret ) { + size_t len = regerror(ret, regex, NULL, 0); + char errorStr[len]; + regerror(ret, regex, errorStr, len); + fprintf(stderr, "string = '%s'\n", string); + fprintf(stderr, "%s\n%s", errorMessage, errorStr); + exit(-1); + } + + return ret; +} + +void CompileRegex(regex_t *regex, const char *pattern, int flags) +{ + int ret = regcomp(regex, pattern, flags); + if( ret ) { + size_t len = regerror(ret, regex, NULL, 0); + char errorStr[len]; + regerror(ret, regex, errorStr, len); + fprintf(stderr, "Regex compilation failed - %s\n", errorStr); + exit(-1); + } +} diff --git a/agents/ramen/src/main.o b/agents/ramen/src/main.o new file mode 100644 index 0000000000000000000000000000000000000000..2c66953147d1ee4471db422d6f0718eda04a5cdc GIT binary patch literal 19688 zcmcgz4RqAim4E-4kPIXw!2t3p0}%*HCO`qfN=bl$NlAc)1QF~0nI!*&smV+_9}xUR z1C;3)OSHCl+HIkATe`XxTh^*5MoW>pUBz~7>DIQKiU>ltAGqq-b`N{+d-u+~d6}`E z-E;OGX8!N~-hKD$-S_c-6YlmmtaMqH;9`kShz!LjJS#KxT3M|X6U3FGC6Ih;ec+yp z=KxDSH|g@_%Yo!Sm*XQf4B3w2S0MQkwu@ZYGpJ2+J&!DsFBf(MTS-8mzu${0`dd!d zJ&kzXQ?fPr8_*=HN?pJIbe8^IgNflU`7a{x1%DtMA^|lru@f}gMn1ZkI+=WUMM?y5*~wPM^DLgs7wCQ2wd9fk2nGe5d1espk*+J zkJ8%X&tqE2flB#*g1+r~|GzI^zEHIHLcv~02$jG097B$qfBZw9Rr`PpB%j*?gACJZ zGd}uTAbWNp!b$(yGlh~(3sK6y57N#p*#b%bi4=rTqfe&%2X*>XAmu;7A%&bw?Lt+1 z$^kw(6kcZme(D()C^hmRQ9)f_sx5Fs^Z7T?Fl5e=G&(ajpMUZrGGipqCz%#Ts^u|oxqrS(pH+cW%c(%}wd9}8NtHGCQxB==XHWl(0+26K{zJP4duPA{ zqS`lTr6aGVVJ4#MJQs?o>+xETmGVEO55s8))#<+x*AjH-{9`z!khusb)BDUIl*mxs z&CDeq&Wu@fzKNMfeFWy|$lU)>59TFUlSxP% {+SQ9pkc0lykdWtq{hUnO4>4Y5 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 literal 0 HcmV?d00001 diff --git a/agents/ramen/src/main.o.dep b/agents/ramen/src/main.o.dep new file mode 100644 index 0000000..b832325 --- /dev/null +++ b/agents/ramen/src/main.o.dep @@ -0,0 +1 @@ +main.o: main.c interface.h diff --git a/agents/vixen/basic_python.pyc b/agents/vixen/basic_python.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4b3cf003913e75339503e01db5cdfdb0d3151e3a GIT binary patch literal 10751 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 literal 0 HcmV?d00001 diff --git a/agents/vixen/path.pyc b/agents/vixen/path.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9d84840430f79c670f5d617c3c2934622c3f8582 GIT binary patch literal 2093 zcmb_dO>f&q5S^t&eb`RX#0YGq0SdGiA%`k;(OVD%iR<(WN@{>Fk-5lF2@Sej?rZOw7{1PJ?y}Si>NLqF zM_qhHJNqd{z2kD4^=v%t?U%{PG%K9#RkL!Gl+$YO?#Fw*c%-t|`J1fhRfyrE>eRJh zIUMFi?uJ8pvP2it4iXNw&?v2;*+0N{j<}3;e$fPW#(|W##84P`AwCp_Vi3>3AfgJd(2wnd1dvz-$OMg=wqF z2*8^%-_-b!42E|dv9~3Mr%h(oeE+LqdrqM`OG97v#xQg3<#zea^xM_ez1QgK!fn2- zpcF8Zd5i05L(T&+#c%61rX#%Epy>^gw+$MX8??N^-rEMv%MB0>DIshGwxm1g@+|jJ zpIV_Jh+E`UcA6~DCr`jOn&lxwno%iQ`S|PtWt*aP-K%J4&?Sn3V!QNtfcjq?RDXau z&HRwcS&`C#T=5j&o5a(XX?*`fLJ@Bj2b~NkeFvReg@Q8h7mepfR+@rIRw%iM*Pb%F zBE6^ypgU+v%Q3BAe|GT95kLCk@#oJ_ULxN-)s_7x&->jrSCkNSlJcZ*s(lboY!+(K}=uFY9i)SvPy-r`2@yugPvLo+r zmXD5|vOB31JuQDI^hQpO%RI@fj?2pBWnmShDsylprkDEsF%)(5-}gAW0SxlD57CLa z6NEu02+g->p9Eq3U9-FR-7p=~FimNg_sn&3GuSrU(7kDHn+q-IavK)ce-Tf!;ZXnE zhQn!@o=h-}ST^c)T?1Dw1TtrC^k1f7+M$Q0CoMgDYBhJWxJb)sMD_p8xyE|WM|Yn! Kpd_};R_$LGopr4M literal 0 HcmV?d00001 -- 2.20.1