@ #include § "ChessVideo.h"; typedef § Object3D* § GraphicalObject; typedef § Camera* § SceneCamera; @ SIMULATION ChessSimulation { MODEL ChessPiece { STATE { GraphicalObject piece = @0@; string square = @""@; string toSquare = @""@; bool firstTick = @true@; bool moving = @false@; bool jump = @false@; bool goingToSky = @false@; real speed = @(real)20@; int numSteps = @0@; int step = @0@; int countDown = @0@; real dx = @0@; real dy = @0@; real dz = @0@; } TICK { @ if(firstTick) { firstTick = false; ChessVideoScene.addObject(piece); return; } if(goingToSky) { piece->translate(0, 0, (real)8.0 / (real)frames_per_second); } if(piece) { if(moving) { if(countDown > 0) { countDown--; return; } if(jump) { real § halfd = (real)numSteps / (real)2; real § st = - ((real)step - halfd); real § st1 = - ((real)(step + 1) - halfd); real § divider = (numSteps * numSteps) / (real)32; dz = (st*st - st1*st1) / divider; } piece->translate(dx, dy, dz); step++; if(step==numSteps) { moving = false; square = toSquare; string § msg = "Yes"; $POSTMESSAGE[NEXTMOVE, msg]; } return; } string § fromSquare = $GETMESSAGE[FROM]; toSquare = $GETMESSAGE[TO]; if(fromSquare == square) { real § fx, fy, fz; real § tx, ty, tz; squareLocation(fromSquare, fx, fy, fz); squareLocation(toSquare, tx, ty, tz); real § distance = (real)sqrt((tx-fx)*(tx-fx)+(ty-fy)*(ty-fy)); numSteps = (int)((distance * frames_per_second)/speed); step = 0; dx = (tx-fx) / (real)numSteps; dy = (ty-fy) / (real)numSteps; dz = (tz-fz) / (real)numSteps; string § empty = ""; $POSTMESSAGE[FROM, empty]; $POSTMESSAGE[TO, empty]; moving = true; countDown = (int)frames_per_second / 2; } else § if(toSquare == square) { goingToSky = true; square = "sky"; } }; @ } } AGENT whitePawn1 { MODEL ChessPiece STATE { piece = @Pawns[1]@; square = @"h2"@; } } AGENT whitePawn2 { MODEL ChessPiece STATE { piece = @Pawns[3]@; square = @"g2"@; } } AGENT whitePawn3 { MODEL ChessPiece STATE { piece = @Pawns[5]@; square = @"f2"@; } } AGENT whitePawn4 { MODEL ChessPiece STATE { piece = @Pawns[7]@; square = @"e2"@; } } AGENT whitePawn5 { MODEL ChessPiece STATE { piece = @Pawns[9]@; square = @"d2"@; } } AGENT whitePawn6 { MODEL ChessPiece STATE { piece = @Pawns[11]@; square = @"c2"@; } } AGENT whitePawn7 { MODEL ChessPiece STATE { piece = @Pawns[13]@; square = @"b2"@; } } AGENT whitePawn8 { MODEL ChessPiece STATE { piece = @Pawns[15]@; square = @"a2"@; } } AGENT blackPawn1 { MODEL ChessPiece STATE { piece = @Pawns[0]@; square = @"h7"@; } } AGENT blackPawn2 { MODEL ChessPiece STATE { piece = @Pawns[2]@; square = @"g7"@; } } AGENT blackPawn3 { MODEL ChessPiece STATE { piece = @Pawns[4]@; square = @"f7"@; } } AGENT blackPawn4 { MODEL ChessPiece STATE { piece = @Pawns[6]@; square = @"e7"@; } } AGENT blackPawn5 { MODEL ChessPiece STATE { piece = @Pawns[8]@; square = @"d7"@; } } AGENT blackPawn6 { MODEL ChessPiece STATE { piece = @Pawns[10]@; square = @"c7"@; } } AGENT blackPawn7 { MODEL ChessPiece STATE { piece = @Pawns[12]@; square = @"b7"@; } } AGENT blackPawn8 { MODEL ChessPiece STATE { piece = @Pawns[14]@; square = @"a7"@; } } AGENT whiteKnight1 { MODEL ChessPiece STATE { piece = @&wknight01@; square = @"b1"@; jump = @true@; } } AGENT whiteKnight2 { MODEL ChessPiece STATE { piece = @&wknight02@; square = @"g1"@; jump = @true@; } } AGENT blackKnight1 { MODEL ChessPiece STATE { piece = @&bknight01@; square = @"b8"@; jump = @true@; } } AGENT blackKnight2 { MODEL ChessPiece STATE { piece = @&bknight02@; square = @"g8"@; jump = @true@; } } AGENT whiteBishop1 { MODEL ChessPiece STATE { piece = @&wbishop01@; square = @"c1"@; } } AGENT whiteBishop2 { MODEL ChessPiece STATE { piece = @&wbishop02@; square = @"f1"@; } } AGENT blackBishop1 { MODEL ChessPiece STATE { piece = @&bbishop01@; square = @"c8"@; } } AGENT blackBishop2 { MODEL ChessPiece STATE { piece = @&bbishop02@; square = @"f8"@; } } AGENT whiteRook1 { MODEL ChessPiece STATE { piece = @&wrook01@; square = @"a1"@; } } AGENT whiteRook2 { MODEL ChessPiece STATE { piece = @&wrook02@; square = @"h1"@; } } AGENT blackRook1 { MODEL ChessPiece STATE { piece = @&brook01@; square = @"a8"@; } } AGENT blackRook2 { MODEL ChessPiece STATE { piece = @&brook02@; square = @"h8"@; } } AGENT whiteQueen1 { MODEL ChessPiece STATE { piece = @&wqueen01@; square = @"d1"@; } } AGENT blackQueen1 { MODEL ChessPiece STATE { piece = @&bqueen01@; square = @"d8"@; } } AGENT whiteKing1 { MODEL ChessPiece STATE { piece = @&wking01@; square = @"e1"@; } } AGENT blackKing1 { MODEL ChessPiece STATE { piece = @&bking01@; square = @"e8"@; } } AGENT chessPlayer { STATE { bool firstTick = @true@; int move = @0@; } TICK { @ if(firstTick) { firstTick = false; string § msg = "Yes"; $POSTMESSAGE[NEXTMOVE, msg]; return; } string § nextMove = $GETMESSAGE[NEXTMOVE]; if(nextMove == "Yes") { string § msg = "No"; $POSTMESSAGE[NEXTMOVE, msg]; if((2*move+1) >= moves.size()) { string § endGame = "Yes"; $POSTMESSAGE[ENDGAME, endGame]; return; } string § fromSquare = moves[2*move]; string § toSquare = moves[2*move+1]; $POSTMESSAGE[FROM, fromSquare]; $POSTMESSAGE[TO, toSquare]; move++; }; @ } } AGENT chessBoard { STATE { bool firstTick = @true@; } TICK { @ if(firstTick) { firstTick = false; ChessVideoScene.addObject(&board); return; }; @ } } AGENT Camera01 { STATE { SceneCamera camera = @&camera01@; int count = @0@; } TICK { @ count++; real § sx = (real)25*(real)cos((2.0*3.1416*count)/(real)(8*frames_per_second)); real § sy = (real)25*(real)sin((2.0*3.1416*count)/(real)(8*frames_per_second)); real § sz = (real)20 + (real)5*(real)sin((2.0*3.1416*count)/(real)(3*frames_per_second)); Vector3DW § eaux(0, 0, 0); eaux.setX(sx); eaux.setY(sy); eaux.setZ(sz); camera->setEye(eaux); string § fromSquare = $GETMESSAGE[FROM]; string § toSquare = $GETMESSAGE[TO]; if((fromSquare != "")&&(toSquare != "")) { real § fx, fy, fz; real § tx, ty, tz; squareLocation(fromSquare, fx, fy, fz); squareLocation(toSquare, tx, ty, tz); real § distance = (fx*fx + fy*fy + fz*fz); distance += (tx*tx + ty*ty + tz*tz); real § grade = (real)1500 / distance; if(grade < 0) grade = 0; if(grade > 10) grade = 10; gradeCamera01 = grade; }; @ } } AGENT Camera02 { STATE { SceneCamera camera = @&camera02@; int count = @0@; } TICK { @ count++; real § sx = (real)10*(real)cos((2.0*3.1416*count)/(real)(8*frames_per_second)); real § sy = (real)10*(real)sin((2.0*3.1416*count)/(real)(8*frames_per_second)); real § sz = (real)5 + (real)2*(real)sin((2.0*3.1416*count)/(real)(3*frames_per_second)); Vector3DW § ataux(0, 0, 0); ataux.setX(sx); ataux.setY(sy); ataux.setZ(sz); camera->setAt(ataux); string § fromSquare = $GETMESSAGE[FROM]; string § toSquare = $GETMESSAGE[TO]; if((fromSquare != "")&&(toSquare != "")) { real § fx, fy, fz; real § tx, ty, tz; squareLocation(fromSquare, fx, fy, fz); squareLocation(toSquare, tx, ty, tz); real § distance = ((sx-fx)*(sx-fx) + (sy-fy)*(sy-fy) + (sz-fz)*(sz-fz)); distance += ((sx-tx)*(sx-tx) + (sy-ty)*(sy-ty) + (sz-tz)*(sz-tz)); real § grade = (real)1500 / distance; if(grade < 0) grade = 0; if(grade > 10) grade = 10; gradeCamera02 = grade; }; @ } } AGENT Camera03 { STATE { SceneCamera camera = @&camera03@; int count = @0@; } TICK { @ count++; real § sx = (real)10*(real)cos((2.0*3.1416*count)/(real)(8*frames_per_second)); real § sy = (real)10*(real)sin((2.0*3.1416*count)/(real)(8*frames_per_second)); real § sz = (real)40 + (real)10*(real)sin((2.0*3.1416*count)/(real)(3*frames_per_second)); Vector3DW § eaux(0, 0, 0); eaux.setX(sx); eaux.setY(sy); eaux.setZ(sz); camera->setEye(eaux); gradeCamera03 = (real)5; @ } } }