SpaceCadetPinball/SpaceCadetPinball/nudge.cpp
Muzychenko Andrey 98f234fce3 Replaced GlobalAlloc with malloc.
WaveMix keeps GlobalAlloc for authenticity.
Fixed float to double casts.
Some cleanup.
2021-02-18 12:53:25 +03:00

100 lines
2.1 KiB
C++

#include "pch.h"
#include "nudge.h"
#include "objlist_class.h"
#include "pb.h"
#include "render.h"
#include "TBall.h"
#include "timer.h"
int nudge::nudged_left;
int nudge::nudged_right;
int nudge::nudged_up;
int nudge::timer;
float nudge::nudge_count;
void nudge::un_nudge_right(int timerId, void* caller)
{
if (nudged_right)
_nudge(-2.0, -1.0);
nudged_right = 0;
}
void nudge::un_nudge_left(int timerId, void* caller)
{
if (nudged_left)
_nudge(2.0, -1.0);
nudged_left = 0;
}
void nudge::un_nudge_up(int timerId, void* caller)
{
if (nudged_up)
_nudge(0.0, -1.0);
nudged_up = 0;
}
void nudge::nudge_right()
{
_nudge(2.0, 1.0);
if (timer)
timer::kill(timer);
timer = timer::set(0.4f, nullptr, un_nudge_right);
nudged_right = 1;
}
void nudge::nudge_left()
{
_nudge(-2.0, 1.0);
if (timer)
timer::kill(timer);
timer = timer::set(0.4f, nullptr, un_nudge_left);
nudged_left = 1;
}
void nudge::nudge_up()
{
_nudge(0.0, 1.0);
if (timer)
timer::kill(timer);
timer = timer::set(0.4f, nullptr, un_nudge_up);
nudged_up = 1;
}
void nudge::_nudge(float xDiff, float yDiff)
{
vector_type accelMod;
float invAccelX, invAccelY;
auto table = pb::MainTable;
auto ballList = pb::MainTable->BallList;
accelMod.X = xDiff * 0.5f;
accelMod.Y = yDiff * 0.5f;
for (auto index = 0; index < ballList->GetCount(); index++)
{
auto ball = ballList->Get(index);
if (ball->ActiveFlag && !ball->CollisionComp)
{
ball->Acceleration.X = ball->Acceleration.X * ball->Speed;
ball->Acceleration.Y = ball->Acceleration.Y * ball->Speed;
maths::vector_add(&ball->Acceleration, &accelMod);
ball->Speed = maths::normalize_2d(&ball->Acceleration);
if (ball->Acceleration.X == 0.0f)
invAccelX = 1000000000.0;
else
invAccelX = 1.0f / ball->Acceleration.X;
ball->InvAcceleration.X = invAccelX;
if (ball->Acceleration.Y == 0.0f)
invAccelY = 1000000000.0;
else
invAccelY = 1.0f / ball->Acceleration.Y;
ball->InvAcceleration.Y = invAccelY;
table = pb::MainTable;
}
}
render::shift(static_cast<int>(floor(xDiff + 0.5f)), static_cast<int>(floor(0.5f - yDiff)), 0, 0, table->Width,
table->Height);
}