Esempio n. 1
0
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);
		}
	}
}
Esempio n. 2
0
/*
 * 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");

		}
	}
}
Esempio n. 3
0
/*
 * 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;
	}
}
Esempio n. 4
0
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);
	} 
}
Esempio n. 5
0
static
void
LvzActivateBoard()
{
	PubMessageFmt("*objon 6");
}
Esempio n. 6
0
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;
	}
}