34 int add = letter < 3 ? 1 : -1;
35 return strcat(tile.netname,
" ",
39 else if ( letter == 3 )
43 else if ( letter < 3 )
60 int add =
number < 3 ? 1 : -1;
61 return strcat(tile.netname,
" ",
86 entity e =
new(minigame_nmm_tile);
91 e.nmm_tile_distance = distance;
104 for (
int i = 0; i < 3; ++i )
107 for (
int j = 0; j < 3; ++j )
109 if ( i != 1 || j != 1 )
125 if ( e.classname ==
"minigame_nmm_tile" )
145 if ( e.classname ==
"minigame_nmm_tile" && e.netname ==
id )
157 return ( dnumber == 0 && ( dletter == 1 || dletter == tile1.nmm_tile_distance ) ) ||
158 ( dletter == 0 && ( dnumber == 1 || dnumber == tile1.nmm_tile_distance ) );
166 if ( e.classname ==
"minigame_nmm_tile" && !e.nmm_tile_piece
178 for (
int i = 0; i < argc; ++i )
181 if ( !e || !e.nmm_tile_piece || e.nmm_tile_piece.team != tile.nmm_tile_piece.team )
190 return tile.nmm_tile_piece && (
202 if ( e.classname ==
"minigame_board_piece" &&
203 (e.minigame_flags & pieceflags) && e.team == teamn )
221 if ( event ==
"start" )
226 for (
int i = 0; i < 7; ++i )
228 e =
msle_spawn(minigame,
new(minigame_board_piece));
231 e =
msle_spawn(minigame,
new(minigame_board_piece));
238 else if ( event ==
"end" )
242 else if ( event ==
"join" )
246 for ( e = minigame.minigame_players; e; e = e.list_next )
250 if ( minigame.minigame_players && minigame.minigame_players.team == 1 )
254 else if ( event ==
"cmd" )
257 int argc = ...(1,
int);
260 bool move_ok =
false;
262 if ( e && argc >= 2 &&
argv(0) ==
"move" &&
273 if ( !tile.nmm_tile_piece && piece )
275 tile.nmm_tile_piece = piece;
277 piece.origin = tile.origin;
284 if ( tile.nmm_tile_piece && tile.nmm_tile_piece.team == e.team )
286 piece = tile.nmm_tile_piece;
290 tile.nmm_tile_piece =
NULL;
291 tile2.nmm_tile_piece = piece;
292 piece.origin = tile2.origin;
302 if ( tile.nmm_tile_piece && tile.nmm_tile_piece.team == e.team )
304 piece = tile.nmm_tile_piece;
306 if ( tile2 && !tile2.nmm_tile_piece )
308 tile.nmm_tile_piece =
NULL;
309 tile2.nmm_tile_piece = piece;
310 piece.origin = tile2.origin;
320 piece = tile.nmm_tile_piece;
321 if ( piece && piece.nmm_tile_piece.team != e.team )
323 tile.nmm_tile_piece =
NULL;
330 int nextteam = e.team % 2 + 1;
346 if ( f.classname ==
"minigame_nmm_tile" && f.nmm_tile_piece &&
347 f.nmm_tile_piece.team == nextteam && !
nmm_in_mill(f) )
352 minigame.minigame_flags |= takemill;
358 else if ( npieces == 3 )
365 if ( f.classname ==
"minigame_nmm_tile" && f.nmm_tile_piece &&
376 LOG_TRACE(
"Invalid move: ", ...(2,
string));
392bool nmm_valid_selection(
entity tile)
397 return !tile.nmm_tile_piece;
400 if ( tile.nmm_tile_piece && tile.nmm_tile_piece.team ==
minigame_self.team &&
410 return !tile.nmm_tile_piece;
412 return tile.nmm_tile_piece && tile.nmm_tile_piece.team ==
minigame_self.team;
415 return tile.nmm_tile_piece && tile.nmm_tile_piece.team !=
minigame_self.team &&
421bool nmm_draw_avaliable(
entity tile)
428 return !tile.nmm_tile_piece;
437 nmm_boardsize = mySize;
445 if ( e.classname ==
"minigame_nmm_tile" )
449 if ( e == nmm_fromtile )
454 else if ( nmm_draw_avaliable(e) && nmm_valid_selection(e) )
460 if ( e == nmm_currtile )
466 if ( e.nmm_tile_piece )
482 if ( e.classname ==
"minigame_player" &&
486 vector win_pos = pos+
eY*(mySize_y-winfs_y)/2;
489 sprintf(_(
"%s^7 won the game!"), pname),
495 sprintf(_(
"%s^7 won the game!"), pname),
513 ts_y = ( mySize_y - 2*player_fontsize_y ) / 2;
518 vector piece_sz =
'48 48 0';
519 float piece_space = piece_sz_x + ( ts_x - 7 * piece_sz_x ) / 6;
521 float piece_light = 1;
528 mypos_y += player_fontsize_y + ts_y;
530 mypos_y += player_fontsize_y;
540 mypos_y += player_fontsize_y + ts_y;
545 else if ( e.classname ==
"minigame_board_piece" )
548 mypos_y += player_fontsize_y;
552 player2x += piece_space;
553 mypos_y += player_fontsize_y + ts_y;
558 player1x += piece_space;
574void nmm_make_move(
entity minigame)
585 if ( nmm_fromtile == nmm_currtile )
589 else if ( nmm_currtile.nmm_tile_piece && nmm_currtile.nmm_tile_piece.team ==
minigame_self.team )
591 nmm_fromtile = nmm_currtile;
593 else if ( nmm_fromtile )
595 minigame_cmd(
"move ",nmm_fromtile.netname,
" ",nmm_currtile.netname);
604string nmm_turn_to_string(
int turnflags)
607 return _(
"You are spectating");
612 return _(
"You lost the game!");
613 return _(
"You win!");
617 return _(
"Wait for your opponent to make their move");
619 return _(
"Click on the game board to place your piece");
621 return _(
"You can select one of your pieces to move it to one of the surrounding places");
623 return _(
"You can select one of your pieces to move it anywhere on the board");
625 return _(
"You can take one of the opponent's pieces");
631int nmm_client_event(
entity minigame,
string event, ...)
633 if ( event ==
"activate" )
637 strcpy(minigame.message, nmm_turn_to_string(minigame.minigame_flags));
639 else if ( event ==
"deactivate" )
645 else if ( (event ==
"key_pressed" || event ==
"key_released") )
647 bool event_blocked = ((
event ==
"key_released")
651 switch ( ...(0,
int) )
657 if ( ! nmm_currtile )
661 string tileid = nmm_currtile.netname;
663 while ( !nmm_currtile )
674 if ( ! nmm_currtile )
678 string tileid = nmm_currtile.netname;
680 while ( !nmm_currtile )
691 if ( ! nmm_currtile )
695 string tileid = nmm_currtile.netname;
697 while ( !nmm_currtile )
708 if ( ! nmm_currtile )
712 string tileid = nmm_currtile.netname;
714 while ( !nmm_currtile )
726 nmm_make_move(minigame);
732 else if ( event ==
"mouse_pressed" && ...(0,
int) ==
K_MOUSE1 )
734 nmm_client_event(minigame,
"mouse_moved");
735 nmm_make_move(minigame);
738 else if ( event ==
"mouse_moved" )
746 if ( e.classname ==
"minigame_nmm_tile" )
758 else if ( event ==
"network_receive" )
762 if ( sent.classname ==
"minigame_board_piece" && ( ...(1,
int) &
MINIG_SF_UPDATE ) )
770 if ( e.classname ==
"minigame_nmm_tile" )
772 if ( e.nmm_tile_piece == sent )
773 e.nmm_tile_piece =
NULL;
774 if ( e.netname == tileid )
775 e.nmm_tile_piece = sent;
779 else if ( sent.classname ==
"minigame" && ( ...(1,
int) &
MINIG_SF_UPDATE ) )
781 strcpy(sent.message, nmm_turn_to_string(sent.minigame_flags));
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)
bool minigame_hud_mouse_in(vector pos, vector sz)
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_drawcolorcodedstring_wrapped(float maxwidth, vector pos, string text, vector fontsize, float theAlpha, int drawflags, float align)
vector minigame_hud_denormalize(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)
#define drawpic(position, pic, size, rgb, alpha, flag)
#define drawfill(position, 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)
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
bool nmm_tile_canmove(entity tile)
int nmm_count_pieces(entity minigame, int teamn, int pieceflags)
int nmm_server_event(entity minigame, string event,...)
void nmm_init_tiles(entity minig)
bool nmm_in_mill(entity tile)
bool nmm_in_mill_string(entity tile, string s)
const int NMM_TURN_TAKEANY
string nmm_tile_build_vmill(entity tile)
bool nmm_tile_adjacent(entity tile1, entity tile2)
string nmm_tile_build_hmill(entity tile)
void nmm_kill_tiles(entity minig)
entity nmm_find_tile(entity minig, string id)
const int NMM_PIECE_BOARD
const int NMM_SPECTATOR_TEAM
void nmm_spawn_tile(string id, entity minig, int distance)
entity nmm_find_piece(entity start, entity minigame, int teamn, int pieceflags)
void nmm_spawn_tile_square(entity minig, int offset, int skip)
strcat(_("^F4Countdown stopped!"), "\n^BG", _("Teams are too unbalanced."))