TPlunger ready. TEdgeManager v1.
This commit is contained in:
@@ -36,32 +36,32 @@ TTableLayer::TTableLayer(TPinballTable* table): TCollisionComponent(table, -1, f
|
||||
auto tableAngleArr = loader::query_float_attribute(groupIndex, 0, 305);
|
||||
if (tableAngleArr)
|
||||
{
|
||||
PinballTable->TableAngleMult = tableAngleArr[0];
|
||||
PinballTable->TableAngle1 = tableAngleArr[1];
|
||||
PinballTable->TableAngle2 = tableAngleArr[2];
|
||||
PinballTable->GravityDirVectMult = tableAngleArr[0];
|
||||
PinballTable->GravityAngleX = tableAngleArr[1];
|
||||
PinballTable->GravityAnglY = tableAngleArr[2];
|
||||
}
|
||||
else
|
||||
{
|
||||
PinballTable->TableAngleMult = 25.0f;
|
||||
PinballTable->TableAngle1 = 0.5f;
|
||||
PinballTable->TableAngle2 = 1.570796f;
|
||||
PinballTable->GravityDirVectMult = 25.0f;
|
||||
PinballTable->GravityAngleX = 0.5f;
|
||||
PinballTable->GravityAnglY = 1.570796f;
|
||||
}
|
||||
|
||||
auto table3 = PinballTable;
|
||||
Angle1 = cos(table3->TableAngle2) * sin(table3->TableAngle1) * table3->TableAngleMult;
|
||||
Angle2 = sin(table3->TableAngle2) * sin(table3->TableAngle1) * table3->TableAngleMult;
|
||||
GraityDirX = cos(table3->GravityAnglY) * sin(table3->GravityAngleX) * table3->GravityDirVectMult;
|
||||
GraityDiY = sin(table3->GravityAnglY) * sin(table3->GravityAngleX) * table3->GravityDirVectMult;
|
||||
auto angleMultArr = loader::query_float_attribute(groupIndex, 0, 701);
|
||||
if (angleMultArr)
|
||||
AngleMult = *angleMultArr;
|
||||
GraityMult = *angleMultArr;
|
||||
else
|
||||
AngleMult = 0.2f;
|
||||
GraityMult = 0.2f;
|
||||
|
||||
table->XOffset = bmp->XPosition;
|
||||
table->YOffset = bmp->YPosition;
|
||||
table->Width = bmp->Width;
|
||||
table->Height = bmp->Height;
|
||||
UnknownC7F = visual.Kicker.Unknown1F;
|
||||
UnknownC6F = 15.0f;
|
||||
MaxCollisionSpeed = visual.Kicker.Unknown1F;
|
||||
CollisionMultiplier = 15.0f;
|
||||
|
||||
auto visArrPtr = visual.FloatArr;
|
||||
Unknown1F = min(visArrPtr[0], min(visArrPtr[2], visArrPtr[4]));
|
||||
@@ -90,11 +90,11 @@ TTableLayer::TTableLayer(TPinballTable* table): TCollisionComponent(table, -1, f
|
||||
visArrPtr += 2;
|
||||
}
|
||||
|
||||
Field.Unknown1 = -1;
|
||||
Field.Mask = -1;
|
||||
Field.Flag2Ptr = &UnknownBaseFlag2;
|
||||
Field.CollisionComp = this;
|
||||
TEdgeManager::edges_insert_square(Unknown2F, Unknown1F, Unknown4F, Unknown3F, nullptr,
|
||||
&Field);
|
||||
edges_insert_square(Unknown2F, Unknown1F, Unknown4F, Unknown3F, nullptr,
|
||||
&Field);
|
||||
}
|
||||
|
||||
TTableLayer::~TTableLayer()
|
||||
@@ -102,3 +102,51 @@ TTableLayer::~TTableLayer()
|
||||
if (edge_manager)
|
||||
delete edge_manager;
|
||||
}
|
||||
|
||||
int TTableLayer::FieldEffect(TBall* ball, vector_type* vecDst)
|
||||
{
|
||||
vecDst->X = GraityDirX - (0.5f - static_cast<float>(rand()) * 0.00003051850947599719f + ball->Acceleration.X) *
|
||||
ball->Speed * GraityMult;
|
||||
vecDst->Y = GraityDiY - ball->Acceleration.Y * ball->Speed * GraityMult;
|
||||
return 1;
|
||||
}
|
||||
|
||||
void TTableLayer::edges_insert_square(float y0, float x0, float y1, float x1, TEdgeSegment* edge,
|
||||
field_effect_type* field)
|
||||
{
|
||||
float widthM = edge_manager->AdvanceX * 0.001f;
|
||||
float heightM = edge_manager->AdvanceY * 0.001f;
|
||||
float xMin = x0 - widthM;
|
||||
float xMax = x1 + widthM;
|
||||
float yMin = y0 - heightM;
|
||||
float yMax = y1 + heightM;
|
||||
|
||||
int xMinBox = edge_manager->box_x(xMin);
|
||||
int yMinBox = edge_manager->box_y(yMin);
|
||||
int xMaxBox = edge_manager->box_x(xMax);
|
||||
int yMaxBox = edge_manager->box_y(yMax);
|
||||
|
||||
float boxX = static_cast<float>(xMinBox) * edge_manager->AdvanceX + edge_manager->X;
|
||||
float boxY = static_cast<float>(yMinBox) * edge_manager->AdvanceY + edge_manager->Y;
|
||||
|
||||
for (int indexX = xMinBox; indexX <= xMaxBox; ++indexX)
|
||||
{
|
||||
for (int indexY = yMinBox; indexY <= yMaxBox; ++indexY)
|
||||
{
|
||||
if (xMax >= boxX && xMin <= boxX + edge_manager->AdvanceX &&
|
||||
yMax >= boxY && yMin <= boxY + edge_manager->AdvanceY)
|
||||
{
|
||||
if (edge)
|
||||
{
|
||||
edge_manager->add_edge_to_box(indexX, indexY, edge);
|
||||
}
|
||||
if (field)
|
||||
{
|
||||
edge_manager->add_field_to_box(indexX, indexY, field);
|
||||
}
|
||||
}
|
||||
boxY += edge_manager->AdvanceY;
|
||||
}
|
||||
boxX += edge_manager->AdvanceX;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user