+#include "snake.qh"
REGISTER_MINIGAME(snake, "Snake"); // SNAAAAKE
const float SNAKE_TURN_MOVE = 0x0100; // the snake is moving, player must control it
bool snake_alone(entity minig)
{
int headcount = 0;
- entity e = world;
+ entity e = NULL;
while ( ( e = findentity(e,owner,minig) ) )
if ( e.classname == "minigame_board_piece" && e.cnt == 1 )
++headcount;
// find same game piece given its tile name
entity snake_find_piece(entity minig, string tile)
{
- entity e = world;
+ entity e = NULL;
while ( ( e = findentity(e,owner,minig) ) )
if ( e.classname == "minigame_board_piece" && e.netname == tile )
return e;
- return world;
+ return NULL;
}
// find same game piece given its cnt
entity snake_find_cnt(entity minig, int steam, int tile)
{
- entity e = world;
+ entity e = NULL;
while ( ( e = findentity(e,owner,minig) ) )
if ( e.classname == "minigame_board_piece" && e.cnt == tile && e.team == steam )
return e;
- return world;
+ return NULL;
}
// check if the tile name is valid (15x15 grid)
entity snake_find_head(entity minig, int steam)
{
- entity e = world;
+ entity e = NULL;
while ( ( e = findentity(e,owner,minig) ) )
if ( e.classname == "minigame_board_piece" && e.cnt == 1 && e.team == steam )
return e;
- return world;
+ return NULL;
}
void snake_new_mouse(entity minigame)
{
string pos = minigame_tile_buildname(i, j);
if(!snake_find_piece(minigame, pos))
- RandomSelection_Add(world, 0, pos, 1, 1);
+ RandomSelection_AddString(pos, 1, 1);
}
entity piece = msle_spawn(minigame,"minigame_board_piece");
}
void snake_move_head(entity minigame, entity head);
-void snake_head_think()
+void snake_head_think(entity this)
{
- SELFPARAM();
- entity minigame = self.owner;
+ entity minigame = this.owner;
if(minigame.minigame_flags & SNAKE_TURN_MOVE)
- snake_move_head(minigame, self);
+ snake_move_head(minigame, this);
snake_check_winner(minigame);
- self.nextthink = time + self.snake_delay;
+ this.nextthink = time + this.snake_delay;
}
void minigame_setup_snake(entity minigame, int pteam)
{
string pos = minigame_tile_buildname(i, j);
if(!snake_find_piece(minigame, pos))
- RandomSelection_Add(world, 0, pos, 1, 1);
+ RandomSelection_AddString(pos, 1, 1);
}
entity piece = msle_spawn(minigame,"minigame_board_piece");
piece.team = pteam;
piece.netname = strzone(RandomSelection_chosen_string);
piece.cnt = 1;
- piece.snake_next = world;
- piece.snake_prev = world;
+ piece.snake_next = NULL;
+ piece.snake_prev = NULL;
piece.snake_last = piece;
- piece.think = snake_head_think;
+ setthink(piece, snake_head_think);
piece.snake_delay = autocvar_sv_minigames_snake_delay_initial;
piece.nextthink = time + 0.1;
minigame_server_sendflags(piece,MINIG_SF_ALL);
#ifdef SVQC
for(e = minigame.minigame_players; e; e = e.list_next)
#elif defined(CSQC)
- e = world;
+ e = NULL;
while( (e = findentity(e,owner,minigame)) )
if ( e.classname == "minigame_player" )
#endif
if(e.team == pteam)
return e;
- return world;
+ return NULL;
}
void snake_add_score(entity minigame, int pteam, int thescore)
piece.team = head.team;
piece.snake_prev = tail;
piece.snake_dir = tail.snake_dir;
- piece.snake_next = world;
+ piece.snake_next = NULL;
piece.snake_tail = true;
piece.netname = strzone(tail.netname);
head.nextthink = time + 1; // make sure they don't to eat us somehow
- entity e = world;
+ entity e = NULL;
while ( ( e = findentity(e,owner,minigame) ) )
if ( e.classname == "minigame_board_piece" && e.cnt && e.team == pteam )
{
if(e.netname) { strunzone(e.netname); }
- remove(e);
+ delete(e);
}
if(minigame.snake_lives[pteam] <= 0)
if(ate_mouse)
{
if(hit.netname) { strunzone(hit.netname); }
- remove(hit);
+ delete(hit);
snake_new_mouse(minigame);
}
}
case "end":
{
- entity e = world;
+ entity e = NULL;
while( (e = findentity(e, owner, minigame)) )
if(e.classname == "minigame_board_piece")
{
if(e.netname) { strunzone(e.netname); }
- remove(e);
+ delete(e);
}
return false;
}
// Required function, draw the game status panel
void snake_hud_status(vector pos, vector mySize)
{
- HUD_Panel_DrawBg(1);
- vector ts;
- ts = minigame_drawstring_wrapped(mySize_x,pos,active_minigame.descriptor.message,
+ HUD_Panel_DrawBg();
+ vector 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);
- ts_y += hud_fontsize_y;
- pos_y += ts_y;
- mySize_y -= ts_y;
+ ts.y += hud_fontsize.y;
+ pos.y += ts.y;
+ mySize.y -= ts.y;
vector player_fontsize = hud_fontsize * 1.75;
- ts_y = ( mySize_y - SNAKE_TEAMS*player_fontsize_y ) / SNAKE_TEAMS;
- ts_x = mySize_x;
+ ts.y = player_fontsize.y + (mySize.y - SNAKE_TEAMS * player_fontsize.y) / SNAKE_TEAMS;
+ ts.x = mySize_x;
vector mypos;
entity e;
{
if ( e.classname == "minigame_player" )
{
- mypos = pos;
- mypos_y += (e.team-1) * (player_fontsize_y + ts_y);
+ mypos = pos + eY * (e.team - 1) * ts.y;
- drawfill(mypos, ts, snake_teamcolor(e.team), 0.25, DRAWFLAG_ADDITIVE);
+ if (e == minigame_self)
+ {
+ const vector hl_size = '1 1 0';
+ drawfill(mypos + hl_size, ts - 2 * hl_size, snake_teamcolor(e.team), 0.25 * panel_fg_alpha, DRAWFLAG_ADDITIVE);
+ drawborderlines(hl_size.x, mypos + hl_size, ts - 2 * hl_size, snake_teamcolor(e.team), panel_fg_alpha, DRAWFLAG_NORMAL);
+ }
+ else
+ drawfill(mypos, ts, snake_teamcolor(e.team), 0.25 * panel_fg_alpha, DRAWFLAG_ADDITIVE);
- minigame_drawcolorcodedstring_trunc(mySize_x,mypos,
- entcs_GetName(e.minigame_playerslot-1),
+ minigame_drawcolorcodedstring_trunc(mySize.x - hud_fontsize.x * 0.5, mypos + eX * hud_fontsize.x * 0.25,
+ entcs_GetName(e.minigame_playerslot - 1),
player_fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
- drawstring(mypos+eY*player_fontsize_y,ftos(e.snake_score),'48 48 0' * (SNAKE_TEAMS * 0.1),
- '0.7 0.84 1', panel_fg_alpha, DRAWFLAG_NORMAL);
- drawstring(mypos+(eY*player_fontsize_y) + (eX*player_fontsize_x),strcat("1UP: ", ftos(active_minigame.snake_lives[e.team])),'48 48 0' * (SNAKE_TEAMS * 0.1),
- '1 0.44 0.54', panel_fg_alpha, DRAWFLAG_NORMAL);
-
- if ( e == minigame_self )
- drawborderlines(1, mypos, ts, snake_teamcolor(e.team), 1, DRAWFLAG_NORMAL);
+ mypos.y += player_fontsize.y;
+ drawstring_aspect(mypos, ftos(e.snake_score), ts - eY * player_fontsize.y - eX * ts.x * (3 / 4),
+ '0.7 0.84 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+ drawstring_aspect(mypos + eX * ts.x * (1 / 4), strcat("1UP: ", ftos(active_minigame.snake_lives[e.team])), ts - eY * player_fontsize.y - eX * ts.x * (1 / 4),
+ '1 0.44 0.54', panel_fg_alpha, DRAWFLAG_NORMAL);
}
}
}