Implement ProcessLevitate (#196)

This commit is contained in:
Anonymous Maarten 2022-10-14 09:52:05 +02:00 committed by GitHub
parent 2708c614ab
commit 6061fd1d5f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 39 additions and 3 deletions

View File

@ -332,8 +332,8 @@ void DeadStopCar(tCar_spec* pCar_spec) {
pCar_spec->curvature = 0.f;
pCar_spec->gear = 0.f;
pCar_spec->revs = 0.f;
BrVector3SetFloat(&pCar_spec->omega, 0.f, 0.f, 0.f);
BrVector3SetFloat(&pCar_spec->v, 0.f, 0.f, 0.f);
BrVector3Set(&pCar_spec->omega, 0.f, 0.f, 0.f);
BrVector3Set(&pCar_spec->v, 0.f, 0.f, 0.f);
}
// IDA: void __usercall TurnOpponentPhysicsOn(tOpponent_spec *pOpponent_spec@<EAX>)
@ -1210,7 +1210,43 @@ void ProcessLevitate(tOpponent_spec* pOpponent_spec, tProcess_objective_command
float terminal_time;
float y;
LOG_TRACE("(%p, %d)", pOpponent_spec, pCommand);
NOT_IMPLEMENTED();
if (pCommand == ePOC_start) {
dr_dprintf("%s: ProcessLevitate() - new objective started", pOpponent_spec->car_spec->driver_name);
pOpponent_spec->levitate_data.waiting_to_levitate = 1;
pOpponent_spec->car_spec->brake_force = 15.f * pOpponent_spec->car_spec->M;
pOpponent_spec->car_spec->acc_force = 0.f;
pOpponent_spec->levitate_data.time_started = gTime_stamp_for_this_munging;
} else if (pCommand == ePOC_run) {
if (pOpponent_spec->levitate_data.waiting_to_levitate) {
if ((BrVector3Length(&pOpponent_spec->car_spec->v) < .01f && BrVector3Length(&pOpponent_spec->car_spec->omega) < 1.f) || gTime_stamp_for_this_munging - pOpponent_spec->levitate_data.time_started > 4000) {
pOpponent_spec->levitate_data.waiting_to_levitate = 0;
pOpponent_spec->levitate_data.time_started = gTime_stamp_for_this_munging;
pOpponent_spec->levitate_data.initial_y = pOpponent_spec->car_spec->car_master_actor->t.t.translate.t.v[1];
if (pOpponent_spec->car_spec->has_been_stolen) {
NewTextHeadupSlot(4, 250, 2500, -4, GetMiscString(170));
}
} else {
pOpponent_spec->car_spec->brake_force = 15.f * pOpponent_spec->car_spec->M;
pOpponent_spec->car_spec->acc_force = 0.f;
BrVector3InvScale(&pOpponent_spec->car_spec->omega, &pOpponent_spec->car_spec->omega,
powf(gFrame_period_for_this_munging / 1000.f, 2.f));
}
}
if (!pOpponent_spec->levitate_data.waiting_to_levitate) {
TurnOpponentPhysicsOff(pOpponent_spec);
t = (gTime_stamp_for_this_munging - pOpponent_spec->levitate_data.time_started) / 1000.f;
if (t < 20.f) {
y = .5f * t * t / 2.f;
} else {
y = 10.f * (t - 20.f) + 100.f;
}
pOpponent_spec->car_spec->car_master_actor->t.t.translate.t.v[1] = pOpponent_spec->levitate_data.initial_y + y;
if (y > 200.f) {
pOpponent_spec->finished_for_this_race = 1;
}
}
}
}
// IDA: void __usercall ProcessGetNearPlayer(tOpponent_spec *pOpponent_spec@<EAX>, tProcess_objective_command pCommand@<EDX>)