You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

213 lines
5.7 KiB

/**
* @file help.cpp
*
* Implementation of the in-game help text.
*/
#include "control.h"
#include "engine/render/text_render.hpp"
#include "init.h"
#include "minitext.h"
#include "stores.h"
#include "utils/language.h"
namespace devilution {
int help_select_line;
bool helpflag;
int HelpTop;
const char gszHelpText[] = {
// TRANSLATORS: HUGE KEY. There might be changes in a future version where redundant keys between the shareware help and the full game help will be consolidated.
N_("$Keyboard Shortcuts:|"
"F1: Open Help Screen|"
"Esc: Display Main Menu|"
"Tab: Display Auto-map|"
"Space: Hide all info screens|"
"S: Open Speedbook|"
"B: Open Spellbook|"
"I: Open Inventory screen|"
"C: Open Character screen|"
"Q: Open Quest log|"
"F: Reduce screen brightness|"
"G: Increase screen brightness|"
"Z: Zoom Game Screen|"
"+ / -: Zoom Automap|"
"1 - 8: Use Belt item|"
"F5, F6, F7, F8: Set hotkey for skill or spell|"
"Shift + Left Mouse Button: Attack without moving|"
"Shift + Left Mouse Button (on character screen): Assign all stat points|"
"Shift + Left Mouse Button (on inventory): Move item to belt or equip/unequip item|"
"Shift + Left Mouse Button (on belt): Move item to inventory|"
"|"
"$Movement:|"
"If you hold the mouse button down while moving, the character "
"will continue to move in that direction.|"
"|"
"$Combat:|"
"Holding down the shift key and then left-clicking allows the "
"character to attack without moving.|"
"|"
"$Auto-map:|"
"To access the auto-map, click the 'MAP' button on the "
"Information Bar or press 'TAB' on the keyboard. Zooming in and "
"out of the map is done with the + and - keys. Scrolling the map "
"uses the arrow keys.|"
"|"
"$Picking up Objects:|"
"Useable items that are small in size, such as potions or scrolls, "
"are automatically placed in your 'belt' located at the top of "
"the Interface bar . When an item is placed in the belt, a small "
"number appears in that box. Items may be used by either pressing "
"the corresponding number or right-clicking on the item.|"
"|"
"$Gold|"
"You can select a specific amount of gold to drop by"
"right-clicking on a pile of gold in your inventory.|"
"|"
"$Skills & Spells:|"
"You can access your list of skills and spells by left-clicking on "
"the 'SPELLS' button in the interface bar. Memorized spells and "
"those available through staffs are listed here. Left-clicking on "
"the spell you wish to cast will ready the spell. A readied spell "
"may be cast by simply right-clicking in the play area.|"
"|"
"$Using the Speedbook for Spells|"
"Left-clicking on the 'readied spell' button will open the 'Speedbook' "
"which allows you to select a skill or spell for immediate use. "
"To use a readied skill or spell, simply right-click in the main play "
"area.|"
"Shift + Left-clicking on the 'select current spell' button will clear the readied spell|"
"|"
"$Setting Spell Hotkeys|"
"You can assign up to four Hotkeys for skills, spells or scrolls. "
"Start by opening the 'speedbook' as described in the section above. "
"Press the F5, F6, F7 or F8 keys after highlighting the spell you "
"wish to assign.|"
"|"
"$Spell Books|"
"Reading more than one book increases your knowledge of that "
"spell, allowing you to cast the spell more effectively.|"
"&")
};
void InitHelp()
{
helpflag = false;
}
static void DrawHelpLine(const CelOutputBuffer &out, int x, int y, char *text, uint16_t style)
{
const int sx = x + 32 + PANEL_X;
const int sy = y * 12 + 44 + UI_OFFSET_Y;
DrawString(out, text, { sx, sy, 577, 0 }, style);
}
void DrawHelp(const CelOutputBuffer &out)
{
int i, c, w;
const char *s;
DrawSTextHelp();
DrawQTextBack(out);
PrintSString(out, 0, 2, gbIsHellfire ? _("Hellfire Help") : _("Diablo Help"), UIS_GOLD | UIS_CENTER);
DrawSLine(out, 5);
s = _(&gszHelpText[0]);
for (i = 0; i < help_select_line; i++) {
c = 0;
w = 0;
while (*s == '\0') {
s++;
}
if (*s == '$') {
s++;
}
if (*s == '&') {
continue;
}
while (*s != '|' && w < 577) {
while (*s == '\0') {
s++;
}
tempstr[c] = *s;
w += fontkern[GameFontSmall][fontframe[GameFontSmall][gbFontTransTbl[(BYTE)tempstr[c]]]] + 1;
c++;
s++;
}
if (w >= 577) {
c--;
while (tempstr[c] != ' ') {
s--;
c--;
}
}
if (*s == '|') {
s++;
}
}
for (i = 7; i < 22; i++) {
c = 0;
w = 0;
while (*s == '\0') {
s++;
}
uint16_t style = UIS_SILVER;
if (*s == '$') {
s++;
style = UIS_RED;
}
if (*s == '&') {
HelpTop = help_select_line;
continue;
}
while (*s != '|' && w < 577) {
while (*s == '\0') {
s++;
}
tempstr[c] = *s;
BYTE tc = gbFontTransTbl[(BYTE)tempstr[c]];
w += fontkern[GameFontSmall][fontframe[GameFontSmall][tc]] + 1;
c++;
s++;
}
if (w >= 577) {
c--;
while (tempstr[c] != ' ') {
s--;
c--;
}
}
if (c != 0) {
tempstr[c] = '\0';
DrawHelpLine(out, 0, i, tempstr, style);
}
if (*s == '|') {
s++;
}
}
PrintSString(out, 0, 23, _("Press ESC to end or the arrow keys to scroll."), UIS_GOLD | UIS_CENTER);
}
void DisplayHelp()
{
help_select_line = 0;
helpflag = true;
HelpTop = 5000;
}
void HelpScrollUp()
{
if (help_select_line > 0)
help_select_line--;
}
void HelpScrollDown()
{
if (help_select_line < HelpTop)
help_select_line++;
}
} // namespace devilution