game: add seasonal calendar widget

This commit is contained in:
Crypto City 2020-08-26 19:46:03 +00:00
parent d36c71da7b
commit 703ebab3e6
8 changed files with 122 additions and 7 deletions

View File

@ -124,3 +124,11 @@ TBTabContainer
item: id: "compass-small", text: "Small"
item: id: "compass-medium", text: "Medium"
item: id: "compass-large", text: "Large"
TBLayout: axis: x
TBTextField: text: "Calendar"
TBSelectDropdown: id: "calendar"
items
item: id: "calendar-off", text: "Off"
item: id: "calendar-small", text: "Small"
item: id: "calendar-medium", text: "Medium"
item: id: "calendar-large", text: "Large"

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -110,6 +110,8 @@ const float TOUCH_SENSITIVITY = 2.0f;
#define DEFAULT_INCLUDE_UNMATCHED_TRADES_IN_QUEUED_COMMANDS false
#define CONFIG_COMPASS "compass"
#define DEFAULT_COMPASS TBIDC("compass-medium")
#define CONFIG_CALENDAR "calendar"
#define DEFAULT_CALENDAR TBIDC("calendar-medium")
#define CONFIG_PANEL "panel"
#define DEFAULT_PANEL String("")
@ -264,6 +266,7 @@ public:
void HandleMusicSkipTrack(StringHash eventType, VariantMap& eventData);
void HandleIncludeUnmatchedTradesInQueuedComands(StringHash eventType, VariantMap& eventData);
void HandleCompass(StringHash eventType, VariantMap& eventData);
void HandleCalendar(StringHash eventType, VariantMap& eventData);
void HandleMint(StringHash eventType, VariantMap& eventData);
void HandleSmelt(StringHash eventType, VariantMap& eventData);
void HandleCancelNonce(StringHash eventType, VariantMap& eventData);
@ -363,6 +366,7 @@ private:
void SetSFXVolume(float volume);
void SetPlaySFXOnNewBlock(bool play);
void SetCompass(TBID compass);
void SetCalendar(TBID calendar);
void UpdateSky();
void LoadControls();
bool GetKeyDown(Urho3D::Key key);
@ -982,6 +986,7 @@ void CryptoCityUrho3D::SetupUI()
SubscribeToEvent(ui, E_CRYPTOCITY_MUSIC_SKIP_TRACK, URHO3D_HANDLER(CryptoCityUrho3D, HandleMusicSkipTrack));
SubscribeToEvent(ui, E_CRYPTOCITY_INCLUDE_UNMATCHED_TRADES_IN_QUEUED_COMMANDS, URHO3D_HANDLER(CryptoCityUrho3D, HandleIncludeUnmatchedTradesInQueuedComands));
SubscribeToEvent(ui, E_CRYPTOCITY_COMPASS, URHO3D_HANDLER(CryptoCityUrho3D, HandleCompass));
SubscribeToEvent(ui, E_CRYPTOCITY_CALENDAR, URHO3D_HANDLER(CryptoCityUrho3D, HandleCalendar));
SubscribeToEvent(ui, E_CRYPTOCITY_SFX_VOLUME, URHO3D_HANDLER(CryptoCityUrho3D, HandleSFXVolume));
SubscribeToEvent(ui, E_CRYPTOCITY_PLAY_SFX_ON_NEW_BLOCK, URHO3D_HANDLER(CryptoCityUrho3D, HandlePlaySFXOnNewBlock));
SubscribeToEvent(ui, E_CRYPTOCITY_RESTORE_MODEL_BACKUP, URHO3D_HANDLER(CryptoCityUrho3D, HandleRestoreModelBackup));
@ -1363,6 +1368,11 @@ void CryptoCityUrho3D::SetCompass(TBID compass)
ui->SetCompassType(compass);
}
void CryptoCityUrho3D::SetCalendar(TBID calendar)
{
ui->SetCalendarType(calendar);
}
void CryptoCityUrho3D::CreateScene()
{
if (!scene_)
@ -1447,6 +1457,7 @@ void CryptoCityUrho3D::CreateScene()
SetMusicTrack(GetConfigValue(CONFIG_AUDIO_SECTION, CONFIG_MUSIC_TRACK, DEFAULT_MUSIC_TRACK));
SetMusicVolume(GetConfigValue(CONFIG_AUDIO_SECTION, CONFIG_MUSIC_VOLUME, DEFAULT_MUSIC_VOLUME));
SetCompass(GetConfigValue(CONFIG_UI_SECTION, CONFIG_COMPASS, DEFAULT_COMPASS));
SetCalendar(GetConfigValue(CONFIG_UI_SECTION, CONFIG_CALENDAR, DEFAULT_CALENDAR));
SetSFXVolume(GetConfigValue(CONFIG_AUDIO_SECTION, CONFIG_SFX_VOLUME, DEFAULT_SFX_VOLUME));
SetPlaySFXOnNewBlock(GetConfigValue(CONFIG_AUDIO_SECTION, CONFIG_PLAY_SFX_ON_NEW_BLOCK, DEFAULT_PLAY_SFX_ON_NEW_BLOCK));
}
@ -4216,6 +4227,14 @@ void CryptoCityUrho3D::HandleCompass(StringHash eventType, VariantMap& eventData
eventData[Compass::P_COMPASS] = (unsigned long long)TBID(GetConfigValue(CONFIG_UI_SECTION, CONFIG_COMPASS, DEFAULT_COMPASS));
}
void CryptoCityUrho3D::HandleCalendar(StringHash eventType, VariantMap& eventData)
{
if (eventData.Contains(Calendar::P_CALENDAR))
SetCalendar(SetConfigValue(CONFIG_UI_SECTION, CONFIG_CALENDAR, TBID(eventData[Calendar::P_CALENDAR].GetUInt64())));
else
eventData[Calendar::P_CALENDAR] = (unsigned long long)TBID(GetConfigValue(CONFIG_UI_SECTION, CONFIG_CALENDAR, DEFAULT_CALENDAR));
}
void CryptoCityUrho3D::HandleResearch(StringHash eventType, VariantMap& eventData)
{
cryptonote::cc_command_research_t cmd;

View File

@ -176,6 +176,7 @@ UIOptionsDialog::UIOptionsDialog(Context *ctx):
musicTrackWidget = GetWidgetByIDAndType<TBSelectDropdown>(TBIDC("music-track"));
musicVolumeWidget = GetWidgetByIDAndType<TBSlider>(TBIDC("music-volume"));
compassWidget = GetWidgetByIDAndType<TBSelectDropdown>(TBIDC("compass"));
calendarWidget = GetWidgetByIDAndType<TBSelectDropdown>(TBIDC("calendar"));
SFXVolumeWidget = GetWidgetByIDAndType<TBSlider>(TBIDC("sfx-volume"));
playSFXOnNewBlockWidget = GetWidgetByIDAndType<TBCheckBox>(TBIDC("play-sfx-on-new-block"));
@ -353,13 +354,13 @@ void UIOptionsDialog::Configure()
musicVolumeWidget->SetValue(newEventData[OptionsMusicVolume::P_VOLUME].GetFloat() * musicVolumeWidget->GetMaxValue());
newEventData = {};
SendEvent(E_OPTIONS_COMPASS, newEventData);
compassWidget->SetValue(-1);
for (int i = 0; i < compassWidget->GetDefaultSource()->GetNumItems(); ++i)
SendEvent(E_OPTIONS_CALENDAR, newEventData);
calendarWidget->SetValue(-1);
for (int i = 0; i < calendarWidget->GetDefaultSource()->GetNumItems(); ++i)
{
if (compassWidget->GetDefaultSource()->GetItemID(i) == newEventData[OptionsCompass::P_COMPASS].GetUInt64())
if (calendarWidget->GetDefaultSource()->GetItemID(i) == newEventData[OptionsCalendar::P_CALENDAR].GetUInt64())
{
compassWidget->SetValue(i);
calendarWidget->SetValue(i);
break;
}
}
@ -640,6 +641,20 @@ void UIOptionsDialog::HandleCompass(StringHash eventType, VariantMap& eventData)
SendEvent(E_OPTIONS_COMPASS, newEventData);
}
void UIOptionsDialog::HandleCalendar(StringHash eventType, VariantMap& eventData)
{
if (configuring)
return;
TBWidgetEvent *ev = (TBWidgetEvent*)eventData[TBWidgetEventNamespace::P_WIDGET_EVENT].GetVoidPtr();
TBSelectDropdown *w = TBSafeCast<TBSelectDropdown>(ev->target);
if (w->GetValue() < 0)
return;
const TBID id = w->GetDefaultSource()->GetItem(w->GetValue())->id;
VariantMap newEventData;
newEventData[OptionsCalendar::P_CALENDAR] = (unsigned long long)id;
SendEvent(E_OPTIONS_CALENDAR, newEventData);
}
void UIOptionsDialog::HandleClose(StringHash eventType, VariantMap& eventData)
{
VariantMap& newEventData = GetEventDataMap();
@ -684,6 +699,7 @@ void UIOptionsDialog::HandleTBMessage(StringHash eventType, VariantMap& eventDat
CONNECT("play-sfx-on-new-block", HandlePlaySFXOnNewBlock);
CONNECT("compass", HandleCompass);
CONNECT("calendar", HandleCalendar);
}
#undef CONNECT

View File

@ -34,7 +34,6 @@ URHO3D_EVENT(E_OPTIONS_ENABLE_HORIZON, OptionsEnableHorizon) { URHO3D_PARAM(P_EN
URHO3D_EVENT(E_OPTIONS_ENABLE_DYNAMIC_SKY, OptionsEnableDynamicSky) { URHO3D_PARAM(P_ENABLE, Enable); }
URHO3D_EVENT(E_OPTIONS_TIME_OF_DAY, OptionsTimeOfDay) { URHO3D_PARAM(P_TIME_OF_DAY, TimeOfDay); }
URHO3D_EVENT(E_OPTIONS_SHOW_FLAGS, OptionsShowFlags) { URHO3D_PARAM(P_SHOW, Show); }
URHO3D_EVENT(E_OPTIONS_ENABLE_COMPASS, OptionsEnableCompass) { URHO3D_PARAM(P_ENABLE, Enable); }
URHO3D_EVENT(E_OPTIONS_CONTROLS_CHANGED, OptionsControlsChanged) {}
URHO3D_EVENT(E_OPTIONS_MUSIC_TRACK, OptionsMusicTrack) { URHO3D_PARAM(P_TRACK, Track); }
URHO3D_EVENT(E_OPTIONS_MUSIC_VOLUME, OptionsMusicVolume) { URHO3D_PARAM(P_VOLUME, Volume); }
@ -42,6 +41,7 @@ URHO3D_EVENT(E_OPTIONS_SFX_VOLUME, OptionsSFXVolume) { URHO3D_PARAM(P_VOLUME, Vo
URHO3D_EVENT(E_OPTIONS_PLAY_SFX_ON_NEW_BLOCK, OptionsPlaySFXOnNewBlock) { URHO3D_PARAM(P_PLAY, Play); }
URHO3D_EVENT(E_OPTIONS_MUSIC_SKIP_TRACK, OptionsMusicSkipTrack) { }
URHO3D_EVENT(E_OPTIONS_COMPASS, OptionsCompass) { URHO3D_PARAM(P_COMPASS, Compass); }
URHO3D_EVENT(E_OPTIONS_CALENDAR, OptionsCalendar) { URHO3D_PARAM(P_CALENDAR, Calendar); }
class UIOptionsDialog: public UITBWindow
{
@ -76,6 +76,7 @@ private:
void HandleMusicVolume(Urho3D::StringHash eventType, Urho3D::VariantMap& eventData);
void HandleMusicSkipTrack(Urho3D::StringHash eventType, Urho3D::VariantMap& eventData);
void HandleCompass(Urho3D::StringHash eventType, Urho3D::VariantMap& eventData);
void HandleCalendar(Urho3D::StringHash eventType, Urho3D::VariantMap& eventData);
void HandleSFXVolume(Urho3D::StringHash eventType, Urho3D::VariantMap& eventData);
void HandlePlaySFXOnNewBlock(Urho3D::StringHash eventType, Urho3D::VariantMap& eventData);
void HandleTBMessage(Urho3D::StringHash eventType, Urho3D::VariantMap& eventData);
@ -102,6 +103,7 @@ private:
tb::TBSelectDropdown *musicTrackWidget;
tb::TBSlider *musicVolumeWidget;
tb::TBSelectDropdown *compassWidget;
tb::TBSelectDropdown *calendarWidget;
tb::TBSlider *SFXVolumeWidget;
tb::TBCheckBox *playSFXOnNewBlockWidget;

View File

@ -68,6 +68,8 @@
#define WALLET_BALANCE_TEXT_SCALE .8f
#define COMPASS_SIZE(size) ((int)(140 * (size)))
#define COMPASS_CENTER_OFFSET(size) ((COMPASS_SIZE(size)) * 2 / 3.0f)
#define CALENDAR_SIZE(size) ((int)(140 * (size)))
#define CALENDAR_CENTER_OFFSET(size) ((CALENDAR_SIZE(size)) * 2 / 3.0f)
using namespace Urho3D;
using namespace tb;
@ -231,6 +233,7 @@ UIUrho3D::UIUrho3D(Context *ctx, const GameState *gameState):
CreateLoadingWalletNotificationWidget();
CreateQueuedCommandsNotificationWidget();
CreateCompass();
CreateCalendar();
CreateNewBlockNotification();
shadingFix = new UITBWindow(context_, "cc/shading-fix.tb.txt", WINDOW_SETTINGS_NONE);
@ -318,7 +321,7 @@ void UIUrho3D::CreateBuildOverviewWidget()
buildOverviewWidget = new UITBWindow(context_, "cc/build-overview.tb.txt", WINDOW_SETTINGS_NONE);
buildOverviewWidget->SetSkinBg(TBIDC("0"));
TBRect rect = buildOverviewWidget->GetRect();
rect.x = 0;
rect.x = graphics->GetWidth() / 2 - rect.w / 2;
rect.y = 0;
buildOverviewWidget->SetRect(rect);
SubscribeToEvent(buildOverviewWidget, E_TB_WIDGET_EVENT, URHO3D_HANDLER(UIUrho3D, HandleTBMessage));
@ -358,12 +361,29 @@ void UIUrho3D::CreateCompass()
compass_frame = root->CreateChild<Sprite>();
compass_frame->SetTexture(cache->GetResource<Texture2D>("UI/compass-frame.png"));
compass_frame->SetBlendMode(Urho3D::BLEND_ALPHA);
compass_needle = root->CreateChild<Sprite>();
compass_needle->SetTexture(cache->GetResource<Texture2D>("UI/compass-needle.png"));
compass_needle->SetBlendMode(Urho3D::BLEND_ALPHA);
compass_changed = true;
}
void UIUrho3D::CreateCalendar()
{
auto root = context_->GetSubsystem<UI>()->GetRoot();
auto* cache = GetSubsystem<ResourceCache>();
calendar_frame = root->CreateChild<Sprite>();
calendar_frame->SetTexture(cache->GetResource<Texture2D>("UI/calendar-frame.png"));
calendar_frame->SetBlendMode(Urho3D::BLEND_ALPHA);
calendar_needle = root->CreateChild<Sprite>();
calendar_needle->SetTexture(cache->GetResource<Texture2D>("UI/calendar-needle.png"));
calendar_needle->SetBlendMode(Urho3D::BLEND_ALPHA);
calendar_changed = true;
}
void UIUrho3D::CreateNewBlockNotification()
{
auto root = context_->GetSubsystem<UI>()->GetRoot();
@ -431,6 +451,33 @@ void UIUrho3D::UpdateCompass(float timeStep, const Vector3 &view_direction)
compass_needle->SetRotation(new_angle);
}
void UIUrho3D::UpdateCalendar()
{
if (calendar_changed)
{
calendar_needle->SetPriority(-100);
calendar_frame->SetPriority(-101);
// re-position/size calendar
float size = 1.0f;
if (calendar_type == TBIDC("calendar-large")) size = 1.25f; else if (calendar_type == TBIDC("calendar-small")) size = 0.75f;
auto* graphics = GetSubsystem<Graphics>();
const int width = graphics->GetWidth() * size;
const int height = graphics->GetHeight() * size;
calendar_frame->SetPosition({CALENDAR_CENTER_OFFSET(size), CALENDAR_CENTER_OFFSET(size)});
calendar_frame->SetSize({CALENDAR_SIZE(size), CALENDAR_SIZE(size)});
calendar_frame->SetHotSpot({CALENDAR_SIZE(size) / 2, CALENDAR_SIZE(size) / 2});
calendar_frame->SetVisible(calendar_type != TBIDC("calendar-off"));
calendar_needle->SetPosition({CALENDAR_CENTER_OFFSET(size), CALENDAR_CENTER_OFFSET(size)});
calendar_needle->SetSize({CALENDAR_SIZE(size), CALENDAR_SIZE(size)});
calendar_needle->SetHotSpot({CALENDAR_SIZE(size) / 2, CALENDAR_SIZE(size) / 2});
calendar_needle->SetVisible(calendar_type != TBIDC("calendar-off"));
}
const float angle = (gameState->top_height + CHAIN_START_DATE_OFFSET) % BLOCKS_PER_GAME_YEAR / (float)BLOCKS_PER_GAME_YEAR;
calendar_frame->SetRotation(-angle * 360);
}
void UIUrho3D::AddNotification(const String &s, float relative_size)
{
notifier.Add(s, relative_size);
@ -532,6 +579,7 @@ void UIUrho3D::Update(float timeStep, uint32_t mouse_x, uint32_t mouse_y, uint32
UpdateLoadingWalletNotification(w);
UpdateQueuedCommandsNotification(w);
UpdateCompass(timeStep, view_direction);
UpdateCalendar();
UpdateNewBlockNotification(timeStep);
m_mining_checker.do_call([this, &w](){
@ -1550,6 +1598,9 @@ void UIUrho3D::ShowOptions()
SubscribeToEvent(optionsDialog, E_OPTIONS_COMPASS, [this](StringHash eventType, VariantMap& eventData) {
SendEvent(E_CRYPTOCITY_COMPASS, eventData);
});
SubscribeToEvent(optionsDialog, E_OPTIONS_CALENDAR, [this](StringHash eventType, VariantMap& eventData) {
SendEvent(E_CRYPTOCITY_CALENDAR, eventData);
});
SubscribeToEvent(optionsDialog, E_OPTIONS_SFX_VOLUME, [this](StringHash eventType, VariantMap& eventData) {
SendEvent(E_CRYPTOCITY_SFX_VOLUME, eventData);
});
@ -2276,6 +2327,9 @@ void UIUrho3D::HandleResized(StringHash eventType, VariantMap& eventData)
// re-center compass
compass_changed = true;
// re-center calendar
calendar_changed = true;
// re-center new block notification
rect = loadingWalletNotificationWidget->GetRect();
rect.x = (width / 2 - rect.w / 2);
@ -2363,6 +2417,12 @@ void UIUrho3D::SetCompassType(TBID type)
compass_changed = true;
}
void UIUrho3D::SetCalendarType(TBID type)
{
calendar_type = type;
calendar_changed = true;
}
void UIUrho3D::HandleFlagInfo(StringHash eventType, VariantMap& eventData)
{
if (lastUpdateEventsDialog)

View File

@ -162,6 +162,7 @@ URHO3D_EVENT(E_CRYPTOCITY_PLAY_SFX_ON_NEW_BLOCK, PlaySFXOnNewBlock) { URHO3D_PAR
URHO3D_EVENT(E_CRYPTOCITY_ADD_CITY_SPECIALIZATION, AddCitySpecialization) { URHO3D_PARAM(P_SPECIALIZATION, Specialization); }
URHO3D_EVENT(E_CRYPTOCITY_INCLUDE_UNMATCHED_TRADES_IN_QUEUED_COMMANDS, IncludeUnmatchedTradesInQueuedCommands) { URHO3D_PARAM(P_INCLUDE, Include); }
URHO3D_EVENT(E_CRYPTOCITY_COMPASS, Compass) { URHO3D_PARAM(P_COMPASS, Compass); }
URHO3D_EVENT(E_CRYPTOCITY_CALENDAR, Calendar) { URHO3D_PARAM(P_CALENDAR, Calendar); }
URHO3D_EVENT(E_CRYPTOCITY_SOW, Sow) { URHO3D_PARAM(P_FLAG, Flag); URHO3D_PARAM(P_CROP, Crop); }
URHO3D_EVENT(E_CRYPTOCITY_HARVEST, Harvest) { URHO3D_PARAM(P_FLAG, Flag); }
URHO3D_EVENT(E_CRYPTOCITY_RESTORE_MODEL_BACKUP, RestoreModelBackup) { URHO3D_PARAM(P_RESTORE, Restore); }
@ -195,6 +196,7 @@ public:
bool IsSelectMaterialOpen() const;
void SetCameraType(tb::TBID type);
void SetCompassType(tb::TBID type);
void SetCalendarType(tb::TBID type);
bool IsClickPassthroughWidget(tb::TBWidget *w) const;
private:
@ -205,6 +207,7 @@ private:
void CreateLoadingWalletNotificationWidget();
void CreateQueuedCommandsNotificationWidget();
void CreateCompass();
void CreateCalendar();
void CreateBuildOverviewWidget();
void CreateNewBlockNotification();
@ -217,6 +220,7 @@ private:
void UpdateLoadingWalletNotification(const std::shared_ptr<GameWallet> &w);
void UpdateQueuedCommandsNotification(const std::shared_ptr<GameWallet> &w);
void UpdateCompass(float timeStep, const Urho3D::Vector3 &view_direction);
void UpdateCalendar();
void UpdateBuildOverview(const boost::optional<std::tuple<uint32_t, std::vector<uint16_t>, std::vector<std::vector<uint8_t>>>> &flagUnderConstruction);
void UpdateNewBlockNotification(float timeStep);
@ -451,6 +455,12 @@ private:
tb::TBID compass_type;
bool compass_changed;
Urho3D::SharedPtr<Urho3D::Sprite> calendar_frame;
Urho3D::SharedPtr<Urho3D::Sprite> calendar_needle;
tb::TBID calendar_type;
bool calendar_changed;
UITBWindow *new_block_notification;
Urho3D::Timer new_block_timer;
};