X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fminigames%2Fminigame%2Fpong.qc;h=dd072a05be1f279b3b5f9b740a38702250890a7e;hb=07fa7468e42c0c782caf12c6c8cb3c125672a0f4;hp=5074dccffd7131d0c693e3b0d8ffba686e7c7b3a;hpb=304b8158c9b753dd5674d055a1b91bd5472a66b8;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/minigames/minigame/pong.qc b/qcsrc/common/minigames/minigame/pong.qc index 5074dccff..dd072a05b 100644 --- a/qcsrc/common/minigames/minigame/pong.qc +++ b/qcsrc/common/minigames/minigame/pong.qc @@ -1,3 +1,4 @@ +#include "pong.qh" REGISTER_MINIGAME(pong, "Pong"); // minigame flags @@ -36,7 +37,7 @@ float autocvar_sv_minigames_pong_ball_number; float autocvar_sv_minigames_pong_ai_thinkspeed; float autocvar_sv_minigames_pong_ai_tolerance; -void pong_ball_think(); +void pong_ball_think(entity this); // Throws a ball in a random direction and sets the think function void pong_ball_throw(entity ball) @@ -47,16 +48,16 @@ void pong_ball_throw(entity ball) while ( fabs(sin(angle)) < 0.17 || fabs(cos(angle)) < 0.17 ); ball.velocity_x = cos(angle)*autocvar_sv_minigames_pong_ball_speed; ball.velocity_y = sin(angle)*autocvar_sv_minigames_pong_ball_speed; - ball.think = pong_ball_think; + setthink(ball, pong_ball_think); ball.nextthink = time; ball.team = 0; ball.SendFlags |= MINIG_SF_UPDATE|PONG_SF_BALLTEAM; } // Think equivalent of pong_ball_throw, used to delay throws -void pong_ball_throwthink() -{SELFPARAM(); - pong_ball_throw(self); +void pong_ball_throwthink(entity this) +{ + pong_ball_throw(this); } // Moves ball to the center and stops its motion @@ -64,10 +65,10 @@ void pong_ball_reset(entity ball) { ball.velocity = '0 0 0'; ball.origin = '0.5 0.5 0'; - ball.think = SUB_NullThink; + setthink(ball, SUB_NullThink); ball.team = 0; ball.SendFlags |= MINIG_SF_UPDATE|PONG_SF_BALLTEAM; - ball.think = pong_ball_throwthink; + setthink(ball, pong_ball_throwthink); ball.nextthink = time + autocvar_sv_minigames_pong_ball_wait; } @@ -94,8 +95,8 @@ void pong_add_score(entity minigame, int team_thrower, int team_receiver, int de // get point in the box nearest to the given one (2D) vector box_nearest(vector box_min, vector box_max, vector p) { - return eX * ( p_x > box_max_x ? box_max_x : ( p_x < box_min_x ? box_min_x : p_x ) ) - + eY * ( p_y > box_max_y ? box_max_y : ( p_y < box_min_y ? box_min_y : p_y ) ); + return vec2( p.x > box_max.x ? box_max.x : ( p.x < box_min.x ? box_min.x : p.x ), + p.y > box_max.y ? box_max.y : ( p.y < box_min.y ? box_min.y : p.y ) ); } void pong_paddle_bounce(entity ball, int pteam) @@ -122,9 +123,14 @@ bool pong_paddle_hit(entity ball, int pteam) entity paddle = ball.owner.pong_paddles[pteam-1]; if (!paddle) return false; - vector near_point = box_nearest(paddle.mins+paddle.origin, - paddle.maxs+paddle.origin, ball.origin); + +#if 1 + vector near_point = box_nearest(paddle.m_mins+paddle.origin, + paddle.m_maxs+paddle.origin, ball.origin); return vdist(near_point - ball.origin, <=, ball.pong_length); +#else + return boxesoverlap(paddle.m_mins + paddle.origin, paddle.m_maxs + paddle.origin, ball.m_mins + ball.origin, ball.m_maxs + ball.origin); +#endif } // Checks for a goal, when that happes adds scores and resets the ball @@ -145,8 +151,8 @@ bool pong_goal(entity ball, int pteam) } // Moves the ball around -void pong_ball_think() -{SELFPARAM(); +void pong_ball_think(entity this) +{ float think_speed = autocvar_sys_ticrate; this.nextthink = time + think_speed; @@ -201,16 +207,16 @@ void pong_ball_think() } // AI action -void pong_ai_think() -{SELFPARAM(); +void pong_ai_think(entity this) +{ float think_speed = autocvar_sv_minigames_pong_ai_thinkspeed; this.nextthink = time + think_speed; float distance; float next_distance; float min_distance = 1; - entity ball = world; - entity mayball = world; + entity ball = NULL; + entity mayball = NULL; while ( ( mayball = findentity(mayball,owner,this.owner) ) ) if ( mayball.classname == "pong_ball" ) { @@ -256,7 +262,7 @@ entity pong_ai_spawn(entity paddle) entity ai = msle_spawn(paddle.owner,"pong_ai"); ai.minigame_players = ai; ai.team = paddle.team; - ai.think = pong_ai_think; + setthink(ai, pong_ai_think); ai.nextthink = time; ai.pong_ai_paddle = paddle; @@ -266,24 +272,24 @@ entity pong_ai_spawn(entity paddle) } // Moves the paddle -void pong_paddle_think() -{SELFPARAM(); +void pong_paddle_think(entity this) +{ float think_speed = autocvar_sys_ticrate; this.nextthink = time + think_speed; if ( this.realowner.minigame_players.pong_keys == PONG_KEY_INCREASE || this.realowner.minigame_players.pong_keys == PONG_KEY_DECREASE ) { - float movement = autocvar_sv_minigames_pong_paddle_speed * think_speed; + float pmovement = autocvar_sv_minigames_pong_paddle_speed * think_speed; float halflen = this.pong_length/2; if ( this.realowner.minigame_players.pong_keys == PONG_KEY_DECREASE ) - movement *= -1; + pmovement *= -1; if ( this.team > 2 ) - this.origin_x = bound(halflen, this.origin_x+movement, 1-halflen); + this.origin_x = bound(halflen, this.origin_x+pmovement, 1-halflen); else - this.origin_y = bound(halflen, this.origin_y+movement, 1-halflen); + this.origin_y = bound(halflen, this.origin_y+pmovement, 1-halflen); this.SendFlags |= MINIG_SF_UPDATE; } @@ -292,8 +298,8 @@ void pong_paddle_think() vector pong_team_to_box_halfsize(int nteam, float length, float width) { if ( nteam > 2 ) - return eY*width/2 + eX*length/2; - return eX*width/2 + eY*length/2; + return vec2(length/2, width/2); + return vec2(width/2, length/2); } vector pong_team_to_paddlepos(int nteam) @@ -309,19 +315,19 @@ vector pong_team_to_paddlepos(int nteam) } // Spawns a pong paddle -// if real_player is world, the paddle is controlled by AI +// if real_player is NULL, the paddle is controlled by AI entity pong_paddle_spawn(entity minigame, int pl_team, entity real_player) { entity paddle = msle_spawn(minigame,"pong_paddle"); paddle.pong_length = autocvar_sv_minigames_pong_paddle_size; paddle.origin = pong_team_to_paddlepos(pl_team); - paddle.think = pong_paddle_think; + setthink(paddle, pong_paddle_think); paddle.nextthink = time; paddle.team = pl_team; - paddle.mins = pong_team_to_box_halfsize(pl_team,-paddle.pong_length,-1/16); - paddle.maxs = pong_team_to_box_halfsize(pl_team,paddle.pong_length,1/16); + paddle.m_mins = pong_team_to_box_halfsize(pl_team,-paddle.pong_length,-1/16); + paddle.m_maxs = pong_team_to_box_halfsize(pl_team,paddle.pong_length,1/16); - if ( real_player == world ) + if ( real_player == NULL ) pong_ai_spawn(paddle); else paddle.realowner = real_player; @@ -352,7 +358,7 @@ int pong_server_event(entity minigame, string event, ...) int i; for ( i = 0; i < PONG_MAX_PLAYERS; i++ ) { - if ( minigame.pong_paddles[i] == world ) + if ( minigame.pong_paddles[i] == NULL ) { pong_paddle_spawn(minigame,i+1,player); return i+1; @@ -370,7 +376,7 @@ int pong_server_event(entity minigame, string event, ...) for ( i = 0; i < PONG_MAX_PLAYERS; i++ ) { paddle = minigame.pong_paddles[i]; - if ( paddle != world && paddle.realowner == player ) + if ( paddle != NULL && paddle.realowner == player ) { ai = pong_ai_spawn(paddle); ai.pong_score = player.minigame_players.pong_score; @@ -392,12 +398,13 @@ int pong_server_event(entity minigame, string event, ...) (minigame.minigame_flags & ~PONG_STATUS_WAIT); minigame.SendFlags |= MINIG_SF_UPDATE; - int i; entity ball; - for ( i = 0; i < autocvar_sv_minigames_pong_ball_number; i++ ) + for ( int j = 0; j < autocvar_sv_minigames_pong_ball_number; j++ ) { ball = msle_spawn(minigame,"pong_ball"); ball.pong_length = autocvar_sv_minigames_pong_ball_radius; + ball.m_mins = vec2(-ball.pong_length, -ball.pong_length); + ball.m_maxs = vec2(ball.pong_length, ball.pong_length); pong_ball_reset(ball); } } @@ -414,15 +421,18 @@ int pong_server_event(entity minigame, string event, ...) case "-moved": player.pong_keys &= ~PONG_KEY_DECREASE; return true; + case "move": + if(argv(1)) + player.pong_keys = stoi(argv(1)); + return true; case "pong_aimore": { - int i; if ( minigame.minigame_flags & PONG_STATUS_WAIT ) - for ( i = 0; i < PONG_MAX_PLAYERS; i++ ) + for ( int j = 0; j < PONG_MAX_PLAYERS; j++ ) { - if ( minigame.pong_paddles[i] == world ) + if ( minigame.pong_paddles[j] == NULL ) { - pong_paddle_spawn(minigame,i+1,world); + pong_paddle_spawn(minigame,j+1,NULL); return true; } } @@ -434,16 +444,15 @@ int pong_server_event(entity minigame, string event, ...) if ( minigame.minigame_flags & PONG_STATUS_WAIT ) { entity paddle; - int i; - for ( i = PONG_MAX_PLAYERS-1; i >= 0; i-- ) + for ( int j = PONG_MAX_PLAYERS-1; j >= 0; j-- ) { - paddle = minigame.pong_paddles[i]; - if ( paddle != world && + paddle = minigame.pong_paddles[j]; + if ( paddle != NULL && paddle.realowner.classname == "pong_ai" ) { - minigame.pong_paddles[i] = world; - remove(paddle.realowner); - remove(paddle); + minigame.pong_paddles[j] = NULL; + delete(paddle.realowner); + delete(paddle); return true; } } @@ -498,9 +507,16 @@ vector pong_team_to_color(int nteam) } } +int pong_keys_pressed; +int pong_keys_pressed_old; + // Required function, draw the game board void pong_hud_board(vector pos, vector mySize) { + if(pong_keys_pressed != pong_keys_pressed_old) + minigame_cmd(strcat("move ", itos(pong_keys_pressed))); + pong_keys_pressed_old = pong_keys_pressed; + minigame_hud_fitsqare(pos, mySize); minigame_hud_simpleboard(pos,mySize,minigame_texture("pong/board")); @@ -542,7 +558,7 @@ void pong_hud_board(vector pos, vector mySize) // Required function, draw the game status panel void pong_hud_status(vector pos, vector mySize) { - HUD_Panel_DrawBg(1); + HUD_Panel_DrawBg(); vector ts; 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); @@ -601,13 +617,15 @@ int pong_client_event(entity minigame, string event, ...) case K_KP_UPARROW: case K_LEFTARROW: case K_KP_LEFTARROW: - minigame_cmd("+moved"); + //minigame_cmd("+moved"); + pong_keys_pressed |= PONG_KEY_DECREASE; return true; case K_DOWNARROW: case K_KP_DOWNARROW: case K_RIGHTARROW: case K_KP_RIGHTARROW: - minigame_cmd("+movei"); + //minigame_cmd("+movei"); + pong_keys_pressed |= PONG_KEY_INCREASE; return true; } return false; @@ -618,13 +636,15 @@ int pong_client_event(entity minigame, string event, ...) case K_KP_UPARROW: case K_LEFTARROW: case K_KP_LEFTARROW: - minigame_cmd("-moved"); + //minigame_cmd("-moved"); + pong_keys_pressed &= ~PONG_KEY_DECREASE; return true; case K_DOWNARROW: case K_KP_DOWNARROW: case K_RIGHTARROW: case K_KP_RIGHTARROW: - minigame_cmd("-movei"); + //minigame_cmd("-movei"); + pong_keys_pressed &= ~PONG_KEY_INCREASE; return true; } return false;