Xonotic QuakeC
The free, fast arena FPS with crisp movement and a wide array of weapons
minigames.qc
Go to the documentation of this file.
1#include "minigames.qh"
2
3REGISTER_NET_LINKED(ENT_CLIENT_MINIGAME)
4
6{
7 FOREACH(Minigames, it.netname == id, return it);
8 return NULL;
9}
10
12{
13 entity e = NULL;
14 while( (e = findfloat(e, minigame_id, id)) )
15 if ( e.classname == "minigame" )
16 return e;
17 return NULL;
18}
19
20// Get letter index of a tile name
22{
23 return str2chr(substring(id,0,1),0)-'a';
24}
25
26// Get number index of a tile name
27// Note: this is 0 based, useful for mathematical operations
28// Note: Since the tile notation starts from the bottom left,
29// you may want to do number_of_rows - what_this_function_returns or something
31{
32 return stof(substring(id,1,-1)) -1 ;
33}
34
35// Get relative position of the center of a given tile
36vector minigame_tile_pos(string id, int rows, int columns)
37{
38 return vec2((minigame_tile_letter(id) + 0.5) / columns,
39 (1 - (minigame_tile_number(id) + 0.5) / rows));
40}
41
42// Get a tile name from indices
43string minigame_tile_buildname(int letter, int number)
44{
45 return strcat(chr2str('a'+letter),ftos(number+1));
46}
47
48// Get the id of a tile relative to the given one
49string minigame_relative_tile(string start_id, int dx, int dy, int rows, int columns)
50{
51 int letter = minigame_tile_letter(start_id);
52 int number = minigame_tile_number(start_id);
53 letter = (letter+dx) % columns;
54 number = (number+dy) % rows;
55 if ( letter < 0 )
56 letter = columns + letter;
57 if ( number < 0 )
58 number = rows + number;
59 return minigame_tile_buildname(letter, number);
60}
61
62// Get tile name from a relative position (matches the tile covering a square area)
63string minigame_tile_name(vector pos, int rows, int columns)
64{
65 if ( pos_x < 0 || pos_x > 1 || pos_y < 0 || pos_y > 1 )
66 return ""; // no tile
67
68 int letter = floor(pos_x * columns);
69 int number = floor((1-pos_y) * rows);
70 return minigame_tile_buildname(letter, number);
71}
72
73// Get the next team number (note: team numbers are between 1 and n_teams, inclusive)
74int minigame_next_team(int curr_team, int n_teams)
75{
76 return curr_team % n_teams + 1;
77}
78
79// Get the previous team number
80int minigame_prev_team(int curr_team, int n_teams)
81{
82 return curr_team % n_teams - 1;
83}
84
85// set send flags only when on server
86// (for example in game logic which can be used both in client and server
87void minigame_server_sendflags(entity ent, int mgflags)
88{
89 #ifdef SVQC
90 ent.SendFlags |= mgflags;
91 #endif
92}
93
94// Spawn linked entity on the server or local entity on the client
95// This entity will be removed automatically when the minigame ends
96entity msle_spawn(entity minigame_session, entity e)
97{
98 e.owner = minigame_session;
99 e.minigame_id = minigame_session.minigame_id;
100 e.descriptor = minigame_session.descriptor;
101 e.minigame_autoclean = 1;
102 #ifdef SVQC
105 #endif
106 return e;
107}
108
109const int msle_base_id = 2;
110int msle_id(string class_name)
111{
112 if ( class_name == "minigame" ) return 1;
113 if ( class_name == "minigame_player" ) return 2;
114 int i = msle_base_id;
115#define MSLE(Name, Fields) ++i; if ( class_name == #Name ) return i;
117#undef MSLE
118 return 0;
119}
120
121string msle_classname(int id)
122{
123 if ( id == 1 ) return "minigame";
124 if ( id == 2 ) return "minigame_player";
125 int i = msle_base_id;
126#define MSLE(Name, Fields) ++i; if ( id == i ) return #Name;
128#undef MSLE
129 return "";
130}
131
133{
134 int pl_num = 0;
135 entity e;
136#ifdef SVQC
137 for(e = minigame.minigame_players; e; e = e.list_next)
138#elif defined(CSQC)
139 e = NULL;
140 while( (e = findfloat(e,minigame_id,minigame.minigame_id)) )
141 if ( e.classname == "minigame_player" )
142#endif
143 ++pl_num;
144 return pl_num;
145}
146
147#ifdef CSQC
148#include "cl_minigames.qc"
149#endif
150#ifdef SVQC
151#include "sv_minigames.qc"
152#endif
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
#define str2chr
#define chr2str
#define FOREACH(list, cond, body)
Definition iter.qh:19
#define REGISTER_NET_LINKED(id)
Definition net.qh:91
void Net_LinkEntity(entity e, bool docull, float dt, bool(entity this, entity to, int sendflags) sendfunc)
Definition net.qh:167
float stof(string val,...)
string substring(string s, float start, float length)
string ftos(float f)
float floor(float f)
entity findfloat(entity start,.float field, float match)
#define MINIGAME_SIMPLELINKED_ENTITIES
Set up automatic entity read/write functionality To ensure that everything is handled automatically,...
Definition all.qh:100
const int msle_base_id
Definition minigames.qc:109
entity msle_spawn(entity minigame_session, entity e)
Definition minigames.qc:96
string minigame_relative_tile(string start_id, int dx, int dy, int rows, int columns)
Definition minigames.qc:49
void minigame_server_sendflags(entity ent, int mgflags)
Definition minigames.qc:87
int minigame_count_players(entity minigame)
Definition minigames.qc:132
int minigame_prev_team(int curr_team, int n_teams)
Definition minigames.qc:80
int msle_id(string class_name)
Definition minigames.qc:110
entity minigame_get_owner(int id)
Definition minigames.qc:11
int minigame_next_team(int curr_team, int n_teams)
Definition minigames.qc:74
int minigame_tile_letter(string id)
Definition minigames.qc:21
string msle_classname(int id)
Definition minigames.qc:121
string minigame_tile_name(vector pos, int rows, int columns)
Definition minigames.qc:63
entity minigame_get_descriptor(string id)
Definition minigames.qc:5
vector minigame_tile_pos(string id, int rows, int columns)
Definition minigames.qc:36
string minigame_tile_buildname(int letter, int number)
Definition minigames.qc:43
int minigame_tile_number(string id)
Definition minigames.qc:30
int minigame_id
Unique ID for the minigame session, associated with all objects currently the result of etof(minigame...
Definition minigames.qh:49
strcat(_("^F4Countdown stopped!"), "\n^BG", _("Teams are too unbalanced."))
#define NULL
Definition post.qh:14
vector
Definition self.qh:96
#define setcefc(e, f)
int int number
Definition impulse.qc:89
bool minigame_CheckSend(entity this, entity client)
bool minigame_SendEntity(entity this, entity to, int sf)
#define vec2(...)
Definition vector.qh:95