From: Mattia Basaglia Date: Fri, 13 Feb 2015 21:53:53 +0000 (+0100) Subject: Multi-ball pong X-Git-Tag: xonotic-v0.8.2~2038^2~12 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=2993044659f4dd9ce87602e3db246f6d7a2aa75c;p=xonotic%2Fxonotic-data.pk3dir.git Multi-ball pong --- diff --git a/gfx/hud/default/minigames/pong/ball.png b/gfx/hud/default/minigames/pong/ball.png new file mode 100644 index 000000000..23dc3c62b Binary files /dev/null and b/gfx/hud/default/minigames/pong/ball.png differ diff --git a/gfx/hud/default/minigames/pong/ball.tga b/gfx/hud/default/minigames/pong/ball.tga deleted file mode 100644 index c160e106d..000000000 Binary files a/gfx/hud/default/minigames/pong/ball.tga and /dev/null differ diff --git a/minigames.cfg b/minigames.cfg index 639ced6b1..04c370cfc 100644 --- a/minigames.cfg +++ b/minigames.cfg @@ -8,6 +8,7 @@ set sv_minigames_pong_paddle_speed 1 "Paddle speed (board size per second set sv_minigames_pong_ball_wait 1 "Number of seconds between reset and throw" set sv_minigames_pong_ball_speed 1.5 "Ball speed (board size per second)" set sv_minigames_pong_ball_radius 0.03125 "Ball radius relative to the board size" +set sv_minigames_pong_ball_number 1 "Number of balls to be played at once" set sv_minigames_pong_ai_thinkspeed 0.1 "Seconds between AI actions" set sv_minigames_pong_ai_tolerance 0.33 "Distance of the ball relative to the paddle size" \ No newline at end of file diff --git a/qcsrc/common/minigames/minigame/pong.qc b/qcsrc/common/minigames/minigame/pong.qc index 39f643231..7e785d17c 100644 --- a/qcsrc/common/minigames/minigame/pong.qc +++ b/qcsrc/common/minigames/minigame/pong.qc @@ -29,6 +29,7 @@ float autocvar_sv_minigames_pong_paddle_speed; float autocvar_sv_minigames_pong_ball_wait; float autocvar_sv_minigames_pong_ball_speed; float autocvar_sv_minigames_pong_ball_radius; +float autocvar_sv_minigames_pong_ball_number; float autocvar_sv_minigames_pong_ai_thinkspeed; float autocvar_sv_minigames_pong_ai_tolerance; @@ -203,40 +204,49 @@ void pong_ai_think() float think_speed = autocvar_sv_minigames_pong_ai_thinkspeed; self.nextthink = time + think_speed; - float distance = self.pong_length/2 * autocvar_sv_minigames_pong_ai_tolerance; - distance += autocvar_sv_minigames_pong_paddle_speed * think_speed; - float target; - float self_pos; - + float distance; + float next_distance; + float min_distance = 1; entity ball = world; - self.pong_keys = 0; - while ( ( ball = findentity(ball,owner,self.owner) ) ) - if ( ball.classname == "pong_ball" ) - { - if ( self.team <= 2 ) - { - target = ball.origin_y + ball.velocity_y*think_speed; - if ( ( self.team == 1 && ball.origin_x < 0.5 && ball.velocity_x < 0 ) || - ( self.team == 2 && ball.origin_x > 0.5 && ball.velocity_x > 0 ) ) - target = 0.5; - self_pos = self.pong_ai_paddle.origin_y; - } - else + entity mayball = world; + while ( ( mayball = findentity(mayball,owner,self.owner) ) ) + if ( mayball.classname == "pong_ball" ) + { + distance = vlen(mayball.origin-self.pong_ai_paddle.origin); + next_distance = vlen(mayball.origin+mayball.velocity-self.pong_ai_paddle.origin); + if ( distance < min_distance && ( distance < 0.5 || next_distance < distance ) ) { - target = ball.origin_x + ball.velocity_x*think_speed; - if ( ( self.team == 4 && ball.origin_y < 0.5 && ball.velocity_y < 0 ) || - ( self.team == 3 && ball.origin_y > 0.5 && ball.velocity_y > 0 ) ) - target = 0.5; - self_pos = self.pong_ai_paddle.origin_x; + min_distance = distance; + ball = mayball; } - - if (target < self_pos - distance) - self.pong_keys = PONG_KEY_DECREASE; - else if (target > self_pos + distance) - self.pong_keys = PONG_KEY_INCREASE; - - break; // TODO support multiple balls? } + + float target = 0.5; + float self_pos; + + + if ( self.team <= 2 ) + { + if ( ball ) + target = ball.origin_y + ball.velocity_y*think_speed; + self_pos = self.pong_ai_paddle.origin_y; + } + else + { + if ( ball ) + target = ball.origin_x + ball.velocity_x*think_speed; + self_pos = self.pong_ai_paddle.origin_x; + } + + distance = self.pong_length/2 * autocvar_sv_minigames_pong_ai_tolerance + + autocvar_sv_minigames_pong_paddle_speed * think_speed; + + if (target < self_pos - distance) + self.pong_keys = PONG_KEY_DECREASE; + else if (target > self_pos + distance) + self.pong_keys = PONG_KEY_INCREASE; + else + self.pong_keys = 0; } entity pong_ai_spawn(entity paddle) @@ -378,9 +388,14 @@ int pong_server_event(entity minigame, string event, ...) (minigame.minigame_flags & ~PONG_STATUS_WAIT); minigame.SendFlags |= MINIG_SF_UPDATE; - entity ball = msle_spawn(minigame,"pong_ball"); - ball.pong_length = autocvar_sv_minigames_pong_ball_radius; - pong_ball_reset(ball); + int i; + entity ball; + for ( i = 0; i < autocvar_sv_minigames_pong_ball_number; i++ ) + { + ball = msle_spawn(minigame,"pong_ball"); + ball.pong_length = autocvar_sv_minigames_pong_ball_radius; + pong_ball_reset(ball); + } } return true; case "+movei":