X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fcommon%2Fminigames%2Fminigame%2Fsnake.qc;h=3aedeb01632db8081faf98e3308738b51dcd45e5;hp=da5cc4a922f222760227302331bf6920f8c4f7d8;hb=de295c2008095603d2d39b1bf1169370d60143b2;hpb=2c33cf3908c1cd42d7a3f3fe38a09ea5b80a7665 diff --git a/qcsrc/common/minigames/minigame/snake.qc b/qcsrc/common/minigames/minigame/snake.qc index da5cc4a92..3aedeb016 100644 --- a/qcsrc/common/minigames/minigame/snake.qc +++ b/qcsrc/common/minigames/minigame/snake.qc @@ -1,3 +1,4 @@ +#include "snake.qh" REGISTER_MINIGAME(snake, "Snake"); // SNAAAAKE const float SNAKE_TURN_MOVE = 0x0100; // the snake is moving, player must control it @@ -20,7 +21,9 @@ bool autocvar_sv_minigames_snake_wrap = false; float autocvar_sv_minigames_snake_delay_initial = 0.7; float autocvar_sv_minigames_snake_delay_multiplier = 50; float autocvar_sv_minigames_snake_delay_min = 0.1; +#ifdef SVQC int autocvar_sv_minigames_snake_lives = 3; +#endif .int snake_score; @@ -38,7 +41,7 @@ int autocvar_sv_minigames_snake_lives = 3; 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; @@ -49,21 +52,21 @@ bool snake_alone(entity minig) // 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) @@ -78,11 +81,11 @@ bool snake_valid_tile(string tile) 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) @@ -94,7 +97,7 @@ 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"); @@ -153,16 +156,16 @@ void snake_check_winner(entity minigame) } void snake_move_head(entity minigame, entity head); -void snake_head_think() +void snake_head_think(entity this) { - 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) @@ -174,17 +177,17 @@ 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); @@ -203,13 +206,13 @@ entity snake_get_player(entity minigame, int pteam) #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) @@ -255,7 +258,7 @@ void snake_move_body(entity minigame, entity head, bool ate_mouse) 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); @@ -282,19 +285,19 @@ void snake_eat_team(entity minigame, int pteam) 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) minigame.snake_lost_teams |= BIT(pteam); if(pl && minigame.snake_lives[pteam] > 0) - minigame_setup_snake(minigame, pteam); + minigame_setup_snake(minigame, pteam); } void snake_move_head(entity minigame, entity head) @@ -354,7 +357,7 @@ void snake_move_head(entity minigame, entity head) if(ate_mouse) { if(hit.netname) { strunzone(hit.netname); } - remove(hit); + delete(hit); snake_new_mouse(minigame); } @@ -415,17 +418,17 @@ int snake_server_event(entity minigame, string event, ...) } else minigame.snake_lives[1] = 1; - + return true; } 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; } @@ -465,8 +468,8 @@ int snake_server_event(entity minigame, string event, ...) { switch(argv(0)) { - case "move": - snake_move(minigame, ...(0,entity), ((...(1,int)) >= 2 ? argv(1) : string_null), ((...(1,int)) == 3 ? argv(2) : string_null)); + case "move": + snake_move(minigame, ...(0,entity), ((...(1,int)) >= 2 ? argv(1) : string_null), ((...(1,int)) == 3 ? argv(2) : string_null)); return true; } @@ -506,7 +509,7 @@ int snake_server_event(entity minigame, string event, ...) return false; } } - + return false; } @@ -539,7 +542,7 @@ void snake_hud_board(vector pos, vector mySize) minigame_hud_fitsqare(pos, mySize); snake_boardpos = pos; snake_boardsize = mySize; - + minigame_hud_simpleboard(pos,mySize,minigame_texture("snake/board")); vector tile_size = minigame_hud_denormalize_size('1 1 0' / SNAKE_TILE_SIZE,pos,mySize); @@ -599,7 +602,7 @@ void snake_hud_board(vector pos, vector mySize) { int thex = minigame_tile_letter(e.netname); int they = minigame_tile_number(e.netname); - entity t = snake_find_cnt(active_minigame, minigame_self.team, e.cnt - 1); + entity t = snake_find_cnt(active_minigame, e.team, e.cnt - 1); int tx = minigame_tile_letter(t.netname); int ty = minigame_tile_number(t.netname); @@ -633,7 +636,7 @@ void snake_hud_board(vector pos, vector mySize) } else { - minigame_drawpic_centered( tile_pos, + minigame_drawpic_centered( tile_pos, minigame_texture(thepiece), tile_size, tile_color, panel_fg_alpha, DRAWFLAG_NORMAL ); } @@ -654,17 +657,17 @@ void snake_hud_board(vector pos, vector mySize) victory_text = "You win!"; if(active_minigame.snake_lives[minigame_self.team] <= 0) victory_text = "You ran out of lives!"; - + vector win_pos = pos+eY*(mySize_y-winfs_y)/2; vector win_sz; win_sz = minigame_drawcolorcodedstring_wrapped(mySize_x,win_pos, - sprintf("%s %s", victory_text, scores_text), + sprintf("%s %s", victory_text, scores_text), winfs, 0, DRAWFLAG_NORMAL, 0.5); - + drawfill(win_pos-eY*hud_fontsize_y,win_sz+2*eY*hud_fontsize_y,'0.3 0.3 1',0.8,DRAWFLAG_ADDITIVE); - + minigame_drawcolorcodedstring_wrapped(mySize_x,win_pos, - sprintf("%s %s", victory_text, scores_text), + sprintf("%s %s", victory_text, scores_text), winfs, panel_fg_alpha, DRAWFLAG_NORMAL, 0.5); } } @@ -673,55 +676,43 @@ void snake_hud_board(vector pos, vector mySize) // 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); - - 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 - 2*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; - vector tile_size = '48 48 0'; - - mypos = pos; - if ( minigame_self.team > 1 ) - mypos_y += player_fontsize_y + (ts_y * (minigame_self.team - 1)); - 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*tile_size_y,'1 1 1',0.25,DRAWFLAG_ADDITIVE); entity e; FOREACH_MINIGAME_ENTITY(e) { if ( e.classname == "minigame_player" ) { - mypos = pos; - if ( e.team > 1 ) - mypos_y += player_fontsize_y + (ts_y * (e.team - 1)); - minigame_drawcolorcodedstring_trunc(mySize_x,mypos, - GetPlayerName(e.minigame_playerslot-1), - player_fontsize, panel_fg_alpha, DRAWFLAG_NORMAL); + mypos = pos + eY * (e.team - 1) * ts.y; - vector tile_color = snake_teamcolor(e.team); - - mypos_y += player_fontsize_y; - drawpic( mypos, - minigame_texture("snake/head"), - tile_size * 0.7, tile_color, panel_fg_alpha, DRAWFLAG_NORMAL ); - - mypos_x += tile_size_x; - - drawstring(mypos,ftos(e.snake_score),tile_size, - '0.7 0.84 1', panel_fg_alpha, DRAWFLAG_NORMAL); + 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); - mypos_x += tile_size_x; + 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,strcat("1UP: ", ftos(active_minigame.snake_lives[e.team])),tile_size * 0.6, - '0.7 0.84 1', panel_fg_alpha, 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); } } } @@ -741,7 +732,7 @@ string snake_turn_to_string(int turnflags) if(active_minigame.snake_lives[minigame_self.team] <= 0) return _("You ran out of lives!"); - + if ( (snake_find_head(active_minigame, minigame_self.team)).snake_dir == '0 0 0' ) return _("Press an arrow key to begin the game"); @@ -750,7 +741,7 @@ string snake_turn_to_string(int turnflags) return _("Avoid the snake's body, collect the mice!"); else return _("Avoid the screen edges and the snake's body, collect the mice!"); - + return ""; } @@ -850,4 +841,4 @@ int snake_client_event(entity minigame, string event, ...) return false; } -#endif \ No newline at end of file +#endif