diff --git a/gui/hud_components/player_info.gui b/gui/hud_components/player_info.gui index 0df863c..5152911 100644 --- a/gui/hud_components/player_info.gui +++ b/gui/hud_components/player_info.gui @@ -83,7 +83,7 @@ - + diff --git a/scripts/GUI/MissionEndMenu.as b/scripts/GUI/MissionEndMenu.as new file mode 100644 index 0000000..1725b41 --- /dev/null +++ b/scripts/GUI/MissionEndMenu.as @@ -0,0 +1,736 @@ +class MissionEndRewardStep +{ + string m_name; + + int m_gold; + int m_wood; + int m_stone; + int m_iron; + int m_crystals; + int m_dust; + int m_ore; + + array@ m_sprites; + int m_delayAfter; + int m_countTm; + int m_countC; + + MissionEndRewardStep() {} + + MissionEndRewardStep(string &in name, int displayTime, int delayAfter, int gold, int wood, int stone, int iron, int crystals, int dust, int ore, PlayerRecord@ materialModder = null, array@ sprites = null) + { + m_name = name; + @m_sprites = sprites; + m_countTm = displayTime; + m_countC = 0; + m_delayAfter = delayAfter; + + m_gold = gold; + m_wood = wood; + m_stone = stone; + m_iron = iron; + m_crystals = crystals; + m_dust = dust; + m_ore = ore; + + if (materialModder !is null) + { + //auto@ mods = materialModder.GetModifiers(); + m_gold = roll_round(m_gold * materialModder.GetMaterialModifier(MaterialType::Gold)); + m_wood = roll_round(m_wood * materialModder.GetMaterialModifier(MaterialType::Wood)); + m_stone = roll_round(m_stone * materialModder.GetMaterialModifier(MaterialType::Stone)); + m_iron = roll_round(m_iron * materialModder.GetMaterialModifier(MaterialType::Iron)); + m_crystals = roll_round(m_crystals * materialModder.GetMaterialModifier(MaterialType::Crystals)); + m_dust = roll_round(m_dust * materialModder.GetMaterialModifier(MaterialType::Dust)); + m_ore = roll_round(m_ore * materialModder.GetMaterialModifier(MaterialType::Ore)); + } + } +} + +MissionEndRewardStep@ SumRewardSteps(array rewardSteps) +{ + MissionEndRewardStep step; + + for (uint i = 0; i < rewardSteps.length(); i++) + { + step.m_gold += rewardSteps[i].m_gold; + step.m_wood += rewardSteps[i].m_wood; + step.m_stone += rewardSteps[i].m_stone; + step.m_iron += rewardSteps[i].m_iron; + step.m_crystals += rewardSteps[i].m_crystals; + step.m_dust += rewardSteps[i].m_dust; + step.m_ore += rewardSteps[i].m_ore; + } + + return step; +} + + + +class MissionEndMenu : AWindowObject +{ + int m_disabledCounter; + + Widget@ m_contentW; + Widget@ m_rewardContent; + + array m_rewardSteps; + + int m_countGold; + int m_countWood; + int m_countStone; + int m_countIron; + int m_countCrystals; + int m_countDust; + int m_countOre; + + bool m_showCongratulation; + + Widget@ m_addGroup; + + TextWidget@ m_currGold; + TextWidget@ m_currWood; + TextWidget@ m_currStone; + TextWidget@ m_currIron; + TextWidget@ m_currCrystals; + TextWidget@ m_currDust; + TextWidget@ m_currOre; + + TextWidget@ m_addGold; + TextWidget@ m_addWood; + TextWidget@ m_addStone; + TextWidget@ m_addIron; + TextWidget@ m_addCrystals; + TextWidget@ m_addDust; + TextWidget@ m_addOre; + + CheckBoxGroupWidget@ m_checkboxGroup; + CheckBoxWidget@ m_materialCheckbox; + CheckBoxWidget@ m_statCheckbox; + + ScrollbarWidget@ m_statGroup; + TextWidget@ m_statCategoryTemplate; + Widget@ m_statSeparatorTemplate; + Widget@ m_statValuePair; + + BindingDisplayWidget@ m_bindingSubTabP; + BindingDisplayWidget@ m_bindingSubTabN; + + int m_delayC; + + MissionEndMenu(GUIBuilder@ b, PlayerRecord@ plr, bool dontClearMission = false) + { + super(b, "gui/mission_end.gui"); + + m_disabledCounter = 1500; + + @m_checkboxGroup = cast(m_widget.GetWidgetById("checkbox-group")); + @m_materialCheckbox = cast(m_checkboxGroup.GetWidgetById("material")); + @m_statCheckbox = cast(m_checkboxGroup.GetWidgetById("stats")); + + @m_addGroup = m_widget.GetWidgetById("add-group"); + + @m_currGold = cast(m_widget.GetWidgetById("curr-gold")); + @m_currWood = cast(m_widget.GetWidgetById("curr-wood")); + @m_currStone = cast(m_widget.GetWidgetById("curr-stone")); + @m_currIron = cast(m_widget.GetWidgetById("curr-iron")); + @m_currCrystals = cast(m_widget.GetWidgetById("curr-crystal")); + @m_currDust = cast(m_widget.GetWidgetById("curr-dust")); + @m_currOre = cast(m_widget.GetWidgetById("curr-ore")); + + @m_addGold = cast(m_widget.GetWidgetById("add-gold")); + @m_addWood = cast(m_widget.GetWidgetById("add-wood")); + @m_addStone = cast(m_widget.GetWidgetById("add-stone")); + @m_addIron = cast(m_widget.GetWidgetById("add-iron")); + @m_addCrystals = cast(m_widget.GetWidgetById("add-crystal")); + @m_addDust = cast(m_widget.GetWidgetById("add-dust")); + @m_addOre = cast(m_widget.GetWidgetById("add-ore")); + + @m_bindingSubTabP = cast(m_widget.GetWidgetById("binding-subtab-p")); + @m_bindingSubTabN = cast(m_widget.GetWidgetById("binding-subtab-n")); + + m_currGold.SetText(Resources::GetString(".tab.overlay.player.gold", {{ "amount", 0 }})); + m_currWood.SetText(Resources::GetString(".tab.overlay.player.wood", {{ "amount", 0 }})); + m_currStone.SetText(Resources::GetString(".tab.overlay.player.stone", {{ "amount", 0 }})); + m_currIron.SetText(Resources::GetString(".tab.overlay.player.iron", {{ "amount", 0 }})); + m_currCrystals.SetText(Resources::GetString(".tab.overlay.player.crys", {{ "amount", 0 }})); + m_currDust.SetText(Resources::GetString(".tab.overlay.player.dust", {{ "amount", 0 }})); + m_currOre.SetText(Resources::GetString(".tab.overlay.player.ore", {{ "amount", 0 }})); + + m_addGold.SetText(""); + m_addWood.SetText(""); + m_addStone.SetText(""); + m_addIron.SetText(""); + m_addCrystals.SetText(""); + m_addDust.SetText(""); + m_addOre.SetText(""); + + @m_statGroup = cast(m_widget.GetWidgetById("stat-group")); + @m_statCategoryTemplate = cast(m_widget.GetWidgetById("stat-category-template")); + @m_statSeparatorTemplate = m_widget.GetWidgetById("stat-separator"); + @m_statValuePair = m_widget.GetWidgetById("stat-value-template"); + + @m_contentW = m_widget.GetWidgetById("stat-content"); + @m_rewardContent = m_widget.GetWidgetById("reward-content"); + + m_contentW.m_visible = false; + m_rewardContent.m_visible = true; + + auto missionDef = MissionDef::Get(plr.currMission); + if (missionDef is null) + { + PrintError("Failed to find ended mission."); + return; + } + + auto sentBack = MissionEndRewardStep(Resources::GetString(".menu.mission_end.step.sent_back"), 1000, 750, + plr.statsRun.GetStatCurr(HashString("sent-back-gold")), + plr.statsRun.GetStatCurr(HashString("sent-back-wood")), + plr.statsRun.GetStatCurr(HashString("sent-back-stone")), + plr.statsRun.GetStatCurr(HashString("sent-back-iron")), + plr.statsRun.GetStatCurr(HashString("sent-back-crystals")), + plr.statsRun.GetStatCurr(HashString("sent-back-dust")), + plr.statsRun.GetStatCurr(HashString("sent-back-ore")) + ); + + m_rewardSteps.insertLast(MissionEndRewardStep(Resources::GetString(".menu.mission_end.step.picked_up"), 750, 750, + max(0, plr.materials[int(MaterialType::Gold)] - plr.valuableInventory.m_totValue), max(0, plr.materials[int(MaterialType::Wood)]), max(0, plr.materials[int(MaterialType::Stone)]), max(0, plr.materials[int(MaterialType::Iron)]), max(0, plr.materials[int(MaterialType::Crystals)]), max(0, plr.materials[int(MaterialType::Dust)]), max(0, plr.materials[int(MaterialType::Ore)]))); + + if (plr.valuableInventory.m_valuables.length() > 0) + { + array sprites; + for (uint i = 0; i < plr.valuableInventory.m_valuables.length(); i++) + { + auto icon = plr.valuableInventory.m_valuables[i].GetIcon(); + if (icon !is null) + sprites.insertLast(icon); + } + + m_rewardSteps.insertLast(MissionEndRewardStep(Resources::GetString(".menu.mission_end.step.valuables"), 500 + 100 * min(30, plr.valuableInventory.m_valuables.length()), 750, plr.valuableInventory.m_totValue, 0, 0, 0, 0, 0, 0, null, sprites)); + } + + + if (g_currTownRecord.GetVariationOnBuilding(HashString("magic_shop")) >= 0) + { + array commonSprites; + array uncommonSprites; + array rareSprites; + array epicSprites; + + for (uint i = 0; i < plr.trinketInventory.m_items.length(); i++) + { + auto trinket = plr.trinketInventory.m_items[i]; + if (trinket.m_quality == Item::Quality::Common) + commonSprites.insertLast(trinket.GetIcon()); + else if (trinket.m_quality == Item::Quality::Uncommon) + uncommonSprites.insertLast(trinket.GetIcon()); + else if (trinket.m_quality == Item::Quality::Rare) + rareSprites.insertLast(trinket.GetIcon()); + else if (trinket.m_quality == Item::Quality::Epic) + epicSprites.insertLast(trinket.GetIcon()); + } + + const int trinketDelayTime = 350; + + if (commonSprites.length() > 0) + { + int num = commonSprites.length(); + auto step = MissionEndRewardStep(Resources::GetString(".menu.mission_end.step.trinkets.common"), 500 + 100 * min(30, commonSprites.length()), trinketDelayTime, 0, 0, 0, 0, num, 0, 0, plr, commonSprites); + m_rewardSteps.insertLast(step); + %STAT Add collected-crystals step.m_crystals plr + } + if (uncommonSprites.length() > 0) + { + int num = uncommonSprites.length() * 3; + auto step = MissionEndRewardStep(Resources::GetString(".menu.mission_end.step.trinkets.uncommon"), 500 + 100 * min(30, uncommonSprites.length()), trinketDelayTime, 0, 0, 0, 0, num, 0, 0, plr, uncommonSprites); + m_rewardSteps.insertLast(step); + %STAT Add collected-crystals step.m_crystals plr + } + if (rareSprites.length() > 0) + { + int num = rareSprites.length(); + auto step = MissionEndRewardStep(Resources::GetString(".menu.mission_end.step.trinkets.rare"), 500 + 100 * min(30, rareSprites.length()), trinketDelayTime, 0, 0, 0, 0, 0, num, 0, plr, rareSprites); + m_rewardSteps.insertLast(step); + %STAT Add collected-dust step.m_dust plr + } + if (epicSprites.length() > 0) + { + int num = epicSprites.length() * 3; + auto step = MissionEndRewardStep(Resources::GetString(".menu.mission_end.step.trinkets.epic"), 500 + 100 * min(30, epicSprites.length()), trinketDelayTime, 0, 0, 0, 0, 0, num, 0, plr, epicSprites); + m_rewardSteps.insertLast(step); + %STAT Add collected-dust step.m_dust plr + } + } + + if (false) // plr.currMissionState != MissionManager::MissionState::Succeeded + { + float costMul = -1.0f * (1.0f - ((1.0f - plr.GetModifiers().ReviveCostMul(plr)) + (1.0f - Tweak::BaseReviveCost))); + auto total = SumRewardSteps(m_rewardSteps); + + auto costStep = MissionEndRewardStep(Resources::GetString(".menu.mission_end.step.revive", {{ "rate", int(costMul * -100.0f + 0.5f) }}), 1000, 750, + int(total.m_gold * costMul), + int(total.m_wood * costMul), + int(total.m_stone * costMul), + int(total.m_iron * costMul), + int(total.m_crystals * costMul), + int(total.m_dust * costMul), + int(total.m_ore * costMul) + ); + + %STAT Add chapel-revive-gold -costStep.m_gold plr + %STAT Add chapel-revive-wood -costStep.m_wood plr + %STAT Add chapel-revive-stone -costStep.m_stone plr + %STAT Add chapel-revive-iron -costStep.m_iron plr + %STAT Add chapel-revive-crystals -costStep.m_crystals plr + %STAT Add chapel-revive-dust -costStep.m_dust plr + %STAT Add chapel-revive-ore -costStep.m_ore plr + + m_rewardSteps.insertLast(costStep); + } + + + + // Bonus?? + + if (plr.currMissionState == MissionManager::MissionState::Succeeded) + { + auto reward = missionDef.GetReward(MissionManager::g_module.m_missionRewardSeed); + bool givesReward = reward !is null && (reward.m_gold.x != 0 || reward.m_wood.x != 0 || reward.m_stone.x != 0 || reward.m_iron.x != 0 || reward.m_crystals.x != 0 || reward.m_dust.x != 0 || reward.m_ore.x != 0); + if (givesReward) + m_rewardSteps.insertLast(MissionEndRewardStep(Resources::GetString(".menu.mission_end.step.reward"), 2000, 500, reward.m_gold.x, reward.m_wood.x, reward.m_stone.x, reward.m_iron.x, reward.m_crystals.x, reward.m_dust.x, reward.m_ore.x, plr)); + + if (missionDef.m_id == "dark_citadel") + { + auto ingp = int(g_ngp + 0.5f); + + if (ingp >= 5) + Platform::Service.UnlockAchievement("beat_dark_citadel_ngp5"); + if (ingp >= 4) + Platform::Service.UnlockAchievement("beat_dark_citadel_ngp4"); + if (ingp >= 3) + Platform::Service.UnlockAchievement("beat_dark_citadel_ngp3"); + if (ingp >= 2) + Platform::Service.UnlockAchievement("beat_dark_citadel_ngp2"); + if (ingp >= 1) + Platform::Service.UnlockAchievement("beat_dark_citadel_ngp1"); + + Platform::Service.UnlockAchievement("beat_dark_citadel"); + + if (!g_myTownRecord.HasTownFlag(HashString("beat_dark_citadel"))) + m_showCongratulation = true; + + g_myTownRecord.SetTownFlag(HashString("beat_dark_citadel"), true, false); + %STAT Max highest-ngp ingp+1 plr + } + } + + m_delayC = 1000; + + if (plr.currMissionState == MissionManager::MissionState::Succeeded) + { + cast(m_widget.GetWidgetById("mission-state")).SetText(Resources::GetString(".menu.mission_end.completed")); + cast(m_widget.GetWidgetById("mission-title")).SetText(missionDef.m_name); + } + else if (plr.currMissionState == MissionManager::MissionState::Failed) + { + cast(m_widget.GetWidgetById("mission-state")).SetText(Resources::GetString(".menu.mission_end.failed")); + cast(m_widget.GetWidgetById("mission-title")).SetText(missionDef.m_name); + + } + else if (plr.currMissionState == MissionManager::MissionState::Aborted) + { + cast(m_widget.GetWidgetById("mission-state")).SetText(Resources::GetString(".menu.mission_end.aborted")); + cast(m_widget.GetWidgetById("mission-title")).SetText(missionDef.m_name); + } + + + auto plrBase = cast(plr.actor); + if (plrBase !is null) + { + Widget@ categoryGroup; + for (uint i = 0; i < plrBase.m_skills.length(); i++) + { + auto val = plr.statsRun.GetStatCurr(HashString("damage-dealt-" + plrBase.m_skills[i].m_skillId)); + if (val == 0) + continue; + + if (categoryGroup is null) + @categoryGroup = AddStatGroup("skill_dmg"); + + AddStatValue(categoryGroup, plrBase.m_skills[i].m_name, formatThousands(val, true)); + } + } + + for (uint i = 0; i < Stats::StatDef::Instances.length(); i++) + { + auto currStat = Stats::StatDef::Instances[i]; + if (currStat.m_hidden) + continue; + + if (currStat.m_category.isEmpty()) + continue; + + auto val = plr.statsRun.GetStatCurr(currStat.m_idHash); + if (val == 0) + continue; + + auto categoryGroup = m_statGroup.GetWidgetByIdImpl(currStat.m_categoryHash); + if (categoryGroup is null) + @categoryGroup = AddStatGroup(currStat.m_category); + + AddStatValue(categoryGroup, Resources::GetString(currStat.m_name), currStat.GetStatFormatted(val)); + } + + + + if (!dontClearMission) + { + MissionManager::g_module.SetMission(0, 0); + plr.currMission = 0; + plr.currMissionState = MissionManager::MissionState::None; + plr.currMissionRewardSeed = 0; + } + + plr.ResetForNewMission(); + g_flags.ClearFlags(FlagState::Run); + + for (uint i = 0; i < plr.materials.length(); i++) + plr.materials[i] = 0; + + { + auto total = SumRewardSteps(m_rewardSteps); + g_myTownRecord.GiveMaterial(MaterialType::Gold, max(0, total.m_gold)); + g_myTownRecord.GiveMaterial(MaterialType::Wood, max(0, total.m_wood)); + g_myTownRecord.GiveMaterial(MaterialType::Stone, max(0, total.m_stone)); + g_myTownRecord.GiveMaterial(MaterialType::Iron, max(0, total.m_iron)); + g_myTownRecord.GiveMaterial(MaterialType::Crystals, max(0, total.m_crystals)); + g_myTownRecord.GiveMaterial(MaterialType::Dust, max(0, total.m_dust)); + g_myTownRecord.GiveMaterial(MaterialType::Ore, max(0, total.m_ore)); + } + + if (sentBack.m_gold > 0 || sentBack.m_wood > 0 || sentBack.m_stone > 0 || sentBack.m_iron > 0 || sentBack.m_crystals > 0 || sentBack.m_dust > 0 || sentBack.m_ore > 0) + m_rewardSteps.insertAt(0, sentBack); + + TabIncome(); + + g_myTownRecord.RefreshDonationTitles(); + plr.RefreshModifiers(); + } + + void RefreshKeybinds(ControlMap@ currMap) override + { + m_bindingSubTabP.SetBinding("MenuPreviousSubTab"); + m_bindingSubTabN.SetBinding("MenuNextSubTab"); + + AWindowObject::RefreshKeybinds(currMap); + } + + void OnInteractableIndexChanged() override + { + auto currInteractable = m_input.GetCurrentInteractable(); + if (currInteractable is null) + { + m_navigationBar.BuildBar({}, this); + return; + } + + array@ rawTexts = currInteractable.NavigationBarText(); + array navTexts; + for (uint i = 0; i < rawTexts.length(); i++) + navTexts.insertLast(KeyNavigationText(m_navigationBar.m_font.BuildText(rawTexts[i]))); + + m_navigationBar.BuildBar(navTexts, this); + } + + void TabIncome() + { + if (m_statGroup.m_visible) + { + m_statGroup.m_visible = false; + m_contentW.m_visible = false; + m_rewardContent.m_visible = true; + RefreshInteractableWidgets(m_widget); + OnInteractableIndexChanged(); + + m_materialCheckbox.SetChecked(true); + m_statCheckbox.SetChecked(false); + } + } + void TabStats() + { + if (!m_statGroup.m_visible) + { + m_statGroup.m_visible = true; + m_contentW.m_visible = true; + m_rewardContent.m_visible = false; + RefreshInteractableWidgets(m_widget); + OnInteractableIndexChanged(); + + m_materialCheckbox.SetChecked(false); + m_statCheckbox.SetChecked(true); + } + } + + Widget@ AddStatGroup(const string &in group) + { + auto newCategory = cast(m_statCategoryTemplate.Clone()); + newCategory.m_id = group; + newCategory.m_idHash = HashString(group); + newCategory.m_visible = true; + + newCategory.SetText(Resources::GetString(".menu.stats.cat." + group)); + + if (m_statGroup.m_children.length() > 0) + newCategory.m_offset.y += m_statValuePair.m_height; + + m_statGroup.AddChild(newCategory); + return newCategory; + } + + void AddStatValue(Widget@ group, const string &in title, const string &in text) + { + auto newStatPair = m_statValuePair.Clone(); + newStatPair.SetID(""); + newStatPair.m_visible = true; + + auto statTitle = cast(newStatPair.GetWidgetById("stat-title")); + statTitle.SetText(title); + + auto statText = cast(newStatPair.GetWidgetById("stat-text")); + statText.SetText(text); + + int i = 0; + int placeIndex = m_statGroup.m_children.findByRef(group) + 1; + for (; placeIndex < int(m_statGroup.m_children.length()); placeIndex++, i++) + { + if (!m_statGroup.m_children[placeIndex].m_id.isEmpty()) + break; + } + + if (i % 2 == 0) + newStatPair.GetWidgetById("stat-bg").m_visible = true; + + m_statGroup.AddChild(newStatPair, placeIndex); + } + + + void Draw(SpriteBatch& sb, int idt) override + { + AWindowObject::Draw(sb, idt); + + if (!m_statGroup.m_visible) + { + auto font = Resources::GetBitmapFont("gui/fonts/hw8.fnt"); + vec2 offset = m_origin + vec2(5, 5); + + for (int r = 0; r <= m_rewardStepCurrId; r++) + { + if (r >= int(m_rewardSteps.length())) + break; + + float step = clamp(m_rewardSteps[r].m_countC / float(m_rewardSteps[r].m_countTm), 0.0f, 1.0f); + if (r < m_rewardStepCurrId) + step = 1.0f; + + StringBuilder cost; + cost.Append(m_rewardSteps[r].m_name); + cost.Append(": "); + + if (m_rewardSteps[r].m_gold != 0) + AddStepCountingText(cost, m_rewardSteps[r].m_gold, ".tab.overlay.player.gold", step); + if (m_rewardSteps[r].m_wood != 0) + AddStepCountingText(cost, m_rewardSteps[r].m_wood, ".tab.overlay.player.wood", step); + if (m_rewardSteps[r].m_stone != 0) + AddStepCountingText(cost, m_rewardSteps[r].m_stone, ".tab.overlay.player.stone", step); + if (m_rewardSteps[r].m_iron != 0) + AddStepCountingText(cost, m_rewardSteps[r].m_iron, ".tab.overlay.player.iron", step); + if (m_rewardSteps[r].m_crystals != 0) + AddStepCountingText(cost, m_rewardSteps[r].m_crystals, ".tab.overlay.player.crys", step); + if (m_rewardSteps[r].m_dust != 0) + AddStepCountingText(cost, m_rewardSteps[r].m_dust, ".tab.overlay.player.dust", step); + if (m_rewardSteps[r].m_ore != 0) + AddStepCountingText(cost, m_rewardSteps[r].m_ore, ".tab.overlay.player.ore", step); + + sb.DrawString(m_rewardContent.m_origin + offset, font, cost.String(), vec4(1,1,1,1), TextAlignment::Left); + + offset.y += font.GetLineHeight() + 1; + + + auto@ sprites = m_rewardSteps[r].m_sprites; + if (sprites !is null && sprites.length() > 0) + { + auto pos = m_rewardContent.m_origin + offset; + float height = 0; + + auto drawSprites = Modifiers::lerp(vec2(0, sprites.length()), step); + float xIncr = float(m_rewardContent.m_width - sprites[0].GetWidth() - offset.x * 2) / max(1.0f, float(sprites.length() - 1)); + xIncr = min(sprites[0].GetWidth() * 1.5f, xIncr); + + for (int i = 0; i < drawSprites; i++) + { + sprites[i].Draw(sb, pos + vec2(int(xIncr * i + 0.5f), 0), g_menuTime); + height = max(height, sprites[i].GetHeight()); + } + + offset.y += height + 3; + } + } + } + } + + void AddStepCountingText(StringBuilder@ sb, int value, const string &in str, float step) + { + if (value != 0) + { + sb.Append(Resources::GetString(str, {{ "amount", lerp(0, value, step) }})); + sb.Append(" "); + } + /* + if (value < 0) + widget.SetColor(vec4(1,0,0,1)); + else + widget.SetColor(vec4(0,1,0,1)); + */ + } + + void SetRewardStepCountingText(TextWidget@ widget, int value, float step) + { + if (value != 0) + widget.SetText("+" + lerp(value, 0, step)); + + if (value < 0) + widget.SetColor(vec4(1,0,0,1)); + else + widget.SetColor(vec4(0,1,0,1)); + } + + int m_rewardStepCurrId; + bool Update(int ms, GameInput& gameInput, MenuInput& menuInput) override + { +%if GAME + if (menuInput.MenuPreviousSubTab.Pressed) + TabIncome(); + if (menuInput.MenuNextSubTab.Pressed) + TabStats(); +%endif + + if (m_disabledCounter > 0) + m_disabledCounter -= ms; + + if (m_delayC > 0) + m_delayC -= ms; + else if (int(m_rewardSteps.length()) > m_rewardStepCurrId) + { + m_rewardSteps[m_rewardStepCurrId].m_countC += ms; + + float step = m_rewardSteps[m_rewardStepCurrId].m_countC / float(m_rewardSteps[m_rewardStepCurrId].m_countTm); + if (step >= 1.0f) + { + m_countGold += m_rewardSteps[m_rewardStepCurrId].m_gold; + m_countWood += m_rewardSteps[m_rewardStepCurrId].m_wood; + m_countStone += m_rewardSteps[m_rewardStepCurrId].m_stone; + m_countIron += m_rewardSteps[m_rewardStepCurrId].m_iron; + m_countCrystals += m_rewardSteps[m_rewardStepCurrId].m_crystals; + m_countDust += m_rewardSteps[m_rewardStepCurrId].m_dust; + m_countOre += m_rewardSteps[m_rewardStepCurrId].m_ore; + + if (m_countGold != 0) + m_currGold.SetText(Resources::GetString(".tab.overlay.player.gold", {{ "amount", m_countGold }})); + if (m_countWood != 0) + m_currWood.SetText(Resources::GetString(".tab.overlay.player.wood", {{ "amount", m_countWood }})); + if (m_countStone != 0) + m_currStone.SetText(Resources::GetString(".tab.overlay.player.stone", {{ "amount", m_countStone }})); + if (m_countIron != 0) + m_currIron.SetText(Resources::GetString(".tab.overlay.player.iron", {{ "amount", m_countIron }})); + if (m_countCrystals != 0) + m_currCrystals.SetText(Resources::GetString(".tab.overlay.player.crys", {{ "amount", m_countCrystals }})); + if (m_countDust != 0) + m_currDust.SetText(Resources::GetString(".tab.overlay.player.dust", {{ "amount", m_countDust }})); + if (m_countOre != 0) + m_currOre.SetText(Resources::GetString(".tab.overlay.player.ore", {{ "amount", m_countOre }})); + + m_addGold.SetText(""); + m_addWood.SetText(""); + m_addStone.SetText(""); + m_addIron.SetText(""); + m_addCrystals.SetText(""); + m_addDust.SetText(""); + m_addOre.SetText(""); + + m_delayC = m_rewardSteps[m_rewardStepCurrId].m_delayAfter; + m_rewardStepCurrId++; + } + else + { + { + if (m_countGold != 0 || m_rewardSteps[m_rewardStepCurrId].m_gold != 0) + m_currGold.SetText(Resources::GetString(".tab.overlay.player.gold", {{ "amount", m_countGold + lerp(0, m_rewardSteps[m_rewardStepCurrId].m_gold, step) }})); + if (m_countWood != 0 || m_rewardSteps[m_rewardStepCurrId].m_wood != 0) + m_currWood.SetText(Resources::GetString(".tab.overlay.player.wood", {{ "amount", m_countWood + lerp(0, m_rewardSteps[m_rewardStepCurrId].m_wood, step) }})); + if (m_countStone != 0 || m_rewardSteps[m_rewardStepCurrId].m_stone != 0) + m_currStone.SetText(Resources::GetString(".tab.overlay.player.stone", {{ "amount", m_countStone + lerp(0, m_rewardSteps[m_rewardStepCurrId].m_stone, step) }})); + if (m_countIron != 0 || m_rewardSteps[m_rewardStepCurrId].m_iron != 0) + m_currIron.SetText(Resources::GetString(".tab.overlay.player.iron", {{ "amount", m_countIron + lerp(0, m_rewardSteps[m_rewardStepCurrId].m_iron, step) }})); + if (m_countCrystals != 0 || m_rewardSteps[m_rewardStepCurrId].m_crystals != 0) + m_currCrystals.SetText(Resources::GetString(".tab.overlay.player.crys", {{ "amount", m_countCrystals + lerp(0, m_rewardSteps[m_rewardStepCurrId].m_crystals, step) }})); + if (m_countDust != 0 || m_rewardSteps[m_rewardStepCurrId].m_dust != 0) + m_currDust.SetText(Resources::GetString(".tab.overlay.player.dust", {{ "amount", m_countDust + lerp(0, m_rewardSteps[m_rewardStepCurrId].m_dust, step) }})); + if (m_countOre != 0 || m_rewardSteps[m_rewardStepCurrId].m_ore != 0) + m_currOre.SetText(Resources::GetString(".tab.overlay.player.ore", {{ "amount", m_countOre + lerp(0, m_rewardSteps[m_rewardStepCurrId].m_ore, step) }})); + } + + { + if (m_countGold != 0 || m_rewardSteps[m_rewardStepCurrId].m_gold != 0) + SetRewardStepCountingText(m_addGold, m_rewardSteps[m_rewardStepCurrId].m_gold, step); + + if (m_countWood != 0 || m_rewardSteps[m_rewardStepCurrId].m_wood != 0) + SetRewardStepCountingText(m_addWood, m_rewardSteps[m_rewardStepCurrId].m_wood, step); + + if (m_countStone != 0 || m_rewardSteps[m_rewardStepCurrId].m_stone != 0) + SetRewardStepCountingText(m_addStone, m_rewardSteps[m_rewardStepCurrId].m_stone, step); + + if (m_countIron != 0 || m_rewardSteps[m_rewardStepCurrId].m_iron != 0) + SetRewardStepCountingText(m_addIron, m_rewardSteps[m_rewardStepCurrId].m_iron, step); + + if (m_countCrystals != 0 || m_rewardSteps[m_rewardStepCurrId].m_crystals != 0) + SetRewardStepCountingText(m_addCrystals, m_rewardSteps[m_rewardStepCurrId].m_crystals, step); + + if (m_countDust != 0 || m_rewardSteps[m_rewardStepCurrId].m_dust != 0) + SetRewardStepCountingText(m_addDust, m_rewardSteps[m_rewardStepCurrId].m_dust, step); + + if (m_countOre != 0 || m_rewardSteps[m_rewardStepCurrId].m_ore != 0) + SetRewardStepCountingText(m_addOre, m_rewardSteps[m_rewardStepCurrId].m_ore, step); + } + } + } + + return AWindowObject::Update(ms, gameInput, menuInput); + } + + void OnFunc(Widget@ sender, const string &in name) override + { + auto parse = name.split(" "); + if (parse[0] == "close") + { + if (m_disabledCounter > 0) + return; + + cast(g_gameMode).SavePlayerAndTown(); + + m_manager.CloseWindow(this); + } + else if (parse[0] == "set-tab") + { + if (parse[1] == "materials") + TabIncome(); + else if (parse[1] == "stats") + TabStats(); + } + } + + void OnClose() override + { + if (m_showCongratulation) + g_gameMode.ShowDialog("a", Resources::GetString(".menu.mission_end.new_game_plus"), Resources::GetString(".menu.ok"), this); + } +} \ No newline at end of file