示例#1
0
/*-------------------------------------------------------------------------
                              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 );
}
示例#2
0
文件: chess.cpp 项目: cycad/opencore
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;
	}
}