mirror of
https://github.com/vcmi/vcmi.git
synced 2025-03-31 22:05:10 +02:00
Merge pull request #3191 from Laserlicht/touch-introduction
Touch introduction
This commit is contained in:
commit
07990644b5
2
.github/workflows/github.yml
vendored
2
.github/workflows/github.yml
vendored
@ -150,7 +150,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
find . -path ./.git -prune -o -path ./AI/FuzzyLite -prune -o -path ./test/googletest \
|
find . -path ./.git -prune -o -path ./AI/FuzzyLite -prune -o -path ./test/googletest \
|
||||||
-o -path ./osx -prune -o -type f \
|
-o -path ./osx -prune -o -type f \
|
||||||
-not -name '*.png' -and -not -name '*.vcxproj*' -and -not -name '*.props' -and -not -name '*.wav' -and -not -name '*.ico' -and -not -name '*.bat' -print0 | \
|
-not -name '*.png' -and -not -name '*.vcxproj*' -and -not -name '*.props' -and -not -name '*.wav' -and -not -name '*.webm' -and -not -name '*.ico' -and -not -name '*.bat' -print0 | \
|
||||||
{ ! xargs -0 grep -l -z -P '\r\n'; }
|
{ ! xargs -0 grep -l -z -P '\r\n'; }
|
||||||
|
|
||||||
- name: Validate JSON
|
- name: Validate JSON
|
||||||
|
BIN
Mods/vcmi/Video/tutorial/AbortSpell.webm
Normal file
BIN
Mods/vcmi/Video/tutorial/AbortSpell.webm
Normal file
Binary file not shown.
BIN
Mods/vcmi/Video/tutorial/BattleDirection.webm
Normal file
BIN
Mods/vcmi/Video/tutorial/BattleDirection.webm
Normal file
Binary file not shown.
BIN
Mods/vcmi/Video/tutorial/BattleDirectionAbort.webm
Normal file
BIN
Mods/vcmi/Video/tutorial/BattleDirectionAbort.webm
Normal file
Binary file not shown.
BIN
Mods/vcmi/Video/tutorial/MapPanning.webm
Normal file
BIN
Mods/vcmi/Video/tutorial/MapPanning.webm
Normal file
Binary file not shown.
BIN
Mods/vcmi/Video/tutorial/MapZooming.webm
Normal file
BIN
Mods/vcmi/Video/tutorial/MapZooming.webm
Normal file
Binary file not shown.
BIN
Mods/vcmi/Video/tutorial/RadialWheel.webm
Normal file
BIN
Mods/vcmi/Video/tutorial/RadialWheel.webm
Normal file
Binary file not shown.
BIN
Mods/vcmi/Video/tutorial/RightClick.webm
Normal file
BIN
Mods/vcmi/Video/tutorial/RightClick.webm
Normal file
Binary file not shown.
@ -174,6 +174,15 @@
|
|||||||
|
|
||||||
"vcmi.battleResultsWindow.applyResultsLabel" : "Apply battle result",
|
"vcmi.battleResultsWindow.applyResultsLabel" : "Apply battle result",
|
||||||
|
|
||||||
|
"vcmi.tutorialWindow.title" : "Touchscreen Introduction",
|
||||||
|
"vcmi.tutorialWindow.decription.RightClick" : "Touch and hold the element on which you want to right-click. Touch the free area to close.",
|
||||||
|
"vcmi.tutorialWindow.decription.MapPanning" : "Touch and drag with one finger to move the map.",
|
||||||
|
"vcmi.tutorialWindow.decription.MapZooming" : "Pinch with two fingers to change the map zoom.",
|
||||||
|
"vcmi.tutorialWindow.decription.RadialWheel" : "Swiping opens radial wheel for various actions, such as creature/hero management and town ordering.",
|
||||||
|
"vcmi.tutorialWindow.decription.BattleDirection" : "To attack from a particular direction, swipe in the direction from which the attack is to be made.",
|
||||||
|
"vcmi.tutorialWindow.decription.BattleDirectionAbort" : "The attack direction gesture can be cancelled if the finger is far enough away.",
|
||||||
|
"vcmi.tutorialWindow.decription.AbortSpell" : "Touch and hold to cancel a spell.",
|
||||||
|
|
||||||
"vcmi.otherOptions.availableCreaturesAsDwellingLabel.hover" : "Show Available Creatures",
|
"vcmi.otherOptions.availableCreaturesAsDwellingLabel.hover" : "Show Available Creatures",
|
||||||
"vcmi.otherOptions.availableCreaturesAsDwellingLabel.help" : "{Show Available Creatures}\n\nShow the number of creatures available to purchase instead of their growth in town summary (bottom-left corner of town screen).",
|
"vcmi.otherOptions.availableCreaturesAsDwellingLabel.help" : "{Show Available Creatures}\n\nShow the number of creatures available to purchase instead of their growth in town summary (bottom-left corner of town screen).",
|
||||||
"vcmi.otherOptions.creatureGrowthAsDwellingLabel.hover" : "Show Weekly Growth of Creatures",
|
"vcmi.otherOptions.creatureGrowthAsDwellingLabel.hover" : "Show Weekly Growth of Creatures",
|
||||||
|
@ -214,6 +214,10 @@
|
|||||||
"SOUNDS/":
|
"SOUNDS/":
|
||||||
[
|
[
|
||||||
{"type" : "dir", "path" : "/Sounds"}
|
{"type" : "dir", "path" : "/Sounds"}
|
||||||
|
],
|
||||||
|
"VIDEO/":
|
||||||
|
[
|
||||||
|
{"type" : "dir", "path" : "/Video"}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -130,6 +130,7 @@ set(client_SRCS
|
|||||||
windows/CQuestLog.cpp
|
windows/CQuestLog.cpp
|
||||||
windows/CSpellWindow.cpp
|
windows/CSpellWindow.cpp
|
||||||
windows/CTradeWindow.cpp
|
windows/CTradeWindow.cpp
|
||||||
|
windows/CTutorialWindow.cpp
|
||||||
windows/CWindowObject.cpp
|
windows/CWindowObject.cpp
|
||||||
windows/CreaturePurchaseCard.cpp
|
windows/CreaturePurchaseCard.cpp
|
||||||
windows/GUIClasses.cpp
|
windows/GUIClasses.cpp
|
||||||
@ -301,6 +302,7 @@ set(client_HEADERS
|
|||||||
windows/CQuestLog.h
|
windows/CQuestLog.h
|
||||||
windows/CSpellWindow.h
|
windows/CSpellWindow.h
|
||||||
windows/CTradeWindow.h
|
windows/CTradeWindow.h
|
||||||
|
windows/CTutorialWindow.h
|
||||||
windows/CWindowObject.h
|
windows/CWindowObject.h
|
||||||
windows/CreaturePurchaseCard.h
|
windows/CreaturePurchaseCard.h
|
||||||
windows/GUIClasses.h
|
windows/GUIClasses.h
|
||||||
|
@ -57,6 +57,7 @@
|
|||||||
#include "windows/CQuestLog.h"
|
#include "windows/CQuestLog.h"
|
||||||
#include "windows/CSpellWindow.h"
|
#include "windows/CSpellWindow.h"
|
||||||
#include "windows/CTradeWindow.h"
|
#include "windows/CTradeWindow.h"
|
||||||
|
#include "windows/CTutorialWindow.h"
|
||||||
#include "windows/GUIClasses.h"
|
#include "windows/GUIClasses.h"
|
||||||
#include "windows/InfoWindows.h"
|
#include "windows/InfoWindows.h"
|
||||||
|
|
||||||
@ -275,6 +276,8 @@ void CPlayerInterface::gamePause(bool pause)
|
|||||||
|
|
||||||
void CPlayerInterface::yourTurn(QueryID queryID)
|
void CPlayerInterface::yourTurn(QueryID queryID)
|
||||||
{
|
{
|
||||||
|
CTutorialWindow::openWindowFirstTime(TutorialMode::TOUCH_ADVENTUREMAP);
|
||||||
|
|
||||||
EVENT_HANDLER_CALLED_BY_CLIENT;
|
EVENT_HANDLER_CALLED_BY_CLIENT;
|
||||||
{
|
{
|
||||||
LOCPLINT = this;
|
LOCPLINT = this;
|
||||||
|
@ -41,8 +41,11 @@ extern "C" {
|
|||||||
static int lodRead(void* opaque, uint8_t* buf, int size)
|
static int lodRead(void* opaque, uint8_t* buf, int size)
|
||||||
{
|
{
|
||||||
auto video = reinterpret_cast<CVideoPlayer *>(opaque);
|
auto video = reinterpret_cast<CVideoPlayer *>(opaque);
|
||||||
|
int bytes = static_cast<int>(video->data->read(buf, size));
|
||||||
|
if(bytes == 0)
|
||||||
|
return AVERROR_EOF;
|
||||||
|
|
||||||
return static_cast<int>(video->data->read(buf, size));
|
return bytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
static si64 lodSeek(void * opaque, si64 pos, int whence)
|
static si64 lodSeek(void * opaque, si64 pos, int whence)
|
||||||
@ -59,8 +62,11 @@ static si64 lodSeek(void * opaque, si64 pos, int whence)
|
|||||||
static int lodReadAudio(void* opaque, uint8_t* buf, int size)
|
static int lodReadAudio(void* opaque, uint8_t* buf, int size)
|
||||||
{
|
{
|
||||||
auto video = reinterpret_cast<CVideoPlayer *>(opaque);
|
auto video = reinterpret_cast<CVideoPlayer *>(opaque);
|
||||||
|
int bytes = static_cast<int>(video->dataAudio->read(buf, size));
|
||||||
|
if(bytes == 0)
|
||||||
|
return AVERROR_EOF;
|
||||||
|
|
||||||
return static_cast<int>(video->dataAudio->read(buf, size));
|
return bytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
static si64 lodSeekAudio(void * opaque, si64 pos, int whence)
|
static si64 lodSeekAudio(void * opaque, si64 pos, int whence)
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
#include "../gui/CursorHandler.h"
|
#include "../gui/CursorHandler.h"
|
||||||
#include "../gui/CGuiHandler.h"
|
#include "../gui/CGuiHandler.h"
|
||||||
#include "../gui/WindowHandler.h"
|
#include "../gui/WindowHandler.h"
|
||||||
|
#include "../windows/CTutorialWindow.h"
|
||||||
#include "../render/Canvas.h"
|
#include "../render/Canvas.h"
|
||||||
#include "../adventureMap/AdventureMapInterface.h"
|
#include "../adventureMap/AdventureMapInterface.h"
|
||||||
|
|
||||||
@ -148,6 +149,8 @@ void BattleInterface::openingEnd()
|
|||||||
tacticNextStack(nullptr);
|
tacticNextStack(nullptr);
|
||||||
activateStack();
|
activateStack();
|
||||||
battleOpeningDelayActive = false;
|
battleOpeningDelayActive = false;
|
||||||
|
|
||||||
|
CTutorialWindow::openWindowFirstTime(TutorialMode::TOUCH_BATTLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
BattleInterface::~BattleInterface()
|
BattleInterface::~BattleInterface()
|
||||||
|
123
client/windows/CTutorialWindow.cpp
Normal file
123
client/windows/CTutorialWindow.cpp
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
/*
|
||||||
|
* CTutorialWindow.cpp, part of VCMI engine
|
||||||
|
*
|
||||||
|
* Authors: listed in file AUTHORS in main folder
|
||||||
|
*
|
||||||
|
* License: GNU General Public License v2.0 or later
|
||||||
|
* Full text of license available in license.txt file, in main folder
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#include "StdInc.h"
|
||||||
|
#include "CTutorialWindow.h"
|
||||||
|
|
||||||
|
#include "../eventsSDL/InputHandler.h"
|
||||||
|
#include "../../lib/CConfigHandler.h"
|
||||||
|
#include "../../lib/CondSh.h"
|
||||||
|
#include "../../lib/CGeneralTextHandler.h"
|
||||||
|
#include "../CPlayerInterface.h"
|
||||||
|
#include "../CGameInfo.h"
|
||||||
|
#include "../CVideoHandler.h"
|
||||||
|
|
||||||
|
#include "../gui/CGuiHandler.h"
|
||||||
|
#include "../gui/Shortcut.h"
|
||||||
|
#include "../gui/WindowHandler.h"
|
||||||
|
#include "../widgets/Images.h"
|
||||||
|
#include "../widgets/Buttons.h"
|
||||||
|
#include "../widgets/TextControls.h"
|
||||||
|
#include "../render/Canvas.h"
|
||||||
|
|
||||||
|
CTutorialWindow::CTutorialWindow(const TutorialMode & m)
|
||||||
|
: CWindowObject(BORDERED, ImagePath::builtin("DIBOXBCK")), mode { m }, page { 0 }
|
||||||
|
{
|
||||||
|
OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;
|
||||||
|
|
||||||
|
pos = Rect(pos.x, pos.y, 380, 400); //video: 320x240
|
||||||
|
background = std::make_shared<CFilledTexture>(ImagePath::builtin("DIBOXBCK"), Rect(0, 0, pos.w, pos.h));
|
||||||
|
|
||||||
|
updateShadow();
|
||||||
|
|
||||||
|
center();
|
||||||
|
|
||||||
|
addUsedEvents(LCLICK);
|
||||||
|
|
||||||
|
if(mode == TutorialMode::TOUCH_ADVENTUREMAP) videos = { "RightClick", "MapPanning", "MapZooming", "RadialWheel" };
|
||||||
|
else if(mode == TutorialMode::TOUCH_BATTLE) videos = { "BattleDirection", "BattleDirectionAbort", "AbortSpell" };
|
||||||
|
|
||||||
|
labelTitle = std::make_shared<CLabel>(190, 15, FONT_BIG, ETextAlignment::CENTER, Colors::YELLOW, CGI->generaltexth->translate("vcmi.tutorialWindow.title"));
|
||||||
|
labelInformation = std::make_shared<CMultiLineLabel>(Rect(5, 40, 370, 60), EFonts::FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, "");
|
||||||
|
buttonOk = std::make_shared<CButton>(Point(159, 367), AnimationPath::builtin("IOKAY"), CButton::tooltip(), std::bind(&CTutorialWindow::exit, this), EShortcut::GLOBAL_ACCEPT); //62x28
|
||||||
|
buttonLeft = std::make_shared<CButton>(Point(5, 217), AnimationPath::builtin("HSBTNS3"), CButton::tooltip(), std::bind(&CTutorialWindow::previous, this), EShortcut::MOVE_LEFT); //22x46
|
||||||
|
buttonRight = std::make_shared<CButton>(Point(352, 217), AnimationPath::builtin("HSBTNS5"), CButton::tooltip(), std::bind(&CTutorialWindow::next, this), EShortcut::MOVE_RIGHT); //22x46
|
||||||
|
|
||||||
|
setContent();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CTutorialWindow::setContent()
|
||||||
|
{
|
||||||
|
video = "tutorial/" + videos[page];
|
||||||
|
|
||||||
|
buttonLeft->block(page<1);
|
||||||
|
buttonRight->block(page>videos.size() - 2);
|
||||||
|
|
||||||
|
labelInformation->setText(CGI->generaltexth->translate("vcmi.tutorialWindow.decription." + videos[page]));
|
||||||
|
}
|
||||||
|
|
||||||
|
void CTutorialWindow::openWindowFirstTime(const TutorialMode & m)
|
||||||
|
{
|
||||||
|
if(GH.input().hasTouchInputDevice() && !persistentStorage["gui"]["tutorialCompleted" + std::to_string(m)].Bool())
|
||||||
|
{
|
||||||
|
if(LOCPLINT)
|
||||||
|
LOCPLINT->showingDialog->set(true);
|
||||||
|
GH.windows().pushWindow(std::make_shared<CTutorialWindow>(m));
|
||||||
|
|
||||||
|
Settings s = persistentStorage.write["gui"]["tutorialCompleted" + std::to_string(m)];
|
||||||
|
s->Bool() = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CTutorialWindow::exit()
|
||||||
|
{
|
||||||
|
if(LOCPLINT)
|
||||||
|
LOCPLINT->showingDialog->setn(false);
|
||||||
|
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CTutorialWindow::next()
|
||||||
|
{
|
||||||
|
page++;
|
||||||
|
setContent();
|
||||||
|
deactivate();
|
||||||
|
activate();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CTutorialWindow::previous()
|
||||||
|
{
|
||||||
|
page--;
|
||||||
|
setContent();
|
||||||
|
deactivate();
|
||||||
|
activate();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CTutorialWindow::show(Canvas & to)
|
||||||
|
{
|
||||||
|
CCS->videoh->update(pos.x + 30, pos.y + 120, to.getInternalSurface(), true, false,
|
||||||
|
[&]()
|
||||||
|
{
|
||||||
|
CCS->videoh->close();
|
||||||
|
CCS->videoh->open(VideoPath::builtin(video));
|
||||||
|
});
|
||||||
|
|
||||||
|
CIntObject::show(to);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CTutorialWindow::activate()
|
||||||
|
{
|
||||||
|
CCS->videoh->open(VideoPath::builtin(video));
|
||||||
|
CIntObject::activate();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CTutorialWindow::deactivate()
|
||||||
|
{
|
||||||
|
CCS->videoh->close();
|
||||||
|
}
|
54
client/windows/CTutorialWindow.h
Normal file
54
client/windows/CTutorialWindow.h
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
* CTutorialWindow.h, part of VCMI engine
|
||||||
|
*
|
||||||
|
* Authors: listed in file AUTHORS in main folder
|
||||||
|
*
|
||||||
|
* License: GNU General Public License v2.0 or later
|
||||||
|
* Full text of license available in license.txt file, in main folder
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "../windows/CWindowObject.h"
|
||||||
|
|
||||||
|
class CFilledTexture;
|
||||||
|
class CButton;
|
||||||
|
class CLabel;
|
||||||
|
class CMultiLineLabel;
|
||||||
|
|
||||||
|
enum TutorialMode
|
||||||
|
{
|
||||||
|
TOUCH_ADVENTUREMAP,
|
||||||
|
TOUCH_BATTLE
|
||||||
|
};
|
||||||
|
|
||||||
|
class CTutorialWindow : public CWindowObject
|
||||||
|
{
|
||||||
|
TutorialMode mode;
|
||||||
|
std::shared_ptr<CFilledTexture> background;
|
||||||
|
|
||||||
|
std::shared_ptr<CButton> buttonOk;
|
||||||
|
std::shared_ptr<CButton> buttonLeft;
|
||||||
|
std::shared_ptr<CButton> buttonRight;
|
||||||
|
|
||||||
|
std::shared_ptr<CLabel> labelTitle;
|
||||||
|
std::shared_ptr<CMultiLineLabel> labelInformation;
|
||||||
|
|
||||||
|
std::string video;
|
||||||
|
std::vector<std::string> videos;
|
||||||
|
|
||||||
|
int page;
|
||||||
|
|
||||||
|
void exit();
|
||||||
|
void next();
|
||||||
|
void previous();
|
||||||
|
void setContent();
|
||||||
|
|
||||||
|
public:
|
||||||
|
CTutorialWindow(const TutorialMode & m);
|
||||||
|
static void openWindowFirstTime(const TutorialMode & m);
|
||||||
|
|
||||||
|
void show(Canvas & to) override;
|
||||||
|
void activate() override;
|
||||||
|
void deactivate() override;
|
||||||
|
};
|
@ -119,6 +119,7 @@ EResType EResTypeHelper::getTypeFromExtension(std::string extension)
|
|||||||
{".MJPG", EResType::VIDEO},
|
{".MJPG", EResType::VIDEO},
|
||||||
{".MPG", EResType::VIDEO},
|
{".MPG", EResType::VIDEO},
|
||||||
{".AVI", EResType::VIDEO},
|
{".AVI", EResType::VIDEO},
|
||||||
|
{".WEBM", EResType::VIDEO},
|
||||||
{".ZIP", EResType::ARCHIVE_ZIP},
|
{".ZIP", EResType::ARCHIVE_ZIP},
|
||||||
{".LOD", EResType::ARCHIVE_LOD},
|
{".LOD", EResType::ARCHIVE_LOD},
|
||||||
{".PAC", EResType::ARCHIVE_LOD},
|
{".PAC", EResType::ARCHIVE_LOD},
|
||||||
|
@ -28,7 +28,7 @@ class JsonSerializeFormat;
|
|||||||
* Font: .fnt
|
* Font: .fnt
|
||||||
* Image: .bmp, .jpg, .pcx, .png, .tga
|
* Image: .bmp, .jpg, .pcx, .png, .tga
|
||||||
* Sound: .wav .82m
|
* Sound: .wav .82m
|
||||||
* Video: .smk, .bik .mjpg .mpg
|
* Video: .smk, .bik .mjpg .mpg .webm
|
||||||
* Music: .mp3, .ogg
|
* Music: .mp3, .ogg
|
||||||
* Archive: .lod, .snd, .vid .pac .zip
|
* Archive: .lod, .snd, .vid .pac .zip
|
||||||
* Palette: .pal
|
* Palette: .pal
|
||||||
|
Loading…
x
Reference in New Issue
Block a user