~z-man/armagetronad/0.2.9-armagetronad-sty+ct+ap-windows-ci-fix

« back to all changes in this revision

Viewing changes to src/tron/gZone.cpp

  • Committer: Armanelgtron
  • Date: 2020-07-10 08:22:38 UTC
  • Revision ID: armanelgtron@gmail.com-20200710082238-ss985s9ppqeog1sm
Make rubber zones time-based instead of depending on the current FPS. Add RUBBERZONE_RATE to control them.

Show diffs side-by-side

added added

removed removed

Lines of Context:
2560
2560
 
2561
2561
gRubberZoneHack::~gRubberZoneHack( void )
2562
2562
{
 
2563
    SetReferenceTime();
2563
2564
}
2564
2565
 
2565
2566
 
2566
2567
static int score_rubberzone=-1;
2567
2568
static tSettingItem<int> s_rz("SCORE_RUBBERZONE",score_rubberzone);
2568
2569
 
 
2570
static REAL sg_rubberZoneRate=40;
 
2571
static tSettingItem<REAL> sg_rubberZoneRateConf("RUBBERZONE_RATE",sg_rubberZoneRate);
 
2572
 
2569
2573
void gRubberZoneHack::OnVanish( void )
2570
2574
{
2571
2575
    grid->RemoveGameObjectInteresting(this);
2612
2616
    return (pPlayerCycle);
2613
2617
}
2614
2618
 
 
2619
bool gRubberZoneHack::Timestep(REAL time)
 
2620
{
 
2621
    bool ret = gZone::Timestep(time);
 
2622
    SetReferenceTime();
 
2623
    return ret;
 
2624
}
 
2625
 
2615
2626
// *******************************************************************************
2616
2627
// *
2617
2628
// *    sg_RubberZoneHurt
2624
2635
// *******************************************************************************
2625
2636
static eLadderLogWriter sg_deathRubberZoneWriter("DEATH_RUBBERZONE", true);
2626
2637
 
2627
 
void sg_RubberZoneHurt( gCycle * target, gRubberZoneHack *rubberZone)
 
2638
void sg_RubberZoneHurt( gCycle * target, gRubberZoneHack *rubberZone,REAL timestep=1)
2628
2639
{
2629
2640
    REAL rubber = target->GetRubber();
2630
2641
    if (rubberZone->GetRubberType() == gRubberZoneHack::TYPE_RUBBER)
2631
2642
    {
2632
 
        if ( rubber + rubberZone->GetRubber() >= sg_rubberCycle )       // max rubber amount reached, kill the cycle
 
2643
        REAL newRubber = rubberZone->GetRubber();
 
2644
        if(sg_rubberZoneRate >= 0)
 
2645
            newRubber *= timestep*sg_rubberZoneRate;
 
2646
 
 
2647
        if ( rubber + newRubber >= sg_rubberCycle )       // max rubber amount reached, kill the cycle
2633
2648
        {
2634
2649
            target->Player()->AddScore( score_rubberzone, tOutput(), "$player_lose_rubberzone" );
2635
2650
            target->Kill();
2639
2654
        }
2640
2655
        else if ( rubber + rubberZone->GetRubber() > 0 )            // sg_deathZoneRubberMalus might be negative, avoid setting a negative rubber!
2641
2656
        {
2642
 
            target->SetRubber( rubber + rubberZone->GetRubber() );
 
2657
            target->SetRubber( rubber + newRubber );
2643
2658
        }
2644
2659
        else                                                        // too low value, just set to zero
2645
2660
            target->SetRubber( 0 );
2667
2682
 
2668
2683
void gRubberZoneHack::OnEnter( gCycle * target, REAL time )
2669
2684
{
2670
 
    sg_RubberZoneHurt( target, this );
 
2685
    REAL timestep = time-referenceTime_;
 
2686
    sg_RubberZoneHurt(target,this,timestep);
2671
2687
}
2672
2688
 
2673
2689
// *******************************************************************************
7105
7121
    else
7106
7122
    {
7107
7123
        float sizeMultiplier = gArena::SizeMultiplier();
7108
 
        float radius, growth;
7109
7124
        tString name;
7110
7125
        std::vector<eCoord> route;
7111
7126
        int pos = 0;