/*------------------------------------------------------------------------- ActMsgCommand --------------------------------------------------------------------------*/ MRESULT ActMsgCommand( WNDATTR *wndattr, MPARAM mp1, MPARAM mp2 ) { USHORT cmd; int offset; cmd = SHORT1FROMMP( mp1 ); switch (cmd) { case CMD_APPEND: CmdAppendFile( wndattr ); break; case CMD_SAVE: CmdSaveAs( wndattr ); break; case CMD_COPY: CmdCopy( wndattr ); break; case CMD_PASTE: CmdPaste( wndattr ); break; case CMD_UNMARK: CmdUnmark( wndattr ); break; case CMD_REARRANGE: CmdRearrange( wndattr ); break; case CMD_ABOUT: CmdAbout( wndattr ); break; case CMD_ACCUM: CmdAccum( wndattr ); break; case CMD_FIND: CmdFind( wndattr ); break; case CMD_MARKFIND: CmdMarkFind( wndattr ); break; case CMD_FINDNEXT: offset = FindIt( wndattr->list, wndattr->current, FNEXT ); CorrectScroll( wndattr, offset ); break; case CMD_FINDPREV: offset = FindIt( wndattr->list, wndattr->current, FPREV ); CorrectScroll( wndattr, offset ); break; case CMD_NEXTMARK: MoveToMark( wndattr, FNEXT ); break; case CMD_PREVMARK: MoveToMark( wndattr, FPREV ); break; case CMD_MATE: CmdMate( wndattr ); break; case CMD_SPAWN: CmdSpawn( wndattr ); break; case CMD_QUIT: CmdQuit( wndattr ); break; default: return MRFROMSHORT( TRUE ); break; } return MRFROMSHORT( FALSE ); }
void GameEvent(CORE_DATA *cd) { USER_DATA *ud = UD(cd); switch (cd->event) { case EVENT_START: RegisterPlugin(OPENCORE_VERSION, "chess", "cycad", "1.0", __DATE__, __TIME__, "A player-vs-player chess bot", sizeof(USER_DATA), 0); ud = UD(cd); // allocate chess board ud->board = (BOARD)calloc(8, sizeof(PIECE*)); for (int i = 0; i < 8; ++i) { ud->board[i] = (PIECE*)calloc(8, sizeof(PIECE)); } BoardReset(ud, ud->board); // draw the board LvzDrawAll(ud, NULL, true); RegisterCommand(COMMAND_CHESSHELP, "!chesshelp", "Chess", 0, CMD_PUBLIC | CMD_PRIVATE, NULL, "Get basic chessbot information", NULL); RegisterCommand(COMMAND_GAMEINFO, "!gameinfo", "Chess", 0, CMD_PUBLIC | CMD_PRIVATE, NULL, "Get information about the current game", NULL); RegisterCommand(COMMAND_WHITE, "!white", "Chess", 0, CMD_PUBLIC | CMD_PRIVATE, NULL, "Play as White", NULL); RegisterCommand(COMMAND_BLACK, "!black", "Chess", 0, CMD_PUBLIC | CMD_PRIVATE, NULL, "Play as Black", NULL); RegisterCommand(COMMAND_MOVE, "!move", "Chess", 0, CMD_PUBLIC | CMD_PRIVATE, "<coord1>,<coord2>", "Move a chess piece", NULL); RegisterCommand(COMMAND_QUIT, "!quit", "Chess", 0, CMD_PUBLIC | CMD_PRIVATE, NULL, "Stop playing chess", NULL); break; case EVENT_COMMAND: switch (cd->cmd_id) { case COMMAND_CHESSHELP: CmdChessHelp(cd); break; case COMMAND_GAMEINFO: CmdGameInfo(cd); break; case COMMAND_WHITE: CmdWhite(cd); break; case COMMAND_BLACK: CmdBlack(cd); break; case COMMAND_MOVE: CmdMove(cd); break; case COMMAND_QUIT: CmdQuit(cd); break; default: assert(0); break; } break; case EVENT_MESSAGE: #if 0 // eventually handle commands in pubchat, like "b1,c3" if (cd->msg_type == MSG_PUBLIC && ud->in_progress && IsPlaying(cd->msg_name)) { } #endif break; case EVENT_ENTER: LvzActivateBoard(); LvzDrawAll(ud, cd->p1, true); LvzToMove(ud->to_move, cd->p1); if (IsPlaying(ud, cd->p1->name)) { // player rejoined ArenaMessageFmt("%s has returned to the game", cd->p1->name); KillTimer(ud->timer); ud->timer = 0; } break; case EVENT_LEAVE: // check if this player is relevant if (IsPlaying(ud, cd->p1->name)) { if (ud->in_progress && ud->timer) { // timer is only set when one player is already gone StopGame(ud, "Both players left the game"); KillTimer(ud->timer); ud->timer = 0; } else if (ud->in_progress) { // someone left a game in progress ArenaMessageFmt("%s has left the game and has 2 minutes to return", cd->p1->name); ud->timer = SetTimer(2 * 60 * 1000, 0, 0); } else { // no need to wait for someone not playing ArenaMessageFmt("%s is no longer playing", cd->p1->name); UnsetPlayerName(ud, cd->p1->name); } } break; case EVENT_TIMER: // this game needs to be stopped due to timeout if (ud->in_progress && cd->timer_id == ud->timer) { StopGame(ud, "Player did not return to game"); ud->timer = 0; } else if (cd->timer_data1) { uint32_t objid = (uint32_t)(intptr_t)cd->timer_data1; uint32_t on = (uint32_t)(intptr_t)cd->timer_data2; if (on) { PubMessageFmt("*objon %u", objid); } else { PubMessageFmt("*objoff %u", objid); } } break; case EVENT_STOP: // free chess board for (int i = 0; i < 8; ++i) { free(ud->board[i]); } free(ud->board); // free user data free(cd->user_data); break; } }