const int TTT_SF_PLAYERSCORE = MINIG_SF_CUSTOM; // send minigame_player scores (won matches)
const int TTT_SF_SINGLEPLAYER = MINIG_SF_CUSTOM<<1;// send minigame.ttt_ai
+const int TTT_SPECTATOR_TEAM = 255; // must be above max teams and equal to or below 255
+
const int TTT_LET_CNT = 3;
const int TTT_NUM_CNT = 3;
const int TTT_TILE_SIZE = 3;
if ( ttt_valid_tile(pos) )
if ( !ttt_find_piece(minigame,pos) )
{
- entity piece = msle_spawn(minigame,"minigame_board_piece");
+ entity piece = msle_spawn(minigame,new(minigame_board_piece));
piece.team = player.team;
piece.netname = strzone(pos);
minigame_server_sendflags(piece,MINIG_SF_ALL);
return false;
// Don't allow more than 2 players
- if(pl_num >= 2) { return false; }
+ if(pl_num >= 2) { return TTT_SPECTATOR_TEAM; }
// Get the right team
if(minigame.minigame_players)
}
case "cmd":
{
+ entity player = ...(0,entity);
+ bool event_blocked = (player.team == TTT_SPECTATOR_TEAM);
switch(argv(0))
{
case "move":
+ if(event_blocked)
+ return true;
ttt_move(minigame, ...(0,entity), ...(1,int) == 2 ? argv(1) : string_null );
return true;
case "next":
+ if(event_blocked)
+ return true;
ttt_next_match(minigame,...(0,entity));
return true;
case "singleplayer":
+ if(event_blocked)
+ return true;
if ( minigame_count_players(minigame) == 1 )
{
minigame.ttt_ai = minigame_next_team(minigame.minigame_players.team, 2);
entity e;
FOREACH_MINIGAME_ENTITY(e)
{
- if ( e.classname == "minigame_player" )
+ if ( e.classname == "minigame_player" && e.team != TTT_SPECTATOR_TEAM )
{
mypos = pos;
if ( e.team == 2 )
// Turn a set of flags into a help message
string ttt_turn_to_string(int turnflags)
{
+ if(minigame_self.team == TTT_SPECTATOR_TEAM)
+ return _("You are spectating");
+
if ( turnflags & TTT_TURN_DRAW )
return _("Draw");
if ( turnflags & TTT_TURN_WIN )
{
- if ( (turnflags&TTT_TURN_TEAM) != minigame_self.team )
- strcat(_("You lost the game!"), "\n", _("Select \"^1Next Match^7\" on the menu for a rematch!"));
+ // translator-friendly messages composed of 2 existing messages
+ // TODO: proper "you win" banner instead of hijacking the help message
+ if ( (turnflags & TTT_TURN_TEAM) != minigame_self.team )
+ return strcat(_("You lost the game!"), "\n", _("Select \"^1Next Match^7\" on the menu for a rematch!"));
return strcat(_("You win!"), "\n", _("Select \"^1Next Match^7\" on the menu to start a new match!"));
}
if ( turnflags & TTT_TURN_NEXT )
{
- if ( (turnflags&TTT_TURN_TEAM) != minigame_self.team )
+ if ( (turnflags & TTT_TURN_TEAM) != minigame_self.team )
return _("Select \"^1Next Match^7\" on the menu to start a new match!");
return _("Wait for your opponent to confirm the rematch");
}
else
ttt_move(minigame,aiplayer,pos);
}
- minigame.message = ttt_turn_to_string(minigame.minigame_flags);
+ strcpy(minigame.message, ttt_turn_to_string(minigame.minigame_flags));
}
// Make the correct move
case "activate":
{
ttt_set_curr_pos("");
- minigame.message = ttt_turn_to_string(minigame.minigame_flags);
+ strcpy(minigame.message, ttt_turn_to_string(minigame.minigame_flags));
+ return false;
+ }
+ case "deactivate":
+ {
+ strfree(minigame.message);
return false;
}
case "key_pressed":
+ case "key_released":
{
- if((minigame.minigame_flags & TTT_TURN_TEAM) == minigame_self.team)
+ bool event_blocked = ((event == "key_released")
+ || ((minigame.minigame_flags & TTT_TURN_TEAM) != minigame_self.team));
+ if (!(minigame.minigame_flags & TTT_TURN_WIN) && !(minigame.minigame_flags & TTT_TURN_DRAW))
{
switch ( ...(0,int) )
{
case K_RIGHTARROW:
case K_KP_RIGHTARROW:
+ if (event_blocked)
+ return true;
if ( ! ttt_curr_pos )
ttt_set_curr_pos("a3");
else
return true;
case K_LEFTARROW:
case K_KP_LEFTARROW:
+ if (event_blocked)
+ return true;
if ( ! ttt_curr_pos )
ttt_set_curr_pos("c3");
else
return true;
case K_UPARROW:
case K_KP_UPARROW:
+ if (event_blocked)
+ return true;
if ( ! ttt_curr_pos )
ttt_set_curr_pos("a1");
else
return true;
case K_DOWNARROW:
case K_KP_DOWNARROW:
+ if (event_blocked)
+ return true;
if ( ! ttt_curr_pos )
ttt_set_curr_pos("a3");
else
case K_ENTER:
case K_KP_ENTER:
case K_SPACE:
+ if (event_blocked)
+ return true;
ttt_make_move(minigame);
return true;
}
{
if(...(0,int) == K_MOUSE1)
{
+ ttt_client_event(minigame, "mouse_moved");
ttt_make_move(minigame);
return true;
}
{
if ( sf & MINIG_SF_UPDATE )
{
- sent.message = ttt_turn_to_string(sent.minigame_flags);
+ strcpy(sent.message, ttt_turn_to_string(sent.minigame_flags));
if ( sent.minigame_flags & minigame_self.team )
minigame_prompt();
}