// ***************************************************************************************** // ***************************************************************************************** // ***************************************************************************************** // // SCRIPT NAME : TRI_Widget.sch // AUTHOR : Nicholas Zippmann // DESCRIPTION : Single Player Races - Widget main procs/functions file // // ***************************************************************************************** // ***************************************************************************************** // ***************************************************************************************** #IF IS_DEBUG_BUILD USING "TRI_Head.sch" USING "TRI_Helpers.sch" USING "TRI_Camera.sch" USING "TRI_Gate.sch" USING "TRI_Racer.sch" USING "TRI_Race.sch" USING "TRI_Master.sch" USING "TRI_Widget_lib.sch" INT iSelectedGateToDirty = -1 // ----------------------------------- // GATES HELPER PROCS/FUNCTIONS // ----------------------------------- PROC TRI_Widget_Gates_Sel_Set(TRI_WIDGET_GATES& Gates, INT iValue, BOOL bReset = TRUE) //DEBUG_MESSAGE("TRI_Widget_Gates_Sel_Set") TRI_Widget_Int_Set(Gates.Selection, iValue, bReset) ENDPROC PROC TRI_Widget_Gates_Sel_Set_Update(TRI_WIDGET_GATES& Gates, INT iValue) //DEBUG_MESSAGE("TRI_Widget_Gates_Sel_Set_Update") TRI_Widget_Int_Set(Gates.Selection, -1) TRI_Widget_Int_Set(Gates.Selection, iValue, FALSE) ENDPROC FUNC INT TRI_Widget_Gates_Sel_Get(TRI_WIDGET_GATES& Gates) //DEBUG_MESSAGE("TRI_Widget_Gates_Sel_Get") RETURN TRI_Widget_Int_Get(Gates.Selection) ENDFUNC PROC TRI_Widget_Gates_Sel_Inc(TRI_WIDGET_GATES& Gates, TRI_RACE_STRUCT& Race) //DEBUG_MESSAGE("TRI_Widget_Gates_Sel_Inc") INT iGateSel = TRI_Widget_Gates_Sel_Get(Gates) IF (iGateSel < (Race.iGateCnt - 1)) ++iGateSel ELIF (iGateSel = (Race.iGateCnt - 1)) iGateSel = 0 ENDIF TRI_Widget_Int_Set(Gates.Selection, iGateSel, FALSE) ENDPROC PROC TRI_Widget_Gates_Sel_Dec(TRI_WIDGET_GATES& Gates, TRI_RACE_STRUCT& Race) //DEBUG_MESSAGE("TRI_Widget_Gates_Sel_Dec") INT iGateSel = TRI_Widget_Gates_Sel_Get(Gates) IF (iGateSel > 0) --iGateSel ELIF (iGateSel = 0) iGateSel = Race.iGateCnt - 1 ENDIF TRI_Widget_Int_Set(Gates.Selection, iGateSel, FALSE) ENDPROC PROC TRI_Widget_Gates_Sel_Beg(TRI_WIDGET_GATES& Gates) //DEBUG_MESSAGE("TRI_Widget_Gates_Sel_Beg") TRI_Widget_Int_Set(Gates.Selection, 0, FALSE) ENDPROC PROC TRI_Widget_Gates_Sel_End(TRI_WIDGET_GATES& Gates, TRI_RACE_STRUCT& Race) //DEBUG_MESSAGE("TRI_Widget_Gates_Sel_End") TRI_Widget_Int_Set(Gates.Selection, Race.iGateCnt - 1, FALSE) ENDPROC // TODO: This gets used in probably too many places where I already have the index... PROC TRI_Widget_Gates_Sel_Act(TRI_WIDGET_GATES& Gates, TRI_RACE_STRUCT& Race) //DEBUG_MESSAGE("TRI_Widget_Gates_Sel_Act") TRI_Race_Gate_Activate(Race, TRI_Widget_Gates_Sel_Get(Gates), TRUE) ENDPROC // TODO: Add error checking and figure out a way to use race error textbox... FUNC BOOL TRI_Widget_Gates_Sel_Create(TRI_WIDGET_GATES& Gates, TRI_RACE_STRUCT& Race, VECTOR vPos) //DEBUG_MESSAGE("TRI_Widget_Gates_Sel_Create") IF (Race.iGateCnt >= TRI_GATE_MAX) RETURN FALSE ENDIF ++Race.iGateCnt INT iGate = Race.iGateCnt - 1 INT iGateNew = TRI_Widget_Gates_Sel_Get(Gates) + 1 WHILE (iGate > iGateNew) Race.sGate[iGate] = Race.sGate[iGate - 1] --iGate ENDWHILE TRI_Race_Gate_Init(Race, iGateNew) Race.sGate[iGateNew].vPos = vPos TRI_Widget_Gates_Sel_Set_Update(Gates, iGateNew) RETURN TRUE ENDFUNC FUNC BOOL TRI_Widget_Gates_Sel_Delete(TRI_WIDGET_GATES& Gates, TRI_RACE_STRUCT& Race) //DEBUG_MESSAGE("TRI_Widget_Gates_Sel_Delete") INT iGate = TRI_Widget_Gates_Sel_Get(Gates) INT iGateNew = Race.iGateCnt - 1 TRI_Race_Gate_Init(Race, iGate) WHILE (iGate < (Race.iGateCnt - 1)) Race.sGate[iGate] = Race.sGate[iGate + 1] --iGateNew ++iGate ENDWHILE IF (Race.iGateCnt > 1) --Race.iGateCnt IF (iGateNew = Race.iGateCnt) --iGateNew ENDIF ENDIF TRI_Widget_Gates_Sel_Set_Update(Gates, iGateNew) RETURN TRUE ENDFUNC PROC TRI_Widget_Gates_Sel_Update_Position(TRI_WIDGET_GATES& Gates, TRI_RACE_STRUCT& Race) //DEBUG_MESSAGE("TRI_Widget_Gates_Sel_Update_Position") INT iGateSel = TRI_Widget_Gates_Sel_Get(Gates) VECTOR vGatePos = Race.sGate[iGateSel].vPos TRI_Widget_Vector_Set(Gates.Position, vGatePos) ENDPROC PROC TRI_Widget_Gates_Sel_Update_Radius(TRI_WIDGET_GATES& Gates, TRI_RACE_STRUCT& Race) //DEBUG_MESSAGE("TRI_Widget_Gates_Sel_Update_Radius") INT iGateSel = TRI_Widget_Gates_Sel_Get(Gates) FLOAT fGateRadius = Race.sGate[iGateSel].fRadius TRI_Widget_Float_Set(Gates.Radius, fGateRadius) ENDPROC PROC TRI_Widget_Gates_Sel_Update_ChkpntType(TRI_WIDGET_GATES& Gates, TRI_RACE_STRUCT& Race) //DEBUG_MESSAGE("TRI_Widget_Gates_Sel_Update_ChkpntType") INT iGateSel = TRI_Widget_Gates_Sel_Get(Gates) TRI_RACE_CHECKPOINT_TYPE eChkpntType = Race.sGate[iGateSel].eChkpntType INT iChkpntType = TRI_ChkpntType_GetIndex(eChkpntType) TRI_Widget_Listbox_Set(Gates.ChkpntType, iChkpntType) ENDPROC PROC TRI_Widget_Gates_Sel_Update_All(TRI_WIDGET_GATES& Gates, TRI_RACE_STRUCT& Race) //DEBUG_MESSAGE("TRI_Widget_Gates_Sel_Update_All") TRI_Widget_Gates_Sel_Update_Position(Gates, Race) TRI_Widget_Gates_Sel_Update_Radius(Gates, Race) TRI_Widget_Gates_Sel_Update_ChkpntType(Gates, Race) //TRI_Widget_Gates_Sel_Update_StuntType(Gates, Race) ENDPROC // ----------------------------------- // GATES CONTROLS PROCS/FUNCTIONS // ----------------------------------- PROC TRI_Widget_Gates_Create_Update(TRI_WIDGET_GATES& Gates, TRI_RACE_STRUCT& Race, TRI_CAMERA_STRUCT& Camera) //DEBUG_MESSAGE("TRI_Widget_Gates_Create_Update") // Check Create Gate (button). IF TRI_Widget_Button_Check(Gates.Create) // Reset Create Gate (button). TRI_Widget_Button_Reset(Gates.Create) // Create new gate at placement position, if possible. VECTOR vGatePos = TRI_Camera_GetPlacementPos(Camera) TRI_Widget_Gates_Sel_Create(Gates, Race, vGatePos) ENDIF ENDPROC PROC TRI_Widget_Gates_Delete_Update(TRI_WIDGET_GATES& Gates, TRI_RACE_STRUCT& Race) //DEBUG_MESSAGE("TRI_Widget_Gates_Delete_Update") // Check Delete Gate (button). IF TRI_Widget_Button_Check(Gates.Delete) // Reset Delete Gate (button). TRI_Widget_Button_Reset(Gates.Delete) // Delete Selected Gate, if possible. TRI_Widget_Gates_Sel_Delete(Gates, Race) ENDIF ENDPROC PROC TRI_Widget_Gates_ShowAll_Update(TRI_WIDGET_GATES& Gates, TRI_RACE_STRUCT& Race) //DEBUG_MESSAGE("TRI_Widget_Gates_ShowAll_Update") INT iGateSel = TRI_Widget_Gates_Sel_Get(Gates) IF iSelectedGateToDirty != iGateSel IF iSelectedGateToDirty != -1 TRI_Race_Gate_Deactivate(Race, iSelectedGateToDirty) ENDIF iSelectedGateToDirty = iGateSel LOAD_SCENE(Race.sGate[iGateSel].vPos) CPRINTLN(DEBUG_TRIATHLON, "LOAD_SCENE :: TRI_Widget_Gates_ShowAll_Update") VECTOR vTelePlayer = Race.sGate[iGateSel].vPos IF (Race.sGate[iGateSel].eChkpntType != TRI_CHKPT_STUNT_DEFAULT) AND (Race.sGate[iGateSel].eChkpntType != TRI_CHKPT_STUNT_FINISH) IF (Race.sGate[iGateSel].eChkpntType != TRI_CHKPT_TRI_SWIM) IF GET_GROUND_Z_FOR_3D_COORD(vTelePlayer, vTelePlayer.z) //FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE) SET_ENTITY_COORDS(PLAYER_PED_ID(), vTelePlayer) //WAIT(1000) //SET_ENTITY_COORDS(PLAYER_PED_ID(), vTelePlayer) //FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE) ELSE SET_ENTITY_COORDS(PLAYER_PED_ID(), Race.sGate[iGateSel].vPos) ENDIF ELSE SET_ENTITY_COORDS(PLAYER_PED_ID(), Race.sGate[iGateSel].vPos) ENDIF ENDIF TRI_Race_Gate_Activate(Race, TRI_Widget_Gates_Sel_Get(Gates), TRUE) TRI_Race_Gate_Create_Custom_GPS_Route(Race) ENDIF // Check Show All Gates (toggle). IF TRI_Widget_Toggle_Check(Gates.ShowAll) // Reset Show All Gates (toggle). TRI_Widget_Toggle_Reset(Gates.ShowAll) // If Show All Gates is on, do just that. // TODO: Think about making into a function. IF TRI_Widget_Toggle_Get(Gates.ShowAll) //TRI_Race_Gate_Activate_All(Race, TRUE) //TRI_Race_Gate_Activate(Race, TRI_Widget_Gates_Sel_Get(Gates), TRUE) // Otherwise, activate only Selected Gate. ELSE TRI_Race_Gate_Deactivate_All(Race) TRI_Widget_Gates_Sel_Act(Gates, Race) ENDIF ENDIF IF TRI_Widget_Toggle_Get(Gates.ShowAll) TRI_Race_Gate_Draw_All_Inactive_Markers(Race, iGateSel) ENDIF ENDPROC PROC TRI_Widget_Gates_Snap_Update(TRI_WIDGET_GATES& Gates, TRI_RACE_STRUCT& Race) //DEBUG_MESSAGE("TRI_Widget_Gates_Delete_Update") // Check Delete Gate (button). IF TRI_Widget_Button_Check(Gates.SnapSelected) // Reset Delete Gate (button). TRI_Widget_Button_Reset(Gates.SnapSelected) INT iGateSel = TRI_Widget_Gates_Sel_Get(Gates) VECTOR vSnapPos = Race.sGate[iGateSel].vPos IF GET_GROUND_Z_FOR_3D_COORD(vSnapPos, vSnapPos.z) Race.sGate[iGateSel].vPos = vSnapPos TRI_Widget_Gates_Sel_Act(Gates, Race) ELSE SCRIPT_ASSERT("GET_GROUND_Z_FOR_3D_COORD failed!") ENDIF ENDIF ENDPROC PROC TRI_Widget_Gates_Selection_Update(TRI_WIDGET_GATES& Gates, TRI_RACE_STRUCT& Race, TRI_CAMERA_STRUCT& Camera) //DEBUG_MESSAGE("TRI_Widget_Gates_Selection_Update") // Check Selected Gate (int). IF TRI_Widget_Int_Check(Gates.Selection) // Reset Selected Gate (int). TRI_Widget_Int_Reset(Gates.Selection) // Clamp Selected Gate (int), if needed. INT iGateSel = TRI_Widget_Gates_Sel_Get(Gates) IF (iGateSel >= Race.iGateCnt) iGateSel = Race.iGateCnt - 1 TRI_Widget_Gates_Sel_Set(Gates, iGateSel) ENDIF // Update Gates widgets from Selected Gate. TRI_Widget_Gates_Sel_Update_All(Gates, Race) // If Show All Gates is on, do just that. // TODO: Think about making into a function. IF TRI_Widget_Toggle_Get(Gates.ShowAll) //TRI_Race_Gate_Activate_All(Race, TRUE) // Otherwise, activate only Selected Gate. ELSE //TRI_Race_Gate_Deactivate_All(Race) //TRI_Widget_Gates_Sel_Act(Gates, Race) ENDIF // Have camera interp to Selected Gate, if needed. IF (Camera.eFocus = TRI_CAMERA_FOCUS_GATES) VECTOR vGatePos = Race.sGate[iGateSel].vPos TRI_Camera_Interp(Camera, vGatePos, FALSE) ENDIF ENDIF ENDPROC PROC TRI_Widget_Gates_Position_Update(TRI_WIDGET_GATES& Gates, TRI_RACE_STRUCT& Race, TRI_CAMERA_STRUCT& Camera) //DEBUG_MESSAGE("TRI_Widget_Gates_Position_Update") // Check Gate Position XYZ (vector). IF TRI_Widget_Vector_Check(Gates.Position) // Reset Gate Position XYZ (vector). TRI_Widget_Vector_Reset(Gates.Position) // Set Selected Gate position from Gate Position XYZ. INT iGateSel = TRI_Widget_Gates_Sel_Get(Gates) VECTOR vGatePos = TRI_Widget_Vector_Get(Gates.Position) Race.sGate[iGateSel].vPos = vGatePos // Reactivate Selected Gate. TRI_Widget_Gates_Sel_Act(Gates, Race) // Have camera interp to Gate Position XYZ, if needed. IF (Camera.eFocus = TRI_CAMERA_FOCUS_GATES) TRI_Camera_Interp(Camera, vGatePos, FALSE) ENDIF ENDIF ENDPROC PROC TRI_Widget_Gates_Radius_Update(TRI_WIDGET_GATES& Gates, TRI_RACE_STRUCT& Race) //DEBUG_MESSAGE("TRI_Widget_Gates_Radius_Update") // Check Gate Radius (float). IF TRI_Widget_Float_Check(Gates.Radius) // Reset Gate Radius (float). TRI_Widget_Float_Reset(Gates.Radius) // Set Selected Gate radius from Gate Radius. INT iGateSel = TRI_Widget_Gates_Sel_Get(Gates) FLOAT fGateRadius = TRI_Widget_Float_Get(Gates.Radius) Race.sGate[iGateSel].fRadius = fGateRadius ENDIF ENDPROC PROC TRI_Widget_Gates_ChkpntType_Update(TRI_WIDGET_GATES& Gates, TRI_RACE_STRUCT& Race) //DEBUG_MESSAGE("TRI_Widget_Gates_ChkpntType_Update") // Check Gate Checkpoint Type (listbox). IF TRI_Widget_Listbox_Check(Gates.ChkpntType) // Reset Gate Checkpoint Type (listbox). TRI_Widget_Listbox_Reset(Gates.ChkpntType) // Set Selected Gate checkpoint type from Gate Checkpoint Type. INT iGateSel = TRI_Widget_Gates_Sel_Get(Gates) INT iChkpntType = TRI_Widget_Listbox_Get(Gates.ChkpntType) Race.sGate[iGateSel].eChkpntType = TRI_ChkpntType_GetEnum(iChkpntType) // Reactivate Selected Gate. //TRI_Widget_Gates_Sel_Act(Gates, Race) ENDIF ENDPROC // TODO: Add error checking and figure out a way to use race error textbox... PROC TRI_Widget_Gates_RelMove_Update(TRI_WIDGET_GATES& Gates, TRI_RACE_STRUCT& Race, TRI_CAMERA_STRUCT& Camera, INT iRacerSel) //DEBUG_MESSAGE("TRI_Widget_Gates_RelMove_Update") // Check Relative Move XYZ (vector). IF TRI_Widget_Vector_Check(Gates.RelMove) // Calculate Relative Move XYZ according to mode. INT iRelMode = TRI_Widget_Listbox_Get(Gates.RelMode) BOOL bRelAbs = TRI_Widget_Toggle_Get(Gates.RelAbs) VECTOR vRelMove = TRI_Widget_Vector_Get(Gates.RelMove) VECTOR vGatePos = TRI_Widget_Vector_Get(Gates.Position) SWITCH (INT_TO_ENUM(TRI_MOVE_MODE_ENUM, iRelMode)) // Camera Relative Move. CASE TRI_MOVE_MODE_CAMERA IF (vRelMove.x <> 0.0) TRI_Camera_GetRelPos_Side(Camera, vGatePos, vRelMove.x, bRelAbs) ELIF (vRelMove.y <> 0.0) TRI_Camera_GetRelPos_Fwd(Camera, vGatePos, vRelMove.y, bRelAbs) ELIF (vRelMove.z <> 0.0) TRI_Camera_GetRelPos_Up(Camera, vGatePos, vRelMove.z, bRelAbs) ENDIF BREAK // Ground Relative Move. CASE TRI_MOVE_MODE_GROUND IF (vRelMove.x <> 0.0) TRI_GetRelPos_Ground_Side(vGatePos, vRelMove.x) ELIF (vRelMove.y <> 0.0) TRI_GetRelPos_Ground_Fwd(vGatePos, vRelMove.y) ELIF (vRelMove.z <> 0.0) TRI_GetRelPos_Ground_Up(vGatePos, vRelMove.z) ENDIF BREAK // Gate Prev Relative Move. CASE TRI_MOVE_MODE_PREV IF (Race.iGateCnt > 1) INT iGateSel iGateSel = TRI_Widget_Int_Get(Gates.Selection) - 1 IF (iGateSel >= 0) VECTOR vGate1Pos, vGate2Pos vGate1Pos = Race.sGate[iGateSel].vPos vGate2Pos = Race.sGate[iGateSel + 1].vPos IF (vRelMove.x <> 0.0) TRI_GetRelPos_Coord_Side(vGate1Pos, vGate2Pos, vGatePos, vRelMove.x, bRelAbs) ELIF (vRelMove.y <> 0.0) TRI_GetRelPos_Coord_Fwd(vGate1Pos, vGate2Pos, vGatePos, vRelMove.y, bRelAbs) ELIF (vRelMove.z <> 0.0) TRI_GetRelPos_Coord_Up(vGate1Pos, vGatePos, vRelMove.z, bRelAbs) ENDIF ENDIF ENDIF BREAK // Gate Next Relative Move. CASE TRI_MOVE_MODE_NEXT IF (Race.iGateCnt > 1) INT iGateSel iGateSel = TRI_Widget_Int_Get(Gates.Selection) + 1 IF (iGateSel <= (Race.iGateCnt - 1)) VECTOR vGate1Pos, vGate2Pos vGate1Pos = Race.sGate[iGateSel].vPos vGate2Pos = Race.sGate[iGateSel - 1].vPos IF (vRelMove.x <> 0.0) TRI_GetRelPos_Coord_Side(vGate1Pos, vGate2Pos, vGatePos, vRelMove.x, bRelAbs) ELIF (vRelMove.y <> 0.0) TRI_GetRelPos_Coord_Fwd(vGate1Pos, vGate2Pos, vGatePos, vRelMove.y, bRelAbs) ELIF (vRelMove.z <> 0.0) TRI_GetRelPos_Coord_Up(vGate1Pos, vGatePos, vRelMove.z, bRelAbs) ENDIF ENDIF ENDIF BREAK // Racer Selection Relative Move. CASE TRI_MOVE_MODE_SELECT PED_INDEX Driver Driver = Race.Racer[iRacerSel].Driver IF (vRelMove.x <> 0.0) TRI_GetRelPos_Entity_Side(Driver, vGatePos, vRelMove.x, bRelAbs) ELIF (vRelMove.y <> 0.0) TRI_GetRelPos_Entity_Fwd(Driver, vGatePos, vRelMove.y, bRelAbs) ELIF (vRelMove.z <> 0.0) TRI_GetRelPos_Entity_Up(Driver, vGatePos, vRelMove.z, bRelAbs) ENDIF BREAK ENDSWITCH // Use Relative Move XYZ to set Gate Position XYZ. TRI_Widget_Vector_Set(Gates.Position, vGatePos, FALSE) // Set Relative Move XYZ (vector) back to zero. TRI_Widget_Vector_Set(Gates.RelMove, <<0.0,0.0,0.0>>) ENDIF ENDPROC // ----------------------------------- // GATES MAIN PROCS/FUNCTIONS // ----------------------------------- PROC TRI_Widget_Gates_Setup(TRI_WIDGET_GATES& Gates) //DEBUG_MESSAGE("TRI_Widget_Gates_Setup") // Create Gates widget group. Gates.GroupID = START_WIDGET_GROUP("Gates") // Setup Create Gate (button). TRI_Widget_Button_Setup(Gates.Create, "Create Gate") // Setup Delete Gate (button). TRI_Widget_Button_Setup(Gates.Delete, "Delete Gate") // Setup Show All Gates (toggle). TRI_Widget_Toggle_Setup(Gates.ShowAll, "Show All Gates", TRUE) // Setup Delete Gate (button). TRI_Widget_Button_Setup(Gates.SnapSelected, "Snap Selected Gate To The Ground") // Setup Selected Gate (int). TRI_Widget_Int_Setup(Gates.Selection, "Selected Gate", 0, TRI_GATE_MAX - 1, 1) // Setup Gate Position XYZ (vector). TRI_Widget_Vector_Setup(Gates.Position, "Gate Position", -10000.0, 10000.0, 0.1) // Setup Gate Radius (float). TRI_Widget_Float_Setup(Gates.Radius, "Gate Radius", 0.0, 100.0, 1.0) // Setup Gate Checkpoint Type (listbox). TEXT_LABEL_31 szChkpntType[10] TRI_ChkpntType_Populate(szChkpntType) TRI_Widget_Listbox_Setup(Gates.ChkpntType, "Gate Checkpoint Type", szChkpntType) // Setup Relative Move Mode (listbox). TEXT_LABEL_31 szRelMode[5] szRelMode[0] = "Camera Relative" szRelMode[1] = "Ground Relative" szRelMode[2] = "Gate Prev Relative" szRelMode[3] = "Gate Next Relative" szRelMode[4] = "Racer Selection Relative" TRI_Widget_Listbox_Setup(Gates.RelMode, "Relative Move Mode", szRelMode) // Setup Relative Move Absolute (toggle). TRI_Widget_Toggle_Setup(Gates.RelAbs, "Relative Move Absolute") // Setup Relative Move XYZ (vector). TRI_Widget_Vector_Setup(Gates.RelMove, "Gate Relative Move", -100.0, 100.0, 0.1) // Close Gates widget group. STOP_WIDGET_GROUP() ENDPROC FUNC BOOL TRI_Widget_Gates_Update(TRI_WIDGET_GATES& Gates, TRI_RACE_STRUCT& Race, TRI_CAMERA_STRUCT& Camera, INT iRacerSel) //DEBUG_MESSAGE("TRI_Widget_Gates_Update") // Update all TRI_ Widget Gates controls. TRI_Widget_Gates_Create_Update(Gates, Race, Camera) TRI_Widget_Gates_Delete_Update(Gates, Race) TRI_Widget_Gates_ShowAll_Update(Gates, Race) TRI_Widget_Gates_Snap_Update(Gates, Race) TRI_Widget_Gates_Selection_Update(Gates, Race, Camera) TRI_Widget_Gates_Position_Update(Gates, Race, Camera) TRI_Widget_Gates_Radius_Update(Gates, Race) TRI_Widget_Gates_ChkpntType_Update(Gates, Race) //TRI_Widget_Gates_StuntType_Update(Gates, Race) TRI_Widget_Gates_RelMove_Update(Gates, Race, Camera, iRacerSel) // Update TRI_ Widget Gates still running. RETURN TRUE ENDFUNC PROC TRI_Widget_Gates_Cleanup(TRI_WIDGET_GATES& Gates) //DEBUG_MESSAGE("TRI_Widget_Gates_Cleanup") TRI_Widget_Delete_Widget_Group(Gates.GroupID) ENDPROC // ----------------------------------- // RACERS HELPER PROCS/FUNCTIONS // ----------------------------------- PROC TRI_Widget_Racers_Queue_Init(TRI_WIDGET_RACERS& Racers) //DEBUG_MESSAGE("TRI_Widget_Racers_Queue_Init") INT i REPEAT TRI_RACER_MAX i Racers.bRacerQueue[i] = FALSE ENDREPEAT ENDPROC PROC TRI_Widget_Racers_Queue_Add(TRI_WIDGET_RACERS& Racers, INT iRacer) //DEBUG_MESSAGE("TRI_Widget_Racers_Queue_Add") Racers.bRacerQueue[iRacer] = TRUE ENDPROC PROC TRI_Widget_Racers_Queue_Update(TRI_WIDGET_RACERS& Racers, TRI_RACE_STRUCT& Race) //DEBUG_MESSAGE("TRI_Widget_Racers_Queue_Update") INT i REPEAT Race.iRacerCnt i IF Racers.bRacerQueue[i] IF TRI_Racer_Stream(Race.Racer[i]) IF TRI_Racer_Create(Race.Racer[i], FALSE) TRI_Racer_Freeze(Race.Racer[i]) Racers.bRacerQueue[i] = FALSE ENDIF ENDIF ENDIF ENDREPEAT ENDPROC PROC TRI_Widget_Racers_Sel_Set(TRI_WIDGET_RACERS& Racers, INT iValue, BOOL bReset = TRUE) //DEBUG_MESSAGE("TRI_Widget_Racers_Sel_Set") TRI_Widget_Int_Set(Racers.Selection, iValue, bReset) ENDPROC PROC TRI_Widget_Racers_Sel_Set_Update(TRI_WIDGET_RACERS& Racers, INT iValue) //DEBUG_MESSAGE("TRI_Widget_Racers_Sel_Set_Update") TRI_Widget_Int_Set(Racers.Selection, -1) TRI_Widget_Int_Set(Racers.Selection, iValue, FALSE) ENDPROC FUNC INT TRI_Widget_Racers_Sel_Get(TRI_WIDGET_RACERS& Racers) //DEBUG_MESSAGE("TRI_Widget_Racers_Sel_Get") RETURN TRI_Widget_Int_Get(Racers.Selection) ENDFUNC PROC TRI_Widget_Racers_Sel_Inc(TRI_WIDGET_RACERS& Racers, TRI_RACE_STRUCT& Race) //DEBUG_MESSAGE("TRI_Widget_Racers_Sel_Inc") INT iRacerSel = TRI_Widget_Racers_Sel_Get(Racers) IF (iRacerSel < (Race.iRacerCnt - 1)) ++iRacerSel ELIF (iRacerSel = (Race.iRacerCnt - 1)) iRacerSel = 0 ENDIF TRI_Widget_Int_Set(Racers.Selection, iRacerSel, FALSE) ENDPROC PROC TRI_Widget_Racers_Sel_Dec(TRI_WIDGET_RACERS& Racers, TRI_RACE_STRUCT& Race) //DEBUG_MESSAGE("TRI_Widget_Racers_Sel_Dec") INT iRacerSel = TRI_Widget_Racers_Sel_Get(Racers) IF (iRacerSel > 0) --iRacerSel ELIF (iRacerSel = 0) iRacerSel = Race.iRacerCnt - 1 ENDIF TRI_Widget_Int_Set(Racers.Selection, iRacerSel, FALSE) ENDPROC PROC TRI_Widget_Racers_Sel_Beg(TRI_WIDGET_RACERS& Racers) //DEBUG_MESSAGE("TRI_Widget_Racers_Sel_Beg") TRI_Widget_Int_Set(Racers.Selection, 0, FALSE) ENDPROC PROC TRI_Widget_Racers_Sel_End(TRI_WIDGET_RACERS& Racers, TRI_RACE_STRUCT& Race) //DEBUG_MESSAGE("TRI_Widget_Racers_Sel_End") TRI_Widget_Int_Set(Racers.Selection, Race.iRacerCnt - 1, FALSE) ENDPROC // TODO: These get used in probably too many places where I already have the indez... PROC TRI_Widget_Racers_Sel_Drv_Act(TRI_WIDGET_RACERS& Racers, TRI_RACE_STRUCT& Race, BOOL bDestroyOld) //DEBUG_MESSAGE("TRI_Widget_Racers_Sel_Drv_Act") INT iRacer = TRI_Widget_Racers_Sel_Get(Racers) IF bDestroyOld TRI_Race_Racer_Driver_UnFreeze(Race, iRacer) TRI_Race_Racer_Driver_Destroy(Race, iRacer) ENDIF TRI_Race_Racer_Driver_Request(Race, iRacer) TRI_Widget_Racers_Queue_Add(Racers, iRacer) ENDPROC PROC TRI_Widget_Racers_Sel_Drv_DeAct(TRI_WIDGET_RACERS& Racers, TRI_RACE_STRUCT& Race, BOOL bDestroyOld) //DEBUG_MESSAGE("TRI_Widget_Racers_Sel_Drv_DeAct") INT iRacer = TRI_Widget_Racers_Sel_Get(Racers) TRI_Race_Racer_Driver_Evict(Race, iRacer) IF bDestroyOld TRI_Race_Racer_Driver_UnFreeze(Race, iRacer) TRI_Race_Racer_Driver_Destroy(Race, iRacer) ENDIF ENDPROC PROC TRI_Widget_Racers_Sel_Veh_Act(TRI_WIDGET_RACERS& Racers, TRI_RACE_STRUCT& Race, BOOL bDestroyOld) //DEBUG_MESSAGE("TRI_Widget_Racers_Sel_Veh_Act") INT iRacer = TRI_Widget_Racers_Sel_Get(Racers) IF bDestroyOld TRI_Race_Racer_Vehicle_UnFreeze(Race, iRacer) TRI_Race_Racer_Vehicle_Destroy(Race, iRacer) ENDIF TRI_Race_Racer_Vehicle_Request(Race, iRacer) TRI_Widget_Racers_Queue_Add(Racers, iRacer) ENDPROC PROC TRI_Widget_Racers_Sel_Veh_DeAct(TRI_WIDGET_RACERS& Racers, TRI_RACE_STRUCT& Race, BOOL bDestroyOld) //DEBUG_MESSAGE("TRI_Widget_Racers_Sel_Veh_DeAct") INT iRacer = TRI_Widget_Racers_Sel_Get(Racers) TRI_Race_Racer_Vehicle_Evict(Race, iRacer) IF bDestroyOld TRI_Race_Racer_Vehicle_UnFreeze(Race, iRacer) TRI_Race_Racer_Vehicle_Destroy(Race, iRacer) ENDIF ENDPROC PROC TRI_Widget_Racers_Sel_Act(TRI_WIDGET_RACERS& Racers, TRI_RACE_STRUCT& Race, BOOL bDestroyOld) //DEBUG_MESSAGE("TRI_Widget_Racers_Sel_Act") INT iRacer = TRI_Widget_Racers_Sel_Get(Racers) IF bDestroyOld TRI_Race_Racer_UnFreeze(Race, iRacer) TRI_Race_Racer_Destroy(Race, iRacer) ENDIF TRI_Race_Racer_Request(Race, iRacer) TRI_Widget_Racers_Queue_Add(Racers, iRacer) ENDPROC PROC TRI_Widget_Racers_Sel_DeAct(TRI_WIDGET_RACERS& Racers, TRI_RACE_STRUCT& Race, BOOL bDestroyOld) //DEBUG_MESSAGE("TRI_Widget_Racers_Sel_DeAct") INT iRacer = TRI_Widget_Racers_Sel_Get(Racers) TRI_Race_Racer_Evict(Race, iRacer) IF bDestroyOld TRI_Race_Racer_UnFreeze(Race, iRacer) TRI_Race_Racer_Destroy(Race, iRacer) ENDIF ENDPROC PROC TRI_Widget_Racers_All_Act(TRI_WIDGET_RACERS& Racers, TRI_RACE_STRUCT& Race, BOOL bDestroyOld) //DEBUG_MESSAGE("TRI_Widget_Racers_All_Act") TRI_Widget_Racers_Queue_Init(Racers) INT i REPEAT Race.iRacerCnt i IF bDestroyOld TRI_Race_Racer_UnFreeze(Race, i) TRI_Race_Racer_Destroy(Race, i) ENDIF TRI_Race_Racer_Request(Race, i) TRI_Widget_Racers_Queue_Add(Racers, i) ENDREPEAT ENDPROC PROC TRI_Widget_Racers_All_DeAct(TRI_WIDGET_RACERS& Racers, TRI_RACE_STRUCT& Race, BOOL bDestroyOld) //DEBUG_MESSAGE("TRI_Widget_Racers_All_DeAct") UNUSED_PARAMETER(Racers) INT i REPEAT Race.iRacerCnt i TRI_Race_Racer_Evict(Race, i) IF bDestroyOld TRI_Race_Racer_UnFreeze(Race, i) TRI_Race_Racer_Destroy(Race, i) ENDIF ENDREPEAT ENDPROC // TODO: Add error checking and figure out a way to use race error textbox... FUNC BOOL TRI_Widget_Racers_Sel_Create(TRI_WIDGET_RACERS& Racers, TRI_RACE_STRUCT& Race, VECTOR vStartPos) //DEBUG_MESSAGE("TRI_Widget_Racers_Sel_Create") IF (Race.iRacerCnt >= TRI_RACER_MAX) RETURN FALSE ENDIF ++Race.iRacerCnt INT iRacer = Race.iRacerCnt - 1 INT iRacerNew = TRI_Widget_Racers_Sel_Get(Racers) + 1 WHILE (iRacer > iRacerNew) Race.Racer[iRacer] = Race.Racer[iRacer - 1] --iRacer ENDWHILE TRI_Race_Racer_Init(Race, iRacerNew) Race.Racer[iRacerNew].vStartPos = vStartPos TRI_Widget_Racers_Sel_Set_Update(Racers, iRacerNew) RETURN TRUE ENDFUNC FUNC BOOL TRI_Widget_Racers_Sel_Delete(TRI_WIDGET_RACERS& Racers, TRI_RACE_STRUCT& Race) //DEBUG_MESSAGE("TRI_Widget_Racers_Sel_Delete") INT iRacer = TRI_Widget_Racers_Sel_Get(Racers) INT iRacerNew = Race.iRacerCnt - 1 TRI_Race_Racer_Init(Race, iRacer) WHILE (iRacer < (Race.iRacerCnt - 1)) Race.Racer[iRacer] = Race.Racer[iRacer + 1] --iRacerNew ++iRacer ENDWHILE IF (Race.iRacerCnt > 1) --Race.iRacerCnt IF (iRacerNew = Race.iRacerCnt) --iRacerNew ENDIF ENDIF TRI_Widget_Racers_Sel_Set_Update(Racers, iRacerNew) RETURN TRUE ENDFUNC PROC TRI_Widget_Racers_Sel_Update_Name(TRI_WIDGET_RACERS& Racers, TRI_RACE_STRUCT& Race) //DEBUG_MESSAGE("TRI_Widget_Racers_Sel_Update_Position") INT iRacerSel = TRI_Widget_Racers_Sel_Get(Racers) TEXT_LABEL_31 szName = Race.Racer[iRacerSel].szName TRI_Widget_Textbox_Set(Racers.Name, szName) ENDPROC PROC TRI_Widget_Racers_Sel_Update_Position(TRI_WIDGET_RACERS& Racers, TRI_RACE_STRUCT& Race) //DEBUG_MESSAGE("TRI_Widget_Racers_Sel_Update_Position") INT iRacerSel = TRI_Widget_Racers_Sel_Get(Racers) VECTOR vStartPos = Race.Racer[iRacerSel].vStartPos TRI_Widget_Vector_Set(Racers.Position, vStartPos) ENDPROC PROC TRI_Widget_Racers_Sel_Update_Heading(TRI_WIDGET_RACERS& Racers, TRI_RACE_STRUCT& Race) //DEBUG_MESSAGE("TRI_Widget_Racers_Sel_Update_Heading") INT iRacerSel = TRI_Widget_Racers_Sel_Get(Racers) FLOAT fStartHead = Race.Racer[iRacerSel].fStartHead TRI_Widget_Float_Set(Racers.Heading, fStartHead) ENDPROC PROC TRI_Widget_Racers_Sel_Update_DriverType(TRI_WIDGET_RACERS& Racers, TRI_RACE_STRUCT& Race) //DEBUG_MESSAGE("TRI_Widget_Racers_Sel_Update_DriverType") INT iRacerSel = TRI_Widget_Racers_Sel_Get(Racers) PED_TYPE eDriverType = Race.Racer[iRacerSel].eDriverType INT iDriverType = TRI_DriverType_GetIndex(eDriverType) TRI_Widget_Listbox_Set(Racers.DriverType, iDriverType) ENDPROC PROC TRI_Widget_Racers_Sel_Update_DriverModel(TRI_WIDGET_RACERS& Racers, TRI_RACE_STRUCT& Race) //DEBUG_MESSAGE("TRI_Widget_Racers_Sel_Update_DriverModel") INT iRacerSel = TRI_Widget_Racers_Sel_Get(Racers) MODEL_NAMES eDriverModel = Race.Racer[iRacerSel].eDriverModel INT iDriverModel = TRI_DriverModel_GetIndex(eDriverModel) TRI_Widget_Listbox_Set(Racers.DriverModel, iDriverModel) ENDPROC PROC TRI_Widget_Racers_Sel_Update_VehicleModel(TRI_WIDGET_RACERS& Racers, TRI_RACE_STRUCT& Race) //DEBUG_MESSAGE("TRI_Widget_Racers_Sel_Update_VehicleModel") INT iRacerSel = TRI_Widget_Racers_Sel_Get(Racers) MODEL_NAMES eVehicleModel = Race.Racer[iRacerSel].eVehicleModel INT iVehicleModel = TRI_VehicleModel_GetIndex(eVehicleModel) TRI_Widget_Listbox_Set(Racers.VehicleModel, iVehicleModel) ENDPROC PROC TRI_Widget_Racers_Sel_Update_All(TRI_WIDGET_RACERS& Racers, TRI_RACE_STRUCT& Race) //DEBUG_MESSAGE("TRI_Widget_Racers_Sel_Update_All") TRI_Widget_Racers_Sel_Update_Name(Racers, Race) TRI_Widget_Racers_Sel_Update_Position(Racers, Race) TRI_Widget_Racers_Sel_Update_Heading(Racers, Race) TRI_Widget_Racers_Sel_Update_DriverType(Racers, Race) TRI_Widget_Racers_Sel_Update_DriverModel(Racers, Race) TRI_Widget_Racers_Sel_Update_VehicleModel(Racers, Race) ENDPROC // ----------------------------------- // RACERS HELPER PROCS/FUNCTIONS // ----------------------------------- PROC TRI_Widget_Racers_Create_Update(TRI_WIDGET_RACERS& Racers, TRI_RACE_STRUCT& Race, TRI_CAMERA_STRUCT& Camera) //DEBUG_MESSAGE("TRI_Widget_Racers_Create_Update") // Check Create Racer (button). IF TRI_Widget_Button_Check(Racers.Create) // Reset Create Racer (button). TRI_Widget_Button_Reset(Racers.Create) // Create new racer at placement position, if possible. VECTOR vStartPos = TRI_Camera_GetPlacementPos(Camera) TRI_Widget_Racers_Sel_Create(Racers, Race, vStartPos) ENDIF ENDPROC PROC TRI_Widget_Racers_Delete_Update(TRI_WIDGET_RACERS& Racers, TRI_RACE_STRUCT& Race) //DEBUG_MESSAGE("TRI_Widget_Racers_Delete_Update") // Check Delete Racer (button). IF TRI_Widget_Button_Check(Racers.Delete) // Reset Delete Racer (button). TRI_Widget_Button_Reset(Racers.Delete) // Deactivate Selected Racer. TRI_Widget_Racers_Sel_DeAct(Racers, Race, TRUE) // Delete Selected Racer, if possible. TRI_Widget_Racers_Sel_Delete(Racers, Race) ENDIF ENDPROC PROC TRI_Widget_Racers_ShowAll_Update(TRI_WIDGET_RACERS& Racers, TRI_RACE_STRUCT& Race) //DEBUG_MESSAGE("TRI_Widget_Racers_ShowAll_Update") // Check Show All Racers (toggle). IF TRI_Widget_Toggle_Check(Racers.ShowAll) // Reset Show All Racers (toggle). TRI_Widget_Toggle_Reset(Racers.ShowAll) // If Show All Racers is on, do just that. // TODO: Think about making into a function. IF TRI_Widget_Toggle_Get(Racers.ShowAll) TRI_Widget_Racers_All_Act(Racers, Race, FALSE) // Otherwise, activate only Selected Racer. ELSE TRI_Widget_Racers_All_DeAct(Racers, Race, TRUE) TRI_Widget_Racers_Sel_Act(Racers, Race, FALSE) ENDIF ENDIF ENDPROC PROC TRI_Widget_Racers_Selection_Update(TRI_WIDGET_RACERS& Racers, TRI_RACE_STRUCT& Race, TRI_CAMERA_STRUCT& Camera) //DEBUG_MESSAGE("TRI_Widget_Racers_Selection_Update") // Check Selected Racer (int). IF TRI_Widget_Int_Check(Racers.Selection) // Reset Selected Racer (int). TRI_Widget_Int_Reset(Racers.Selection) // Clamp Selected Racer (int), if needed. INT iRacerSel = TRI_Widget_Racers_Sel_Get(Racers) IF (iRacerSel >= Race.iRacerCnt) iRacerSel = Race.iRacerCnt - 1 TRI_Widget_Racers_Sel_Set(Racers, iRacerSel) ENDIF // Update Racers widgets from Selected Racer. TRI_Widget_Racers_Sel_Update_All(Racers, Race) // If Show All Racers is on, do just that. // TODO: Think about making into a function. IF TRI_Widget_Toggle_Get(Racers.ShowAll) TRI_Widget_Racers_All_Act(Racers, Race, FALSE) // Otherwise, activate only Selected Racer. ELSE TRI_Widget_Racers_All_DeAct(Racers, Race, TRUE) TRI_Widget_Racers_Sel_Act(Racers, Race, FALSE) ENDIF // Have camera interp to Selected Racer, if needed. IF (Camera.eFocus = TRI_CAMERA_FOCUS_RACERS) VECTOR vStartPos = Race.Racer[iRacerSel].vStartPos TRI_Camera_Interp(Camera, vStartPos, FALSE) ENDIF ENDIF ENDPROC PROC TRI_Widget_Racers_Name_Update(TRI_WIDGET_RACERS& Racers, TRI_RACE_STRUCT& Race) //DEBUG_MESSAGE("TRI_Widget_Racers_Name_Update") // Check Racer Name (textbox). IF TRI_Widget_Textbox_Check(Racers.Name) // Reset Racer Name (textbox). TRI_Widget_Textbox_Reset(Racers.Name) // Set Selected Racer name from Racer Name. INT iRacerSel = TRI_Widget_Int_Get(Racers.Selection) TEXT_LABEL_31 szRacerName = TRI_Widget_Textbox_Get(Racers.Name) Race.Racer[iRacerSel].szName = szRacerName ENDIF ENDPROC PROC TRI_Widget_Racers_Position_Update(TRI_WIDGET_RACERS& Racers, TRI_RACE_STRUCT& Race, TRI_CAMERA_STRUCT& Camera) //DEBUG_MESSAGE("TRI_Widget_Racers_Position_Update") // Check Racer Start Position XYZ (vector). IF TRI_Widget_Vector_Check(Racers.Position) // Reset Racer Start Position XYZ (vector). TRI_Widget_Vector_Reset(Racers.Position) // Set Selected Racer start position from Racer Start Position XYZ. INT iRacerSel = TRI_Widget_Int_Get(Racers.Selection) VECTOR vStartPos = TRI_Widget_Vector_Get(Racers.Position) Race.Racer[iRacerSel].vStartPos = vStartPos // Reactivate Selected Racer. TRI_Widget_Racers_Sel_Act(Racers, Race, FALSE) // Have camera interp to Racer Start Position XYZ, if needed. IF (Camera.eFocus = TRI_CAMERA_FOCUS_RACERS) TRI_Camera_Interp(Camera, vStartPos, FALSE) ENDIF ENDIF ENDPROC PROC TRI_Widget_Racers_Heading_Update(TRI_WIDGET_RACERS& Racers, TRI_RACE_STRUCT& Race) //DEBUG_MESSAGE("TRI_Widget_Racers_Heading_Update") // Check Racer Start Heading (float). IF TRI_Widget_Float_Check(Racers.Heading) // Reset Racer Start Heading (float). TRI_Widget_Float_Reset(Racers.Heading) // Set Selected Racer start heading from Racer Start Heading. INT iRacerSel = TRI_Widget_Int_Get(Racers.Selection) FLOAT fStartHead = TRI_Widget_Float_Get(Racers.Heading) Race.Racer[iRacerSel].fStartHead = fStartHead // Reactivate Selected Racer. TRI_Widget_Racers_Sel_Act(Racers, Race, FALSE) ENDIF ENDPROC PROC TRI_Widget_Racers_DriverType_Update(TRI_WIDGET_RACERS& Racers, TRI_RACE_STRUCT& Race) //DEBUG_MESSAGE("TRI_Widget_Racers_DriverType_Update") // Check Racer Driver Type (listbox). IF TRI_Widget_Listbox_Check(Racers.DriverType) // Reset Racer Driver Type (listbox). TRI_Widget_Listbox_Reset(Racers.DriverType) // Deactivate Selected Racer driver. TRI_Widget_Racers_Sel_Drv_DeAct(Racers, Race, TRUE) // Set Selected Racer driver type from Racer Driver Type. INT iRacerSel = TRI_Widget_Racers_Sel_Get(Racers) INT iDriverType = TRI_Widget_Listbox_Get(Racers.DriverType) Race.Racer[iRacerSel].eDriverType = TRI_DriverType_GetEnum(iDriverType) // Reactivate Selected Racer driver. TRI_Widget_Racers_Sel_Drv_Act(Racers, Race, TRUE) ENDIF ENDPROC PROC TRI_Widget_Racers_DriverModel_Update(TRI_WIDGET_RACERS& Racers, TRI_RACE_STRUCT& Race) //DEBUG_MESSAGE("TRI_Widget_Racers_DriverModel_Update") // Check Racer Driver Model (listbox). IF TRI_Widget_Listbox_Check(Racers.DriverModel) // Reset Racer Driver Model (listbox). TRI_Widget_Listbox_Reset(Racers.DriverModel) // Deactivate Selected Racer driver. TRI_Widget_Racers_Sel_Drv_DeAct(Racers, Race, TRUE) // Set Selected Racer driver model from Racer Driver Model. INT iRacerSel = TRI_Widget_Racers_Sel_Get(Racers) INT iDriverModel = TRI_Widget_Listbox_Get(Racers.DriverModel) Race.Racer[iRacerSel].eDriverModel = TRI_DriverModel_GetEnum(iDriverModel) // Reactivate Selected Racer driver. TRI_Widget_Racers_Sel_Drv_Act(Racers, Race, TRUE) ENDIF ENDPROC PROC TRI_Widget_Racers_VehicleModel_Update(TRI_WIDGET_RACERS& Racers, TRI_RACE_STRUCT& Race) //DEBUG_MESSAGE("TRI_Widget_Racers_VehicleModel_Update") // Check Racer Vehicle Model (listbox). IF TRI_Widget_Listbox_Check(Racers.VehicleModel) // Reset Racer Vehicle Model (listbox). TRI_Widget_Listbox_Reset(Racers.VehicleModel) // Deactivate Selected Racer vehicle. TRI_Widget_Racers_Sel_Veh_DeAct(Racers, Race, TRUE) // Set Selected Racer vehicle model from Racer Vehicle Model. INT iRacerSel = TRI_Widget_Racers_Sel_Get(Racers) INT iVehicleModel = TRI_Widget_Listbox_Get(Racers.VehicleModel) Race.Racer[iRacerSel].eVehicleModel = TRI_VehicleModel_GetEnum(iVehicleModel) // Reactivate Selected Racer vehicle. TRI_Widget_Racers_Sel_Veh_Act(Racers, Race, TRUE) ENDIF ENDPROC // TODO: Add error checking and figure out a way to use race error textbox... PROC TRI_Widget_Racers_RelMove_Update(TRI_WIDGET_RACERS& Racers, TRI_RACE_STRUCT& Race, TRI_CAMERA_STRUCT& Camera, INT iGateSel) //DEBUG_MESSAGE("TRI_Widget_Racers_RelMove_Update") // Check Relative Move XYZ (vector). IF TRI_Widget_Vector_Check(Racers.RelMove) // Calculate Relative Move XYZ according to mode. INT iRelMode = TRI_Widget_Listbox_Get(Racers.RelMode) BOOL bRelAbs = TRI_Widget_Toggle_Get(Racers.RelAbs) VECTOR vRelMove = TRI_Widget_Vector_Get(Racers.RelMove) VECTOR vRacerPos = TRI_Widget_Vector_Get(Racers.Position) FLOAT fRacerHead = TRI_Widget_Float_Get(Racers.Heading) SWITCH (INT_TO_ENUM(TRI_MOVE_MODE_ENUM, iRelMode)) // Camera Relative Move. CASE TRI_MOVE_MODE_CAMERA IF (vRelMove.x <> 0.0) TRI_Camera_GetRelPos_Side(Camera, vRacerPos, vRelMove.x, bRelAbs) fRacerHead = TRI_Camera_GetHeading(Camera) ELIF (vRelMove.y <> 0.0) TRI_Camera_GetRelPos_Fwd(Camera, vRacerPos, vRelMove.y, bRelAbs) fRacerHead = TRI_Camera_GetHeading(Camera) ELIF (vRelMove.z <> 0.0) TRI_Camera_GetRelPos_Up(Camera, vRacerPos, vRelMove.z, bRelAbs) fRacerHead = TRI_Camera_GetHeading(Camera) ENDIF BREAK // Ground Relative Move. CASE TRI_MOVE_MODE_GROUND IF (vRelMove.x <> 0.0) TRI_GetRelPos_Ground_Side(vRacerPos, vRelMove.x) fRacerHead = 0.0 ELIF (vRelMove.y <> 0.0) TRI_GetRelPos_Ground_Fwd(vRacerPos, vRelMove.y) fRacerHead = 0.0 ELIF (vRelMove.z <> 0.0) TRI_GetRelPos_Ground_Up(vRacerPos, vRelMove.z) fRacerHead = 0.0 ENDIF BREAK // Racer Prev Relative Move. CASE TRI_MOVE_MODE_PREV IF (Race.iRacerCnt > 1) INT iRacerSel iRacerSel = TRI_Widget_Int_Get(Racers.Selection) - 1 IF (iRacerSel >= 0) PED_INDEX Driver Driver = Race.Racer[iRacerSel].Driver IF (vRelMove.x <> 0.0) TRI_GetRelPos_Entity_Side(Driver, vRacerPos, vRelMove.x, bRelAbs) fRacerHead = GET_ENTITY_HEADING(Driver) ELIF (vRelMove.y <> 0.0) TRI_GetRelPos_Entity_Fwd(Driver, vRacerPos, vRelMove.y, bRelAbs) fRacerHead = GET_ENTITY_HEADING(Driver) ELIF (vRelMove.z <> 0.0) TRI_GetRelPos_Entity_Up(Driver, vRacerPos, vRelMove.z, bRelAbs) fRacerHead = GET_ENTITY_HEADING(Driver) ENDIF ENDIF ENDIF BREAK // Racer Next Relative Move. CASE TRI_MOVE_MODE_NEXT IF (Race.iRacerCnt > 1) INT iRacerSel iRacerSel = TRI_Widget_Int_Get(Racers.Selection) + 1 IF (iRacerSel <= (Race.iRacerCnt - 1)) PED_INDEX Driver Driver = Race.Racer[iRacerSel].Driver IF (vRelMove.x <> 0.0) TRI_GetRelPos_Entity_Side(Driver, vRacerPos, vRelMove.x, bRelAbs) fRacerHead = GET_ENTITY_HEADING(Driver) ELIF (vRelMove.y <> 0.0) TRI_GetRelPos_Entity_Fwd(Driver, vRacerPos, vRelMove.y, bRelAbs) fRacerHead = GET_ENTITY_HEADING(Driver) ELIF (vRelMove.z <> 0.0) TRI_GetRelPos_Entity_Up(Driver, vRacerPos, vRelMove.z, bRelAbs) fRacerHead = GET_ENTITY_HEADING(Driver) ENDIF ENDIF ENDIF BREAK // Gate Selection Relative Move. CASE TRI_MOVE_MODE_SELECT VECTOR vGate1Pos, vGate2Pos, vGateFwd IF (Race.iGateCnt = 1) vGate1Pos = Race.sGate[iGateSel].vPos vGate2Pos = TRI_Master.vDefRcrPos ELIF (iGateSel = (Race.iGateCnt - 1)) vGate1Pos = Race.sGate[iGateSel].vPos vGate2Pos = Race.sGate[iGateSel - 1].vPos ELSE vGate1Pos = Race.sGate[iGateSel].vPos vGate2Pos = Race.sGate[iGateSel + 1].vPos ENDIF IF (vRelMove.x <> 0.0) TRI_GetRelPos_Coord_Side(vGate1Pos, vGate2Pos, vRacerPos, vRelMove.x, bRelAbs) vGateFwd = vGate2Pos - vGate1Pos fRacerHead = GET_HEADING_FROM_VECTOR_2D(vGateFwd.x, vGateFwd.y) ELIF (vRelMove.y <> 0.0) TRI_GetRelPos_Coord_Fwd(vGate1Pos, vGate2Pos, vRacerPos, vRelMove.y, bRelAbs) vGateFwd = vGate2Pos - vGate1Pos fRacerHead = GET_HEADING_FROM_VECTOR_2D(vGateFwd.x, vGateFwd.y) ELIF (vRelMove.z <> 0.0) TRI_GetRelPos_Coord_Up(vGate1Pos, vRacerPos, vRelMove.z, bRelAbs) vGateFwd = vGate2Pos - vGate1Pos fRacerHead = GET_HEADING_FROM_VECTOR_2D(vGateFwd.x, vGateFwd.y) ENDIF BREAK ENDSWITCH // Use Relative Move XYZ to set Racer Start Position XYZ. TRI_Widget_Vector_Set(Racers.Position, vRacerPos, FALSE) // Use Relative Move Mode to set Racer Start Heading. TRI_Widget_Float_Set(Racers.Heading, fRacerHead, FALSE) // Set Relative Move XYZ (vector) back to zero. TRI_Widget_Vector_Set(Racers.RelMove, <<0.0,0.0,0.0>>) ENDIF ENDPROC // ----------------------------------- // RACERS MAIN PROCS/FUNCTIONS // ----------------------------------- PROC TRI_Widget_Racers_Setup(TRI_WIDGET_RACERS& Racers) //DEBUG_MESSAGE("TRI_Widget_Racers_Setup") // Create Racers widget group. Racers.GroupID = START_WIDGET_GROUP("Racers") // Setup Create Racer (button). TRI_Widget_Button_Setup(Racers.Create, "Create Racer") // Setup Delete Racer (button). TRI_Widget_Button_Setup(Racers.Delete, "Delete Racer") // Setup Show All Racers (toggle). TRI_Widget_Toggle_Setup(Racers.ShowAll, "Show All Racers") // Setup Selected Racer (int). TRI_Widget_Int_Setup(Racers.Selection, "Selected Racer", 0, TRI_RACER_MAX - 1, 1) // Setup Racer Name (textbox). TRI_Widget_Textbox_Setup(Racers.Name, "Racer Name", "Put Racer Name Here!") // Setup Racer Start Position XYZ (vector). TRI_Widget_Vector_Setup(Racers.Position, "Racer Start Position", -10000.0, 10000.0, 0.1) // Setup Racer Start Heading (float). TRI_Widget_Float_Setup(Racers.Heading, "Racer Start Heading", 0.0, 359.9, 0.1) // Setup Racer Driver Type (listbox). TEXT_LABEL_31 szDriverType[4] TRI_DriverType_Populate(szDriverType) TRI_Widget_Listbox_Setup(Racers.DriverType, "Racer Driver Type", szDriverType) // Setup Racer Driver Model (listbox). TEXT_LABEL_31 szDriverModel[4] TRI_DriverModel_Populate(szDriverModel) TRI_Widget_Listbox_Setup(Racers.DriverModel, "Racer Driver Model", szDriverModel) // Setup Racer Vehicle Model (listbox). TEXT_LABEL_31 szVehicleModel[60] TRI_VehicleModel_Populate(szVehicleModel) TRI_Widget_Listbox_Setup(Racers.VehicleModel, "Racer Vehicle Model", szVehicleModel) // Setup Relative Move Mode (listbox). TEXT_LABEL_31 szRelMode[5] szRelMode[0] = "Camera Relative" szRelMode[1] = "Ground Relative" szRelMode[2] = "Racer Prev Relative" szRelMode[3] = "Racer Next Relative" szRelMode[4] = "Gate Selection Relative" TRI_Widget_Listbox_Setup(Racers.RelMode, "Relative Move Mode", szRelMode) // Setup Relative Move Absolute (toggle). TRI_Widget_Toggle_Setup(Racers.RelAbs, "Relative Move Absolute") // Setup Relative Move XYZ (vector). TRI_Widget_Vector_Setup(Racers.RelMove, "Racer Relative Move", -100.0, 100.0, 0.1) // Init Racers Queue. TRI_Widget_Racers_Queue_Init(Racers) // Close Racers widget group. STOP_WIDGET_GROUP() ENDPROC FUNC BOOL TRI_Widget_Racers_Update(TRI_WIDGET_RACERS& Racers, TRI_RACE_STRUCT& Race, TRI_CAMERA_STRUCT& Camera, INT iGateSel) //DEBUG_MESSAGE("TRI_Widget_Racers_Update") // Update all TRI_ Widget Racers controls. TRI_Widget_Racers_Create_Update(Racers, Race, Camera) TRI_Widget_Racers_Delete_Update(Racers, Race) TRI_Widget_Racers_ShowAll_Update(Racers, Race) TRI_Widget_Racers_Selection_Update(Racers, Race, Camera) TRI_Widget_Racers_Name_Update(Racers, Race) TRI_Widget_Racers_Position_Update(Racers, Race, Camera) TRI_Widget_Racers_Heading_Update(Racers, Race) TRI_Widget_Racers_DriverType_Update(Racers, Race) TRI_Widget_Racers_DriverModel_Update(Racers, Race) TRI_Widget_Racers_VehicleModel_Update(Racers, Race) TRI_Widget_Racers_RelMove_Update(Racers, Race, Camera, iGateSel) // Update Racers Queue. TRI_Widget_Racers_Queue_Update(Racers, Race) // Update TRI_ Widget Racers still running. RETURN TRUE ENDFUNC PROC TRI_Widget_Racers_Cleanup(TRI_WIDGET_RACERS& Racers) //DEBUG_MESSAGE("TRI_Widget_Racers_Cleanup") TRI_Widget_Delete_Widget_Group(Racers.GroupID) ENDPROC // ----------------------------------- // RACE HELPER PROCS/FUNCTIONS // ----------------------------------- FUNC BOOL TRI_Widget_Race_Name_Qualify(TRI_WIDGET_RACE& Race) //DEBUG_MESSAGE("TRI_Widget_Race_Name_Qualify") TEXT_LABEL_31 szName = TRI_Widget_Textbox_Get(Race.Name) IF IS_STRING_EMPTY(szName) TEXT_LABEL_31 szFileName = TRI_Widget_Textbox_Get(Race.FileName) IF NOT IS_STRING_EMPTY(szFileName) TRI_Widget_Textbox_Set(Race.Error, "Name Invalid! Used FileName!") TRI_Widget_Textbox_Set(Race.Name, szFileName) ELSE DEBUG_MESSAGE("TRI_Widget_Race_Name_Qualify: Name invalid!") TRI_Widget_Textbox_Set(Race.Error, "Name Invalid! Try Again!") TRI_Widget_Textbox_Set(Race.Name, "") RETURN FALSE ENDIF ENDIF RETURN TRUE ENDFUNC #IF IS_DEBUG_BUILD FUNC BOOL TRI_Widget_Race_FileName_Qualify(TRI_WIDGET_RACE& Race) //DEBUG_MESSAGE("TRI_Widget_Race_FileName_Qualify") TEXT_LABEL_31 szFileName = TRI_Widget_Textbox_Get(Race.FileName) IF IS_STRING_EMPTY(szFileName) TEXT_LABEL_31 szName = TRI_Widget_Textbox_Get(Race.Name) IF NOT IS_STRING_EMPTY(szName) TRI_Widget_Textbox_Set(Race.Error, "FileName Invalid! Used Name!") TRI_Widget_Textbox_Set(Race.FileName, szName) ELSE DEBUG_MESSAGE("TRI_Widget_Race_FileName_Qualify: FileName invalid!") TRI_Widget_Textbox_Set(Race.Error, "FileName Invalid! Try Again!") TRI_Widget_Textbox_Set(Race.FileName, "") RETURN FALSE ENDIF ENDIF szFileName = TRI_FileName_MakeString(szFileName) TRI_Widget_Textbox_Set(Race.FileName, szFileName) RETURN TRUE ENDFUNC #ENDIF // ----------------------------------- // RACE MAIN PROCS/FUNCTIONS // ----------------------------------- PROC TRI_Widget_Race_Setup(TRI_WIDGET_RACE& Race) //DEBUG_MESSAGE("TRI_Widget_Race_Setup") // Create Race widget group. Race.GroupID = START_WIDGET_GROUP("Race") // Setup Race Error (textbox). TRI_Widget_Textbox_Setup(Race.Error, "Race Error", "Race Errors Show Up Here!") // Setup Race Time (float) (set newest race). // TODO: Not sure how to do a time widget. Hold off for now... //TRI_Widget_Float_Setup(Race.Time, "Race Time", 0.0, 100.0, 0.01) // Setup Race Name (textbox) (set newest race). TRI_Widget_Textbox_Setup(Race.Name, "Race Name", TRI_Master.szRaceName[TRI_Master.iRaceCnt]) // Setup Race FileName (textbox) (set newest race). TRI_Widget_Textbox_Setup(Race.FileName, "Race FileName", TRI_Master.szRaceFileName[TRI_Master.iRaceCnt]) // Setup Create Race (button). TRI_Widget_Button_Setup(Race.Create, "Create Race") // Setup Pick Race (listbox) (set newest race). TRI_Widget_Listbox_Setup(Race.Pick, "Pick Race", TRI_Master.szRaceFileName, TRI_Master.iRaceCur) // TRI_Master.iRaceCnt - 1) // Setup Load Race (button) (set to auto-load). TRI_Widget_Button_Setup(Race.Load, "Load Race", TRUE) // Setup Save Race (button). TRI_Widget_Button_Setup(Race.Save, "Save Race") // Setup Export Race (button). TRI_Widget_Button_Setup(Race.Export, "Export Race") // Setup Gates widget group. TRI_Widget_Gates_Setup(Race.Gates) // Setup Racers widget group. TRI_Widget_Racers_Setup(Race.Racers) // Close Race widget group. STOP_WIDGET_GROUP() ENDPROC FUNC BOOL TRI_Widget_Race_Update(TRI_WIDGET_RACE& Race, TRI_CAMERA_STRUCT& Camera) //DEBUG_MESSAGE("TRI_Widget_Race_Update") // Update Race Name (textbox). #IF IS_DEBUG_BUILD IF TRI_Widget_Textbox_Check(Race.Name) //DEBUG_MESSAGE("TRI_Widget_Race_Update: Name") // Qualify Race Name (textbox). TRI_Widget_Race_Name_Qualify(Race) ENDIF // Otherwise, update Race FileName (textbox). IF TRI_Widget_Textbox_Check(Race.FileName) //DEBUG_MESSAGE("TRI_Widget_Race_Update: FileName") // Qualify Race FileName (textbox). TRI_Widget_Race_FileName_Qualify(Race) ENDIF // Otherwise, update Create Race (button). IF TRI_Widget_Button_Check(Race.Create) //DEBUG_MESSAGE("TRI_Widget_Race_Update: Create") // Reset Create Race (button). TRI_Widget_Button_Reset(Race.Create) // Qualify Race FileName (textbox). IF NOT TRI_Widget_Race_FileName_Qualify(Race) RETURN TRUE ENDIF // Add race filename/name to master list (check for errors). TEXT_LABEL_31 szRaceFileName = TRI_Widget_Textbox_Get(Race.FileName) // TEXT_LABEL_31 szRaceName = TRI_Widget_Textbox_Get(Race.Name) INT iRaceIndex = ENUM_TO_INT(eCurrentTriRace) //TRI_Master_Add_Race(szRaceFileName, szRaceName) IF (iRaceIndex = -2) DEBUG_MESSAGE("TRI_Widget_Race_Update: Race FileName duplicate!") TRI_Widget_Textbox_Set(Race.Error, "FileName Duplicate! Try Again!") RETURN TRUE ELIF (iRaceIndex = -1) DEBUG_MESSAGE("TRI_Widget_Race_Update: Race limit reached!") TRI_Widget_Textbox_Set(Race.Error, "Race Limit Reached! Up Limit!") RETURN TRUE ENDIF // Create race (makes new XML/SCH files). IF NOT TRI_Race_Create(Race.Race, szRaceFileName) DEBUG_MESSAGE("TRI_Widget_Race_Update: Race create failed!") TRI_Widget_Textbox_Set(Race.Error, "Race Create Failed! Try Again!") RETURN TRUE ENDIF // Save master XML file and reset TRI_ Widget Race. TRI_Master_Save() RETURN FALSE // Otherwise, update Pick Race (listbox). ELIF TRI_Widget_Listbox_Check(Race.Pick) //DEBUG_MESSAGE("TRI_Widget_Race_Update: Pick") // Reset Pick Race (listbox). TRI_Widget_Listbox_Reset(Race.Pick) // Set Load Race (button) to auto-load. TRI_Widget_Button_Set(Race.Load, TRUE) // Otherwise, update Load Race (button). ELIF TRI_Widget_Button_Check(Race.Load) //DEBUG_MESSAGE("TRI_Widget_Race_Update: Load") // Reset Load Race (button). TRI_Widget_Button_Reset(Race.Load) // Load selected race from XML file. INT iRaceSel = TRI_Widget_Listbox_Get(Race.Pick) IF NOT TRI_Race_Load(Race.Race, TRI_Master.szRaceFileName[iRaceSel]) DEBUG_MESSAGE("TRI_Widget_Race_Update: Race load failed!") TRI_Widget_Textbox_Set(Race.Error, "Race Load Failed! Try Again!") RETURN TRUE ENDIF // Set Race Time/Name/FileName using newly loaded race info. // TODO: Not sure how to do a time widget. Hold off for now... //TRI_Widget_Float_Set(Race.Time, TRI_Master.fRaceTime[iRaceSel]) TRI_Widget_Textbox_Set(Race.Name, TRI_Master.szRaceName[iRaceSel]) TRI_Widget_Textbox_Set(Race.FileName, TRI_Master.szRaceFileName[iRaceSel]) // Reset Selected Gate and update related widget fields. iSelectedGateToDirty = -1 //will force gate selection to 0 //TRI_Widget_Int_Set(Race.Gates.Selection, 0) TRI_Widget_Gates_Sel_Update_All(Race.Gates, Race.Race) // If Show All Gates is on, do just that. // TODO: Think about making into a function. IF TRI_Widget_Toggle_Get(Race.Gates.ShowAll) //TRI_Race_Gate_Activate_All(Race.Race, TRUE) // Otherwise, activate only Selected Gate. ELSE TRI_Race_Gate_Deactivate_All(Race.Race) //TRI_Widget_Gates_Sel_Act(Race.Gates, Race.Race) ENDIF // Reset Selected Racer and update related widget fields. TRI_Widget_Int_Set(Race.Racers.Selection, 0) TRI_Widget_Racers_Sel_Update_All(Race.Racers, Race.Race) // If Show All Racers is on, do just that. // TODO: Think about making into a function. IF TRI_Widget_Toggle_Get(Race.Racers.ShowAll) TRI_Widget_Racers_All_Act(Race.Racers, Race.Race, FALSE) // Otherwise, activate only Selected Racer. ELSE TRI_Widget_Racers_All_DeAct(Race.Racers, Race.Race, TRUE) TRI_Widget_Racers_Sel_Act(Race.Racers, Race.Race, FALSE) ENDIF // Have camera interp to Selected Gate/Racer, if needed. VECTOR vFocusPos = <<0.0, 0.0, 0.0>> IF (Camera.eFocus = TRI_CAMERA_FOCUS_GATES) vFocusPos = Race.Race.sGate[0].vPos ELIF (Camera.eFocus = TRI_CAMERA_FOCUS_RACERS) vFocusPos = Race.Race.Racer[0].vStartPos ENDIF TRI_Camera_Interp(Camera, vFocusPos, FALSE) // Otherwise, update Save Race (button). ELIF TRI_Widget_Button_Check(Race.Save) //DEBUG_MESSAGE("TRI_Widget_Race_Update: Save") // Reset Save Race (button). TRI_Widget_Button_Reset(Race.Save) // Save selected race to XML file. INT iRaceSel = TRI_Widget_Listbox_Get(Race.Pick) TRI_Race_Save(Race.Race, TRI_Master.szRaceFileName[iRaceSel]) // Otherwise, update Export Race (button). ELIF TRI_Widget_Button_Check(Race.Export) //DEBUG_MESSAGE("TRI_Widget_Race_Update: Export") // Reset Export Race (button). TRI_Widget_Button_Reset(Race.Export) // Export selected race to SCH file. INT iRaceSel = TRI_Widget_Listbox_Get(Race.Pick) TRI_Race_Export(Race.Race, TRI_Master.szRaceFileName[iRaceSel]) ENDIF #ENDIF // Update joystick selection controls. // D-Pad Down - Set Selected Gate/Racer (begin). IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_DOWN) IF (Camera.eFocus = TRI_CAMERA_FOCUS_GATES) TRI_Widget_Gates_Sel_Beg(Race.Gates) ELIF (Camera.eFocus = TRI_CAMERA_FOCUS_RACERS) TRI_Widget_Racers_Sel_Beg(Race.Racers) ENDIF // D-Pad Up - Set Selected Gate/Racer (end). ELIF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_UP) IF (Camera.eFocus = TRI_CAMERA_FOCUS_GATES) TRI_Widget_Gates_Sel_End(Race.Gates, Race.Race) ELIF (Camera.eFocus = TRI_CAMERA_FOCUS_RACERS) TRI_Widget_Racers_Sel_End(Race.Racers, Race.Race) ENDIF // D-Pad Left - Decrement Selected Gate/Racer (wrapping). ELIF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_LEFT) IF (Camera.eFocus = TRI_CAMERA_FOCUS_GATES) TRI_Widget_Gates_Sel_Dec(Race.Gates, Race.Race) ELIF (Camera.eFocus = TRI_CAMERA_FOCUS_RACERS) TRI_Widget_Racers_Sel_Dec(Race.Racers, Race.Race) ENDIF // D-Pad Right - Increment Selected Gate/Racer (wrapping). ELIF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_RIGHT) IF (Camera.eFocus = TRI_CAMERA_FOCUS_GATES) TRI_Widget_Gates_Sel_Inc(Race.Gates, Race.Race) ELIF (Camera.eFocus = TRI_CAMERA_FOCUS_RACERS) TRI_Widget_Racers_Sel_Inc(Race.Racers, Race.Race) ENDIF // LT + RT - Create new gate after Selected Gate/Racer. ELIF (IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_LB) AND IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_RB)) OR (IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_RB) AND IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_LB)) IF (Camera.eFocus = TRI_CAMERA_FOCUS_GATES) TRI_Widget_Button_Set(Race.Gates.Create, TRUE) ELIF (Camera.eFocus = TRI_CAMERA_FOCUS_RACERS) TRI_Widget_Button_Set(Race.Racers.Create, TRUE) ENDIF ENDIF // Update Gates widget group. INT iRacerSel = TRI_Widget_Int_Get(Race.Racers.Selection) TRI_Widget_Gates_Update(Race.Gates, Race.Race, Camera, iRacerSel) // Update Racers widget group. INT iGateSel = TRI_Widget_Int_Get(Race.Gates.Selection) TRI_Widget_Racers_Update(Race.Racers, Race.Race, Camera, iGateSel) // Update TRI_ Widget Race still running. RETURN TRUE ENDFUNC PROC TRI_Widget_Race_Cleanup(TRI_WIDGET_RACE& Race) //DEBUG_MESSAGE("TRI_Widget_Race_Cleanup") TRI_Race_Gate_Deactivate_All(Race.Race) TRI_Widget_Racers_Cleanup(Race.Racers) TRI_Widget_Gates_Cleanup(Race.Gates) TRI_Widget_Delete_Widget_Group(Race.GroupID) ENDPROC // ----------------------------------- // RACEMODE PROCS/FUNCTIONS // ----------------------------------- PROC TRI_Widget_RaceMode_Setup(TRI_WIDGET_RACEMODE& RaceMode) //DEBUG_MESSAGE("TRI_Widget_RaceMode_Setup") // Create Race Mode widget group. RaceMode.GroupID = START_WIDGET_GROUP("Race Mode") // TODO: Setup Race Mode widgets here... // Close Race Mode widget group. STOP_WIDGET_GROUP() ENDPROC FUNC BOOL TRI_Widget_RaceMode_Update(TRI_WIDGET_RACEMODE& RaceMode) //DEBUG_MESSAGE("TRI_Widget_RaceMode_Update") UNUSED_PARAMETER(RaceMode) // Update TRI_ Widget Race Mode still running. RETURN TRUE ENDFUNC PROC TRI_Widget_RaceMode_Cleanup(TRI_WIDGET_RACEMODE& RaceMode) //DEBUG_MESSAGE("TRI_Widget_RaceMode_Cleanup") TRI_Widget_Delete_Widget_Group(RaceMode.GroupID) ENDPROC // ----------------------------------- // EDITMODE PROCS/FUNCTIONS // ----------------------------------- PROC TRI_Widget_EditMode_Setup(TRI_WIDGET_EDITMODE& EditMode) //DEBUG_MESSAGE("TRI_Widget_EditMode_Setup") // Create Edit Mode widget group. EditMode.GroupID = START_WIDGET_GROUP("Edit Mode") // Setup Camera Mode (listbox). TEXT_LABEL_31 szCamMode[3] szCamMode[0] = "Gameplay Mode" szCamMode[1] = "Free Mode" szCamMode[2] = "Fly-Through Mode" TRI_Widget_Listbox_Setup(EditMode.CamMode, "Camera Mode", szCamMode) // Setup Camera Focus (listbox). TEXT_LABEL_31 szCamFocus[2] szCamFocus[0] = "Gates Focus" szCamFocus[1] = "Racers Focus" TRI_Widget_Listbox_Setup(EditMode.CamFocus, "Camera Focus", szCamFocus) // Close Edit Mode widget group. STOP_WIDGET_GROUP() // Setup Race widget group. TRI_Widget_Race_Setup(EditMode.Race) // Setup Edit Mode camera. TRI_Camera_Setup(EditMode.Camera) ENDPROC FUNC BOOL TRI_Widget_EditMode_Update(TRI_WIDGET_EDITMODE& EditMode) //DEBUG_MESSAGE("TRI_Widget_EditMode_Update") // Get camera focus position for Selected Gate/Racer. VECTOR vFocusPos = <<0.0, 0.0, 0.0>> INT iCamFocus = TRI_Widget_Listbox_Get(EditMode.CamFocus) TRI_CAMERA_FOCUS_ENUM eCamFocus = INT_TO_ENUM(TRI_CAMERA_FOCUS_ENUM, iCamFocus) IF (eCamFocus = TRI_CAMERA_FOCUS_GATES) INT iGateSel = TRI_Widget_Gates_Sel_Get(EditMode.Race.Gates) vFocusPos = EditMode.Race.Race.sGate[iGateSel].vPos ELIF (eCamFocus = TRI_CAMERA_FOCUS_RACERS) INT iRacerSel = TRI_Widget_Racers_Sel_Get(EditMode.Race.Racers) vFocusPos = EditMode.Race.Race.Racer[iRacerSel].vStartPos ENDIF // Update Camera Mode (listbox). IF TRI_Widget_Listbox_Check(EditMode.CamMode) //DEBUG_MESSAGE("TRI_Widget_EditMode_Update: CamMode") // Reset Camera Mode (listbox). TRI_Widget_Listbox_Reset(EditMode.CamMode) // Set camera to new mode for Selected Gate/Racer. INT iCamMode = TRI_Widget_Listbox_Get(EditMode.CamMode) TRI_CAMERA_MODE_ENUM eCamMode = INT_TO_ENUM(TRI_CAMERA_MODE_ENUM, iCamMode) TRI_Camera_Mode_Set(EditMode.Camera, eCamMode, vFocusPos) // Otherwise, update Camera Focus (listbox). ELIF TRI_Widget_Listbox_Check(EditMode.CamFocus) //DEBUG_MESSAGE("TRI_Widget_EditMode_Update: CamFocus") // Reset Camera Focus (listbox). TRI_Widget_Listbox_Reset(EditMode.CamFocus) // Set camera to new focus for Selected Gate/Racer. iCamFocus = TRI_Widget_Listbox_Get(EditMode.CamFocus) eCamFocus = INT_TO_ENUM(TRI_CAMERA_FOCUS_ENUM, iCamFocus) IF (eCamFocus = TRI_CAMERA_FOCUS_GATES) INT iGateSel = TRI_Widget_Gates_Sel_Get(EditMode.Race.Gates) vFocusPos = EditMode.Race.Race.sGate[iGateSel].vPos ELIF (eCamFocus = TRI_CAMERA_FOCUS_RACERS) INT iRacerSel = TRI_Widget_Racers_Sel_Get(EditMode.Race.Racers) vFocusPos = EditMode.Race.Race.Racer[iRacerSel].vStartPos ENDIF TRI_Camera_Focus_Set(EditMode.Camera, eCamFocus, vFocusPos) ENDIF // Update Race widget group, reset TRI_ Widget Edit Mode, if needed. IF NOT TRI_Widget_Race_Update(EditMode.Race, EditMode.Camera) RETURN FALSE ENDIF // Have camera update around Selected Gate. TRI_Camera_Update(EditMode.Camera, EditMode.Input, vFocusPos) // Update TRI_ Widget Edit Mode still running. RETURN TRUE ENDFUNC PROC TRI_Widget_EditMode_Cleanup(TRI_WIDGET_EDITMODE& EditMode) //DEBUG_MESSAGE("TRI_Widget_EditMode_Cleanup") TRI_Camera_Cleanup(EditMode.Camera) TRI_Widget_Race_Cleanup(EditMode.Race) TRI_Widget_Delete_Widget_Group(EditMode.GroupID) ENDPROC // ----------------------------------- // MAIN PROCS/FUNCTIONS // ----------------------------------- PROC TRI_Widget_Main_Setup(TRI_WIDGET_MAIN& Main) //DEBUG_MESSAGE("TRI_Widget_Main_Setup") // Create Main widget group. Main.GroupID = START_WIDGET_GROUP("Single Player Races") // Setup TRI_ Mode (listbox). TEXT_LABEL_31 szTRIMode[2] szTRIMode[0] = "Race Mode" szTRIMode[1] = "Edit Mode" TRI_Widget_Listbox_Setup(Main.TRIMode, "TRI_ Mode", szTRIMode) // Close Main widget group. STOP_WIDGET_GROUP() ENDPROC //PROC SETUP_TRI_INTESITY_WIDGETS() // START_WIDGET_GROUP("Triathlon Intensity & Drain") // ADD_WIDGET_FLOAT_SLIDER("BIKE_INTENSITY_INCREASE_RATE", BIKE_INTENSITY_INCREASE_RATE, 0, 1000, 0.1) // ADD_WIDGET_FLOAT_SLIDER("BIKE_INTENSITY_DECREASE_RATE", BIKE_INTENSITY_DECREASE_RATE, 0, 1000, 0.1) // ADD_WIDGET_FLOAT_SLIDER("BIKE_WAIT_BEFORE_COOLDOWN", BIKE_WAIT_BEFORE_COOLDOWN, 0, 5, 0.01) // ADD_WIDGET_FLOAT_SLIDER("SWIM_INTENSITY_INCREASE_EMPTY", SWIM_INTENSITY_INCREASE_EMPTY, 0, 1000, 0.1) // ADD_WIDGET_FLOAT_SLIDER("SWIM_INTENSITY_INCREASE_GREEN", SWIM_INTENSITY_INCREASE_GREEN, 0, 1000, 0.1) // ADD_WIDGET_FLOAT_SLIDER("SWIM_INTENSITY_INCREASE_YRF", SWIM_INTENSITY_INCREASE_YRF, 0, 1000, 0.1) // ADD_WIDGET_FLOAT_SLIDER("SWIM_INTENSITY_DECREASE_GREEN", SWIM_INTENSITY_DECREASE_GREEN, 0, 1000, 0.1) // ADD_WIDGET_FLOAT_SLIDER("SWIM_INTENSITY_DECREASE_YRF", SWIM_INTENSITY_DECREASE_YRF, 0, 1000, 0.1) // STOP_WIDGET_GROUP() //ENDPROC PROC SETUP_TRI_ENERGY_WIDGETS() // START_WIDGET_GROUP("Triathlon Energy & Drain") // ADD_WIDGET_FLOAT_SLIDER("GREEN_ENERGY_DRAIN", GREEN_ENERGY_DRAIN, 0, 1000, 0.01) // ADD_WIDGET_FLOAT_SLIDER("YELLOW_ENERGY_DRAIN", YELLOW_ENERGY_DRAIN, 0, 1000, 0.01) // ADD_WIDGET_FLOAT_SLIDER("RED_ENERGY_DRAIN", RED_ENERGY_DRAIN, 0, 1000, 0.01) // ADD_WIDGET_FLOAT_SLIDER("MAX_ENERGY_DRAIN", MAX_ENERGY_DRAIN, 0, 1000, 0.01) // ADD_WIDGET_FLOAT_SLIDER("GREEN_TO_YELLOW_SHIFT", GREEN_TO_YELLOW_SHIFT, 0, 1, 0.01) // ADD_WIDGET_FLOAT_SLIDER("YELLOW_TO_RED_SHIFT", YELLOW_TO_RED_SHIFT, 0, 1, 0.01) // ADD_WIDGET_FLOAT_SLIDER("ENERGY_EMPTY_REPLENISH_WAIT", ENERGY_EMPTY_REPLENISH_WAIT, 0, 10, 0.1) // ADD_WIDGET_FLOAT_SLIDER("ENERGY_EMPTY_REPLENISH_BOOST", ENERGY_EMPTY_REPLENISH_BOOST, 0, 1, 0.01) // ADD_WIDGET_FLOAT_SLIDER("ENERGY_EMPTY_REPLENISH_RATE", ENERGY_EMPTY_REPLENISH_RATE, 0, 1, 0.01) // STOP_WIDGET_GROUP() ENDPROC PROC SETUP_TRI_SCAN_LINES_WIDGETS() // START_WIDGET_GROUP("Triathlon News Heli Scan Lines") // ADD_WIDGET_INT_SLIDER("TRI_NEWS_SCAN_LINES", TRI_NEWS_SCAN_LINES, 0, 200, 1) // STOP_WIDGET_GROUP() ENDPROC PROC SETUP_TRI_CHEERING_WIDGETS() START_WIDGET_GROUP("Triathlon Cheering") /* ADD_WIDGET_FLOAT_SLIDER("TRI_TIME_TO_CHEERING", TRI_TIME_TO_CHEERING, 0, 10, 0.1) ADD_WIDGET_FLOAT_SLIDER("TRI_CHEERING_PROB", TRI_CHEERING_PROB, 0, 1.0, 0.01) ADD_WIDGET_FLOAT_SLIDER("TRI_CHEERING_RANGE", TRI_CHEERING_RANGE, 0, 100, 1.0) ADD_WIDGET_FLOAT_SLIDER("TRI_TIME_TO_INTRO_CHATTER", TRI_TIME_TO_INTRO_CHATTER, 0, 10, 0.1) ADD_WIDGET_FLOAT_SLIDER("TRI_INTRO_CHATTER_PROB", TRI_INTRO_CHATTER_PROB, 0, 1.0, 0.01) */ STOP_WIDGET_GROUP() ENDPROC PROC SETUP_TRI_MENU_WIDGETS() START_WIDGET_GROUP("Triathlon Menu Widgets") /* ADD_WIDGET_FLOAT_SLIDER("MENU_OFFSET_1", MENU_OFFSET_1, -3, 3, 0.01) ADD_WIDGET_FLOAT_SLIDER("MENU_OFFSET_2", MENU_OFFSET_2, -3, 3, 0.01) ADD_WIDGET_FLOAT_SLIDER("MENU_OFFSET_3", MENU_OFFSET_3, -3, 3, 0.01) */ STOP_WIDGET_GROUP() ENDPROC PROC SETUP_TRI_QUIT_MENU_WIDGETS() START_WIDGET_GROUP( "Quit Delay" ) ADD_WIDGET_INT_SLIDER( "TRI_BLOCK_QUIT_INPUT_DURATION", TRI_BLOCK_QUIT_INPUT_DURATION, 0, 5000, 100 ) STOP_WIDGET_GROUP() ENDPROC // Only used when using the data driven method to adjust blocking area positions //#IF IS_DEBUG_BUILD //PROC SETUP_TRI_NAVMESH_WIDGETS() // TEXT_LABEL_23 txtLabel // // INT idx2 // START_WIDGET_GROUP("Triathlon Blocking Areas") // REPEAT COUNT_OF(TRI_Master.iNavBlockAreas) idx2 // txtLabel = "Nav block " // txtLabel += idx2 // txtLabel += " pos" // ADD_WIDGET_VECTOR_SLIDER(txtLabel, TRI_Master.vNavBlockPositions[idx2], -10000.0, 10000.0, 0.1) // txtLabel = "Nav block " // txtLabel += idx2 // txtLabel += " head" // ADD_WIDGET_FLOAT_SLIDER(txtLabel, TRI_Master.fNavBlockHeadings[idx2], -360.0, 360.0, 0.0349) // ADD_WIDGET_STRING("") // ENDREPEAT // STOP_WIDGET_GROUP() //ENDPROC //#ENDIF #IF IS_DEBUG_BUILD PROC SETUP_TRI_BANNER_WIDGETS() START_WIDGET_GROUP("Triathlon Banners") ADD_WIDGET_BOOL("Turn on to cheat and set banners", IS_CHEATING_ENABLED) ADD_WIDGET_FLOAT_SLIDER("TEST_HEADING", TEST_HEADING, 0, 360, 1) ADD_WIDGET_VECTOR_SLIDER("TEST_VECTOR_1", TEST_VECTOR_1, -10000, 10000, 0.01) ADD_WIDGET_VECTOR_SLIDER("TEST_VECTOR_2", TEST_VECTOR_2, -10000, 10000, 0.01) STOP_WIDGET_GROUP() ENDPROC PROC SETUP_TRI_AI_FINISH_HEADING_WIDGETS() START_WIDGET_GROUP("Tri AI Finish Heading Widgets") ADD_WIDGET_FLOAT_SLIDER("TRI_AI_FINISH_HEADING_ADJUST", TRI_AI_FINISH_HEADING_ADJUST, 0, 180, 1.0) STOP_WIDGET_GROUP() ENDPROC #ENDIF PROC SETUP_KITS_BAG_WIDGETS() // START_WIDGET_GROUP("Triathlon Kits Bag") // ADD_WIDGET_FLOAT_SLIDER("KITS_BAG_HEIGHT", KITS_BAG_HEIGHT, -1, 1, 0.01) // STOP_WIDGET_GROUP() ENDPROC PROC TRI_Widget_Main_Setup_TRI(TRI_WIDGET_MAIN& Main) //DEBUG_MESSAGE("TRI_Widget_Main_Setup") // Create Main widget group. Main.GroupID = START_WIDGET_GROUP("Single Player Races") // Setup TRI_ Mode (listbox). TEXT_LABEL_31 szTRIMode[2] szTRIMode[0] = "Race Mode" szTRIMode[1] = "Edit Mode" TRI_Widget_Listbox_Setup(Main.TRIMode, "TRI_ Mode", szTRIMode) // SETUP_TRI_INTESITY_WIDGETS() SETUP_TRI_ENERGY_WIDGETS() SETUP_TRI_BANNER_WIDGETS() SETUP_TRI_AI_FINISH_HEADING_WIDGETS() //SETUP_TRI_NAVMESH_WIDGETS() SETUP_TRI_SCAN_LINES_WIDGETS() SETUP_KITS_BAG_WIDGETS() SETUP_TRI_CHEERING_WIDGETS() SETUP_TRI_MENU_WIDGETS() SETUP_TRI_QUIT_MENU_WIDGETS() // Close Main widget group. STOP_WIDGET_GROUP() ENDPROC FUNC BOOL TRI_Widget_Main_Update(TRI_WIDGET_MAIN& Main) //DEBUG_MESSAGE("TRI_Widget_Main_Update") // Update TRI_ Mode (listbox). IF TRI_Widget_Listbox_Check(Main.TRIMode) //DEBUG_MESSAGE("TRI_Widget_Main_Update: TRIMode") // Reset TRI_ Mode (listbox). TRI_Widget_Listbox_Reset(Main.TRIMode) // If TRI_ Mode is Race, setup Race Mode. SET_CURRENT_WIDGET_GROUP(Main.GroupID) IF (TRI_Widget_Listbox_Get(Main.TRIMode) = 0) TRI_Widget_EditMode_Cleanup(Main.EditMode) TRI_Widget_RaceMode_Setup(Main.RaceMode) // Otherwise, TRI_ Mode is Edit, setup Edit Mode. ELSE TRI_Widget_RaceMode_Cleanup(Main.RaceMode) TRI_Widget_EditMode_Setup(Main.EditMode) ENDIF CLEAR_CURRENT_WIDGET_GROUP(Main.GroupID) // Update TRI_ Widget Main finished. RETURN FALSE ENDIF // If TRI_ Mode is Race, update Race Mode. IF (TRI_Widget_Listbox_Get(Main.TRIMode) = 0) TRI_Widget_RaceMode_Update(Main.RaceMode) // Otherwise, TRI_ Mode is Edit, update Edit Mode. ELIF NOT TRI_Widget_EditMode_Update(Main.EditMode) SET_CURRENT_WIDGET_GROUP(Main.GroupID) TRI_Widget_EditMode_Cleanup(Main.EditMode) TRI_Widget_EditMode_Setup(Main.EditMode) CLEAR_CURRENT_WIDGET_GROUP(Main.GroupID) ENDIF // Update TRI_ Widget Main still running. RETURN TRUE ENDFUNC PROC TRI_Widget_Main_Cleanup(TRI_WIDGET_MAIN& Main) //DEBUG_MESSAGE("TRI_Widget_Main_Cleanup") SET_CURRENT_WIDGET_GROUP(Main.GroupID) IF (TRI_Widget_Listbox_Get(Main.TRIMode) != 0) TRI_Widget_EditMode_Cleanup(Main.EditMode) ELSE TRI_Widget_RaceMode_Cleanup(Main.RaceMode) ENDIF CLEAR_CURRENT_WIDGET_GROUP(Main.GroupID) TRI_Widget_Delete_Widget_Group(Main.GroupID) ENDPROC #ENDIF // IS_DEBUG_BUILD // END OF FILE! DO NOT ADD ANYTHING BELOW THIS LINE!