thug/Code/Sk/Modules/Skate/score.h

304 lines
10 KiB
C
Raw Normal View History

2016-02-13 21:39:12 +00:00
/*****************************************************************************
** **
** Neversoft Entertainment. **
** **
** Copyright (C) 2001 - All Rights Reserved **
** **
******************************************************************************
** **
** Project: **
** **
** Module: **
** **
** File name: **
** **
** Created by: rjm, 1/23/2001 **
** **
** Description: **
** **
*****************************************************************************/
#ifndef __MODULES_SKATE_SCORE_H
#define __MODULES_SKATE_SCORE_H
#include <core/defines.h>
#include <core/lookuptable.h>
#include <core/dynamictable.h>
#include <gel/scripting/vecpair.h>
#include <gel/scripting/array.h>
#include <gfx/Image/ImageBasic.h>
/*****************************************************************************
** Includes **
*****************************************************************************/
/*****************************************************************************
** Defines **
*****************************************************************************/
namespace Net
{
class Conn;
class MsgHandlerContext;
}
namespace Mdl
{
/*****************************************************************************
** Class Definitions **
*****************************************************************************/
/*****************************************************************************
** Private Declarations **
*****************************************************************************/
/*****************************************************************************
** Private Prototypes **
*****************************************************************************/
/*****************************************************************************
** Public Declarations **
*****************************************************************************/
/*****************************************************************************
** Public Prototypes **
*****************************************************************************/
/*****************************************************************************
** Inline Functions **
*****************************************************************************/
/******************************************************************/
/* */
/* */
/******************************************************************/
class Score : public Spt::Class
{
public:
typedef uint32 Flags;
enum
{
vBLOCKING = nBit(1),
vSWITCH = nBit(2),
vNOLLIE = nBit(3),
vGAP = nBit(4),
vSPECIAL = nBit(5),
vNODEGRADE = nBit(6),
vCAT = nBit(7),
};
enum
{
MAX_ROBOT_NODES = 2500
};
Score();
~Score();
void Update();
void SetSkaterId(short skater_id);
void SetTotalScore( int score );
int GetTotalScore();
int GetLastScoreLanded() {return m_recentScorePot;}
int GetScorePotValue() {return m_scorePot * m_currentMult;} // current pot value
bool GetSpecialState() {return m_specialIsActive;}
void ForceSpecial( void );
uint32 GetLastTrickId(); // Added by Ken
uint32 GetTrickId( int trickIndex );
void TrickTextPulse(int index); // Added by Ken so that replay can use it
void TrickTextCountdown(int index); // Added by Ken so that replay can use it
void TrickTextLanded(int index); // Added by Ken so that replay can use it
void TrickTextBail(int index); // Added by Ken so that replay can use it
void Trigger(char *trick_name, int base_score, Flags flags = 0);
void SetSpin(int spin_degrees );
void UpdateSpin(int spin_degrees );
void TweakTrick(int tweak_value );
void Land( void );
void Bail( bool clearScoreText = false );
void Reset();
Net::Conn* GetAssociatedNetworkConnection( void );
void LogTrickObject( int skater_id, int score, uint32 num_pending_tricks, uint32* p_pending_tricks, bool propagate );
void LogTrickObjectRequest( int score );
void SetBalanceMeter(bool state, float value = 0.0f);
void SetManualMeter(bool state, float value = 0.0f);
void RepositionMeters( void );
int GetNumberOfNonGapTricks();
bool IsLatestTrickByName( uint32 trick_text_checksum, int spin_mult, bool require_perfect, int num_taps );
bool IsLatestTrick( uint32 key_combo, int spin_mult, bool require_perfect, int num_taps );
// counting occurrences of trick
int GetPreviousNumberOfOccurrencesByName( uint32 trickTextChecksum, int spin_degrees = 0, int num_taps = 1 );
int GetPreviousNumberOfOccurrences( uint32 trick_checksum, int spin_degrees = 0, int num_taps = 1 );
// int GetPreviousNumberOfOccurrences( Script::CArray* pTricks );
int GetCurrentNumberOfOccurrencesByName( uint32 trickTextChecksum, int spin_degrees = 0, bool require_perfect = false, int num_taps = 1 );
int GetCurrentNumberOfOccurrences( uint32 trick_checksum, int spin_degrees = 0, bool require_perfect = false, int num_taps = 1 );
int GetCurrentNumberOfOccurrences( Script::CArray* pTricks, int start_trick_index = 0 );
bool VerifyTrickMatch( int info_tab_index, uint32 trick_checksum, int spin_degrees = 0, bool require_perfect = false );
int CountTrickMatches( uint32 trick_checksum, int spin_degrees = 0, bool require_perfect = false );
int CountStringMatches( const char* string );
int GetCurrentTrickCount() { return m_currentTrick; }
int GetCurrentMult() { return m_currentMult; }
// track the best and longest combos
int GetLongestCombo() { return m_longestCombo; }
int GetBestCombo() { return m_bestCombo; }
void SetBestCombo( int best_combo ) { m_bestCombo = best_combo; }
void ResetComboRecords();
void setSpecialBarColors();
bool TrickIsGap( int trickIndex );
static int s_handle_score_message ( Net::MsgHandlerContext* context );
void UpdateRobotDetection(int node);
float GetRobotMult();
float GetRobotRailMult() {return m_robot_rail_mult;}
private:
void reset_robot_detection();
void reset_robot_detection_combo();
int get_packed_score( int start, int end );
void pack_trick_info_table();
void print_trick_info_table();
void copy_trick_name_with_special_spaces(char *pOut, const char *pIn);
void captureScore();
void resetScorePot();
void dispatch_trick_sequence_to_screen(bool clear_text=false);
int spinMult(int x);
int deprecMult(int x);
void setup_balance_meter_stuff();
void position_balance_meter(bool state, float value, bool isVertical);
void dispatch_score_pot_value_to_screen(int score, int multiplier);
void check_high_score(int old_score, int new_score);
void set_special_is_active ( bool is_active );
short m_skaterId;
enum EScorePotState
{
SHOW_ACTUAL_SCORE_POT,
WAITING_TO_COUNT_SCORE_POT,
SHOW_COUNTED_SCORE_POT,
};
int m_totalScore;
EScorePotState m_scorePotState;
int m_scorePot;
int m_countedScorePot;
int m_scorePotCountdown;
int m_recentScorePot;
int m_recentSpecialScorePot;
int m_longestCombo;
int m_bestCombo;
int m_bestGameCombo;
//HUD::TrickWindow* mp_trickWindow;
struct TrickHistory
{
uint32 id;
// there are 4 switch modes, so 4 entries
int total_count[4]; // done during session
int combo_count[4]; // done during combo
};
Lst::LookupTable<TrickHistory> m_historyTab;
struct TrickInfo
{
enum
{
TEXT_BUFFER_SIZE = 64,
};
int score;
int mult_index;
int spin_mult_index;
int spin_degrees;
uint32 id;
uint32 switch_mode;
Flags flags;
char trickNameText[TEXT_BUFFER_SIZE];
char trickTextFormatted[TEXT_BUFFER_SIZE];
};
// keeps track of tricks done in current sequence
Lst::DynamicTable<TrickInfo> m_infoTab;
int m_currentTrick; // Tricks cap out at 250
int m_currentMult; // but multiplier will keep going
// Indicates most recent blocking trick
int m_currentBlockingTrick;
// Most recent spin trick. Must come after a blocking trick.
// Can be a blocking trick itself, but will be treated differently
// if so.
int m_currentSpinTrick;
int m_specialScore;
bool m_specialIsActive;
enum
{
REGULAR_SPECIAL = 0,
SPECIAL_SPECIAL
};
Image::RGBA m_special_rgba[3];
float m_special_interpolator;
float m_special_interpolator_rate;
bool m_debug;
// Balance meter stuff -- here for now
int m_numArrowPositions;
Script::CPair m_arrowPosTab[20];
float m_arrowInterval;
Script::CPair m_arrowPos;
float m_arrowRot;
Script::CPair m_meterPos[2];
uint8 m_robot_detection_count[MAX_ROBOT_NODES];
uint8 m_robot_detection_count_combo[MAX_ROBOT_NODES];
int m_num_robot_landed;
int m_num_robot_landed_combo;
int m_num_robot_unique;
int m_num_robot_first_combo;
int m_num_robot_unique_combo;
float m_robot_rail_mult;
};
} // namespace Mdl
#endif // __MODULES_SKATE_SCORE_H