From 5252fb1b7e2c4e728027257e6345912a6d8fddba Mon Sep 17 00:00:00 2001 From: oz Date: Tue, 19 Jan 2021 18:28:48 +0300 Subject: [PATCH] TRamp, TPinballTable ready. --- Doc/FuncStats.xlsx | Bin 38873 -> 38856 bytes SpaceCadetPinball/TBall.h | 4 +- SpaceCadetPinball/TDemo.cpp | 4 +- SpaceCadetPinball/TEdgeSegment.cpp | 10 +- SpaceCadetPinball/TEdgeSegment.h | 4 +- SpaceCadetPinball/TLine.h | 3 +- SpaceCadetPinball/TPinballTable.cpp | 21 +-- SpaceCadetPinball/TRamp.cpp | 218 ++++++++++++++++++++++++++++ SpaceCadetPinball/TRamp.h | 29 +++- SpaceCadetPinball/maths.h | 9 +- 10 files changed, 263 insertions(+), 39 deletions(-) diff --git a/Doc/FuncStats.xlsx b/Doc/FuncStats.xlsx index c0872b337ac8549cf069725418f5c42e122f8e7b..a8fa03979e9099b85e5d0f1f0ac189d59fed61b0 100644 GIT binary patch delta 29118 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%0D+a6jqx&3P@5E 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 delta 29195 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 diff --git a/SpaceCadetPinball/TBall.h b/SpaceCadetPinball/TBall.h index 1ab6707..74f117b 100644 --- a/SpaceCadetPinball/TBall.h +++ b/SpaceCadetPinball/TBall.h @@ -24,9 +24,7 @@ public : float TimeDelta; float TimeNow; vector_type InvAcceleration; - int Unknown13; - int Unknown14; - int Unknown15; + vector_type RampFieldForce; TCollisionComponent* CollisionComp; int FieldFlag; TEdgeSegment* Collisions[5]; diff --git a/SpaceCadetPinball/TDemo.cpp b/SpaceCadetPinball/TDemo.cpp index 7284cb1..baf401b 100644 --- a/SpaceCadetPinball/TDemo.cpp +++ b/SpaceCadetPinball/TDemo.cpp @@ -100,7 +100,7 @@ void TDemo::Collision(TBall* ball, vector_type* nextPosition, vector_type* direc ball->Position.Y = nextPosition->Y; ball->RayMaxDistance -= coef; - switch (edge->WallValue) + switch (reinterpret_cast(edge->WallValue)) { case 1400: if (!FlipLeftTimer && !FlipLeftFlag) @@ -134,7 +134,7 @@ void TDemo::Collision(TBall* ball, vector_type* nextPosition, vector_type* direc break; default: break; - } + } } void TDemo::PlungerRelease(int timerId, void* caller) diff --git a/SpaceCadetPinball/TEdgeSegment.cpp b/SpaceCadetPinball/TEdgeSegment.cpp index da1cfbf..5cff1d9 100644 --- a/SpaceCadetPinball/TEdgeSegment.cpp +++ b/SpaceCadetPinball/TEdgeSegment.cpp @@ -20,7 +20,7 @@ void TEdgeSegment::port_draw() TEdgeSegment* TEdgeSegment::install_wall(float* floatArr, TCollisionComponent* collComp, char* flagPtr, unsigned int visual_flag, - float offset, int someValue) + float offset, int wallValue) { vector_type center{}, start{}, end{}, prevCenter{}, vec1{}, vec2{}, dstVec{}; TEdgeSegment* edge = nullptr; @@ -38,7 +38,7 @@ TEdgeSegment* TEdgeSegment::install_wall(float* floatArr, TCollisionComponent* c if (circle) { - circle->WallValue = someValue; + circle->WallValue = reinterpret_cast(wallValue); circle->place_in_grid(); } @@ -56,7 +56,7 @@ TEdgeSegment* TEdgeSegment::install_wall(float* floatArr, TCollisionComponent* c if (line) { - line->WallValue = someValue; + line->WallValue = reinterpret_cast(wallValue); line->Offset(offset); line->place_in_grid(); collComp->EdgeList->Add(line); @@ -103,7 +103,7 @@ TEdgeSegment* TEdgeSegment::install_wall(float* floatArr, TCollisionComponent* c if (circle) { - circle->WallValue = someValue; + circle->WallValue = reinterpret_cast(wallValue); circle->place_in_grid(); collComp->EdgeList->Add(circle); } @@ -119,7 +119,7 @@ TEdgeSegment* TEdgeSegment::install_wall(float* floatArr, TCollisionComponent* c if (line) { - line->WallValue = someValue; + line->WallValue = reinterpret_cast(wallValue); line->Offset(offset); line->place_in_grid(); collComp->EdgeList->Add(line); diff --git a/SpaceCadetPinball/TEdgeSegment.h b/SpaceCadetPinball/TEdgeSegment.h index 4cec022..f07ef35 100644 --- a/SpaceCadetPinball/TEdgeSegment.h +++ b/SpaceCadetPinball/TEdgeSegment.h @@ -16,7 +16,7 @@ public: TCollisionComponent* CollisionComponent; char* PinbCompFlag2Ptr; char ProcessedFlag; - int WallValue; + void* WallValue; int VisualFlag; TEdgeSegment(TCollisionComponent* collComp, char* someFlag, unsigned int visualFlag); @@ -28,5 +28,5 @@ public: virtual float FindCollisionDistance(ray_type* ray) = 0; static TEdgeSegment* install_wall(float* floatArr, TCollisionComponent* collComp, char* flagPtr, - unsigned int visual_flag, float offset, int someValue); + unsigned int visual_flag, float offset, int wallValue); }; diff --git a/SpaceCadetPinball/TLine.h b/SpaceCadetPinball/TLine.h index d4fd798..a823cba 100644 --- a/SpaceCadetPinball/TLine.h +++ b/SpaceCadetPinball/TLine.h @@ -9,8 +9,7 @@ public: line_type Line; float X0, Y0, X1, Y1; TLine(TCollisionComponent* collCmp, char* flagPtr, unsigned int visualFlag, float x0, float y0, float x1, float y1); - TLine(TCollisionComponent* collCmp, char* flagPtr, unsigned int visualFlag, struct vector_type* start, - struct vector_type* end); + TLine(TCollisionComponent* collCmp, char* flagPtr, unsigned int visualFlag, vector_type* start, vector_type* end); void Offset(float offset); float FindCollisionDistance(ray_type* ray) override; void EdgeCollision(TBall* ball, float coef) override; diff --git a/SpaceCadetPinball/TPinballTable.cpp b/SpaceCadetPinball/TPinballTable.cpp index 700bed1..c197f5c 100644 --- a/SpaceCadetPinball/TPinballTable.cpp +++ b/SpaceCadetPinball/TPinballTable.cpp @@ -635,25 +635,14 @@ void TPinballTable::replay_timer_callback(int timerId, void* caller) void TPinballTable::tilt_timeout(int timerId, void* caller) { auto table = static_cast(caller); + vector_type vec{}; + table->TiltTimeoutTimer = 0; if (table->TiltLockFlag) { - /*v2 = table->ListP2.ListPtr; - v3 = v2->Array; - if (v2->Count > 0) + for (int i = 0; i < table->BallList->Count(); i++) { - v4 = v2->Count; - do - { - (*(void(__stdcall**)(void*, char*, char*, _DWORD, _DWORD))(*(_DWORD*)table->Drain + 20))( - *v3, - &v5, - &v5, - 0.0, - 0); - ++v3; - --v4; - } while (v4); - }*/ + table->Drain->Collision(static_cast(table->BallList->Get(i)), &vec, &vec, 0.0, nullptr); + } } } diff --git a/SpaceCadetPinball/TRamp.cpp b/SpaceCadetPinball/TRamp.cpp index 6357994..b24a2d4 100644 --- a/SpaceCadetPinball/TRamp.cpp +++ b/SpaceCadetPinball/TRamp.cpp @@ -2,6 +2,224 @@ #include "TRamp.h" +#include "control.h" +#include "loader.h" +#include "objlist_class.h" +#include "TBall.h" +#include "TEdgeSegment.h" +#include "TLine.h" +#include "TPinballTable.h" +#include "TTableLayer.h" + + +TRamp::TRamp(TPinballTable* table, int groupIndex) : TCollisionComponent(table, groupIndex, false) +{ + visualStruct visual{}; + vector_type end{}, start{}, *end2, *start2, *start3, *end3; + + MessageField = 0; + UnknownBaseFlag1 = 1; + loader::query_visual(groupIndex, 0, &visual); + VisualFlag = visual.Flag; + + auto floatArr1 = loader::query_float_attribute(groupIndex, 0, 701); + if (floatArr1) + BallFieldMult = *floatArr1; + else + BallFieldMult = 0.2f; + auto floatArr2 = loader::query_float_attribute(groupIndex, 0, 1305); + if (floatArr2) + RampFlag1 = static_cast(floor(*floatArr2)); + else + RampFlag1 = 0; + + auto floatArr3Plane = loader::query_float_attribute(groupIndex, 0, 1300); + RampPlaneCount = static_cast(floor(*floatArr3Plane)); + RampPlane = reinterpret_cast(floatArr3Plane + 1); + + auto floatArr4 = loader::query_float_attribute(groupIndex, 0, 1303); + end.X = floatArr4[2]; + end.Y = floatArr4[3]; + start.X = floatArr4[4]; + start.Y = floatArr4[5]; + Line1 = new TLine(this, &UnknownBaseFlag2, 1 << static_cast(floor(floatArr4[0])), &start, &end); + EdgeList->Add(Line1); + if (Line1) + { + Line1->WallValue = nullptr; + Line1->place_in_grid(); + } + + auto floatArr5WallPoint = loader::query_float_attribute(groupIndex, 0, 1301); + Wall1PointFirst = 1 << static_cast(floor(floatArr5WallPoint[0])); + auto wallPt1_2 = static_cast(floor(floatArr5WallPoint[1])); + Wall1PointLast = floatArr5WallPoint[7]; + maths::find_closest_edge( + RampPlane, + RampPlaneCount, + reinterpret_cast(floatArr5WallPoint + 3), + &end2, + &start2); + Line2 = new TLine(this, &UnknownBaseFlag2, VisualFlag, start2, end2); + EdgeList->Add(Line2); + if (Line2) + { + Line2->WallValue = nullptr; + Line2->place_in_grid(); + } + + auto floatArr6WallPoint = loader::query_float_attribute(groupIndex, 0, 1302); + auto wall2Pt1_2 = static_cast(floor(floatArr6WallPoint[1])); + Wall2PointFirst = 1 << static_cast(floor(floatArr6WallPoint[0])); + Wall2PointLast = floatArr6WallPoint[7]; + maths::find_closest_edge( + RampPlane, + RampPlaneCount, + reinterpret_cast(floatArr6WallPoint + 3), + &end3, + &start3); + Line3 = new TLine(this, &UnknownBaseFlag2, VisualFlag, start3, end3); + EdgeList->Add(Line3); + if (Line3) + { + Line3->WallValue = nullptr; + Line3->place_in_grid(); + } + + + auto xMin = 1000000000.0f; + auto yMin = 1000000000.0f; + auto yMax = -1000000000.0f; + auto xMax = -1000000000.0f; + for (auto index = 0; index < RampPlaneCount; index++) + { + auto plane = &RampPlane[index]; + auto pVec1 = reinterpret_cast(&plane->V1); + auto pVec2 = reinterpret_cast(&plane->V2); + auto pVec3 = reinterpret_cast(&plane->V3); + + xMin = min(min(min(plane->V3.X, plane->V1.X), plane->V2.X), xMin); + yMin = min(min(min(plane->V3.Y, plane->V1.Y), plane->V2.Y), xMin); // Sic + xMax = max(max(max(plane->V3.X, plane->V1.X), plane->V2.X), xMin); + yMax = max(max(max(plane->V3.Y, plane->V1.Y), plane->V2.Y), xMin); + + vector_type* pointOrder[4] = {pVec1, pVec2, pVec3, pVec1}; + for (auto pt = 0; pt < 3; pt++) + { + auto point1 = pointOrder[pt], point2 = pointOrder[pt + 1]; + auto lineFlag = 0; + if (point1 != end2 || point2 != start2) + { + if (point1 != end3 || point2 != start3) + { + lineFlag = visual.Flag; + } + else if (wall2Pt1_2) + { + lineFlag = Wall2PointFirst; + } + } + else if (wallPt1_2) + { + lineFlag = Wall1PointFirst; + } + if (lineFlag) + { + auto line = new TLine(this, &UnknownBaseFlag2, lineFlag, point1, point2); + EdgeList->Add(line); + if (line) + { + line->WallValue = plane; + line->place_in_grid(); + } + } + } + + plane->FieldForce.X = cos(plane->GravityAngle2) * sin(plane->GravityAngle1) * + PinballTable->GravityDirVectMult; + plane->FieldForce.Y = sin(plane->GravityAngle2) * sin(plane->GravityAngle1) * + PinballTable->GravityDirVectMult; + } + + Field.Flag2Ptr = &UnknownBaseFlag2; + Field.CollisionComp = this; + Field.Mask = visual.Flag; + + auto x1 = xMax; + auto y1 = yMax; + auto x0 = xMin; + auto y0 = yMin; + TTableLayer::edges_insert_square(y0, x0, y1, x1, nullptr, &Field); +} + +void TRamp::put_scoring(int index, int score) +{ + if (index < 4) + Scores[index] = score; +} + +int TRamp::get_scoring(int index) +{ + return index < 4 ? Scores[index] : 0; +} + +void TRamp::Collision(TBall* ball, vector_type* nextPosition, vector_type* direction, float coef, TEdgeSegment* edge) +{ + ball->not_again(edge); + ball->Position.X = nextPosition->X; + ball->Position.Y = nextPosition->Y; + ball->RayMaxDistance -= coef; + + auto plane = static_cast(edge->WallValue); + if (plane) + { + ball->CollisionFlag = 1; + ball->CollisionOffset.X = plane->BallCollisionOffset.X; + ball->CollisionOffset.Y = plane->BallCollisionOffset.Y; + ball->CollisionOffset.Z = plane->BallCollisionOffset.Z; + ball->RampFieldForce.X = plane->FieldForce.X; + ball->RampFieldForce.Y = plane->FieldForce.Y; + ball->Position.Z = ball->Position.X * ball->CollisionOffset.X + ball->Position.Y * ball->CollisionOffset.Y + + ball->Offset + ball->CollisionOffset.Z; + ball->FieldFlag = VisualFlag; + return; + } + + if (edge == Line1) + { + if (!PinballTable->TiltLockFlag) + { + loader::play_sound(SoundIndex2); + control::handler(63, this); + } + } + else + { + ball->CollisionFlag = 0; + if (edge == Line2) + { + ball->FieldFlag = Wall1PointFirst; + if (!RampFlag1) + return; + ball->Position.Z = ball->Offset + Wall1PointLast; + } + else + { + ball->FieldFlag = Wall2PointFirst; + if (!RampFlag1) + return; + ball->Position.Z = ball->Offset + Wall2PointLast; + } + } +} + +int TRamp::FieldEffect(TBall* ball, vector_type* vecDst) +{ + vecDst->X = ball->RampFieldForce.X - ball->Acceleration.X * ball->Speed * BallFieldMult; + vecDst->Y = ball->RampFieldForce.Y - ball->Acceleration.Y * ball->Speed * BallFieldMult; + return 1; +} + void TRamp::port_draw() { TCollisionComponent::port_draw(); diff --git a/SpaceCadetPinball/TRamp.h b/SpaceCadetPinball/TRamp.h index ca5b7f0..21b598b 100644 --- a/SpaceCadetPinball/TRamp.h +++ b/SpaceCadetPinball/TRamp.h @@ -1,13 +1,34 @@ #pragma once + #include "TCollisionComponent.h" +#include "TEdgeManager.h" + +struct ramp_plane_type; class TRamp : public TCollisionComponent { public: - TRamp(TPinballTable* table, int groupIndex) : TCollisionComponent(table, groupIndex, false) - { - } - + TRamp(TPinballTable* table, int groupIndex); + void put_scoring(int index, int score) override; + int get_scoring(int index) override; + void Collision(TBall* ball, vector_type* nextPosition, vector_type* direction, float coef, + TEdgeSegment* edge) override; + int FieldEffect(TBall* ball, vector_type* vecDst) override; void port_draw() override; + + int Scores[4]; + field_effect_type Field; + int VisualFlag; + int RampFlag1; + int RampPlaneCount; + float BallFieldMult; + ramp_plane_type* RampPlane; + TEdgeSegment* Line2; + TEdgeSegment* Line3; + TEdgeSegment* Line1; + int Wall1PointFirst; + int Wall2PointFirst; + float Wall1PointLast; + float Wall2PointLast; }; diff --git a/SpaceCadetPinball/maths.h b/SpaceCadetPinball/maths.h index cfbf9f1..d369c03 100644 --- a/SpaceCadetPinball/maths.h +++ b/SpaceCadetPinball/maths.h @@ -47,8 +47,8 @@ struct __declspec(align(4)) line_type struct vector_type2 { - int X; - int Y; + float X; + float Y; }; struct wall_point_type @@ -61,14 +61,13 @@ struct wall_point_type struct __declspec(align(4)) ramp_plane_type { - float Unknown12; - vector_type2 V0; + vector_type BallCollisionOffset; vector_type2 V1; vector_type2 V2; vector_type2 V3; float GravityAngle1; float GravityAngle2; - vector_type2 V5_Zero; + vector_type2 FieldForce; };