@@ -2188,6 +2188,8 @@ void ACrab::Update()
2188
2188
// //////////////////////////////////
2189
2189
// Movement direction
2190
2190
2191
+ bool isStill = (m_Vel + m_PrevVel).GetMagnitude () < 1 .0F ;
2192
+
2191
2193
if (m_Controller.IsState (MOVE_RIGHT) || m_Controller.IsState (MOVE_LEFT) || m_MoveState == JUMP && m_Status != INACTIVE) {
2192
2194
if (m_MoveState != JUMP)
2193
2195
{
@@ -2385,159 +2387,72 @@ void ACrab::Update()
2385
2387
float RFGLegProg = m_Paths[RIGHTSIDE][FGROUND][WALK].GetRegularProgress ();
2386
2388
float RBGLegProg = m_Paths[RIGHTSIDE][BGROUND][WALK].GetRegularProgress ();
2387
2389
2388
- bool playStride = false ;
2390
+ bool restarted = false ;
2389
2391
2390
- // Make sure we are starting a stride if we're basically stopped
2391
- if (fabs (m_Vel.GetLargest ()) < 0.25 )
2392
- m_StrideStart[LEFTSIDE] = true ;
2392
+ // Make sure we are starting a stride if we're basically stopped.
2393
+ if (isStill) { m_StrideStart[LEFTSIDE] = true ; }
2393
2394
2394
2395
// ////////////////
2395
2396
// LEFT LEGS
2396
2397
2397
- if (m_pLFGLeg && (!m_pLBGLeg || (!(m_Paths[LEFTSIDE][FGROUND][WALK].PathEnded () && LBGLegProg < 0.5 ) || m_StrideStart[LEFTSIDE])))
2398
- {
2399
- // m_StrideStart[LEFTSIDE] = false;
2400
- m_StrideTimer[LEFTSIDE].Reset ();
2401
- m_pLFGFootGroup->PushAsLimb (m_Pos +
2402
- RotateOffset (m_pLFGLeg->GetParentOffset ()),
2403
- m_Vel,
2404
- m_Rotation,
2405
- m_Paths[LEFTSIDE][FGROUND][WALK],
2406
- // mass,
2407
- deltaTime,
2408
- &playStride);
2409
- }
2398
+ if (m_pLFGLeg && (!m_pLBGLeg || (!(m_Paths[LEFTSIDE][FGROUND][WALK].PathEnded () && LBGLegProg < 0 .5F ) || m_StrideStart[LEFTSIDE]))) {
2399
+ m_StrideTimer[LEFTSIDE].Reset ();
2400
+ m_pLFGFootGroup->PushAsLimb (m_pLFGLeg->GetJointPos (), m_Vel, m_Rotation, m_Paths[LEFTSIDE][FGROUND][WALK], deltaTime, &restarted);
2401
+ }
2410
2402
2411
- if (m_pLBGLeg && (!m_pLFGLeg || !(m_Paths[LEFTSIDE][BGROUND][WALK].PathEnded () && LFGLegProg < 0.5 )))
2412
- {
2413
- m_StrideStart[LEFTSIDE] = false ;
2414
- m_StrideTimer[LEFTSIDE].Reset ();
2415
- m_pLBGFootGroup->PushAsLimb (m_Pos +
2416
- RotateOffset (m_pLBGLeg->GetParentOffset ()),
2417
- m_Vel,
2418
- m_Rotation,
2419
- m_Paths[LEFTSIDE][BGROUND][WALK],
2420
- // mass,
2421
- deltaTime);
2422
- }
2403
+ if (m_pLBGLeg) {
2404
+ if (!m_pLFGLeg || !(m_Paths[LEFTSIDE][BGROUND][WALK].PathEnded () && LFGLegProg < 0 .5F )) {
2405
+ m_StrideStart[LEFTSIDE] = false ;
2406
+ m_StrideTimer[LEFTSIDE].Reset ();
2407
+ m_pLBGFootGroup->PushAsLimb (m_pLBGLeg->GetJointPos (), m_Vel, m_Rotation, m_Paths[LEFTSIDE][BGROUND][WALK], deltaTime);
2408
+ } else {
2409
+ m_pLBGFootGroup->FlailAsLimb (m_Pos, RotateOffset (m_pLBGLeg->GetParentOffset ()), m_pLBGLeg->GetMaxLength (), m_PrevVel, m_AngularVel, m_pLBGLeg->GetMass (), deltaTime);
2410
+ }
2411
+ }
2423
2412
2424
- // Restart the left stride if the current one seems to be taking too long
2425
- if (m_StrideTimer[LEFTSIDE].IsPastSimMS (m_Paths[LEFTSIDE][FGROUND][WALK].GetTotalPathTime ()))
2426
- m_StrideStart[LEFTSIDE] = true ;
2413
+ // Reset the left-side walking stride if it's taking longer than it should.
2414
+ if (m_StrideTimer[LEFTSIDE].IsPastSimMS (static_cast <double >(m_Paths[LEFTSIDE][FGROUND][WALK].GetTotalPathTime () * 1 .1F ))) { m_StrideStart[LEFTSIDE] = true ; }
2427
2415
2428
2416
// /////////////////
2429
2417
// RIGHT LEGS
2430
2418
2431
- if (m_pRFGLeg && (!m_pRBGLeg || !(m_Paths[RIGHTSIDE][FGROUND][WALK].PathEnded () && RBGLegProg < 0.5 )))
2432
- {
2433
- m_StrideStart[RIGHTSIDE] = false ;
2434
- m_StrideTimer[RIGHTSIDE].Reset ();
2435
- m_pRFGFootGroup->PushAsLimb (m_Pos +
2436
- RotateOffset (m_pRFGLeg->GetParentOffset ()),
2437
- m_Vel,
2438
- m_Rotation,
2439
- m_Paths[RIGHTSIDE][FGROUND][WALK],
2440
- // mass,
2441
- deltaTime,
2442
- &playStride);
2443
- }
2419
+ if (m_pRFGLeg) {
2420
+ if (!m_pRBGLeg || !(m_Paths[RIGHTSIDE][FGROUND][WALK].PathEnded () && RBGLegProg < 0 .5F )) {
2421
+ m_StrideStart[RIGHTSIDE] = false ;
2422
+ m_StrideTimer[RIGHTSIDE].Reset ();
2423
+ m_pRFGFootGroup->PushAsLimb (m_pRFGLeg->GetJointPos (), m_Vel, m_Rotation, m_Paths[RIGHTSIDE][FGROUND][WALK], deltaTime, &restarted);
2424
+ } else {
2425
+ m_pRFGFootGroup->FlailAsLimb (m_Pos, RotateOffset (m_pRFGLeg->GetParentOffset ()), m_pRFGLeg->GetMaxLength (), m_PrevVel, m_AngularVel, m_pRFGLeg->GetMass (), deltaTime);
2426
+ }
2427
+ }
2444
2428
2445
- if (m_pRBGLeg && (!m_pRFGLeg || (!(m_Paths[RIGHTSIDE][BGROUND][WALK].PathEnded () && RFGLegProg < 0.5 ) || m_StrideStart[RIGHTSIDE])))
2446
- {
2447
- // m_StrideStart[RIGHTSIDE] = false;
2448
- m_StrideTimer[RIGHTSIDE].Reset ();
2449
- m_pRBGFootGroup->PushAsLimb (m_Pos +
2450
- RotateOffset (m_pRBGLeg->GetParentOffset ()),
2451
- m_Vel,
2452
- m_Rotation,
2453
- m_Paths[RIGHTSIDE][BGROUND][WALK],
2454
- // mass,
2455
- deltaTime);
2456
- }
2429
+ if (m_pRBGLeg && (!m_pRFGLeg || (!(m_Paths[RIGHTSIDE][BGROUND][WALK].PathEnded () && RFGLegProg < 0 .5F ) || m_StrideStart[RIGHTSIDE]))) {
2430
+ m_StrideTimer[RIGHTSIDE].Reset ();
2431
+ m_pRBGFootGroup->PushAsLimb (m_pRBGLeg->GetJointPos (), m_Vel, m_Rotation, m_Paths[RIGHTSIDE][BGROUND][WALK], deltaTime);
2432
+ }
2457
2433
2458
- // Restart the right stride if the current one seems to be taking too long
2459
- if (m_StrideTimer[RIGHTSIDE].IsPastSimMS (m_Paths[RIGHTSIDE][FGROUND][WALK].GetTotalPathTime ()))
2460
- m_StrideStart[RIGHTSIDE] = true ;
2434
+ // Reset the right-side walking stride if it's taking longer than it should.
2435
+ if (m_StrideTimer[RIGHTSIDE].IsPastSimMS (static_cast <double >(m_Paths[RIGHTSIDE][FGROUND][WALK].GetTotalPathTime () * 1 .1F ))) { m_StrideStart[RIGHTSIDE] = true ; }
2461
2436
2462
- // Play the stride sound, if applicable
2463
- if (playStride)
2464
- if (m_StrideSound) { m_StrideSound->Play (m_Pos); }
2465
- }
2466
- // JUMPING
2467
- else if ((m_pRFGLeg || m_pRBGLeg) && m_MoveState == JUMP)
2468
- {
2469
- /*
2470
- if (m_pRFGLeg && (!m_Paths[FGROUND][m_MoveState].PathEnded() || m_JetTimeLeft == m_JetTimeTotal))
2471
- {
2472
- m_pRFGFootGroup->PushAsLimb(m_Pos + RotateOffset(m_pRFGLeg->GetParentOffset()),
2473
- m_Vel,
2474
- m_Rotation,
2475
- m_Paths[FGROUND][m_MoveState],
2476
- // mass / 2,
2477
- deltaTime);
2478
- }
2479
- if (m_pRBGLeg && (!m_Paths[BGROUND][m_MoveState].PathEnded() || m_JetTimeLeft == m_JetTimeTotal))
2480
- {
2481
- m_pRBGFootGroup->PushAsLimb(m_Pos + RotateOffset(m_pRBGLeg->GetParentOffset()),
2482
- m_Vel,
2483
- m_Rotation,
2484
- m_Paths[BGROUND][m_MoveState],
2485
- // mass / 2,
2486
- deltaTime);
2487
- }
2437
+ if (restarted && m_StrideSound) { m_StrideSound->Play (m_Pos); }
2438
+ } else if (m_pLFGLeg || m_pLBGLeg || m_pRFGLeg || m_pRBGLeg) {
2439
+ if (m_MoveState == JUMP) {
2440
+ // TODO: Utilize jump paths in an intuitive way?
2441
+ } else {
2442
+ for (int side = 0 ; side < SIDECOUNT; ++side) {
2443
+ for (int layer = 0 ; layer < LAYERCOUNT; ++layer) {
2444
+ m_Paths[side][layer][WALK].Terminate ();
2445
+ }
2446
+ }
2447
+ if (m_pLFGLeg) { m_pLFGFootGroup->PushAsLimb (m_pLFGLeg->GetJointPos (), m_Vel, m_Rotation, m_Paths[LEFTSIDE][FGROUND][STAND], deltaTime); }
2488
2448
2489
- if (m_JetTimeLeft <= 0)
2490
- {
2491
- m_MoveState = STAND;
2492
- m_Paths[FGROUND][JUMP].Terminate();
2493
- m_Paths[BGROUND][JUMP].Terminate();
2494
- m_Paths[FGROUND][STAND].Terminate();
2495
- m_Paths[BGROUND][STAND].Terminate();
2496
- m_Paths[FGROUND][WALK].Terminate();
2497
- m_Paths[BGROUND][WALK].Terminate();
2498
- }
2499
- */
2500
- }
2501
- // STANDING
2502
- else if (m_pLFGLeg || m_pLBGLeg || m_pRFGLeg || m_pRBGLeg)
2503
- {
2504
- for (int side = 0 ; side < SIDECOUNT; ++side)
2505
- for (int layer = 0 ; layer < LAYERCOUNT; ++layer)
2506
- m_Paths[side][layer][WALK].Terminate ();
2449
+ if (m_pLBGLeg) { m_pLBGFootGroup->PushAsLimb (m_pLBGLeg->GetJointPos (), m_Vel, m_Rotation, m_Paths[LEFTSIDE][BGROUND][STAND], deltaTime); }
2507
2450
2508
- if (m_pLFGLeg)
2509
- m_pLFGFootGroup->PushAsLimb (m_Pos.GetFloored () + RotateOffset (m_pLFGLeg->GetParentOffset ()),
2510
- m_Vel,
2511
- m_Rotation,
2512
- m_Paths[LEFTSIDE][FGROUND][STAND],
2513
- // mass / 2,
2514
- deltaTime);
2515
-
2516
- if (m_pLBGLeg)
2517
- m_pLBGFootGroup->PushAsLimb (m_Pos.GetFloored () + RotateOffset (m_pLBGLeg->GetParentOffset ()),
2518
- m_Vel,
2519
- m_Rotation,
2520
- m_Paths[LEFTSIDE][BGROUND][STAND],
2521
- // mass / 2,
2522
- deltaTime);
2523
-
2524
- if (m_pRFGLeg)
2525
- m_pRFGFootGroup->PushAsLimb (m_Pos.GetFloored () + RotateOffset (m_pRFGLeg->GetParentOffset ()),
2526
- m_Vel,
2527
- m_Rotation,
2528
- m_Paths[RIGHTSIDE][FGROUND][STAND],
2529
- // mass / 2,
2530
- deltaTime);
2531
-
2532
- if (m_pRBGLeg)
2533
- m_pRBGFootGroup->PushAsLimb (m_Pos.GetFloored () + RotateOffset (m_pRBGLeg->GetParentOffset ()),
2534
- m_Vel,
2535
- m_Rotation,
2536
- m_Paths[RIGHTSIDE][BGROUND][STAND],
2537
- // mass / 2,
2538
- deltaTime);
2451
+ if (m_pRFGLeg) { m_pRFGFootGroup->PushAsLimb (m_pRFGLeg->GetJointPos (), m_Vel, m_Rotation, m_Paths[RIGHTSIDE][FGROUND][STAND], deltaTime); }
2539
2452
2540
- }
2453
+ if (m_pRBGLeg) { m_pRBGFootGroup->PushAsLimb (m_pRBGLeg->GetJointPos (), m_Vel, m_Rotation, m_Paths[RIGHTSIDE][BGROUND][STAND], deltaTime); }
2454
+ }
2455
+ }
2541
2456
} else {
2542
2457
// Not stable/standing, so make sure the end of limbs are moving around limply in a ragdoll fashion.
2543
2458
// TODO: Make the limb atom groups fly around and react to terrain, without getting stuck etc.
0 commit comments