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 minigame, entity tile)
bool nmm_in_mill_string (entity minigame, 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 211 of file nmm.qc.

212{
213 int n = 0;
214 entity e = NULL;
215 while (( e = nmm_find_piece(e,minigame, teamn, pieceflags) ))
216 ++n;
217 return n;
218}
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:200
#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 200 of file nmm.qc.

201{
202 entity e = start;
203 while ( ( e = findfloat(e,minigame_id,minigame.minigame_id) ) )
204 if ( e.classname == "minigame_board_piece" &&
205 (e.minigame_flags & pieceflags) && e.team == teamn )
206 return e;
207 return NULL;
208}
entity findfloat(entity start,.float field, float match)
int minigame_id
Unique ID for the minigame session, associated with all objects currently the result of etof(minigame...
Definition minigames.qh:49

References entity(), findfloat(), minigame_id, and NULL.

Referenced by nmm_count_pieces(), and nmm_server_event().

◆ nmm_find_tile()

entity nmm_find_tile ( entity minig,
string id )

Definition at line 143 of file nmm.qc.

144{
145 entity e = NULL;
146 while ( ( e = findfloat(e,minigame_id,minig.minigame_id) ) )
147 if ( e.classname == "minigame_nmm_tile" && e.netname == id )
148 return e;
149 return NULL;
150}

References entity(), findfloat(), minigame_id, and NULL.

Referenced by nmm_in_mill_string(), and nmm_server_event().

◆ nmm_in_mill()

bool nmm_in_mill ( entity minigame,
entity tile )

Definition at line 190 of file nmm.qc.

191{
192 return tile.nmm_tile_piece && (
193 nmm_in_mill_string(minigame,tile,tile.nmm_tile_hmill) ||
194 nmm_in_mill_string(minigame,tile,tile.nmm_tile_vmill) );
195}
bool nmm_in_mill_string(entity minigame, entity tile, string s)
Definition nmm.qc:177

References entity(), and nmm_in_mill_string().

Referenced by nmm_server_event().

◆ nmm_in_mill_string()

bool nmm_in_mill_string ( entity minigame,
entity tile,
string s )

Definition at line 177 of file nmm.qc.

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

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 137 of file nmm.qc.

138{
139 nmm_spawn_tile_square(minig,0,2);
140}
void nmm_spawn_tile_square(entity minig, int offset, int skip)
Definition nmm.qc:102

References entity(), and nmm_spawn_tile_square().

Referenced by nmm_server_event().

◆ nmm_kill_tiles()

void nmm_kill_tiles ( entity minig)

Definition at line 123 of file nmm.qc.

124{
125 entity e = NULL;
126 while ( ( e = findfloat(e,minigame_id,minig.minigame_id) ) )
127 if ( e.classname == "minigame_nmm_tile" )
128 {
129 strfree(e.netname);
130 strfree(e.nmm_tile_hmill);
131 strfree(e.nmm_tile_vmill);
132 delete(e);
133 }
134}
#define strfree(this)
Definition string.qh:57

References entity(), findfloat(), minigame_id, NULL, and strfree.

Referenced by nmm_server_event().

◆ nmm_server_event()

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

Definition at line 221 of file nmm.qc.

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

◆ 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.minigame_id = minig.minigame_id;
91 e.descriptor = minig.descriptor;
92 e.team = 0;
93 e.nmm_tile_distance = distance;
94 e.nmm_tile_hmill = strzone(nmm_tile_build_hmill(e));
95 e.nmm_tile_vmill = strzone(nmm_tile_build_vmill(e));
96}
string strzone(string s)
vector minigame_tile_pos(string id, int rows, int columns)
Definition minigames.qc:36
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 102 of file nmm.qc.

103{
104 int letter = offset;
105 int number = offset;
106 for ( int i = 0; i < 3; ++i )
107 {
108 number = offset;
109 for ( int j = 0; j < 3; ++j )
110 {
111 if ( i != 1 || j != 1 )
113 number += skip+1;
114 }
115 letter += skip+1;
116 }
117
118 if ( skip > 0 )
119 nmm_spawn_tile_square(minig,offset+1,skip-1);
120}
string minigame_tile_buildname(int letter, int number)
Definition minigames.qc:43
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 153 of file nmm.qc.

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

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 164 of file nmm.qc.

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

References entity(), findfloat(), minigame_id, nmm_tile_adjacent(), and NULL.

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().