Xonotic QuakeC
The free, fast arena FPS with crisp movement and a wide array of weapons
nmm.qc File Reference
#include "nmm.qh"
Include dependency graph for nmm.qc:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

int nmm_count_pieces (entity minigame, int teamn, int pieceflags)
entity nmm_find_piece (entity start, entity minigame, int teamn, int pieceflags)
entity nmm_find_tile (entity minig, string id)
bool nmm_in_mill (entity tile)
bool nmm_in_mill_string (entity tile, string s)
void nmm_init_tiles (entity minig)
void nmm_kill_tiles (entity minig)
int nmm_server_event (entity minigame, string event,...)
void nmm_spawn_tile (string id, entity minig, int distance)
void nmm_spawn_tile_square (entity minig, int offset, int skip)
bool nmm_tile_adjacent (entity tile1, entity tile2)
string nmm_tile_build_hmill (entity tile)
string nmm_tile_build_vmill (entity tile)
bool nmm_tile_canmove (entity tile)
 REGISTER_MINIGAME (nmm, _("Nine Men's Morris"))

Variables

const int NMM_PIECE_BOARD = 0x2
const int NMM_PIECE_DEAD = 0x0
const int NMM_PIECE_HOME = 0x1
const int NMM_SPECTATOR_TEAM = 255
int nmm_tile_distance
string nmm_tile_hmill
entity nmm_tile_piece
string nmm_tile_vmill
const int NMM_TURN_FLY = 0x0400
const int NMM_TURN_MOVE = 0x0200
const int NMM_TURN_PLACE = 0x0100
const int NMM_TURN_TAKE = 0x0800
const int NMM_TURN_TAKEANY =0x1000
const int NMM_TURN_TEAM = 0x00ff
const int NMM_TURN_TEAM1 = 0x0001
const int NMM_TURN_TEAM2 = 0x0002
const int NMM_TURN_TYPE = 0xff00
const int NMM_TURN_WIN = 0x2000

Function Documentation

◆ nmm_count_pieces()

int nmm_count_pieces ( entity minigame,
int teamn,
int pieceflags )

Definition at line 209 of file nmm.qc.

210{
211 int n = 0;
212 entity e = NULL;
213 while (( e = nmm_find_piece(e,minigame, teamn, pieceflags) ))
214 n++;
215 return n;
216}
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
entity nmm_find_piece(entity start, entity minigame, int teamn, int pieceflags)
Definition nmm.qc:198
#define NULL
Definition post.qh:14

References entity(), nmm_find_piece(), and NULL.

Referenced by nmm_server_event().

◆ nmm_find_piece()

entity nmm_find_piece ( entity start,
entity minigame,
int teamn,
int pieceflags )

Definition at line 198 of file nmm.qc.

199{
200 entity e = start;
201 while ( ( e = findentity(e,owner,minigame) ) )
202 if ( e.classname == "minigame_board_piece" &&
203 (e.minigame_flags & pieceflags) && e.team == teamn )
204 return e;
205 return NULL;
206}
entity owner
Definition main.qh:87
entity findentity(entity start,.entity field, entity match)

References entity(), findentity(), NULL, and owner.

Referenced by nmm_count_pieces(), and nmm_server_event().

◆ nmm_find_tile()

entity nmm_find_tile ( entity minig,
string id )

Definition at line 141 of file nmm.qc.

142{
143 entity e = NULL;
144 while ( ( e = findentity(e,owner,minig) ) )
145 if ( e.classname == "minigame_nmm_tile" && e.netname == id )
146 return e;
147 return NULL;
148}

References entity(), findentity(), NULL, and owner.

Referenced by nmm_in_mill_string(), and nmm_server_event().

◆ nmm_in_mill()

bool nmm_in_mill ( entity tile)

Definition at line 188 of file nmm.qc.

189{
190 return tile.nmm_tile_piece && (
191 nmm_in_mill_string(tile,tile.nmm_tile_hmill) ||
192 nmm_in_mill_string(tile,tile.nmm_tile_vmill) );
193}
bool nmm_in_mill_string(entity tile, string s)
Definition nmm.qc:175

References entity(), and nmm_in_mill_string().

Referenced by nmm_server_event().

◆ nmm_in_mill_string()

bool nmm_in_mill_string ( entity tile,
string s )

Definition at line 175 of file nmm.qc.

176{
177 int argc = tokenize(s);
178 for ( int i = 0; i < argc; ++i )
179 {
180 entity e = nmm_find_tile(tile.owner,argv(i));
181 if ( !e || !e.nmm_tile_piece || e.nmm_tile_piece.team != tile.nmm_tile_piece.team )
182 return false;
183 }
184 return true;
185}
float tokenize(string s)
string argv(float n)
entity nmm_find_tile(entity minig, string id)
Definition nmm.qc:141

References argv(), entity(), nmm_find_tile(), and tokenize().

Referenced by nmm_in_mill().

◆ nmm_init_tiles()

void nmm_init_tiles ( entity minig)

Definition at line 135 of file nmm.qc.

136{
137 nmm_spawn_tile_square(minig,0,2);
138}
void nmm_spawn_tile_square(entity minig, int offset, int skip)
Definition nmm.qc:100

References entity(), and nmm_spawn_tile_square().

Referenced by nmm_server_event().

◆ nmm_kill_tiles()

void nmm_kill_tiles ( entity minig)

Definition at line 121 of file nmm.qc.

122{
123 entity e = NULL;
124 while ( ( e = findentity(e,owner,minig) ) )
125 if ( e.classname == "minigame_nmm_tile" )
126 {
127 strfree(e.netname);
128 strfree(e.nmm_tile_hmill);
129 strfree(e.nmm_tile_vmill);
130 delete(e);
131 }
132}
#define strfree(this)
Definition string.qh:59

References entity(), findentity(), NULL, owner, and strfree.

Referenced by nmm_server_event().

◆ nmm_server_event()

int nmm_server_event ( entity minigame,
string event,
... )

Definition at line 219 of file nmm.qc.

220{
221 if ( event == "start" )
222 {
223 minigame.minigame_flags = NMM_TURN_PLACE|NMM_TURN_TEAM1;
224 nmm_init_tiles(minigame);
225 entity e;
226 for ( int i = 0; i < 7; ++i )
227 {
228 e = msle_spawn(minigame,new(minigame_board_piece));
229 e.team = 1;
230 e.minigame_flags = NMM_PIECE_HOME;
231 e = msle_spawn(minigame,new(minigame_board_piece));
232 e.team = 2;
233 e.minigame_flags = NMM_PIECE_HOME;
234 }
235
236 return 1;
237 }
238 else if ( event == "end" )
239 {
240 nmm_kill_tiles(minigame);
241 }
242 else if ( event == "join" )
243 {
244 int n = 0;
245 entity e;
246 for ( e = minigame.minigame_players; e; e = e.list_next )
247 n++;
248 if ( n >= 2 )
249 return NMM_SPECTATOR_TEAM;
250 if ( minigame.minigame_players && minigame.minigame_players.team == 1 )
251 return 2;
252 return 1;
253 }
254 else if ( event == "cmd" )
255 {
256 entity e = ...(0,entity);
257 int argc = ...(1,int);
258 entity tile = NULL;
259 entity piece = NULL;
260 bool move_ok = false;
261
262 if ( e && argc >= 2 && argv(0) == "move" &&
263 ( minigame.minigame_flags & NMM_TURN_TEAM ) == e.team )
264 {
265 tile = nmm_find_tile(minigame,argv(1));
266 if ( !tile )
267 {
268 move_ok = false;
269 }
270 else if ( minigame.minigame_flags & NMM_TURN_PLACE )
271 {
272 piece = nmm_find_piece(NULL,minigame,e.team,NMM_PIECE_HOME);
273 if ( !tile.nmm_tile_piece && piece )
274 {
275 tile.nmm_tile_piece = piece;
276 piece.minigame_flags = NMM_PIECE_BOARD;
277 piece.origin = tile.origin;
278 piece.SendFlags |= MINIG_SF_UPDATE;
279 move_ok = true;
280 }
281 }
282 else if ( minigame.minigame_flags & NMM_TURN_MOVE )
283 {
284 if ( tile.nmm_tile_piece && tile.nmm_tile_piece.team == e.team )
285 {
286 piece = tile.nmm_tile_piece;
287 entity tile2 = nmm_find_tile(minigame,argv(2));
288 if ( tile2 && nmm_tile_adjacent(tile,tile2) && !tile2.nmm_tile_piece )
289 {
290 tile.nmm_tile_piece = NULL;
291 tile2.nmm_tile_piece = piece;
292 piece.origin = tile2.origin;
293 piece.SendFlags |= MINIG_SF_UPDATE;
294 tile = tile2;
295 move_ok = true;
296 }
297 }
298
299 }
300 else if ( minigame.minigame_flags & NMM_TURN_FLY )
301 {
302 if ( tile.nmm_tile_piece && tile.nmm_tile_piece.team == e.team )
303 {
304 piece = tile.nmm_tile_piece;
305 entity tile2 = nmm_find_tile(minigame,argv(2));
306 if ( tile2 && !tile2.nmm_tile_piece )
307 {
308 tile.nmm_tile_piece = NULL;
309 tile2.nmm_tile_piece = piece;
310 piece.origin = tile2.origin;
311 piece.SendFlags |= MINIG_SF_UPDATE;
312 tile = tile2;
313 move_ok = true;
314 }
315 }
316
317 }
318 else if ( minigame.minigame_flags & NMM_TURN_TAKE )
319 {
320 piece = tile.nmm_tile_piece;
321 if ( piece && piece.nmm_tile_piece.team != e.team )
322 {
323 tile.nmm_tile_piece = NULL;
324 piece.minigame_flags = NMM_PIECE_DEAD;
325 piece.SendFlags |= MINIG_SF_UPDATE;
326 move_ok = true;
327 }
328 }
329
330 int nextteam = e.team % 2 + 1;
331 int npieces = nmm_count_pieces(minigame,nextteam,NMM_PIECE_HOME|NMM_PIECE_BOARD);
332
333 if ( npieces < 3 )
334 {
335 minigame.minigame_flags = NMM_TURN_WIN | e.team;
336 minigame.SendFlags |= MINIG_SF_UPDATE;
337 }
338 else if ( move_ok)
339 {
340 if ( !(minigame.minigame_flags & NMM_TURN_TAKE) && nmm_in_mill(tile) )
341 {
342 minigame.minigame_flags = NMM_TURN_TAKE|e.team;
343 int takemill = NMM_TURN_TAKEANY;
344 entity f = NULL;
345 while ( ( f = findentity(f,owner,minigame) ) )
346 if ( f.classname == "minigame_nmm_tile" && f.nmm_tile_piece &&
347 f.nmm_tile_piece.team == nextteam && !nmm_in_mill(f) )
348 {
349 takemill = 0;
350 break;
351 }
352 minigame.minigame_flags |= takemill;
353 }
354 else
355 {
356 if ( nmm_find_piece(NULL,minigame,nextteam,NMM_PIECE_HOME) )
357 minigame.minigame_flags = NMM_TURN_PLACE|nextteam;
358 else if ( npieces == 3 )
359 minigame.minigame_flags = NMM_TURN_FLY|nextteam;
360 else
361 {
362 minigame.minigame_flags = NMM_TURN_WIN|e.team;
363 entity f = NULL;
364 while ( ( f = findentity(f,owner,minigame) ) )
365 if ( f.classname == "minigame_nmm_tile" && f.nmm_tile_piece &&
366 f.nmm_tile_piece.team == nextteam && nmm_tile_canmove(f) )
367 {
368 minigame.minigame_flags = NMM_TURN_MOVE|nextteam;
369 break;
370 }
371 }
372 }
373 minigame.SendFlags |= MINIG_SF_UPDATE;
374 }
375 else
376 LOG_TRACE("Invalid move: ", ...(2, string));
377 return 1;
378 }
379 }
380 return 0;
381}
#define int
Definition _all.inc:20
#define LOG_TRACE(...)
Definition log.qh:76
entity msle_spawn(entity minigame_session, entity e)
Definition minigames.qc:87
const int MINIG_SF_UPDATE
Definition minigames.qh:109
bool nmm_tile_canmove(entity tile)
Definition nmm.qc:162
const int NMM_TURN_TEAM1
Definition nmm.qc:12
int nmm_count_pieces(entity minigame, int teamn, int pieceflags)
Definition nmm.qc:209
void nmm_init_tiles(entity minig)
Definition nmm.qc:135
bool nmm_in_mill(entity tile)
Definition nmm.qc:188
const int NMM_TURN_FLY
Definition nmm.qc:7
const int NMM_TURN_PLACE
Definition nmm.qc:5
const int NMM_TURN_TEAM
Definition nmm.qc:14
const int NMM_TURN_TAKEANY
Definition nmm.qc:9
bool nmm_tile_adjacent(entity tile1, entity tile2)
Definition nmm.qc:151
const int NMM_PIECE_DEAD
Definition nmm.qc:16
void nmm_kill_tiles(entity minig)
Definition nmm.qc:121
const int NMM_PIECE_BOARD
Definition nmm.qc:18
const int NMM_TURN_TAKE
Definition nmm.qc:8
const int NMM_SPECTATOR_TEAM
Definition nmm.qc:20
const int NMM_TURN_MOVE
Definition nmm.qc:6
const int NMM_TURN_WIN
Definition nmm.qc:10
const int NMM_PIECE_HOME
Definition nmm.qc:17

References argv(), entity(), findentity(), int, LOG_TRACE, MINIG_SF_UPDATE, msle_spawn(), nmm_count_pieces(), nmm_find_piece(), nmm_find_tile(), nmm_in_mill(), nmm_init_tiles(), nmm_kill_tiles(), NMM_PIECE_BOARD, NMM_PIECE_DEAD, NMM_PIECE_HOME, NMM_SPECTATOR_TEAM, nmm_tile_adjacent(), nmm_tile_canmove(), NMM_TURN_FLY, NMM_TURN_MOVE, NMM_TURN_PLACE, NMM_TURN_TAKE, NMM_TURN_TAKEANY, NMM_TURN_TEAM, NMM_TURN_TEAM1, NMM_TURN_WIN, NULL, and owner.

◆ nmm_spawn_tile()

void nmm_spawn_tile ( string id,
entity minig,
int distance )

Definition at line 83 of file nmm.qc.

84{
85 // TODO global variable + list_next for simpler tile loops
86 entity e = new(minigame_nmm_tile);
87 e.origin = minigame_tile_pos(id,7,7);
88 e.netname = id;
89 e.owner = minig;
90 e.team = 0;
91 e.nmm_tile_distance = distance;
92 e.nmm_tile_hmill = strzone(nmm_tile_build_hmill(e));
93 e.nmm_tile_vmill = strzone(nmm_tile_build_vmill(e));
94}
string strzone(string s)
vector minigame_tile_pos(string id, int rows, int columns)
Definition minigames.qc:27
string nmm_tile_build_vmill(entity tile)
Definition nmm.qc:54
string nmm_tile_build_hmill(entity tile)
Definition nmm.qc:28

References entity(), minigame_tile_pos(), nmm_tile_build_hmill(), nmm_tile_build_vmill(), and strzone().

Referenced by nmm_spawn_tile_square().

◆ nmm_spawn_tile_square()

void nmm_spawn_tile_square ( entity minig,
int offset,
int skip )

Definition at line 100 of file nmm.qc.

101{
102 int letter = offset;
103 int number = offset;
104 for ( int i = 0; i < 3; ++i )
105 {
106 number = offset;
107 for ( int j = 0; j < 3; ++j )
108 {
109 if ( i != 1 || j != 1 )
111 number += skip+1;
112 }
113 letter += skip+1;
114 }
115
116 if ( skip > 0 )
117 nmm_spawn_tile_square(minig,offset+1,skip-1);
118}
string minigame_tile_buildname(int letter, int number)
Definition minigames.qc:34
void nmm_spawn_tile(string id, entity minig, int distance)
Definition nmm.qc:83
int int number
Definition impulse.qc:89

References entity(), minigame_tile_buildname(), nmm_spawn_tile(), nmm_spawn_tile_square(), number, and strzone().

Referenced by nmm_init_tiles(), and nmm_spawn_tile_square().

◆ nmm_tile_adjacent()

bool nmm_tile_adjacent ( entity tile1,
entity tile2 )

Definition at line 151 of file nmm.qc.

152{
153
154 int dnumber = fabs ( minigame_tile_number(tile1.netname) - minigame_tile_number(tile2.netname) );
155 int dletter = fabs ( minigame_tile_letter(tile1.netname) - minigame_tile_letter(tile2.netname) );
156
157 return ( dnumber == 0 && ( dletter == 1 || dletter == tile1.nmm_tile_distance ) ) ||
158 ( dletter == 0 && ( dnumber == 1 || dnumber == tile1.nmm_tile_distance ) );
159}
float fabs(float f)
int minigame_tile_letter(string id)
Definition minigames.qc:12
int minigame_tile_number(string id)
Definition minigames.qc:21

References entity(), fabs(), minigame_tile_letter(), and minigame_tile_number().

Referenced by nmm_server_event(), and nmm_tile_canmove().

◆ nmm_tile_build_hmill()

string nmm_tile_build_hmill ( entity tile)

Definition at line 28 of file nmm.qc.

29{
30 int number = minigame_tile_number(tile.netname);
31 int letter = minigame_tile_letter(tile.netname);
32 if ( number == letter || number+letter == 6 )
33 {
34 int add = letter < 3 ? 1 : -1;
35 return strcat(tile.netname," ",
36 minigame_tile_buildname(letter+add*tile.nmm_tile_distance,number)," ",
37 minigame_tile_buildname(letter+add*2*tile.nmm_tile_distance,number) );
38 }
39 else if ( letter == 3 )
40 return strcat(minigame_tile_buildname(letter-tile.nmm_tile_distance,number)," ",
41 tile.netname," ",
42 minigame_tile_buildname(letter+tile.nmm_tile_distance,number) );
43 else if ( letter < 3 )
47 else
51}
strcat(_("^F4Countdown stopped!"), "\n^BG", _("Teams are too unbalanced."))

References entity(), minigame_tile_buildname(), minigame_tile_letter(), minigame_tile_number(), number, and strcat().

Referenced by nmm_spawn_tile().

◆ nmm_tile_build_vmill()

string nmm_tile_build_vmill ( entity tile)

Definition at line 54 of file nmm.qc.

55{
56 int letter = minigame_tile_letter(tile.netname);
57 int number = minigame_tile_number(tile.netname);
58 if ( letter == number || letter+number == 6 )
59 {
60 int add = number < 3 ? 1 : -1;
61 return strcat(tile.netname," ",
62 minigame_tile_buildname(letter,number+add*tile.nmm_tile_distance)," ",
63 minigame_tile_buildname(letter,number+add*2*tile.nmm_tile_distance) );
64 }
65 else if ( number == 3 )
66 return strcat(minigame_tile_buildname(letter,number-tile.nmm_tile_distance)," ",
67 tile.netname," ",
68 minigame_tile_buildname(letter,number+tile.nmm_tile_distance) );
69 else if ( number < 3 )
70 return strcat(minigame_tile_buildname(letter,0)," ",
71 minigame_tile_buildname(letter,1)," ",
72 minigame_tile_buildname(letter,2) );
73 else
74 return strcat(minigame_tile_buildname(letter,4)," ",
75 minigame_tile_buildname(letter,5)," ",
76 minigame_tile_buildname(letter,6) );
77}

References entity(), minigame_tile_buildname(), minigame_tile_letter(), minigame_tile_number(), number, and strcat().

Referenced by nmm_spawn_tile().

◆ nmm_tile_canmove()

bool nmm_tile_canmove ( entity tile)

Definition at line 162 of file nmm.qc.

163{
164 entity e = NULL;
165 while ( ( e = findentity(e,owner,tile.owner) ) )
166 if ( e.classname == "minigame_nmm_tile" && !e.nmm_tile_piece
167 && nmm_tile_adjacent(e,tile) )
168 {
169 return true;
170 }
171 return false;
172}

References entity(), findentity(), nmm_tile_adjacent(), NULL, and owner.

Referenced by nmm_server_event().

◆ REGISTER_MINIGAME()

REGISTER_MINIGAME ( nmm ,
_("Nine Men's Morris")  )

Variable Documentation

◆ NMM_PIECE_BOARD

const int NMM_PIECE_BOARD = 0x2

Definition at line 18 of file nmm.qc.

Referenced by nmm_server_event().

◆ NMM_PIECE_DEAD

const int NMM_PIECE_DEAD = 0x0

Definition at line 16 of file nmm.qc.

Referenced by nmm_server_event().

◆ NMM_PIECE_HOME

const int NMM_PIECE_HOME = 0x1

Definition at line 17 of file nmm.qc.

Referenced by nmm_server_event().

◆ NMM_SPECTATOR_TEAM

const int NMM_SPECTATOR_TEAM = 255

Definition at line 20 of file nmm.qc.

Referenced by nmm_server_event().

◆ nmm_tile_distance

int nmm_tile_distance

Definition at line 22 of file nmm.qc.

◆ nmm_tile_hmill

string nmm_tile_hmill

Definition at line 24 of file nmm.qc.

◆ nmm_tile_piece

entity nmm_tile_piece

Definition at line 23 of file nmm.qc.

◆ nmm_tile_vmill

string nmm_tile_vmill

Definition at line 25 of file nmm.qc.

◆ NMM_TURN_FLY

const int NMM_TURN_FLY = 0x0400

Definition at line 7 of file nmm.qc.

Referenced by nmm_server_event().

◆ NMM_TURN_MOVE

const int NMM_TURN_MOVE = 0x0200

Definition at line 6 of file nmm.qc.

Referenced by nmm_server_event().

◆ NMM_TURN_PLACE

const int NMM_TURN_PLACE = 0x0100

Definition at line 5 of file nmm.qc.

Referenced by nmm_server_event().

◆ NMM_TURN_TAKE

const int NMM_TURN_TAKE = 0x0800

Definition at line 8 of file nmm.qc.

Referenced by nmm_server_event().

◆ NMM_TURN_TAKEANY

const int NMM_TURN_TAKEANY =0x1000

Definition at line 9 of file nmm.qc.

Referenced by nmm_server_event().

◆ NMM_TURN_TEAM

const int NMM_TURN_TEAM = 0x00ff

Definition at line 14 of file nmm.qc.

Referenced by nmm_server_event().

◆ NMM_TURN_TEAM1

const int NMM_TURN_TEAM1 = 0x0001

Definition at line 12 of file nmm.qc.

Referenced by nmm_server_event().

◆ NMM_TURN_TEAM2

const int NMM_TURN_TEAM2 = 0x0002

Definition at line 13 of file nmm.qc.

◆ NMM_TURN_TYPE

const int NMM_TURN_TYPE = 0xff00

Definition at line 11 of file nmm.qc.

◆ NMM_TURN_WIN

const int NMM_TURN_WIN = 0x2000

Definition at line 10 of file nmm.qc.

Referenced by nmm_server_event().