33 if ( e.classname ==
"minigame_board_piece" && e.netname == tile )
83 if ( pos && player.team == (minigame.minigame_flags &
TTT_TURN_TEAM) )
89 piece.team = player.team;
93 minigame.ttt_npieces++;
97 player.minigame_flags++;
120 !( minigame.minigame_flags & player.team ) )
125 minigame.ttt_npieces = 0;
128 if ( e.classname ==
"minigame_board_piece" )
150 if(e.classname ==
"minigame_board_piece")
162 if ( (minigame.ttt_ai) && pl_num > 0 )
169 if(minigame.minigame_players)
236 ttt_boardsize = mySize;
256 if ( e.classname ==
"minigame_board_piece" )
262 if ( !e.ttt_checkwin )
265 float icon_color = 1;
266 if ( e.ttt_checkwin == -1 )
268 else if ( e.ttt_checkwin == 1 )
297 ts_y = ( mySize_y - 2*player_fontsize_y ) / 2;
300 vector tile_size =
'48 48 0';
309 mypos_y += player_fontsize_y + ts_y;
311 (e.minigame_playerslot ?
entcs_GetName(e.minigame_playerslot-1) : _(
"AI")),
314 mypos_y += player_fontsize_y;
319 mypos_x += tile_size_x;
328string ttt_turn_to_string(
int turnflags)
331 return _(
"You are spectating");
341 return strcat(_(
"You lost the game!"),
"\n", _(
"Select \"^1Next Match^7\" on the menu for a rematch!"));
342 return strcat(_(
"You win!"),
"\n", _(
"Select \"^1Next Match^7\" on the menu to start a new match!"));
348 return _(
"Select \"^1Next Match^7\" on the menu to start a new match!");
349 return _(
"Wait for your opponent to confirm the rematch");
353 return _(
"Wait for your opponent to make their move");
356 return _(
"Click on the game board to place your piece");
361const int TTT_AI_POSFLAG_A1 = 0x0001;
362const int TTT_AI_POSFLAG_A2 = 0x0002;
363const int TTT_AI_POSFLAG_A3 = 0x0004;
364const int TTT_AI_POSFLAG_B1 = 0x0008;
365const int TTT_AI_POSFLAG_B2 = 0x0010;
366const int TTT_AI_POSFLAG_B3 = 0x0020;
367const int TTT_AI_POSFLAG_C1 = 0x0040;
368const int TTT_AI_POSFLAG_C2 = 0x0080;
369const int TTT_AI_POSFLAG_C3 = 0x0100;
372string ttt_ai_piece_flag2pos(
int pieceflag)
376 case TTT_AI_POSFLAG_A1:
378 case TTT_AI_POSFLAG_A2:
380 case TTT_AI_POSFLAG_A3:
383 case TTT_AI_POSFLAG_B1:
385 case TTT_AI_POSFLAG_B2:
387 case TTT_AI_POSFLAG_B3:
390 case TTT_AI_POSFLAG_C1:
392 case TTT_AI_POSFLAG_C2:
394 case TTT_AI_POSFLAG_C3:
402bool ttt_ai_checkmask(
int piecemask,
int checkflags)
404 return checkflags && (piecemask & checkflags) == checkflags;
408int ttt_ai_1of3(
int piecemask,
int flag1,
int flag2,
int flag3)
410 if ( ttt_ai_checkmask(piecemask,flag1|flag2|flag3) )
413 if ( ttt_ai_checkmask(piecemask,flag1|flag2) )
416 if ( ttt_ai_checkmask(piecemask,flag3|flag2) )
419 if ( ttt_ai_checkmask(piecemask,flag3|flag1) )
426int ttt_ai_random(
int piecemask)
435 for (
int i = 0; i < 9; ++i )
442 LOG_TRACE(sprintf(
"TTT AI: selected %x from %x",
448int ttt_ai_block3 (
int piecemask,
int piecemask_free )
452 r |= ttt_ai_1of3(piecemask,TTT_AI_POSFLAG_A1,TTT_AI_POSFLAG_A2,TTT_AI_POSFLAG_A3);
453 r |= ttt_ai_1of3(piecemask,TTT_AI_POSFLAG_B1,TTT_AI_POSFLAG_B2,TTT_AI_POSFLAG_B3);
454 r |= ttt_ai_1of3(piecemask,TTT_AI_POSFLAG_C1,TTT_AI_POSFLAG_C2,TTT_AI_POSFLAG_C3);
455 r |= ttt_ai_1of3(piecemask,TTT_AI_POSFLAG_A1,TTT_AI_POSFLAG_B1,TTT_AI_POSFLAG_C1);
456 r |= ttt_ai_1of3(piecemask,TTT_AI_POSFLAG_A2,TTT_AI_POSFLAG_B2,TTT_AI_POSFLAG_C2);
457 r |= ttt_ai_1of3(piecemask,TTT_AI_POSFLAG_A3,TTT_AI_POSFLAG_B3,TTT_AI_POSFLAG_C3);
458 r |= ttt_ai_1of3(piecemask,TTT_AI_POSFLAG_A1,TTT_AI_POSFLAG_B2,TTT_AI_POSFLAG_C3);
459 r |= ttt_ai_1of3(piecemask,TTT_AI_POSFLAG_A3,TTT_AI_POSFLAG_B2,TTT_AI_POSFLAG_C1);
460 LOG_TRACE(sprintf(
"TTT AI: possible 3 in a rows in %x: %x (%x)",piecemask,r, r&piecemask_free));
462 return ttt_ai_random(r);
469string ttt_ai_choose_simple(
int piecemask_self,
int piecemask_opponent,
int piecemask_free )
473 LOG_TRACE(
"TTT AI: checking winning move");
474 if (( move = ttt_ai_block3(piecemask_self,piecemask_free) ))
475 return ttt_ai_piece_flag2pos(move);
477 LOG_TRACE(
"TTT AI: checking opponent's winning move");
478 if (( move = ttt_ai_block3(piecemask_opponent,piecemask_free) ))
479 return ttt_ai_piece_flag2pos(move);
482 return ttt_ai_piece_flag2pos(ttt_ai_random(piecemask_free));
486void ttt_aimove(
entity minigame)
488 if ( minigame.minigame_flags == (
TTT_TURN_PLACE|minigame.ttt_ai) )
492 if ( aiplayer.classname ==
"minigame_player" && !aiplayer.minigame_playerslot )
506 int piecemask_self = 0;
507 int piecemask_opponent = 0;
508 int piecemask_free = 0;
511 for (
int i = 0; i < 3; ++i )
513 for (
int j = 0; j < 3; ++j )
519 if ( piece.team == aiplayer.team )
520 piecemask_self |= pieceflag;
522 piecemask_opponent |= pieceflag;
525 piecemask_free |= pieceflag;
531 LOG_TRACE(sprintf(
"TTT AI: self: %x opponent: %x free: %x",
532 piecemask_self, piecemask_opponent, piecemask_free));
533 pos = ttt_ai_choose_simple(piecemask_self, piecemask_opponent, piecemask_free);
540 strcpy(minigame.message, ttt_turn_to_string(minigame.minigame_flags));
544void ttt_make_move(
entity minigame)
548 if ( minigame.ttt_ai )
551 ttt_aimove(minigame);
558void ttt_set_curr_pos(
string s)
567int ttt_client_event(
entity minigame,
string event, ...)
573 ttt_set_curr_pos(
"");
574 strcpy(minigame.message, ttt_turn_to_string(minigame.minigame_flags));
585 bool event_blocked = ((
event ==
"key_released")
589 switch ( ...(0,
int) )
595 if ( ! ttt_curr_pos )
596 ttt_set_curr_pos(
"a3");
604 if ( ! ttt_curr_pos )
605 ttt_set_curr_pos(
"c3");
613 if ( ! ttt_curr_pos )
614 ttt_set_curr_pos(
"a1");
622 if ( ! ttt_curr_pos )
623 ttt_set_curr_pos(
"a3");
632 ttt_make_move(minigame);
639 case "mouse_pressed":
643 ttt_client_event(minigame,
"mouse_moved");
644 ttt_make_move(minigame);
656 ttt_set_curr_pos(
"");
660 case "network_receive":
664 if ( sent.classname ==
"minigame" )
668 strcpy(sent.message, ttt_turn_to_string(sent.minigame_flags));
676 bool spawnai = ai && !sent.ttt_ai;
681 entity aiplayer =
new(minigame_player);
682 aiplayer.owner = minigame;
684 aiplayer.minigame_playerslot = 0;
685 aiplayer.minigame_autoclean = 1;
686 ttt_aimove(minigame);
706 if(...(0,
string) ==
"next")
708 if ( minigame.ttt_ai )
711 ttt_aimove(minigame);
716 else if ( ...(0,
string) ==
"singleplayer" && !minigame.ttt_ai )
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
void minigame_drawcolorcodedstring_trunc(float maxwidth, vector pos, string text, vector fontsize, float theAlpha, int drawflags)
void minigame_show_allspecs(vector boardpos, vector boardsize)
vector minigame_drawstring_wrapped(float maxwidth, vector pos, string text, vector fontsize, vector color, float theAlpha, int drawflags, float align)
void minigame_hud_simpleboard(vector pos, vector mySize, string board_texture)
string minigame_texture(string name)
vector minigame_hud_denormalize_size(vector v, vector pos, vector mySize)
vector minigame_hud_denormalize(vector v, vector pos, vector mySize)
vector minigame_hud_normalize(vector v, vector pos, vector mySize)
void minigame_drawpic_centered(vector pos, string texture, vector sz, vector color, float thealpha, int drawflags)
#define REGISTER_MINIGAME(name, nicename)
#define minigame_hud_fitsqare(pos, mySize)
#define minigame_cmd(...)
#define FOREACH_MINIGAME_ENTITY(entityvar)
void HUD_MinigameMenu_CustomEntry(entity parent, string menumessage, string event_arg)
#define drawstring(position, text, scale, rgb, alpha, flag)
#define drawpic(position, pic, size, rgb, alpha, flag)
const float DRAWFLAG_NORMAL
const float DRAWFLAG_ADDITIVE
string entcs_GetName(int i)
#define HUD_Panel_DrawBg()
entity msle_spawn(entity minigame_session, entity e)
string minigame_relative_tile(string start_id, int dx, int dy, int rows, int columns)
void minigame_server_sendflags(entity ent, int mgflags)
int minigame_count_players(entity minigame)
int minigame_next_team(int curr_team, int n_teams)
int minigame_tile_letter(string id)
string minigame_tile_name(vector pos, int rows, int columns)
vector minigame_tile_pos(string id, int rows, int columns)
string minigame_tile_buildname(int letter, int number)
int minigame_tile_number(string id)
const int MINIG_SF_UPDATE
const int MINIG_SF_CUSTOM
strcat(_("^F4Countdown stopped!"), "\n^BG", _("Teams are too unbalanced."))
ERASEABLE void RandomSelection_Init()
float RandomSelection_chosen_float
#define RandomSelection_AddFloat(f, weight, priority)
const int TTT_SF_SINGLEPLAYER
const int TTT_SF_PLAYERSCORE
bool ttt_winning_piece(entity piece)
void ttt_move(entity minigame, entity player, string pos)
int ttt_server_event(entity minigame, string event,...)
const int TTT_SPECTATOR_TEAM
entity ttt_find_piece(entity minig, string tile)
bool ttt_valid_tile(string tile)
void ttt_next_match(entity minigame, entity player)