//Adress: 0x401A7D
int g_pCubePosition[25][8] =
{
//Legenda
// X Y: Posição Incial
// OX OY: Posição do portal de Concordancia com a pergunta
// XX XY: Posição do portal de Discordancia com a pergunta
// Exp: Exp Acrecensata ou Decrementa
// X Y OX OY XX XY Exp NULL
{1677, 4076, 1686, 4078, 1686, 4070, 1000, 0},
{1700, 4076, 1708, 4078, 1708, 4070, 1500, 0},
{1720, 4076, 1730, 4078, 1730, 4070, 2000, 0},
{1744, 4076, 1752, 4078, 1752, 4070, 2500, 0},
{1764, 4076, 1774, 4078, 1774, 4070, 3000, 0},
{1768, 4056, 1772, 4046, 1764, 4046, 10000, 0},
{1768, 4032, 1772, 4024, 1764, 4024, 3500, 0},
{1768, 4012, 1772, 4002, 1764, 4002, 4000, 0},
{1768, 3992, 1772, 3980, 1764, 3980, 4500, 0},
{1752, 3988, 1740, 3982, 1740, 3990, 5000, 0},
{1728, 3988, 1718, 3982, 1718, 3990, 5500, 0},
{1708, 3988, 1696, 3982, 1696, 3990, 15000, 0},
{1684, 3988, 1674, 3982, 1674, 3990, 6000, 0},
{1680, 4004, 1676, 4014, 1684, 4014, 6500, 0},
{1680, 4028, 1675, 4036, 1684, 4036, 7000, 0},
{1680, 4048, 1676, 4058, 1684, 4058, 7500, 0},
{1696, 4052, 1708, 4056, 1708, 4048, 8000, 0},
{1720, 4052, 1730, 4056, 1730, 4048, 8500, 0},
{1744, 4052, 1752, 4056, 1752, 4048, 9000, 0},
{1748, 4032, 1750, 4024, 1742, 4024, 20000, 0},
{1748, 4012, 1749, 4002, 1742, 4002, 10000, 0},
{1728, 4008, 1718, 4004, 1718, 4012, 1200, 0},
{1708, 4008, 1696, 4004, 1696, 4012, 1500, 0},
{1703, 4028, 1698, 4036, 1706, 4036, 30000, 0},
{1720, 4032, 3333, 3333, 3333, 3333, 20000, 0},
};
void CQuiz::QuizProcess(int Room)
{
int Value = 0;
int Random = rand() % 100;
if (Room % 25 == 23)
{
if (Random < 50)
Value = 1;
else if (Random < 60)
Value = 2;
else if (Random < 90)
Value = 3;
else
Value = 4;
}
else if (Random < 40)
{
Value = 1;
}
else if (Random < 70)
{
Value = 2;
}
else if (Random < 90)
{
Value = 3;
}
else
{
Value = 4;
}
for (int i = 1; i < MAX_USER; ++i)
{
if (pUser[i].UnknowByte_2480 == Room && pUser[i].UnknowByte_2504)
{
pUser[i].UnknowByte_2504 = 0;
int RoomStage = Room / 25;
if (Room % 25 == 24) // Última sala? Recall Direto
{
DoRecall(i);
continue;
}
int TargetX = pMob[i].TargetX;
int TargetY = pMob[i].TargetY;
int RoomIndex = Room % 25;
int CubePosX = 0;
int CubePosY = 0;
int ChosenRoom = 0;
if (g_pQuiz[QuizQuestion[Room]].Response == 1) // Checa se resposta é "sim" ou "não"
{
if (RoomStage)
{
if (RoomStage == 1)
{
CubePosX = g_pCubePosition[RoomIndex][2] + 128;
CubePosY = g_pCubePosition[RoomIndex][3] - 128;
}
else
{
if (RoomStage == 2)
CubePosX = g_pCubePosition[RoomIndex][2] + 256;
else
CubePosX = g_pCubePosition[RoomIndex][2];
CubePosY = g_pCubePosition[RoomIndex][3];
}
}
else
{
CubePosX = g_pCubePosition[RoomIndex][2];
CubePosY = g_pCubePosition[RoomIndex][3];
}
}
else if (RoomStage)
{
if (RoomStage == 1)
{
CubePosX = g_pCubePosition[RoomIndex][4] + 128;
CubePosY = g_pCubePosition[RoomIndex][5] - 128;
}
else
{
if (RoomStage == 2)
CubePosX = g_pCubePosition[RoomIndex][4] + 256;
else
CubePosX = g_pCubePosition[RoomIndex][4];
CubePosY = g_pCubePosition[RoomIndex][5];
}
}
else
{
CubePosX = g_pCubePosition[RoomIndex][4];
CubePosY = g_pCubePosition[RoomIndex][5];
}
// Verifica se o jogador está no portal correto
if (TargetX >= CubePosX && TargetX < CubePosX + 4 &&
TargetY >= CubePosY && TargetY < CubePosY + 4)
{
ChosenRoom = Value;
if (Value == 4)
ChosenRoom = 1;
}
else
{
ChosenRoom = -Value;
if (Value == 4)
{
SendClientMessage(i, g_pMessageStringTable[_NN_Incorrect_kicked]);
DoRecall(i);
continue;
}
}
if (ChosenRoom > 0) // Resposta correta
{
int ExpIncrese = 0;
if (RoomStage)
{
if (RoomStage == 1)
ExpIncrese = 4000 * ChosenRoom;
else if (RoomStage == 2)
ExpIncrese = 7600 * ChosenRoom;
}
else
{
ExpIncrese = 2000 * ChosenRoom;
}
pMob[i].MOB.Exp += ExpIncrese;
if (pMob[i].CheckGetLevel())
{
SendClientMessage(i, g_pMessageStringTable[_NN_Level_Up]);
SendScore(i);
}
SendEtc(i);
snprintf(Buffer, sizeof(Buffer), g_pMessageStringTable[_DD_Correct_answer], ChosenRoom, ExpIncrese);
SendClientMessage(i, Buffer);
}
else // Resposta incorreta
{
int ExpDecrese = 0;
if (RoomStage)
{
if (RoomStage == 1)
ExpDecrese = 4000 * ChosenRoom;
else if (RoomStage == 2)
ExpDecrese = 7600 * ChosenRoom;
}
else
{
ExpDecrese = 2000 * ChosenRoom;
}
if (ExpDecrese > 0 && pMob[i].MOB.Exp < 0xEE6B2800)
pMob[i].MOB.Exp += ExpDecrese;
if (ExpDecrese < 0 && pMob[i].MOB.Exp > -ExpDecrese)
pMob[i].MOB.Exp += ExpDecrese;
snprintf(Buffer, 0x80u, g_pMessageStringTable[_DD_Incorrect_answer], ChosenRoom, ExpDecrese);
SendClientMessage(i, Buffer);
SendEtc(i);
}
int NextRoom = ChosenRoom + (Room % 25);
int NextRoomIndex = Room % 25;
for (int k = 0; k < 4 && NextRoom != NextRoomIndex; ++k)
{
if (NextRoom > NextRoomIndex)
++NextRoomIndex;
if (NextRoom < NextRoomIndex)
--NextRoomIndex;
if (NextRoomIndex >= 25)
{
NextRoom = 48 - NextRoom;
NextRoomIndex = 23;
}
}
if (NextRoomIndex > 24)
{
SendClientMessage(i, g_pMessageStringTable[_NN_Incorrect_kicked]);
DoRecall(i);
}
else
{
int InitCubePosX = g_pCubePosition[NextRoomIndex][0];
int InitCubePosY = g_pCubePosition[NextRoomIndex][1];
if (RoomStage == 1)
{
InitCubePosX += 128;
InitCubePosY -= 128;
}
else if (RoomStage == 2)
{
InitCubePosX += 256;
}
DoTeleport(i, InitCubePosX, InitCubePosY, 1);
int GetCubePosition = GetCubeTeleportPosition(pMob[i].TargetX, pMob[i].TargetY);
if (GetCubePosition % 25 == 24)
GenerateMob(GetCubePosition + 195, 0, 0);
}
}
}
if (Room % 25 != 24)
GenerateMob(Room + 195, 0, 0);
}