X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fminigames%2Fminigame%2Fnmm.qc;h=e4e0dc6380d9aec56a1b05601a8f5d733fe1b9c5;hb=0fd6fa4f46e6e704eceac437d05daa326fa8cb14;hp=b7ad467b8c2728ec128d8835c23157007540121f;hpb=6cc2d1aa115907d16ae84fb07c3fe6c3329cd9b5;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/minigames/minigame/nmm.qc b/qcsrc/common/minigames/minigame/nmm.qc index b7ad467b8..e4e0dc638 100644 --- a/qcsrc/common/minigames/minigame/nmm.qc +++ b/qcsrc/common/minigames/minigame/nmm.qc @@ -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; @@ -227,7 +228,7 @@ int nmm_server_event(entity minigame, string event, ...) e.team = 2; e.minigame_flags = NMM_PIECE_HOME; } - + return 1; } else if ( event == "end" ) @@ -253,8 +254,8 @@ int nmm_server_event(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 nmm_server_event(entity minigame, string event, ...) move_ok = true; } } - + } else if ( minigame.minigame_flags & NMM_TURN_FLY ) { @@ -308,7 +309,7 @@ int nmm_server_event(entity minigame, string event, ...) move_ok = true; } } - + } else if ( minigame.minigame_flags & NMM_TURN_TAKE ) { @@ -321,10 +322,10 @@ int nmm_server_event(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; @@ -431,7 +432,7 @@ void nmm_hud_board(vector pos, vector 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 nmm_hud_board(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,43 +452,43 @@ void nmm_hud_board(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); } } @@ -497,16 +498,16 @@ 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 nmm_hud_status(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 nmm_hud_status(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 nmm_hud_status(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 nmm_client_event(entity minigame, string event, ...) -{ +{SELFPARAM(); if ( event == "activate" ) { nmm_fromtile = world; @@ -640,7 +641,7 @@ int nmm_client_event(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 nmm_client_event(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 nmm_client_event(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 nmm_client_event(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 nmm_client_event(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