Skip to content

Commit c71d735

Browse files
Implement multi-actuator dash model. Not tested yet.
1 parent 3876964 commit c71d735

File tree

5 files changed

+79
-9
lines changed

5 files changed

+79
-9
lines changed

src/leg.cpp

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -106,15 +106,17 @@ Leg::dash( const double power,
106106
* ( 1.0 - std::fabs( dir ) / 90.0 ) ),
107107
0.0,
108108
1.0 );
109-
const double accel_magnitude = std::fabs( M_player.effort()
110-
* actual_power
111-
* dir_rate
112-
* M_player.playerType()->dashPowerRate() )
113-
/ ( M_player.pos().y < 0.0
114-
? ( M_player.side() == LEFT
115-
? param.slownessOnTopForLeft()
116-
: param.slownessOnTopForRight() )
117-
: 1.0 );
109+
double accel_magnitude = std::fabs( M_player.effort()
110+
* actual_power
111+
* dir_rate
112+
* M_player.playerType()->dashPowerRate() );
113+
114+
if ( M_player.pos().y < 0.0 )
115+
{
116+
accel_magnitude /= ( M_player.side() == LEFT
117+
? param.slownessOnTopForLeft()
118+
: param.slownessOnTopForRight() );
119+
}
118120

119121
const double accel_dir = ( back_dash
120122
? normalized_dir + 180.0

src/pcombuilder.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ class Builder {
7878

7979
virtual void dash( double power ) = 0;
8080
virtual void dash( double power, double dir ) = 0;
81+
virtual void dashLeftLeg( double power, double dir ) = 0;
82+
virtual void dashRightLeg( double power, double dir ) = 0;
8183
virtual void turn( double moment ) = 0;
8284
virtual void turn_neck( double moment ) = 0;
8385
virtual void change_focus( double moment_dist, double moment_dir ) = 0;

src/player.cpp

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,8 @@ Player::Player( Stadium & stadium,
226226
M_change_focus_count(0 ),
227227
M_change_view_count( 0 ),
228228
M_say_count( 0 ),
229+
M_left_leg( *this ),
230+
M_right_leg( *this ),
229231
M_arm( ServerParam::instance().pointToBan(),
230232
ServerParam::instance().pointToDuration() ),
231233
M_attentionto_count( 0 ),
@@ -1154,6 +1156,56 @@ Player::dash( double power,
11541156
}
11551157

11561158

1159+
void
1160+
Player::dashLeftLeg( double power,
1161+
double dir )
1162+
{
1163+
if ( M_left_leg.commandDone() )
1164+
{
1165+
return;
1166+
}
1167+
1168+
M_left_leg.dash( power, dir );
1169+
M_stamina = std::max( 0.0, stamina() - M_left_leg.consumedStamina() );
1170+
1171+
M_dash_cycles = 1;
1172+
M_command_done = true;
1173+
}
1174+
1175+
void
1176+
Player::dashRightLeg( double power,
1177+
double dir )
1178+
{
1179+
if ( M_right_leg.commandDone() )
1180+
{
1181+
return;
1182+
}
1183+
1184+
M_right_leg.dash( power, dir );
1185+
M_stamina = std::max( 0.0, stamina() - M_right_leg.consumedStamina() );
1186+
1187+
M_dash_cycles = 1;
1188+
M_command_done = true;
1189+
}
1190+
1191+
void
1192+
Player::applyLegsEffect()
1193+
{
1194+
const PVector body_unit = PVector::fromPolar( 1.0, angleBodyCommitted() );
1195+
const PVector vel_l = vel() + M_left_leg.accel();
1196+
const PVector vel_r = vel() + M_right_leg.accel();
1197+
const double vel_l_body = body_unit.x * vel_l.x + body_unit.y * vel_l.y;
1198+
const double vel_r_body = body_unit.x * vel_r.x + body_unit.y * vel_r.y;
1199+
1200+
const double omega = ( vel_r_body - vel_l_body ) / ( M_player_type->playerSize() * 2.0 );
1201+
const PVector new_vel = ( vel_r + vel_l ) /= 2.0;
1202+
1203+
push( new_vel - vel() );
1204+
M_angle_body = normalize_angle( angleBodyCommitted()
1205+
+ ( 1.0 + drand( -M_randp, M_randp ) ) * omega );
1206+
}
1207+
1208+
11571209
void
11581210
Player::turn( double moment )
11591211
{
@@ -2663,6 +2715,9 @@ Player::resetCommandFlags()
26632715
M_turn_neck_done = false;
26642716

26652717
M_done_received = false;
2718+
2719+
M_left_leg.resetCommand();
2720+
M_right_leg.resetCommand();
26662721
}
26672722

26682723
void

src/player.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#define RCSSSERVER_PLAYER_H
2424

2525
#include "arm.h"
26+
#include "leg.h"
2627
#include "audio.h"
2728
#include "object.h"
2829
#include "pcombuilder.h"
@@ -178,6 +179,8 @@ class Player
178179
int M_change_view_count;
179180
int M_say_count;
180181

182+
Leg M_left_leg;
183+
Leg M_right_leg;
181184
Arm M_arm;
182185

183186
int M_attentionto_count;
@@ -371,6 +374,11 @@ class Player
371374
const double & effort() const { return M_effort; }
372375
const double & staminaCapacity() const { return M_stamina_capacity; }
373376

377+
//
378+
// leg
379+
//
380+
void applyLegsEffect();
381+
374382
//
375383
// arm
376384
//
@@ -473,6 +481,8 @@ class Player
473481
/** PlayerCommands */
474482
void dash( double power ) override;
475483
void dash( double power, double dir ) override;
484+
void dashLeftLeg( double power, double dir ) override;
485+
void dashRightLeg( double power, double dir ) override;
476486
void turn( double moment ) override;
477487
void turn_neck( double moment ) override;
478488
void change_focus( double moment_dist, double moment_dir) override;

src/stadium.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -794,6 +794,7 @@ Stadium::step()
794794
//
795795
for ( PlayerCont::reference p : M_players )
796796
{
797+
p->applyLegsEffect();
797798
p->resetCommandFlags();
798799
p->incArmAge();
799800
}

0 commit comments

Comments
 (0)