]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/minigames/minigame/nmm.qc
Shownames: fade when moving to spectate
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / minigames / minigame / nmm.qc
index eb27646fde600bc0a165a884a9a843a6ec5bf72f..e4e0dc6380d9aec56a1b05601a8f5d733fe1b9c5 100644 (file)
@@ -1,3 +1,5 @@
+REGISTER_MINIGAME(nmm, "Nine Men's Morris");
+
 const int NMM_TURN_PLACE = 0x0100; // player has to place a piece on the board
 const int NMM_TURN_MOVE  = 0x0200; // player has to move a piece by one tile
 const int NMM_TURN_FLY   = 0x0400; // player has to move a piece anywhere
@@ -72,14 +74,13 @@ string nmm_tile_build_vmill(entity tile)
 
 // Create an new tile
 // \param id       Tile index (eg: a1)
-// \param minig    Owner minigame instance 
+// \param minig    Owner minigame instance
 // \param distance Distance from adjacent tiles
 void nmm_spawn_tile(string id, entity minig, int distance)
 {
        // TODO global variable + list_next for simpler tile loops
-       entity e = spawn();
+       entity e = new(minigame_nmm_tile);
        e.origin = minigame_tile_pos(id,7,7);
-       e.classname = "minigame_nmm_tile";
        e.netname = id;
        e.owner = minig;
        e.team = 0;
@@ -89,7 +90,7 @@ void nmm_spawn_tile(string id, entity minig, int distance)
 }
 
 // Create a tile square and recursively create inner squares
-// \param minig    Owner minigame instance 
+// \param minig    Owner minigame instance
 // \param offset   Index offset (eg: 1 to start the square at b2, 0 at a1 etc.)
 // \param skip     Number of indices to skip between tiles (eg 1: a1, a3)
 void nmm_spawn_tile_square( entity minig, int offset, int skip )
@@ -107,7 +108,7 @@ void nmm_spawn_tile_square( entity minig, int offset, int skip )
                }
                letter += skip+1;
        }
-       
+
        if ( skip > 0 )
                nmm_spawn_tile_square(minig,offset+1,skip-1);
 }
@@ -145,10 +146,10 @@ entity nmm_find_tile(entity minig, string id)
 // Check whether two tiles are adjacent
 bool nmm_tile_adjacent(entity tile1, entity tile2)
 {
-               
+
        int dnumber = fabs ( minigame_tile_number(tile1.netname) - minigame_tile_number(tile2.netname) );
        int dletter = fabs ( minigame_tile_letter(tile1.netname) - minigame_tile_letter(tile2.netname) );
-       
+
        return ( dnumber == 0 && ( dletter == 1 || dletter == tile1.nmm_tile_distance ) ) ||
                ( dletter == 0 && ( dnumber == 1 || dnumber == tile1.nmm_tile_distance ) );
 }
@@ -158,7 +159,7 @@ bool nmm_tile_canmove(entity tile)
 {
        entity e = world;
        while ( ( e = findentity(e,owner,tile.owner) ) )
-               if ( e.classname == "minigame_nmm_tile" && !e.nmm_tile_piece 
+               if ( e.classname == "minigame_nmm_tile" && !e.nmm_tile_piece
                                && nmm_tile_adjacent(e,tile) )
                {
                        return true;
@@ -182,7 +183,7 @@ bool nmm_in_mill_string(entity tile, string s)
 // Check if a tile is in a mill
 bool nmm_in_mill(entity tile)
 {
-       return tile.nmm_tile_piece &&  ( 
+       return tile.nmm_tile_piece &&  (
                nmm_in_mill_string(tile,tile.nmm_tile_hmill) ||
                nmm_in_mill_string(tile,tile.nmm_tile_vmill) );
 }
@@ -194,7 +195,7 @@ entity nmm_find_piece(entity start, entity minigame, int teamn, int pieceflags)
 {
        entity e = start;
        while ( ( e = findentity(e,owner,minigame) ) )
-               if ( e.classname == "minigame_board_piece" && 
+               if ( e.classname == "minigame_board_piece" &&
                                (e.minigame_flags & pieceflags) && e.team == teamn )
                        return e;
        return world;
@@ -211,7 +212,7 @@ int nmm_count_pieces(entity minigame, int teamn, int pieceflags)
 }
 
 // required function, handle server side events
-int minigame_event_nmm(entity minigame, string event, ...)
+int nmm_server_event(entity minigame, string event, ...)
 {
        if ( event == "start" )
        {
@@ -227,7 +228,7 @@ int minigame_event_nmm(entity minigame, string event, ...)
                        e.team = 2;
                        e.minigame_flags = NMM_PIECE_HOME;
                }
-                       
+
                return 1;
        }
        else if ( event == "end" )
@@ -253,8 +254,8 @@ int minigame_event_nmm(entity minigame, string event, ...)
                entity tile = world;
                entity piece = world;
                bool move_ok = false;
-               
-               if ( e && argc >= 2 && argv(0) == "move" && 
+
+               if ( e && argc >= 2 && argv(0) == "move" &&
                        ( minigame.minigame_flags & NMM_TURN_TEAM ) == e.team )
                {
                        tile = nmm_find_tile(minigame,argv(1));
@@ -290,7 +291,7 @@ int minigame_event_nmm(entity minigame, string event, ...)
                                                move_ok = true;
                                        }
                                }
-                               
+
                        }
                        else if ( minigame.minigame_flags & NMM_TURN_FLY )
                        {
@@ -308,7 +309,7 @@ int minigame_event_nmm(entity minigame, string event, ...)
                                                move_ok = true;
                                        }
                                }
-                               
+
                        }
                        else if ( minigame.minigame_flags & NMM_TURN_TAKE )
                        {
@@ -321,10 +322,10 @@ int minigame_event_nmm(entity minigame, string event, ...)
                                        move_ok = true;
                                }
                        }
-                       
+
                        int nextteam = e.team % 2 + 1;
                        int npieces = nmm_count_pieces(minigame,nextteam,NMM_PIECE_HOME|NMM_PIECE_BOARD);
-                       
+
                        if ( npieces < 3 )
                        {
                                minigame.minigame_flags = NMM_TURN_WIN | e.team;
@@ -368,7 +369,7 @@ int minigame_event_nmm(entity minigame, string event, ...)
                                minigame.SendFlags |= MINIG_SF_UPDATE;
                        }
                        else
-                               dprint("Invalid move: ",...(2,string),"\n");
+                               LOG_TRACE("Invalid move: ",...(2,string),"\n");
                        return 1;
                }
        }
@@ -425,13 +426,13 @@ bool nmm_draw_avaliable(entity tile)
 }
 
 // Required function, draw the game board
-void minigame_hud_board_nmm(vector pos, vector mySize)
+void nmm_hud_board(vector pos, vector mySize)
 {
        minigame_hud_fitsqare(pos, mySize);
        nmm_boardpos = pos;
        nmm_boardsize = mySize;
        minigame_hud_simpleboard(pos,mySize,minigame_texture("nmm/board"));
-       
+
        vector tile_size = minigame_hud_denormalize_size('1 1 0'/7,pos,mySize);
        vector tile_pos;
        entity e;
@@ -440,7 +441,7 @@ void minigame_hud_board_nmm(vector pos, vector mySize)
                if ( e.classname == "minigame_nmm_tile" )
                {
                        tile_pos = minigame_hud_denormalize(e.origin,pos,mySize);
-                       
+
                        if ( e == nmm_fromtile )
                        {
                                minigame_drawpic_centered( tile_pos, minigame_texture("nmm/tile_active"),
@@ -451,62 +452,62 @@ void minigame_hud_board_nmm(vector pos, vector mySize)
                                minigame_drawpic_centered( tile_pos, minigame_texture("nmm/tile_available"),
                                        tile_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL );
                        }
-                       
+
                        if ( e == nmm_currtile )
                        {
                                minigame_drawpic_centered( tile_pos, minigame_texture("nmm/tile_selected"),
                                        tile_size, '1 1 1', panel_fg_alpha, DRAWFLAG_ADDITIVE );
                        }
-                       
+
                        if ( e.nmm_tile_piece )
                        {
-                               minigame_drawpic_centered( tile_pos,  
+                               minigame_drawpic_centered( tile_pos,
                                        minigame_texture(strcat("nmm/piece",ftos(e.nmm_tile_piece.team))),
                                        tile_size*0.8, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL );
                        }
-                       
+
                        //drawstring(tile_pos, e.netname, hud_fontsize, '1 0 0', 1, DRAWFLAG_NORMAL);
                }
        }
-       
+
        if ( active_minigame.minigame_flags & NMM_TURN_WIN )
        {
                vector winfs = hud_fontsize*2;
                string playername = "";
                FOREACH_MINIGAME_ENTITY(e)
-                       if ( e.classname == "minigame_player" && 
+                       if ( e.classname == "minigame_player" &&
                                        e.team == (active_minigame.minigame_flags & NMM_TURN_TEAM) )
-                               playername = GetPlayerName(e.minigame_playerslot-1);
-               
+                               playername = entcs_GetName(e.minigame_playerslot-1);
+
                vector win_pos = pos+eY*(mySize_y-winfs_y)/2;
                vector win_sz;
                win_sz = minigame_drawcolorcodedstring_wrapped(mySize_x,win_pos,
-                       sprintf("%s^7 won the game!",playername), 
+                       sprintf("%s^7 won the game!",playername),
                        winfs, 0, DRAWFLAG_NORMAL, 0.5);
-               
+
                drawfill(win_pos-eY*hud_fontsize_y,win_sz+2*eY*hud_fontsize_y,'1 1 1',0.5,DRAWFLAG_ADDITIVE);
-               
+
                minigame_drawcolorcodedstring_wrapped(mySize_x,win_pos,
-                       sprintf("%s^7 won the game!",playername), 
+                       sprintf("%s^7 won the game!",playername),
                        winfs, panel_fg_alpha, DRAWFLAG_NORMAL, 0.5);
        }
 }
 
 // Required function, draw the game status panel
-void minigame_hud_status_nmm(vector pos, vector mySize)
+void nmm_hud_status(vector pos, vector mySize)
 {
        HUD_Panel_DrawBg(1);
        vector ts;
-       
+
        ts = minigame_drawstring_wrapped(mySize_x,pos,active_minigame.descriptor.message,
                hud_fontsize * 2, '0.25 0.47 0.72', panel_fg_alpha, DRAWFLAG_NORMAL,0.5);
        pos_y += ts_y;
        mySize_y -= ts_y;
-       
+
        vector player_fontsize = hud_fontsize * 1.75;
        ts_y = ( mySize_y - 2*player_fontsize_y ) / 2;
        ts_x = mySize_x;
-       
+
        float player1x = 0;
        float player2x = 0;
        vector piece_sz = '48 48 0';
@@ -514,14 +515,14 @@ void minigame_hud_status_nmm(vector pos, vector mySize)
        vector mypos;
        float piece_light = 1;
        entity e = world;
-       
+
        mypos = pos;
        if ( (active_minigame.minigame_flags&NMM_TURN_TEAM) == 2 )
                mypos_y  += player_fontsize_y + ts_y;
        drawfill(mypos,eX*mySize_x+eY*player_fontsize_y,'1 1 1',0.5,DRAWFLAG_ADDITIVE);
        mypos_y += player_fontsize_y;
        drawfill(mypos,eX*mySize_x+eY*piece_sz_y,'1 1 1',0.25,DRAWFLAG_ADDITIVE);
-       
+
        FOREACH_MINIGAME_ENTITY(e)
        {
                if ( e.classname == "minigame_player" )
@@ -530,7 +531,7 @@ void minigame_hud_status_nmm(vector pos, vector mySize)
                        if ( e.team == 2 )
                                mypos_y  += player_fontsize_y + ts_y;
                        minigame_drawcolorcodedstring_trunc(mySize_x,mypos,
-                               GetPlayerName(e.minigame_playerslot-1),
+                               entcs_GetName(e.minigame_playerslot-1),
                                player_fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
                }
                else if ( e.classname == "minigame_board_piece" )
@@ -554,7 +555,7 @@ void minigame_hud_status_nmm(vector pos, vector mySize)
                                piece_light = 1;
                        else
                                piece_light = 0.15;
-                       
+
                        drawpic(mypos, minigame_texture(strcat("nmm/piece",ftos(e.team))), piece_sz,
                                '1 1 1'*piece_light, panel_fg_alpha, DRAWFLAG_NORMAL );
                }
@@ -600,7 +601,7 @@ string nmm_turn_to_string(int turnflags)
                        return _("You lost the game!");
                return _("You win!");
        }
-       
+
        if ( (turnflags&NMM_TURN_TEAM) != minigame_self.team )
                return _("Wait for your opponent to make their move");
        if ( turnflags & NMM_TURN_PLACE )
@@ -611,13 +612,13 @@ string nmm_turn_to_string(int turnflags)
                return _("You can select one of your pieces to move it anywhere on the board");
        if ( turnflags & NMM_TURN_TAKE )
                return _("You can take one of the opponent's pieces");
-       
+
        return "";
 }
 
 // Required function, handle client events
-int minigame_event_nmm(entity minigame, string event, ...)
-{
+int nmm_client_event(entity minigame, string event, ...)
+{SELFPARAM();
        if ( event == "activate" )
        {
                nmm_fromtile = world;
@@ -640,7 +641,7 @@ int minigame_event_nmm(entity minigame, string event, ...)
                                else
                                {
                                        string tileid = nmm_currtile.netname;
-                                       nmm_currtile = world; 
+                                       nmm_currtile = world;
                                        while ( !nmm_currtile )
                                        {
                                                tileid = minigame_relative_tile(tileid,1,0,7,7);
@@ -655,7 +656,7 @@ int minigame_event_nmm(entity minigame, string event, ...)
                                else
                                {
                                        string tileid = nmm_currtile.netname;
-                                       nmm_currtile = world; 
+                                       nmm_currtile = world;
                                        while ( !nmm_currtile )
                                        {
                                                tileid = minigame_relative_tile(tileid,-1,0,7,7);
@@ -670,7 +671,7 @@ int minigame_event_nmm(entity minigame, string event, ...)
                                else
                                {
                                        string tileid = nmm_currtile.netname;
-                                       nmm_currtile = world; 
+                                       nmm_currtile = world;
                                        while ( !nmm_currtile )
                                        {
                                                tileid = minigame_relative_tile(tileid,0,1,7,7);
@@ -685,7 +686,7 @@ int minigame_event_nmm(entity minigame, string event, ...)
                                else
                                {
                                        string tileid = nmm_currtile.netname;
-                                       nmm_currtile = world; 
+                                       nmm_currtile = world;
                                        while ( !nmm_currtile )
                                        {
                                                tileid = minigame_relative_tile(tileid,0,-1,7,7);
@@ -745,15 +746,15 @@ int minigame_event_nmm(entity minigame, string event, ...)
                                }
                        }
                }
-               else if ( self.classname == "minigame" && ( ...(1,int) & MINIG_SF_UPDATE ) ) 
+               else if ( self.classname == "minigame" && ( ...(1,int) & MINIG_SF_UPDATE ) )
                {
                        self.message = nmm_turn_to_string(self.minigame_flags);
                        if ( self.minigame_flags & minigame_self.team )
                                minigame_prompt();
                }
        }
-       
+
        return 0;
 }
 
-#endif 
+#endif