static void LvzActivate(USER_DATA *ud, PLAYER *p, COLOR c, TYPE t, int x, int y, bool show) { uint32_t objid = LvzGetObjId(c, t, x, y); if (show) { if (p) { PrivMessageFmt(p, "*objon %u", objid); } else { PubMessageFmt("*objon %u", objid); } } else { if (p) { PrivMessageFmt(p, "*objoff %u", objid); } else { PubMessageFmt("*objoff %u", objid); } } }
/* * Display the LVZ that shows whos turn it is. */ static void LvzToMove(COLOR c, PLAYER *p) { if (c == COLOR_WHITE) { if (p) { PrivMessageFmt(p, "*objon 7"); PrivMessageFmt(p, "*objoff 8"); } else { PubMessageFmt("*objon 7"); PubMessageFmt("*objoff 8"); } } else if (c == COLOR_BLACK) { if (p) { PrivMessageFmt(p, "*objon 8"); PrivMessageFmt(p, "*objoof 7"); } else { PubMessageFmt("*objon 8"); PubMessageFmt("*objoff 7"); } } else { if (p) { PrivMessageFmt(p, "*objoff 7"); PrivMessageFmt(p, "*objoff 8"); } else { PubMessageFmt("*objoff 7"); PubMessageFmt("*objoff 8"); } } }
/* * Check the get_file() queue and if there are entries, initiate * a file transfer. */ void try_get_next_file(THREAD_DATA *td) { THREAD_DATA::net_t *n = td->net; THREAD_DATA::net_t::chunk_in_t *ci = n->chunk_i; if (ci->in_use == 0 && ci->file_list->empty() == false) { DOWNLOAD_ENTRY *fe = &*ci->file_list->begin(); LogFmt(OP_SMOD, "Initiating file download: %s", fe->name); if (strlen(fe->initiator) > 0) { RmtMessageFmt(fe->initiator, "Initiating file download: %s", fe->name); } PubMessageFmt("*getfile %s", fe->name); strlcpy(ci->initiator, fe->initiator, 24); ci->file_list->erase(ci->file_list->begin()); ci->in_use = 1; } }
void try_send_next_file(THREAD_DATA *td) { THREAD_DATA::net_t::send_file_data_t *sfd = td->net->send_file_data; if (sfd->in_use == 0 && !sfd->upload_list->empty()) { UPLOAD_DATA *ud = *sfd->upload_list->begin(); sfd->in_use = 1; strlcpy(sfd->cur_initiator, ud->initiator, 64); strlcpy(sfd->cur_filename, ud->filename, 24); PubMessageFmt("*putfile %s", sfd->cur_filename); LogFmt(OP_SMOD, "Initiated file upload: %s", sfd->cur_filename); if (strlen(sfd->cur_initiator) > 0) { RmtMessageFmt(sfd->cur_initiator, "Initiated file upload: %s", sfd->cur_filename); } sfd->upload_list->erase(sfd->upload_list->begin()); free(ud); } }
static void LvzActivateBoard() { PubMessageFmt("*objon 6"); }
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; } }