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 )
296 ts_y = ( mySize_y - 2*player_fontsize_y ) / 2;
299 vector tile_size =
'48 48 0';
308 mypos_y += player_fontsize_y + ts_y;
310 (e.minigame_playerslot ?
entcs_GetName(e.minigame_playerslot-1) : _(
"AI")),
313 mypos_y += player_fontsize_y;
318 mypos_x += tile_size_x;
327string ttt_turn_to_string(
int turnflags)
330 return _(
"You are spectating");
340 return strcat(_(
"You lost the game!"),
"\n", _(
"Select \"^1Next Match^7\" on the menu for a rematch!"));
341 return strcat(_(
"You win!"),
"\n", _(
"Select \"^1Next Match^7\" on the menu to start a new match!"));
347 return _(
"Select \"^1Next Match^7\" on the menu to start a new match!");
348 return _(
"Wait for your opponent to confirm the rematch");
352 return _(
"Wait for your opponent to make their move");
355 return _(
"Click on the game board to place your piece");
360const int TTT_AI_POSFLAG_A1 = 0x0001;
361const int TTT_AI_POSFLAG_A2 = 0x0002;
362const int TTT_AI_POSFLAG_A3 = 0x0004;
363const int TTT_AI_POSFLAG_B1 = 0x0008;
364const int TTT_AI_POSFLAG_B2 = 0x0010;
365const int TTT_AI_POSFLAG_B3 = 0x0020;
366const int TTT_AI_POSFLAG_C1 = 0x0040;
367const int TTT_AI_POSFLAG_C2 = 0x0080;
368const int TTT_AI_POSFLAG_C3 = 0x0100;
371string ttt_ai_piece_flag2pos(
int pieceflag)
375 case TTT_AI_POSFLAG_A1:
377 case TTT_AI_POSFLAG_A2:
379 case TTT_AI_POSFLAG_A3:
382 case TTT_AI_POSFLAG_B1:
384 case TTT_AI_POSFLAG_B2:
386 case TTT_AI_POSFLAG_B3:
389 case TTT_AI_POSFLAG_C1:
391 case TTT_AI_POSFLAG_C2:
393 case TTT_AI_POSFLAG_C3:
401bool ttt_ai_checkmask(
int piecemask,
int checkflags)
403 return checkflags && (piecemask & checkflags) == checkflags;
407int ttt_ai_1of3(
int piecemask,
int flag1,
int flag2,
int flag3)
409 if ( ttt_ai_checkmask(piecemask,flag1|flag2|flag3) )
412 if ( ttt_ai_checkmask(piecemask,flag1|flag2) )
415 if ( ttt_ai_checkmask(piecemask,flag3|flag2) )
418 if ( ttt_ai_checkmask(piecemask,flag3|flag1) )
425int ttt_ai_random(
int piecemask)
434 for (
int i = 0; i < 9; ++i )
441 LOG_TRACE(sprintf(
"TTT AI: selected %x from %x",
447int ttt_ai_block3 (
int piecemask,
int piecemask_free )
451 r |= ttt_ai_1of3(piecemask,TTT_AI_POSFLAG_A1,TTT_AI_POSFLAG_A2,TTT_AI_POSFLAG_A3);
452 r |= ttt_ai_1of3(piecemask,TTT_AI_POSFLAG_B1,TTT_AI_POSFLAG_B2,TTT_AI_POSFLAG_B3);
453 r |= ttt_ai_1of3(piecemask,TTT_AI_POSFLAG_C1,TTT_AI_POSFLAG_C2,TTT_AI_POSFLAG_C3);
454 r |= ttt_ai_1of3(piecemask,TTT_AI_POSFLAG_A1,TTT_AI_POSFLAG_B1,TTT_AI_POSFLAG_C1);
455 r |= ttt_ai_1of3(piecemask,TTT_AI_POSFLAG_A2,TTT_AI_POSFLAG_B2,TTT_AI_POSFLAG_C2);
456 r |= ttt_ai_1of3(piecemask,TTT_AI_POSFLAG_A3,TTT_AI_POSFLAG_B3,TTT_AI_POSFLAG_C3);
457 r |= ttt_ai_1of3(piecemask,TTT_AI_POSFLAG_A1,TTT_AI_POSFLAG_B2,TTT_AI_POSFLAG_C3);
458 r |= ttt_ai_1of3(piecemask,TTT_AI_POSFLAG_A3,TTT_AI_POSFLAG_B2,TTT_AI_POSFLAG_C1);
459 LOG_TRACE(sprintf(
"TTT AI: possible 3 in a rows in %x: %x (%x)",piecemask,r, r&piecemask_free));
461 return ttt_ai_random(r);
468string ttt_ai_choose_simple(
int piecemask_self,
int piecemask_opponent,
int piecemask_free )
472 LOG_TRACE(
"TTT AI: checking winning move");
473 if (( move = ttt_ai_block3(piecemask_self,piecemask_free) ))
474 return ttt_ai_piece_flag2pos(move);
476 LOG_TRACE(
"TTT AI: checking opponent's winning move");
477 if (( move = ttt_ai_block3(piecemask_opponent,piecemask_free) ))
478 return ttt_ai_piece_flag2pos(move);
481 return ttt_ai_piece_flag2pos(ttt_ai_random(piecemask_free));
485void ttt_aimove(
entity minigame)
487 if ( minigame.minigame_flags == (
TTT_TURN_PLACE|minigame.ttt_ai) )
491 if ( aiplayer.classname ==
"minigame_player" && !aiplayer.minigame_playerslot )
505 int piecemask_self = 0;
506 int piecemask_opponent = 0;
507 int piecemask_free = 0;
510 for (
int i = 0; i < 3; ++i )
512 for (
int j = 0; j < 3; ++j )
518 if ( piece.team == aiplayer.team )
519 piecemask_self |= pieceflag;
521 piecemask_opponent |= pieceflag;
524 piecemask_free |= pieceflag;
530 LOG_TRACE(sprintf(
"TTT AI: self: %x opponent: %x free: %x",
531 piecemask_self, piecemask_opponent, piecemask_free));
532 pos = ttt_ai_choose_simple(piecemask_self, piecemask_opponent, piecemask_free);
539 strcpy(minigame.message, ttt_turn_to_string(minigame.minigame_flags));
543void ttt_make_move(
entity minigame)
547 if ( minigame.ttt_ai )
550 ttt_aimove(minigame);
557void ttt_set_curr_pos(
string s)
566int ttt_client_event(
entity minigame,
string event, ...)
572 ttt_set_curr_pos(
"");
573 strcpy(minigame.message, ttt_turn_to_string(minigame.minigame_flags));
584 bool event_blocked = ((
event ==
"key_released")
588 switch ( ...(0,
int) )
594 if ( ! ttt_curr_pos )
595 ttt_set_curr_pos(
"a3");
603 if ( ! ttt_curr_pos )
604 ttt_set_curr_pos(
"c3");
612 if ( ! ttt_curr_pos )
613 ttt_set_curr_pos(
"a1");
621 if ( ! ttt_curr_pos )
622 ttt_set_curr_pos(
"a3");
631 ttt_make_move(minigame);
638 case "mouse_pressed":
642 ttt_client_event(minigame,
"mouse_moved");
643 ttt_make_move(minigame);
655 ttt_set_curr_pos(
"");
659 case "network_receive":
663 if ( sent.classname ==
"minigame" )
667 strcpy(sent.message, ttt_turn_to_string(sent.minigame_flags));
675 bool spawnai = ai && !sent.ttt_ai;
680 entity aiplayer =
new(minigame_player);
681 aiplayer.owner = minigame;
683 aiplayer.minigame_playerslot = 0;
684 aiplayer.minigame_autoclean = 1;
685 ttt_aimove(minigame);
705 if(...(0,
string) ==
"next")
707 if ( minigame.ttt_ai )
710 ttt_aimove(minigame);
715 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)