From e6fac7f87080f742dfe776b77b4f1222d8da0277 Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Sun, 19 May 2024 22:05:05 +0200 Subject: [PATCH] Introduce progress/loader window --- .../g2/loader/loader_hybrid_supports.png | Bin 0 -> 2143 bytes resources/g2/loader/loader_hybrid_track.png | Bin 0 -> 1936 bytes resources/g2/loader/loader_hybrid_vehicle.png | Bin 0 -> 1600 bytes resources/g2/loader/loader_steel_supports.png | Bin 0 -> 317 bytes resources/g2/loader/loader_steel_track.png | Bin 0 -> 263 bytes resources/g2/loader/loader_steel_vehicle.png | Bin 0 -> 1694 bytes .../g2/loader/loader_wooden_supports.png | Bin 0 -> 2494 bytes resources/g2/loader/loader_wooden_track.png | Bin 0 -> 1021 bytes resources/g2/loader/loader_wooden_vehicle.png | Bin 0 -> 1510 bytes resources/g2/sprites.json | 37 +++- src/openrct2-ui/WindowManager.cpp | 5 + src/openrct2-ui/libopenrct2ui.vcxproj | 1 + src/openrct2-ui/windows/ProgressWindow.cpp | 192 ++++++++++++++++++ src/openrct2-ui/windows/Window.h | 3 + src/openrct2/interface/WindowClasses.h | 1 + src/openrct2/scenes/title/TitleScene.cpp | 6 + src/openrct2/sprites.h | 12 ++ 17 files changed, 255 insertions(+), 2 deletions(-) create mode 100644 resources/g2/loader/loader_hybrid_supports.png create mode 100644 resources/g2/loader/loader_hybrid_track.png create mode 100644 resources/g2/loader/loader_hybrid_vehicle.png create mode 100644 resources/g2/loader/loader_steel_supports.png create mode 100644 resources/g2/loader/loader_steel_track.png create mode 100644 resources/g2/loader/loader_steel_vehicle.png create mode 100644 resources/g2/loader/loader_wooden_supports.png create mode 100644 resources/g2/loader/loader_wooden_track.png create mode 100644 resources/g2/loader/loader_wooden_vehicle.png create mode 100644 src/openrct2-ui/windows/ProgressWindow.cpp diff --git a/resources/g2/loader/loader_hybrid_supports.png b/resources/g2/loader/loader_hybrid_supports.png new file mode 100644 index 0000000000000000000000000000000000000000..8860ca12dd31410f8c3a9ba70c36b2f7dc12d1e6 GIT binary patch literal 2143 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 G-hTmsvXqhl literal 0 HcmV?d00001 diff --git a/resources/g2/loader/loader_hybrid_vehicle.png b/resources/g2/loader/loader_hybrid_vehicle.png new file mode 100644 index 0000000000000000000000000000000000000000..914bf2447affe5c601c97c2a7ad258e8dcd2a59c GIT binary patch literal 1600 zcmZ9MeKga19LIlMu8G9mx-2U4m{yV1R8wd)OooMJY1Q&LOwFt;R#rwMHxJth9mTXR zFliqH+dwId*$U;s#P zp`hKZAs`1${||-Xj$^F=tcxj*Lct?oAUOg6NF*4Eh5;=|Rg+`{KykMMy{L#XD%Bcv zq;c_JN~R~k#3GnXF;g}R2H+B8TppTRLFPrEdAzm)04T7)7Z4x?6sH0*jiEb$E=9Y^|eN=vZ_e+eybmu8ghi;Qc{8T%QB$W)|wC8LT^o>#Rfdi(aT1hW!ew5Yg{%peA%y(?plOJ!U zU(F{bCI~Vc?{CiW&p3B;aG$7AsvC$7GAw&t*HI`;*5YDl($pK~u|q_no_*ccxWyti zF)7L<wxU&p?rx3niT^-X=^ z*Y2{+Z%=FeUQc{C6W_xaYi~#}b8}6a6AmW)T)3>^Ch}*0f*#B%we39CjH!NAk63Ss zG9U0WLupfzs4o-vsJXwtb!a)`S!Sr5&6(%uhc^920hJ#}vuERO z_AsdBYwNx*G(Rl4eLXU+Rnn7Pn1TKPRc^TL;p4mo78zmb6pYR?+wmv26EP}t%DFaP zZ2UDj1NN+tEESKiva{D6E$1AbK1KA>qZ=_2A_Mr*Ik}S#(5x*8H@AlH5e2zqsT8ge z#?{okkS9+)H>;9tDm|39@bsb3HZon!Iw-dlX^P3v^K9!2ogZIr_Nf;61vo$V(C~La zU=F@7*^;JPeMs5XZfN?{d9~i9md3Nn>+Tcl^h1^6io0;Yu)`xUAVNPxNEdno%Zz@< z$7aDLVZ9W5_!|C2M$WBuiN4hQR@dlFsA|L-3E4(j z6YJd6PZUL0VAxN*{j9Qnhd`9GZG)BT+f1TKbf?u*O;UgWAY66K%ST@~%y{f})hCYl t`Nn4To*0@t&*s93PRH#0ZE)i+I<_JtZ+>aJTDkJ&`1=O=)E_*N^)E&#`S}0< literal 0 HcmV?d00001 diff --git a/resources/g2/loader/loader_steel_supports.png b/resources/g2/loader/loader_steel_supports.png new file mode 100644 index 0000000000000000000000000000000000000000..9dc4c998746d7056506e7eeb8c5cdadd39206bfa GIT binary patch literal 317 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K56gilIB%^j~F_7Xc@Q4J`+`=Ht$S`Y;1W?d8 zz$e7@|NsB`&d%P+$XBmFQ_E_7rJ@s z`-6;7)i{2O1@o84zosb8=nzfIH$L*}IP;OR&;z^5mSp_h wQQ&;{qQ7(34gaHg-#4f|NmdjZQpFJ-!JaJ+Sz!!dj5WI{mcH^x2^kuvhSl;JMfs<0@X8>1o;Is zFqBO`YXRg{d%8G=Se#CtVR@iIQCD|uc9fLFgGJ#NgXSGPdUUDw5mugp3+q;AXr5Ql z(72Jxp&}t6v5QCI07GwD9P6UQR|c66LvI}IoSYtEdZ1xpas%T9#<#HoYJOFsx=$rf zc{}gEb-Iy3U3OpBv`;(-*6fg;rOMutCh?)kBeQ{#VShohbKDin^+0DZc)I$ztaD0e F0stl+S)Bj? literal 0 HcmV?d00001 diff --git a/resources/g2/loader/loader_steel_vehicle.png b/resources/g2/loader/loader_steel_vehicle.png new file mode 100644 index 0000000000000000000000000000000000000000..410b84f4224bfae57c46db0e9e587a281848a668 GIT binary patch literal 1694 zcmV;P24VS$P)uPNKL8gaBNs;>BQrB2Q!6Kr2QNcI zFHavYV>>rXOFMH*KL7wf02@C;cRy28Ln{YETU$#9b4z1mPbUCRD-%;wi&JZBR{#K4 zI}2NLb6dYZUmuTSHydMPn`3)>V~;y$05fYVn{P`OZ-awx&sTE*0Cz_#cXzLQ3qN~5 ztAm%9hf}+YS38S~zl+~fdvpJPC;yu>|F=K?&rAQ~ z!~gSN|ND;)J;yr$000zpQchC<000000000000000000000000%Z{eW;00hEGL_t(Y z$IX`iU)n|($0LZSYu8p}=XE!(v$uH5;!;!Qn(bQCbh5faqs@v`DM*Ft5Qa?q|L?g= z0{HE<*Ro&sdHLm&=bhyF1jO}e6mJyW^hOs`KpTiim zTp3RM{M`m$+i0J`QA>pf1uMUFbXHYOfadQ%SmOC5MYrA^99Yk{Cg^%8c*fVCDY|#^ zXV2Q+Q}p)jDy1*pzkl)FtG7pOlhVCj?{M?*q`U79)EGLQ)4zs|Q;49K_3H8Q+MBJ7 zHH40>#_@5!aDOQeUiJuSzEDsVNjDB)*9&yLQhBx>(aqlB-ln3rYYhg4r*EG=eu(g~ z34Z%zdvg^zjnR$hcVH9?n&mhYq4LTKg>_3Ef{?SgD7|VD(XbNIwYAH1d3j7%S0kFO zxd3VPA(jQx0$4`UTaEE@Ja_xUp~m{1ejk20hO_nigF(MjMuZ{Mkxi0Qv!-CbYCxeb z{h-q@C_^0>Lbwzf=W;C!HChAJ>)eG$7^>C5)|m2j_0UaBi3wXfwHk8_igs#BdJ()j z27WpNxgZC_fyS_s!HRHbfx6DbG^1B4 zfhrISl|o1{HBluNg%p9A%|;Od9V5a?MIA=rVFrHOBng!fqzFbjD+Pgs;5jLcGE{<( zCZCy+5r9`<86!%<;PClDjK)n8QWXIzSQbi(Nsn2n6o&{}mWlvh`4mLLf0VLNV4@d- zgfttL$%NDfofOk&AOg8b>RTW=HOW5<>lqmV7KKHx-9dfw6VojGy&(q724il)BFSXJ zDNu*Y;awbB{BD?-rU+#YeEu#m0Y>eMZL&Hl- zr|0G*bUstkTwa8SY59g8$?3eyd0IECx2}l*?-E5lZCT|o0x!ZT%<2tIlG7RP%%n52 o%asW5es8)N*ukBb`X5C28wo{J1N~4eW^ctr)I|;1jBxwMQ8rOw}T%MP$GOrxk9)Yx=M~r#rK||K0t4 zzwh@w{@?75l%!QY&o6u)005tacugt*h=e78Kj$u7KfG8SD%|F<@oRYi@bY(^BA~iv zJ^*;Mnss`cUYm%Mj736FjDeOoEUe2GP(?aeg3O|Apn*1;t!ik%*$jbZN)4@%YY{CQ zOPkE`n>jjdbCQnSoJA@rDDtVO1?9F>8m zYJNB6PIyv7CYz1LVc2fBOYBk!!x>>zsZ_!U24k35K#2KVtBr7ot^AT{1`W-VoSC(m z87t^wBn(WBO$`ZRC!?^iGqhHIDpNwvUXlO97BHq75auEY{dTsQzV|ja27%c*=!+< zG|XC!5IB=aJeJ93IKi=?PCB7NtHl$nyp6Dubb>|=2~kVTW(rp-X@U$#5OEl(kcnla zQZ6=NVT2f!hZ!h^oRBGG=(N3tA#+@{owlb0dn`OdLCO_MF@m5oZs+b45oVS5qTznaIj>0C{L$D4VfT)9(wB8}cSwaPYw6McXaq^rNx5a}u` zEhw0LZGK7yo-Kk&d%KAiNPnT+lQ5piu-OTYjy4L}dWMFAe@;G6Z2D#K&sM&tivMW? z{yOnfsU=N>)kq676NX&jz^>6USs3`oHJkYMy)iTm7iODlIWt#O3vBZ0ukw6xVExt`~ZfRrgH$n%OUsH)oeQu4mV>7OiPu0`w|Sbu29 z?i{IVFDvNF5^P1b)TA^Zs`twb0C3kQXrguc*8X>nWL=AzcQ)OVNOX?8u)MOvf-d;y zHuk_j8lp|ZzuETc$p!n+V!yk^XHzmm9CM<}wafh1ttMwfN1ZQSNvbU|_ta94YuauG zKjl{map>+}Wt_FGD9=xbEs4m51`a%~*50+D} z#ede)u<7rAS(|sv(wO129M6oXU(dhM&aJoJkIUO#T~N4Z@SIG1zn>pE)_weX?9h$& z>O4Jv?bv^P<+F~o$6<|ydF1^kU@;^SIQLrP&kUm*KH4in&jIhvlhy_*XVFpZ(Lp=+ zLt{wR?{5X49t)U%$*Zp9zf)i;LCW8LVd<7jd`oAa@50!QszARX6`0)^!6?LW^812GJny<&yMYcT}?9BgDLHJ)kN__oL z_vOW^^gWNuJllfq)W7Yl*uCaE`eJGOpQYO$dyBW5THQyBX3aiat5;oGQeUgT6Y)xK zyXd<&YwEMSXOD9EVDYZ2>6WNdkARXrMTu{Htytk5f8xb_k0!pC4c@QVxv=wL9I))X zWBU%T>+qHTEb-I?Jy$WX|8zGPard)>eahg_tJD`&o^4IuY}p&{2Do*M3d-(^ymu=k zPG=!txAZ3GxW^oJn|~tq8~fnHr5+uv#@@QLrY{0KD}%N%fvOY7M~=jHr+(a3*>!f` zE47Qdg&dI)e<=F4mHuSI@VO1$5uZEjGym2Q)V8X$YU}I&GMb_~-rqM=2(Af-_V?yL zAzI{r)Rm;oP333bdDN&19=`qB!!{|2^k} z#&3$Qj}Nou*#T~uzPD;N-rVuP>o}F2ywH#LQ@aNkPOd!Pc(TWz_Xbi2bL+iIY7Xu8 zL90ZSd-J+hdKA5-X6~iTFXPS|*$>|xyBDx^*JYm&<-DFbp?FW;t0~KK%~9uxn~UoV zT%lVj?A;e$`DAW@>ZbpvXXWmg@478*b+@kJT|OU#_dO{;aN|O8!-EB>yg2Ip&e5YH jpDy>1!b<}S${seKR+{mzlwX&+{;(3_k~D{7-rV{>Wz3-v literal 0 HcmV?d00001 diff --git a/resources/g2/loader/loader_wooden_track.png b/resources/g2/loader/loader_wooden_track.png new file mode 100644 index 0000000000000000000000000000000000000000..adafe2432ad823719889985292f99b40c3eb377d GIT binary patch literal 1021 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5R5_S|N#=C*G(*Y6kipKfow+Sz!!dj5WI{mcH^x2^l1hb#a8{~xH#J~-Gr zIXSwx7^ptKxf!CRdHQsSuEp~4m>S+dab4)NUa?1g1_WJx^>)!jvmcQ~luKdf^;m2VC zgF8(H{c{#6G~5?7>pOnu>zZzhbr%c%b~-ojQZD6BF2DQnOXpz)K8>A{uO;VkRM=g( zWnCnGcHM?EU(e{xXu9vPtSu$?)0HcyW6z6yNP2gRVdv|}+pkVPy~Ac5uO}5I|2n{3 z;;_6tP&ClvhDMX)x|XZ<3wjLNB%3o$e-yU$t}I-)m+AP!@vn?|-#ncM$G^T2$g*9~8g((c={L*w_U|J9o-xju50)r!sNrba`Q%Oh zgL$Xq6mymqeB(V}ow2L>ShUt%g}LTy8=Vz zEVHzHee>th-kIX&Y}c9h1r~;Bw(I3+n>J5V@UeQ?>RmI>?Zso`v};v0icagN9O7m< zqL|Fu$IK!T=aI7Z|9ysvIZZJZlRq5f+OUXyrL+Z$1?T0H&;HhC=(-5K2&O)neH^*dUw*R>A7O2a9ctn4CxPBF8>jW1%^Oa}*Eeon4|HvC(rdp58j1L5IBU%2W{WwlLn$!`Z*`qU z11Q}7^4;AHj?=u;pnA=?_0d{=j_E1Tm-1O(D;1)|^|A5thvUH>(_ezdnDcdRd8-)L z7mdpwT%4KAxViwku)5&u?0hYsd7o+|!TyTN>p2nUDiuoG-4~7^6G(*N-R<9h6QnXR zOs_E2^_{~x5zjF_ov&pDdCJulqiqS264!&1S9>DfWBMOl`c9A=u3ldM^?O0e#r4e9 z+mj-mWO{M+&VnEpTs^lA#u9TESl(}QF&u~cY}x5 zwC5%*?CMW%)pr6tmCdhQ@-+PhP+r%6z8stcdN{-q_H?eezEyl(e|UN3YM=`XtD6N+ z!^hO}o<^eH@54{OX%;P_>U3!KJ7T+S(IL(L+TQK*X5TFw>Uva9Plwtd33?FKJRj=y ztpq(2)r*UvUa7eni7nf7Q1(2p`mFnsxTq5#eZGXk!aI^jc70-v0G)g zq=3Rq^fbmodrd!lXsaHD#I`9d*{n({dKzP)k<3DpHC@+BwoF$`CEe7kk}OH|SJusH zRhFx?@OWsXx}j;R*=#m-KWR1_9gQWb)@e2xrmDJM0AryM{?Fn5@je#%|EABZY40Cg zToSqDz$Kh8_ZD=D1?W_AfMx@~X-?(d6k5XE+t7Y*>V-EnozlGLzj|(Kv;DFjbpQYW M07*qoM6N<$g5fN^hyVZp literal 0 HcmV?d00001 diff --git a/resources/g2/sprites.json b/resources/g2/sprites.json index d2f4bd51f3..862b804f48 100644 --- a/resources/g2/sprites.json +++ b/resources/g2/sprites.json @@ -311,6 +311,39 @@ { "path": "icons/colour_invisible_pressed.png" }, + { + "path": "loader/loader_hybrid_supports.png", + "y": 10 + }, + { + "path": "loader/loader_hybrid_track.png", + "y": 15 + }, + { + "path": "loader/loader_hybrid_vehicle.png" + }, + { + "path": "loader/loader_steel_supports.png", + "y": 27 + }, + { + "path": "loader/loader_steel_track.png", + "y": 16 + }, + { + "path": "loader/loader_steel_vehicle.png" + }, + { + "path": "loader/loader_wooden_supports.png", + "y": 3 + }, + { + "path": "loader/loader_wooden_track.png", + "y": 3 + }, + { + "path": "loader/loader_wooden_vehicle.png" + }, { "path": "palette_map/palette_map_dark_olive_dark.png", "palette": "keep", @@ -24912,12 +24945,12 @@ "palette": "keep" }, { - "path": "icons/medium-curve-left.png", + "path": "icons/medium-curve-left.png", "x": 2, "y": 6 }, { - "path": "icons/medium-curve-right.png", + "path": "icons/medium-curve-right.png", "x": 1, "y": 6 } diff --git a/src/openrct2-ui/WindowManager.cpp b/src/openrct2-ui/WindowManager.cpp index 34f8835da2..4b6aece012 100644 --- a/src/openrct2-ui/WindowManager.cpp +++ b/src/openrct2-ui/WindowManager.cpp @@ -269,6 +269,11 @@ public: return nullptr; } + case WindowClass::ProgressWindow: + { + std::string message = intent->GetStringExtra(INTENT_EXTRA_MESSAGE); + return ProgressWindowOpen(message); + } case WindowClass::Ride: { const auto rideId = RideId::FromUnderlying(intent->GetSIntExtra(INTENT_EXTRA_RIDE_ID)); diff --git a/src/openrct2-ui/libopenrct2ui.vcxproj b/src/openrct2-ui/libopenrct2ui.vcxproj index 23fc5adcb4..9c6aeaafc4 100644 --- a/src/openrct2-ui/libopenrct2ui.vcxproj +++ b/src/openrct2-ui/libopenrct2ui.vcxproj @@ -193,6 +193,7 @@ + diff --git a/src/openrct2-ui/windows/ProgressWindow.cpp b/src/openrct2-ui/windows/ProgressWindow.cpp new file mode 100644 index 0000000000..c803f193a0 --- /dev/null +++ b/src/openrct2-ui/windows/ProgressWindow.cpp @@ -0,0 +1,192 @@ +/***************************************************************************** + * Copyright (c) 2014-2024 OpenRCT2 developers + * + * For a complete list of all authors, please refer to contributors.md + * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 + * + * OpenRCT2 is licensed under the GNU General Public License version 3. + *****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace OpenRCT2::Ui::Windows +{ + enum ProgressWindowWidgetIdx + { + WIDX_BACKGROUND, + WIDX_TITLE, + WIDX_CLOSE, + }; + + static constexpr int32_t kWindowWidth = 400; + static constexpr int32_t kWindowHeight = 90; + + // clang-format off + static Widget kProgressWindowWidgets[] = { + MakeWidget({ 0, 0}, { kWindowWidth, kWindowHeight}, WindowWidgetType::Frame, WindowColour::Primary ), // panel / background + MakeWidget({ 1, 1}, {kWindowWidth - 3, 14}, WindowWidgetType::Caption, WindowColour::Primary, STR_STRINGID, STR_WINDOW_TITLE_TIP), // title bar + MakeWidget({kWindowWidth - 12, 2}, { 11, 12}, WindowWidgetType::CloseBox, WindowColour::Primary, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP), // close x button + kWidgetsEnd, + }; + + struct LoaderVehicleStyle + { + ImageId supports; + ImageId track; + ImageId vehicle; + }; + + static std::array kVehicleStyles = { { + { + ImageId{SPR_G2_LOADER_HYBRID_SUPPORTS, COLOUR_LIGHT_ORANGE, COLOUR_DARK_BROWN }, + ImageId{SPR_G2_LOADER_HYBRID_TRACK, COLOUR_LIGHT_ORANGE, COLOUR_LIGHT_ORANGE }, + ImageId{SPR_G2_LOADER_HYBRID_VEHICLE, COLOUR_OLIVE_GREEN, COLOUR_OLIVE_GREEN, COLOUR_BRIGHT_RED } + }, + { + ImageId{SPR_G2_LOADER_STEEL_SUPPORTS, COLOUR_LIGHT_BROWN, COLOUR_BLACK }, + ImageId{SPR_G2_LOADER_STEEL_TRACK, COLOUR_LIGHT_BROWN, COLOUR_LIGHT_BROWN }, + ImageId{SPR_G2_LOADER_STEEL_VEHICLE, COLOUR_LIGHT_BLUE, COLOUR_WHITE, COLOUR_LIGHT_BLUE } + }, + { + ImageId{SPR_G2_LOADER_WOODEN_SUPPORTS, COLOUR_BLACK, COLOUR_WHITE }, + ImageId{SPR_G2_LOADER_WOODEN_TRACK, COLOUR_BORDEAUX_RED, COLOUR_BLACK }, + ImageId{SPR_G2_LOADER_WOODEN_VEHICLE, COLOUR_BRIGHT_RED, COLOUR_BRIGHT_RED, COLOUR_SATURATED_BROWN} + }, + } }; + + static uint8_t nextStyle = 0; + + // clang-format on + class ProgressWindow final : public Window + { + private: + std::string _captionTemplate; + std::string _currentCaption; + uint8_t style; + + public: + void OnOpen() override + { + widgets = kProgressWindowWidgets; + WindowInitScrollWidgets(*this); + + widgets[WIDX_CLOSE].type = WindowWidgetType::Empty; + + frame_no = 0; + min_width = kWindowWidth; + min_height = kWindowHeight; + max_width = min_width; + max_height = min_height; + + style = nextStyle++ % std::size(kVehicleStyles); + } + + void OnUpdate() override + { + frame_no += 3; + if (frame_no > width) + { + frame_no = 0; + style++; + if (style >= 3) + style = 0; + } + + InvalidateWidget(WIDX_BACKGROUND); + } + + void OnPrepareDraw() override + { + ResizeFrame(); + } + + void PrepareCaption() + { + std::stringstream caption; + caption << _captionTemplate; + caption << " (" << frame_no << " / " << width << ")"; + + _currentCaption = caption.str(); + + // Set window title + auto ft = Formatter::Common(); + ft.Add(STR_STRING); + ft.Add(_currentCaption.c_str()); + } + + void OnDraw(DrawPixelInfo& dpi) override + { + PrepareCaption(); + WindowDrawWidgets(*this, dpi); + + auto& widget = widgets[WIDX_TITLE]; + auto screenCoords = windowPos + ScreenCoordsXY{ widget.left, widget.bottom + 1 }; + + DrawPixelInfo clipDPI; + if (!ClipDrawPixelInfo(clipDPI, dpi, screenCoords, width - 3, height - widget.bottom - 3)) + return; + + auto& variant = kVehicleStyles[style]; + + // Draw supports sprite -- twice, to fill the window + auto trackCoords = ScreenCoordsXY{ widget.left, widget.bottom + 1 }; + GfxDrawSprite(clipDPI, variant.supports, trackCoords); + GfxDrawSprite(clipDPI, variant.supports, trackCoords + ScreenCoordsXY(256, 0)); + + // Draw track sprite -- twice, to fill the window + GfxDrawSprite(clipDPI, variant.track, trackCoords); + GfxDrawSprite(clipDPI, variant.track, trackCoords + ScreenCoordsXY(256, 0)); + + if (_totalCount == 0) + return; + + // Draw vehicle to indicate progress + auto* vehicle = GfxGetG1Element(variant.vehicle); + auto position = (-vehicle->width + 2) + (frame_no % width); + GfxDrawSprite(clipDPI, variant.vehicle, ScreenCoordsXY(position, widget.bottom + 1)); + } + + void SetCaptionTemplate(const std::string& text) + { + _captionTemplate = text; + Invalidate(); + } + }; + + WindowBase* ProgressWindowOpen(const std::string& text) + { + ProgressWindow* window; + if ((window = static_cast(WindowFindByClass(WindowClass::ProgressWindow))) != nullptr) + { + WindowBringToFront(*window); + } + else + { + window = WindowCreate( + WindowClass::ProgressWindow, kWindowWidth, kWindowHeight, + WF_10 | WF_TRANSPARENT | WF_CENTRE_SCREEN | WF_STICK_TO_FRONT); + } + + window->SetCaptionTemplate(text); + return window; + } + + // force close + void ProgressWindowClose() + { + auto window = WindowFindByClass(WindowClass::ProgressWindow); + if (window == nullptr) + { + return; + } + auto progressWindow = static_cast(window); + progressWindow->Close(); + } +} // namespace OpenRCT2::Ui::Windows diff --git a/src/openrct2-ui/windows/Window.h b/src/openrct2-ui/windows/Window.h index e5ffb282a2..624f34cbc4 100644 --- a/src/openrct2-ui/windows/Window.h +++ b/src/openrct2-ui/windows/Window.h @@ -167,6 +167,9 @@ namespace OpenRCT2::Ui::Windows WindowBase* NetworkStatusOpenPassword(); void WindowNetworkStatusClose(); + WindowBase* ProgressWindowOpen(const std::string& text); + void ProgressWindowClose(); + void WindowTextInputKey(WindowBase* w, uint32_t keycode); void WindowTextInputOpen( WindowBase* call_w, WidgetIndex call_widget, StringId title, StringId description, const Formatter& descriptionArgs, diff --git a/src/openrct2/interface/WindowClasses.h b/src/openrct2/interface/WindowClasses.h index c0bcdbed0d..30f4e81f1e 100644 --- a/src/openrct2/interface/WindowClasses.h +++ b/src/openrct2/interface/WindowClasses.h @@ -88,6 +88,7 @@ enum class WindowClass : uint8_t Transparency = 134, AssetPacks = 135, ResetShortcutKeysPrompt = 136, + ProgressWindow = 137, // Only used for colour schemes Staff = 220, diff --git a/src/openrct2/scenes/title/TitleScene.cpp b/src/openrct2/scenes/title/TitleScene.cpp index 5fafb6819d..c9dc43f685 100644 --- a/src/openrct2/scenes/title/TitleScene.cpp +++ b/src/openrct2/scenes/title/TitleScene.cpp @@ -29,6 +29,7 @@ #include "../../scenario/ScenarioRepository.h" #include "../../ui/UiContext.h" #include "../../util/Util.h" +#include "../../windows/Intent.h" #include "TitleSequence.h" #include "TitleSequenceManager.h" #include "TitleSequencePlayer.h" @@ -205,6 +206,11 @@ void TitleScene::CreateWindows() ContextOpenWindow(WindowClass::TitleOptions); ContextOpenWindow(WindowClass::TitleLogo); WindowResizeGui(ContextGetWidth(), ContextGetHeight()); + + auto intent = Intent(WindowClass::ProgressWindow); + intent.PutExtra(INTENT_EXTRA_MESSAGE, "Important stuff is loading"); + ContextOpenIntent(&intent); + _hideVersionInfo = false; } diff --git a/src/openrct2/sprites.h b/src/openrct2/sprites.h index 235fe5d510..eb66c77299 100644 --- a/src/openrct2/sprites.h +++ b/src/openrct2/sprites.h @@ -976,6 +976,18 @@ enum SPR_G2_ICON_PALETTE_INVISIBLE, SPR_G2_ICON_PALETTE_INVISIBLE_PRESSED, + // G2 Loading progress + + SPR_G2_LOADER_HYBRID_SUPPORTS, + SPR_G2_LOADER_HYBRID_TRACK, + SPR_G2_LOADER_HYBRID_VEHICLE, + SPR_G2_LOADER_STEEL_SUPPORTS, + SPR_G2_LOADER_STEEL_TRACK, + SPR_G2_LOADER_STEEL_VEHICLE, + SPR_G2_LOADER_WOODEN_SUPPORTS, + SPR_G2_LOADER_WOODEN_TRACK, + SPR_G2_LOADER_WOODEN_VEHICLE, + // G2 Palette maps SPR_G2_PALETTE_BEGIN,