Merge branch 'master' of https://github.com/GTAmodding/re3
This commit is contained in:
@ -3,6 +3,9 @@
|
||||
#include "Sprite2d.h"
|
||||
#include "TxdStore.h"
|
||||
#include "Font.h"
|
||||
#ifdef BUTTON_ICONS
|
||||
#include "FileMgr.h"
|
||||
#endif
|
||||
|
||||
void
|
||||
AsciiToUnicode(const char *src, wchar *dst)
|
||||
@ -224,6 +227,12 @@ wchar foreign_table[128] = {
|
||||
0, 174, 165, 166, 167, 0, 168, 0, 0, 169, 170, 171, 172, 0, 0, 0,
|
||||
};
|
||||
|
||||
#ifdef BUTTON_ICONS
|
||||
CSprite2d CFont::ButtonSprite[MAX_BUTTON_ICONS];
|
||||
int CFont::PS2Symbol = BUTTON_NONE;
|
||||
int CFont::ButtonsSlot = -1;
|
||||
#endif // BUTTON_ICONS
|
||||
|
||||
void
|
||||
CFont::Initialise(void)
|
||||
{
|
||||
@ -286,6 +295,34 @@ CFont::Initialise(void)
|
||||
SetAlphaFade(255.0f);
|
||||
SetDropShadowPosition(0);
|
||||
CTxdStore::PopCurrentTxd();
|
||||
|
||||
#ifdef BUTTON_ICONS
|
||||
if (int file = CFileMgr::OpenFile("MODELS/X360BTNS.TXD")) {
|
||||
CFileMgr::CloseFile(file);
|
||||
ButtonsSlot = CTxdStore::AddTxdSlot("buttons");
|
||||
CTxdStore::LoadTxd(ButtonsSlot, "MODELS/X360BTNS.TXD");
|
||||
CTxdStore::AddRef(ButtonsSlot);
|
||||
CTxdStore::PushCurrentTxd();
|
||||
CTxdStore::SetCurrentTxd(ButtonsSlot);
|
||||
#if 0 // unused
|
||||
ButtonSprite[BUTTON_UP].SetTexture("up");
|
||||
ButtonSprite[BUTTON_DOWN].SetTexture("down");
|
||||
ButtonSprite[BUTTON_LEFT].SetTexture("left");
|
||||
ButtonSprite[BUTTON_RIGHT].SetTexture("right");
|
||||
#endif
|
||||
ButtonSprite[BUTTON_CROSS].SetTexture("cross");
|
||||
ButtonSprite[BUTTON_CIRCLE].SetTexture("circle");
|
||||
ButtonSprite[BUTTON_SQUARE].SetTexture("square");
|
||||
ButtonSprite[BUTTON_TRIANGLE].SetTexture("triangle");
|
||||
ButtonSprite[BUTTON_L1].SetTexture("l1");
|
||||
ButtonSprite[BUTTON_L2].SetTexture("l2");
|
||||
ButtonSprite[BUTTON_L3].SetTexture("l3");
|
||||
ButtonSprite[BUTTON_R1].SetTexture("r1");
|
||||
ButtonSprite[BUTTON_R2].SetTexture("r2");
|
||||
ButtonSprite[BUTTON_R3].SetTexture("r3");
|
||||
CTxdStore::PopCurrentTxd();
|
||||
}
|
||||
#endif // BUTTON_ICONS
|
||||
}
|
||||
|
||||
#ifdef MORE_LANGUAGES
|
||||
@ -334,6 +371,13 @@ CFont::ReloadFonts(uint8 set)
|
||||
void
|
||||
CFont::Shutdown(void)
|
||||
{
|
||||
#ifdef BUTTON_ICONS
|
||||
if (ButtonsSlot != -1) {
|
||||
for (int i = 0; i < MAX_BUTTON_ICONS; i++)
|
||||
ButtonSprite[i].Delete();
|
||||
CTxdStore::RemoveTxdSlot(ButtonsSlot);
|
||||
}
|
||||
#endif
|
||||
Sprite[0].Delete();
|
||||
Sprite[1].Delete();
|
||||
Sprite[2].Delete();
|
||||
@ -359,8 +403,34 @@ CFont::InitPerFrame(void)
|
||||
#endif
|
||||
SetDropShadowPosition(0);
|
||||
NewLine = 0;
|
||||
#ifdef BUTTON_ICONS
|
||||
PS2Symbol = BUTTON_NONE;
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef BUTTON_ICONS
|
||||
void
|
||||
CFont::DrawButton(float x, float y)
|
||||
{
|
||||
if (x <= 0.0f || x > SCREEN_WIDTH || y <= 0.0f || y > SCREEN_HEIGHT)
|
||||
return;
|
||||
|
||||
if (PS2Symbol != BUTTON_NONE) {
|
||||
CRect rect;
|
||||
rect.left = x;
|
||||
rect.top = Details.scaleY + Details.scaleY + y;
|
||||
rect.right = Details.scaleY * 17.0f + x;
|
||||
rect.bottom = Details.scaleY * 19.0f + y;
|
||||
|
||||
int vertexAlphaState;
|
||||
RwRenderStateGet(rwRENDERSTATEVERTEXALPHAENABLE, &vertexAlphaState);
|
||||
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void *)TRUE);
|
||||
ButtonSprite[PS2Symbol].Draw(rect, CRGBA(255, 255, 255, Details.color.a));
|
||||
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void *)vertexAlphaState);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
CFont::PrintChar(float x, float y, wchar c)
|
||||
{
|
||||
@ -642,7 +712,14 @@ CFont::GetNumberLines(float xstart, float ystart, wchar *s)
|
||||
y = ystart;
|
||||
|
||||
while(*s){
|
||||
#ifdef FIX_BUGS
|
||||
float f = Details.centre ? Details.centreSize :
|
||||
Details.rightJustify ? xstart - Details.rightJustifyWrap :
|
||||
Details.wrapX;
|
||||
#else
|
||||
float f = (Details.centre ? Details.centreSize : Details.wrapX);
|
||||
#endif
|
||||
|
||||
#ifdef MORE_LANGUAGES
|
||||
if (IsJapaneseFont())
|
||||
f -= SCREEN_SCALE_X(21.0f * 2.0f);
|
||||
@ -722,8 +799,15 @@ CFont::GetTextRect(CRect *rect, float xstart, float ystart, wchar *s)
|
||||
x = xstart;
|
||||
y = ystart;
|
||||
|
||||
#ifdef FIX_BUGS
|
||||
float xEnd = Details.centre ? Details.centreSize :
|
||||
Details.rightJustify ? xstart - Details.rightJustifyWrap :
|
||||
Details.wrapX;
|
||||
#else
|
||||
float xEnd = (Details.centre ? Details.centreSize : Details.wrapX);
|
||||
#endif
|
||||
while(*s){
|
||||
if(x + GetStringWidth(s) > (Details.centre ? Details.centreSize : Details.wrapX)){
|
||||
if(x + GetStringWidth(s) > xEnd){
|
||||
// reached end of line
|
||||
if(x > maxlength)
|
||||
maxlength = x;
|
||||
@ -833,6 +917,15 @@ CFont::PrintString(float x, float y, wchar *start, wchar *&end, float spwidth, f
|
||||
c = *s - ' ';
|
||||
if (Details.slant != 0.0f && !IsJapanese())
|
||||
y = (Details.slantRefX - x) * Details.slant + Details.slantRefY;
|
||||
|
||||
#ifdef BUTTON_ICONS
|
||||
if (PS2Symbol != BUTTON_NONE) {
|
||||
DrawButton(x, y);
|
||||
x += Details.scaleY * 17.0f;
|
||||
PS2Symbol = BUTTON_NONE;
|
||||
}
|
||||
#endif
|
||||
|
||||
PrintChar(x, y, c);
|
||||
x += GetCharacterSize(c);
|
||||
if (c == 0 && (!NewLine || !IsJapanese())) // space
|
||||
@ -860,6 +953,40 @@ CFont::PrintString(float x, float y, wchar *start, wchar *end, float spwidth)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef XBOX_SUBTITLES
|
||||
void
|
||||
CFont::PrintStringFromBottom(float x, float y, wchar *str)
|
||||
{
|
||||
#ifdef MORE_LANGUAGES
|
||||
if (IsJapaneseFont())
|
||||
y -= (32.0f * CFont::Details.scaleY / 2.75f + 2.0f * CFont::Details.scaleY) * GetNumberLines(x, y, str);
|
||||
else
|
||||
#endif
|
||||
y -= (32.0f * CFont::Details.scaleY * 0.5f + 2.0f * CFont::Details.scaleY) * GetNumberLines(x, y, str);
|
||||
PrintString(x, y, str);
|
||||
}
|
||||
|
||||
void
|
||||
CFont::PrintOutlinedString(float x, float y, wchar *str, float outlineStrength, bool fromBottom, CRGBA outlineColor)
|
||||
{
|
||||
CRGBA textColor = Details.color;
|
||||
SetColor(outlineColor);
|
||||
CVector2D offsets[] = { {1.f, 1.f}, {1.f, -1.f}, {-1.f, 1.f}, {-1.f, -1.f} };
|
||||
for(int i = 0; i < ARRAY_SIZE(offsets); i++){
|
||||
if (fromBottom)
|
||||
PrintStringFromBottom(x + SCREEN_SCALE_X(offsets[i].x * outlineStrength), y + SCREEN_SCALE_Y(offsets[i].y * outlineStrength), str);
|
||||
else
|
||||
PrintString(x + SCREEN_SCALE_X(offsets[i].x * outlineStrength), y + SCREEN_SCALE_Y(offsets[i].y * outlineStrength), str);
|
||||
}
|
||||
SetColor(textColor);
|
||||
|
||||
if (fromBottom)
|
||||
PrintStringFromBottom(x, y, str);
|
||||
else
|
||||
PrintString(x, y, str);
|
||||
}
|
||||
#endif
|
||||
|
||||
float
|
||||
CFont::GetCharacterWidth(wchar c)
|
||||
{
|
||||
@ -964,6 +1091,30 @@ CFont::GetStringWidth(wchar *s, bool spaces)
|
||||
do {
|
||||
while (*s == '~' || *s == JAP_TERMINATION) {
|
||||
s++;
|
||||
#ifdef BUTTON_ICONS
|
||||
switch (*s) {
|
||||
#if 0 // unused
|
||||
case 'U':
|
||||
case 'D':
|
||||
case '<':
|
||||
case '>':
|
||||
#endif
|
||||
case 'X':
|
||||
case 'O':
|
||||
case 'Q':
|
||||
case 'T':
|
||||
case 'K':
|
||||
case 'M':
|
||||
case 'A':
|
||||
case 'J':
|
||||
case 'V':
|
||||
case 'C':
|
||||
w += 17.0f * Details.scaleY;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
while (!(*s == '~' || *s == JAP_TERMINATION)) s++;
|
||||
s++;
|
||||
}
|
||||
@ -978,12 +1129,40 @@ CFont::GetStringWidth(wchar *s, bool spaces)
|
||||
for (; (*s != ' ' || spaces) && *s != '\0'; s++) {
|
||||
if (*s == '~') {
|
||||
s++;
|
||||
#ifdef BUTTON_ICONS
|
||||
switch (*s) {
|
||||
#if 0 // unused
|
||||
case 'U':
|
||||
case 'D':
|
||||
case '<':
|
||||
case '>':
|
||||
#endif
|
||||
case 'X':
|
||||
case 'O':
|
||||
case 'Q':
|
||||
case 'T':
|
||||
case 'K':
|
||||
case 'M':
|
||||
case 'A':
|
||||
case 'J':
|
||||
case 'V':
|
||||
case 'C':
|
||||
w += 17.0f * Details.scaleY;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
while (*s != '~') s++;
|
||||
#ifndef FIX_BUGS
|
||||
s++;
|
||||
if (*s == ' ' && !spaces)
|
||||
break;
|
||||
}
|
||||
w += GetCharacterSize(*s - ' ');
|
||||
}
|
||||
#else
|
||||
} else
|
||||
#endif
|
||||
w += GetCharacterSize(*s - ' ');
|
||||
}
|
||||
}
|
||||
return w;
|
||||
@ -1037,9 +1216,11 @@ CFont::GetNextSpace(wchar *s)
|
||||
if(*s == '~'){
|
||||
s++;
|
||||
while(*s != '~') s++;
|
||||
#ifndef FIX_BUGS
|
||||
s++;
|
||||
if(*s == ' ')
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
return s;
|
||||
@ -1047,7 +1228,7 @@ CFont::GetNextSpace(wchar *s)
|
||||
|
||||
#ifdef MORE_LANGUAGES
|
||||
wchar*
|
||||
CFont::ParseToken(wchar *s, wchar*, bool japShit)
|
||||
CFont::ParseToken(wchar *s, wchar* ss, bool japShit)
|
||||
{
|
||||
s++;
|
||||
if ((Details.color.r || Details.color.g || Details.color.b) && !japShit) {
|
||||
@ -1067,13 +1248,37 @@ CFont::ParseToken(wchar *s, wchar*, bool japShit)
|
||||
case 'r': SetColor(CRGBA(113, 43, 73, 255)); break;
|
||||
case 'w': SetColor(CRGBA(175, 175, 175, 255)); break;
|
||||
case 'y': SetColor(CRGBA(210, 196, 106, 255)); break;
|
||||
#ifdef BUTTON_ICONS
|
||||
#if 0 // unused
|
||||
case 'U': PS2Symbol = BUTTON_UP; break;
|
||||
case 'D': PS2Symbol = BUTTON_DOWN; break;
|
||||
case '<': PS2Symbol = BUTTON_LEFT; break;
|
||||
case '>': PS2Symbol = BUTTON_RIGHT; break;
|
||||
#endif
|
||||
case 'X': PS2Symbol = BUTTON_CROSS; break;
|
||||
case 'O': PS2Symbol = BUTTON_CIRCLE; break;
|
||||
case 'Q': PS2Symbol = BUTTON_SQUARE; break;
|
||||
case 'T': PS2Symbol = BUTTON_TRIANGLE; break;
|
||||
case 'K': PS2Symbol = BUTTON_L1; break;
|
||||
case 'M': PS2Symbol = BUTTON_L2; break;
|
||||
case 'A': PS2Symbol = BUTTON_L3; break;
|
||||
case 'J': PS2Symbol = BUTTON_R1; break;
|
||||
case 'V': PS2Symbol = BUTTON_R2; break;
|
||||
case 'C': PS2Symbol = BUTTON_R3; break;
|
||||
#endif
|
||||
}
|
||||
} else if (IsJapanese()) {
|
||||
if ((*s & 0x7FFF) == 'N' || (*s & 0x7FFF) == 'n')
|
||||
NewLine = true;
|
||||
}
|
||||
while ((!IsJapanese() || (*s != JAP_TERMINATION)) && *s != '~') s++;
|
||||
#ifdef FIX_BUGS
|
||||
if (*(++s) == '~')
|
||||
s = ParseToken(s, ss, japShit);
|
||||
return s;
|
||||
#else
|
||||
return s + 1;
|
||||
#endif
|
||||
}
|
||||
#else
|
||||
wchar*
|
||||
@ -1094,6 +1299,24 @@ CFont::ParseToken(wchar *s, wchar*)
|
||||
case 'r': SetColor(CRGBA(0x71, 0x2B, 0x49, 0xFF)); break;
|
||||
case 'w': SetColor(CRGBA(0xAF, 0xAF, 0xAF, 0xFF)); break;
|
||||
case 'y': SetColor(CRGBA(0xD2, 0xC4, 0x6A, 0xFF)); break;
|
||||
#ifdef BUTTON_ICONS
|
||||
#if 0 // unused
|
||||
case 'U': PS2Symbol = BUTTON_UP; break;
|
||||
case 'D': PS2Symbol = BUTTON_DOWN; break;
|
||||
case '<': PS2Symbol = BUTTON_LEFT; break;
|
||||
case '>': PS2Symbol = BUTTON_RIGHT; break;
|
||||
#endif
|
||||
case 'X': PS2Symbol = BUTTON_CROSS; break;
|
||||
case 'O': PS2Symbol = BUTTON_CIRCLE; break;
|
||||
case 'Q': PS2Symbol = BUTTON_SQUARE; break;
|
||||
case 'T': PS2Symbol = BUTTON_TRIANGLE; break;
|
||||
case 'K': PS2Symbol = BUTTON_L1; break;
|
||||
case 'M': PS2Symbol = BUTTON_L2; break;
|
||||
case 'A': PS2Symbol = BUTTON_L3; break;
|
||||
case 'J': PS2Symbol = BUTTON_R1; break;
|
||||
case 'V': PS2Symbol = BUTTON_R2; break;
|
||||
case 'C': PS2Symbol = BUTTON_R3; break;
|
||||
#endif
|
||||
}
|
||||
while(*s != '~') s++;
|
||||
return s+1;
|
||||
|
Reference in New Issue
Block a user