From 2528e94b483d40dabb2fa23080b8de35b62ecef7 Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Wed, 19 Feb 2020 14:05:36 +0100 Subject: [PATCH] Introduce low, medium, and high density buttons to the scatter tool. Change window lay-out to more closely resemble others by introducing density buttons, along with new sprites. The amount of elements varies by density as follows: * Low: number of elements equal to tool size * Medium: twice as many elements as the tool size * High: three times as many elements as the tool size. Remove extraneous 'retry' clause. --- data/language/en-GB.txt | 8 +- resources/g2/sprites.json | 9 ++ resources/g2/tool/scenery_scatter_high.png | Bin 0 -> 3202 bytes resources/g2/tool/scenery_scatter_low.png | Bin 0 -> 3164 bytes resources/g2/tool/scenery_scatter_medium.png | Bin 0 -> 3195 bytes src/openrct2-ui/windows/Scenery.cpp | 4 +- src/openrct2-ui/windows/SceneryScatter.cpp | 116 +++++++++---------- src/openrct2-ui/windows/TopToolbar.cpp | 24 ++-- src/openrct2-ui/windows/Window.h | 3 +- src/openrct2/localisation/StringIds.h | 8 +- src/openrct2/sprites.h | 6 +- src/openrct2/world/Scenery.h | 7 ++ 12 files changed, 104 insertions(+), 81 deletions(-) create mode 100644 resources/g2/tool/scenery_scatter_high.png create mode 100644 resources/g2/tool/scenery_scatter_low.png create mode 100644 resources/g2/tool/scenery_scatter_medium.png diff --git a/data/language/en-GB.txt b/data/language/en-GB.txt index 9eeea5e23d..c649824c2c 100644 --- a/data/language/en-GB.txt +++ b/data/language/en-GB.txt @@ -3669,9 +3669,11 @@ STR_6347 :Path additions cannot be placed on level crossings! STR_6348 :Remove level crossing first! STR_6349 :Random title sequence STR_6350 :Scatter -STR_6351 :{BLACK}Size -STR_6352 :{BLACK}Amount -STR_6353 :Scenery Scatter Tool +STR_6351 :Scenery Scatter Tool +STR_6352 :Density +STR_6353 :{SMALLFONT}{BLACK}Low density +STR_6354 :{SMALLFONT}{BLACK}Medium density +STR_6355 :{SMALLFONT}{BLACK}High density ############# # Scenarios # diff --git a/resources/g2/sprites.json b/resources/g2/sprites.json index df7fda9fd4..05f88aa104 100644 --- a/resources/g2/sprites.json +++ b/resources/g2/sprites.json @@ -462,6 +462,15 @@ "x_offset": 1, "y_offset": 5 }, + { + "path": "tool/scenery_scatter_low.png" + }, + { + "path": "tool/scenery_scatter_medium.png" + }, + { + "path": "tool/scenery_scatter_high.png" + }, { "path": "font/latin/ae-uc-small.png", "y_offset": 0, diff --git a/resources/g2/tool/scenery_scatter_high.png b/resources/g2/tool/scenery_scatter_high.png new file mode 100644 index 0000000000000000000000000000000000000000..1469782a2a6f050f92892126175bea7f35817abe GIT binary patch literal 3202 zcmcIndu-Hn94`|M3<<^!hD4<4Ac)fI|l@E;KJP;+m!Jz(8sS^-CbMS?l#c4 zs3WpJcuoQtXh4lj9%Dqo5HzSDhQyE%6bX+^AV>&7qa!AY5P!WF12#5AF1hQk?f3Wj ze!rjZ>vydc)x9#JtQ;Ax7PP#QrBW;B_iTn`*n0=1eRzrF6l& z09NNXra%yljg6j0ug9=z35w?-22Id34kd7VsqTnPxNhgC5rV*$EzNW^Lq}aiQ8F5w z00u2hx)3unu)3Y12@*y$i6%jLNY|x=pdx4F%myo(P_D=Xh=Lf<9UID08CkQ=a16W7 z=m$FU`VIw<+DIg$qfc96v5X4aDUCxnQiSv=ZC5Wf0Z|ETqrs9vX&joFpZ3OfD#2|& z2eBQBCpMcxi3LQ*u&NCsnvQZs+Fz80l%dZ?L|M~a2Bx_BQd>Y!bU*;3Nt(n-8mG8w z$|o?q;H92-qfaJ9BZi`>OYae-y#f@X*gHgF#wnsB4k)b1f@)YX5%Q(Q#9Ba@dM$=# zq9BwQQNx0Yp>^Kg&qF086_%lDQTW2HoLP*9N=sOZXIY%~PziG*5h0}8j;PBZ6bxX{ zSC6JC0u3le;h~?3mm+Z=N&0b)S7e-*B$e_~K1xx!^!}hBH@F$(?oSqzV#pBVws|B; z0ZOGsT&86|P6MBc^FCI=eX62R3eAx|C4=^YrNMd@qrFjGs}zXnV_4G1&;9Rn3jGpfm=>pBtFl~e=E z5Q_Dy#}?!FCyAq3ngMOF(aLpX2+I0*)r4S-=tUIH?%N^qu1qL0BPp676$Qh-YPy)5vm~g?v9m{{DZUPZmW!1L&qyr;q)^S-OPMynK0AdE4ra@J{5yUEb7j=y z8}e3<{<>@1h;j0?q4R4uegAPwn|HF~E$42=c;QT5_l*~S zDgE%TU0uia?A_nGV)45@IS84(9yvRya#A$^kCsc@ZsdJCcRz8pzO{M#t?u1d9vOD6 WpgSjb>}&47givXDu(NpaoBse3jXYrh literal 0 HcmV?d00001 diff --git a/resources/g2/tool/scenery_scatter_low.png b/resources/g2/tool/scenery_scatter_low.png new file mode 100644 index 0000000000000000000000000000000000000000..40a2752107ef2aebdb5f869255db3634c6ccdccc GIT binary patch literal 3164 zcmcImd2AF_7@sDB7UWQY2;mrp5-Kt~_X$gBcMDx%OKCS)qA||SyxASPyR*zpyKVom z3fQ74NQj1TC|b~HH8w4b6)^%mv9{(g&hO zMY9EJnkz$UbDb(_Sjk*;PNNJJ#DSxrjqzB*mK(iTTCWV(?rQ==(;`lt7b|rE(b`}Y z>N72XavmO6DON-U$wToh$?&sKnxrIx6bXvKNlGSpnG?|L4})lyrpwj-`B^OZ#< z^PjH)fYb(qd5k`7iO2I0wo~2!-N+Ksr?eevN&=!9*k-+@g7OAv=CqtQwo?tR@;Qj@ zP&~akDf=v-IHnac%~&qVRXKlA8d8Q92Nl&wxC}ht;$^o0zv2KdMw2v&lQd3=A&Qkb zNoJ@A-RP4U(V(drdeaS}G$TVHR=h?OW}K!t%7DU}D(j{dS0G)i};_h*VpGgYYLs(Bnui8LE# zaGGN{oD*0b4|71rDVkAviWL+}6LZ=YTL!FWCDvQ3Yn28yvK&vc9IfFRDT+8t=`pFqR1uZ=$9Gbkpq`%_T>mEI(4Gw8OdJ1NBi zr4bm*LDU7&ulZ)80a(2pNGg^Bn=7zvFQ!{&9L?u2>X@jKOvVgVaa|`G5?Z!_BcO;DjoUYI~uPQpuh7}SQSs>yR!*VK+7)=9wzwTV$er~%v>VR1=K;Yfn z$R|qwv}wRHdgVdyT+5q)rnBz{NIpuw=+!X&Xs99#PuC1^X$)XIp3|( z^n8{3>OF(aLpX3{I0*)r4S?fFDGXFx55t)nR#*-XOOl97lm>KKV0a+Fk(RN>yw%y@ z_L4LWz0Op*SMZ?bF7qcu_>ezif&{Ex3!Wg~J2-9=f)vyT{G}nW{n+z+mhU6StUiE` zr;B^4My=LQJvVh_>%4QL$J0ZPyu7YDI%TJ?b*{hl?n!j>nP}Tb6X-FOtrsT*mbA4t zM2D0;I`yT?$2z7A4_ukwd1>s|f6s_*{c8P}S3YT9Z*Pul_34X9Vc8FNwEWod!os}; zyW7rVr)x^*&BD;b%a9hNhD6 z(D&2CPdnCM{OeMvGv3~<-qW`I-mb1!3XhEHIl8Uu{YgE?!Qt+m+eVRX3z3$y(V|_4 z4r;0Lk&#i~#_K{m_AU3WZr*ZELYJ0JU%CV-E~!IWK7V>ry}53e9XnuJuSI^H_{MMN zwGZCi|6=6h>D1xT031JEP=8@8@<(CyUS#d$%VSRkYt}t`V(8+{LZGmrT|2~mCyY3{ zWOm?0!;0?9Cx>v~Ox|C#`1@xrOuSR5`nfi^3OV!G*%OaES g^Tg|a?kV|9*t3%UB4Qb>?)g7ZUg>|c?D41m0ocJPEC2ui literal 0 HcmV?d00001 diff --git a/resources/g2/tool/scenery_scatter_medium.png b/resources/g2/tool/scenery_scatter_medium.png new file mode 100644 index 0000000000000000000000000000000000000000..93dfba41f1e46e7e580bfbaacbccba71344bf74e GIT binary patch literal 3195 zcmcInYitx%6y8=qD4-xM3K}yG1|(&69y@QkOKG>z3ftDwY6+;^nYpu_c6Vo-nYP;+ zwWvg?@<{6|hygSjqXGuhK+wpmD4@ou1b-L-L*lb)MB!iKoqbV((kima%-p$i?sRSR>=<-E_)cstdW^FwmpVS*_$l6%=i9LHCZDfh zjZxp|Hbxf9su}kK%~YU28MlzM&sQ=pX#uqbx|jl^Mk0v+w&z0}GqfOn4;P^#Ryk}k zDm!hsq_etS?QBsc4WAdnN|G{C5Qi?nlJQu=k&{6@rB_B{Z<@rhl!)6B#OHekvBpR( zR&Lr5TD!|Xd7>briN+jt3LD4eB%bb8^emJsbYr0$)UXZbc-hz0O z>sm5Nwzs$Y+XH^nj*_$_Asr0KFa(kyoQ{MGl0?Fpk<}1}j%pj0YnTbl(+Cu^)eYjv z({u=NE2lQ$WMD#okx5{Yw4d@qN(pLePR?qzV=3dBO2Qb7!-VS~Svn_cHJPsIG?_!F z&VBxe0R(L%lCyD1U*hqc3CFEyLt$h9xumpH-(f+r4mxJ5t-^{n%&b&*M3Q zMNkYui}f@s zbCMjOi@oeqY0-$O8G6S>qD(+WLKlc4#%aI>!wPGvtebWmAiRt?h(gjzL~$&a1-aae znKm+vybBDTuPQIEwN2fKp$|^o!ZNI?qMWBCo+lVTopLu4k*gAp3lb`<3I}l%tKTp* znbicqLk$u%6$lWlr1FHqasr_XtfEO8q%^2z*N08D)nkyiK3zwbSgYri=6S{O6w5Ihp;4kpu(Zw)iY@|z zVR&6m%ULb+QG5={xs$2NG7!y-Vn*oSs4pSC5=4uz^eC-}yu3wZ0O4F| zcph|Q>@I;1On z<#GgdK@RD@nP`Ldpa3jj1Jqoh?F4b%Hse^1!-&1W@#Wlwoh?)bXH$A*|@#1fK zZm6EKMNwY=pVS++Fh9nUZsTPmX=!$yXlRJTT4@rxvd5TlY|NU!xJ((|kX5;=5_D z;ir9Fr$g%5igib9LzZKG~3JrdfneBbMzH$TPBULT#_`{SfLTMESJgTd>>?E@X3S3FnT^zN#f zRkbgjy|sAj;a~1L@Yz|Rd-TjNLHWHc>yEFRcK6W z{qxOV^^fn`-mAaa_{npzmin_width = WINDOW_SCENERY_WIDTH; window->max_width = WINDOW_SCENERY_WIDTH; diff --git a/src/openrct2-ui/windows/SceneryScatter.cpp b/src/openrct2-ui/windows/SceneryScatter.cpp index 9cb6a9094b..a0b7d17fef 100644 --- a/src/openrct2-ui/windows/SceneryScatter.cpp +++ b/src/openrct2-ui/windows/SceneryScatter.cpp @@ -15,8 +15,6 @@ #include #include -#define MAX_AMOUNT 100 - enum WINDOW_CLEAR_SCENERY_WIDGET_IDX { WIDX_BACKGROUND, @@ -25,24 +23,26 @@ enum WINDOW_CLEAR_SCENERY_WIDGET_IDX WIDX_PREVIEW, WIDX_DECREMENT, WIDX_INCREMENT, - WIDX_AMOUNT, - WIDX_ADECREMENT, - WIDX_AINCREMENT + WIDX_DENSITY, + WIDX_DENSITY_LOW, + WIDX_DENSITY_MEDIUM, + WIDX_DENSITY_HIGH }; // clang-format off static rct_widget window_scenery_scatter_widgets[] = { - { WWT_FRAME, 1, 0, 70, 0, 113, 0xFFFFFFFF, STR_NONE }, // panel / background - { WWT_CAPTION, 0, 0, 57, 1, 14, STR_SCENERY_SCATTER, STR_WINDOW_TITLE_TIP }, // title bar - { WWT_CLOSEBOX, 0, 57, 68, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // close x button + { WWT_FRAME, 1, 0, 85, 0, 99, 0xFFFFFFFF, STR_NONE }, // panel / background + { WWT_CAPTION, 0, 1, 84, 1, 14, STR_SCENERY_SCATTER, STR_WINDOW_TITLE_TIP }, // title bar + { WWT_CLOSEBOX, 0, 73, 83, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // close x button - { WWT_IMGBTN, 1, 5, 48, 17, 48, SPR_LAND_TOOL_SIZE_0, STR_NONE }, // preview box - { WWT_TRNBTN, 1, 6, 23, 18, 33, IMAGE_TYPE_REMAP | SPR_LAND_TOOL_DECREASE, STR_ADJUST_SMALLER_LAND_TIP }, // decrement size - { WWT_TRNBTN, 1, 32, 49, 32, 47, IMAGE_TYPE_REMAP | SPR_LAND_TOOL_INCREASE, STR_ADJUST_LARGER_LAND_TIP }, // increment size + { WWT_IMGBTN, 1, 20, 63, 17, 48, SPR_LAND_TOOL_SIZE_0, STR_NONE }, // preview box + { WWT_TRNBTN, 1, 21, 36, 18, 33, IMAGE_TYPE_REMAP | SPR_LAND_TOOL_DECREASE, STR_ADJUST_SMALLER_LAND_TIP }, // decrement size + { WWT_TRNBTN, 1, 47, 62, 32, 47, IMAGE_TYPE_REMAP | SPR_LAND_TOOL_INCREASE, STR_ADJUST_LARGER_LAND_TIP }, // increment size - { WWT_IMGBTN, 1, 5, 48, 65, 96, 0xFFFFFFFF, STR_NONE }, // preview box - { WWT_TRNBTN, 1, 6, 23, 66, 81, IMAGE_TYPE_REMAP | SPR_LAND_TOOL_DECREASE, STR_ADJUST_SMALLER_LAND_TIP }, // decrement size amount - { WWT_TRNBTN, 1, 32, 49, 80, 94, IMAGE_TYPE_REMAP | SPR_LAND_TOOL_INCREASE, STR_ADJUST_LARGER_LAND_TIP }, // increment size amount + { WWT_GROUPBOX, 1, 3, 82, 55, 96, STR_SCATTER_TOOL_DENSITY, STR_NONE }, + { WWT_FLATBTN, 1, 7, 30, 68, 91, IMAGE_TYPE_REMAP | SPR_G2_SCENERY_SCATTER_LOW, STR_SCATTER_TOOL_DENSITY_LOW }, // low amount + { WWT_FLATBTN, 1, 31, 54, 68, 91, IMAGE_TYPE_REMAP | SPR_G2_SCENERY_SCATTER_MEDIUM, STR_SCATTER_TOOL_DENSITY_MEDIUM }, // medium amount + { WWT_FLATBTN, 1, 55, 78, 68, 91, IMAGE_TYPE_REMAP | SPR_G2_SCENERY_SCATTER_HIGH, STR_SCATTER_TOOL_DENSITY_HIGH }, // high amount { WIDGETS_END }, }; // clang-format on @@ -98,12 +98,12 @@ rct_window* window_scenery_scatter_open() if (window != nullptr) return window; - window = window_create( - ScreenCoordsXY(context_get_width() - 70, 29), 70, 114, &window_clear_scenery_events, WC_SCENERY_SCATTER, 0); + window = window_create_auto_pos(86, 100, &window_clear_scenery_events, WC_SCENERY_SCATTER, 0); + window->widgets = window_scenery_scatter_widgets; window->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_INCREMENT) | (1 << WIDX_DECREMENT) | (1 << WIDX_PREVIEW) - | (1 << WIDX_AINCREMENT) | (1 << WIDX_ADECREMENT) | (1 << WIDX_AMOUNT); - window->hold_down_widgets = (1 << WIDX_INCREMENT) | (1 << WIDX_DECREMENT) | (1 << WIDX_AINCREMENT) | (1 << WIDX_ADECREMENT); + | (1 << WIDX_DENSITY_LOW) | (1 << WIDX_DENSITY_MEDIUM) | (1 << WIDX_DENSITY_HIGH); + window->hold_down_widgets = (1 << WIDX_INCREMENT) | (1 << WIDX_DECREMENT); window_init_scroll_widgets(window); window_push_others_below(window); @@ -123,9 +123,20 @@ static void window_scenery_scatter_mouseup(rct_window* w, rct_widgetindex widget window_close(w); break; case WIDX_PREVIEW: - case WIDX_AMOUNT: window_scenery_scatter_inputsize(w, widgetIndex); break; + + case WIDX_DENSITY_LOW: + gWindowSceneryScatterDensity = ScatterToolDensity::LowDensity; + break; + + case WIDX_DENSITY_MEDIUM: + gWindowSceneryScatterDensity = ScatterToolDensity::MediumDensity; + break; + + case WIDX_DENSITY_HIGH: + gWindowSceneryScatterDensity = ScatterToolDensity::HighDensity; + break; } } @@ -144,21 +155,6 @@ static void window_scenery_scatter_mousedown(rct_window* w, rct_widgetindex widg // Increment land tool size, if it stays within the limit gWindowSceneryScatterSize = std::min(MAXIMUM_TOOL_SIZE, gWindowSceneryScatterSize + 1); - // Invalidate the window - w->Invalidate(); - break; - - case WIDX_ADECREMENT: - // Decrement land tool size, if it stays within the limit - gWindowSceneryScatterAmount = std::max(1, gWindowSceneryScatterAmount - 1); - - // Invalidate the window - w->Invalidate(); - break; - case WIDX_AINCREMENT: - // Increment land tool size, if it stays within the limit - gWindowSceneryScatterAmount = std::min(MAX_AMOUNT, gWindowSceneryScatterAmount + 1); - // Invalidate the window w->Invalidate(); break; @@ -170,7 +166,7 @@ static void window_scenery_scatter_textinput(rct_window* w, rct_widgetindex widg int32_t size; char* end; - if (!(widgetIndex == WIDX_PREVIEW || widgetIndex == WIDX_AMOUNT) || text == nullptr) + if (widgetIndex != WIDX_PREVIEW || text == nullptr) return; size = strtol(text, &end, 10); @@ -183,11 +179,6 @@ static void window_scenery_scatter_textinput(rct_window* w, rct_widgetindex widg size = std::min(MAXIMUM_TOOL_SIZE, size); gWindowSceneryScatterSize = size; break; - case WIDX_AMOUNT: - size = std::max(1, size); - size = std::min(MAX_AMOUNT, size); - gWindowSceneryScatterAmount = size; - break; } w->Invalidate(); } @@ -203,11 +194,6 @@ static void window_scenery_scatter_inputsize(rct_window* w, rct_widgetindex widg TextInputDescriptionArgs[1] = MAXIMUM_TOOL_SIZE; maxlen = 3; break; - case WIDX_AMOUNT: - TextInputDescriptionArgs[0] = 1; - TextInputDescriptionArgs[1] = MAX_AMOUNT; - maxlen = 4; // Catch 100 - break; } window_text_input_open(w, widgetindex, STR_SELECTION_SIZE, STR_ENTER_SELECTION_SIZE, STR_NONE, STR_NONE, maxlen); } @@ -220,7 +206,24 @@ static void window_scenery_scatter_update(rct_window* w) static void window_scenery_scatter_invalidate(rct_window* w) { // Set the preview image button to be pressed down - w->pressed_widgets = (1 << WIDX_PREVIEW) | (1 << WIDX_AMOUNT); + w->pressed_widgets = (1 << WIDX_PREVIEW); + + // Set density buttons' pressed state. + switch (gWindowSceneryScatterDensity) + { + case ScatterToolDensity::LowDensity: + w->pressed_widgets |= (1 << WIDX_DENSITY_LOW); + break; + + case ScatterToolDensity::MediumDensity: + w->pressed_widgets |= (1 << WIDX_DENSITY_MEDIUM); + break; + + case ScatterToolDensity::HighDensity: + w->pressed_widgets |= (1 << WIDX_DENSITY_HIGH); + break; + } + // Update the preview image (for tool sizes up to 7) window_scenery_scatter_widgets[WIDX_PREVIEW].image = land_tool_size_to_sprite_index(gWindowSceneryScatterSize); } @@ -229,25 +232,12 @@ static void window_scenery_scatter_paint(rct_window* w, rct_drawpixelinfo* dpi) { window_draw_widgets(w, dpi); - int32_t x, y; - x = w->x + window_scenery_scatter_widgets[WIDX_PREVIEW].left; - y = w->y + window_scenery_scatter_widgets[WIDX_PREVIEW].bottom + 2; - gfx_draw_string_left(dpi, STR_SMALL_SIZE, nullptr, COLOUR_BLACK, x, y); - - x = w->x + window_scenery_scatter_widgets[WIDX_AMOUNT].left; - y = w->y + window_scenery_scatter_widgets[WIDX_AMOUNT].bottom + 2; - gfx_draw_string_left(dpi, STR_SMALL_AMOUNT, nullptr, COLOUR_BLACK, x, y); - - // Draw number for tool sizes bigger than 7 - + // Draw area as a number for tool sizes bigger than 7 if (gWindowSceneryScatterSize > MAX_TOOL_SIZE_WITH_SPRITE) { - x = w->x + (window_scenery_scatter_widgets[WIDX_PREVIEW].left + window_scenery_scatter_widgets[WIDX_PREVIEW].right) / 2; - y = w->y + (window_scenery_scatter_widgets[WIDX_PREVIEW].top + window_scenery_scatter_widgets[WIDX_PREVIEW].bottom) / 2; + auto preview = window_scenery_scatter_widgets[WIDX_PREVIEW]; + int32_t x = w->x + (preview.left + preview.right) / 2; + int32_t y = w->y + (preview.top + preview.bottom) / 2; gfx_draw_string_centred(dpi, STR_LAND_TOOL_SIZE_VALUE, x, y, COLOUR_BLACK, &gWindowSceneryScatterSize); } - - x = w->x + (window_scenery_scatter_widgets[WIDX_AMOUNT].left + window_scenery_scatter_widgets[WIDX_AMOUNT].right) / 2; - y = w->y + (window_scenery_scatter_widgets[WIDX_AMOUNT].top + window_scenery_scatter_widgets[WIDX_AMOUNT].bottom) / 2; - gfx_draw_string_centred(dpi, STR_LAND_TOOL_SIZE_VALUE, x, y, COLOUR_BLACK, &gWindowSceneryScatterAmount); } diff --git a/src/openrct2-ui/windows/TopToolbar.cpp b/src/openrct2-ui/windows/TopToolbar.cpp index 2b11743396..ab669cb158 100644 --- a/src/openrct2-ui/windows/TopToolbar.cpp +++ b/src/openrct2-ui/windows/TopToolbar.cpp @@ -1761,14 +1761,27 @@ static void window_top_toolbar_scenery_tool_down(int16_t x, int16_t y, rct_windo bool isCluster = gWindowSceneryScatterEnabled && (network_get_mode() != NETWORK_MODE_CLIENT || network_can_perform_command(network_get_current_player_group_index(), -2)); + if (isCluster) { - quantity = gWindowSceneryScatterAmount; + switch (gWindowSceneryScatterDensity) + { + case ScatterToolDensity::LowDensity: + quantity = gWindowSceneryScatterSize; + break; + + case ScatterToolDensity::MediumDensity: + quantity = gWindowSceneryScatterSize * 2; + break; + + case ScatterToolDensity::HighDensity: + quantity = gWindowSceneryScatterSize * 3; + break; + } } bool forceError = true; - uint16_t retry = 0; - for (int32_t q = 0; q < quantity + retry; q++) + for (int32_t q = 0; q < quantity; q++) { int32_t zCoordinate = gSceneryPlaceZ; rct_scenery_entry* scenery = get_small_scenery_entry((parameter_1 >> 8) & 0xFF); @@ -1859,11 +1872,6 @@ static void window_top_toolbar_scenery_tool_down(int16_t x, int16_t y, rct_windo break; } } - else - { - if (retry < gWindowSceneryScatterSize * gWindowSceneryScatterSize) - retry++; - } gSceneryPlaceZ = zCoordinate; } break; diff --git a/src/openrct2-ui/windows/Window.h b/src/openrct2-ui/windows/Window.h index 0e16acd044..2dfcc24809 100644 --- a/src/openrct2-ui/windows/Window.h +++ b/src/openrct2-ui/windows/Window.h @@ -19,12 +19,13 @@ using scenarioselect_callback = void (*)(const utf8* path); struct Peep; struct TileElement; struct Vehicle; +enum class ScatterToolDensity : uint8_t; extern uint16_t gWindowSceneryTabSelections[]; extern uint8_t gWindowSceneryActiveTabIndex; extern rct_window* gWindowSceneryScatterWindow; extern uint16_t gWindowSceneryScatterSize; -extern uint16_t gWindowSceneryScatterAmount; +extern ScatterToolDensity gWindowSceneryScatterDensity; extern bool gWindowSceneryScatterEnabled; extern uint8_t gWindowSceneryPaintEnabled; extern uint8_t gWindowSceneryRotation; diff --git a/src/openrct2/localisation/StringIds.h b/src/openrct2/localisation/StringIds.h index bae72e358d..2db5ca07bf 100644 --- a/src/openrct2/localisation/StringIds.h +++ b/src/openrct2/localisation/StringIds.h @@ -3897,9 +3897,11 @@ enum STR_OPTIONS_RANDOM_TITLE_SEQUENCE = 6349, STR_SCENERY_SCATTER = 6350, - STR_SMALL_SIZE = 6351, - STR_SMALL_AMOUNT = 6352, - STR_THEMES_WINDOW_SCENERY_SCATTER = 6353, + STR_THEMES_WINDOW_SCENERY_SCATTER = 6351, + STR_SCATTER_TOOL_DENSITY = 6352, + STR_SCATTER_TOOL_DENSITY_LOW = 6353, + STR_SCATTER_TOOL_DENSITY_MEDIUM = 6354, + STR_SCATTER_TOOL_DENSITY_HIGH = 6355, // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 diff --git a/src/openrct2/sprites.h b/src/openrct2/sprites.h index c1f0880b6b..77c1212587 100644 --- a/src/openrct2/sprites.h +++ b/src/openrct2/sprites.h @@ -857,7 +857,11 @@ enum SPR_G2_MOUNTAIN_TOOL_EVEN = SPR_G2_BEGIN + 132, SPR_G2_MOUNTAIN_TOOL_ODD = SPR_G2_BEGIN + 133, - SPR_G2_CHAR_BEGIN = SPR_G2_BEGIN + 134, + SPR_G2_SCENERY_SCATTER_LOW = SPR_G2_BEGIN + 134, + SPR_G2_SCENERY_SCATTER_MEDIUM = SPR_G2_BEGIN + 135, + SPR_G2_SCENERY_SCATTER_HIGH = SPR_G2_BEGIN + 136, + + SPR_G2_CHAR_BEGIN = SPR_G2_BEGIN + 137, SPR_G2_AE_UPPER = SPR_G2_CHAR_BEGIN, SPR_G2_AE_LOWER = SPR_G2_CHAR_BEGIN + 1, diff --git a/src/openrct2/world/Scenery.h b/src/openrct2/world/Scenery.h index 5860950a6d..ead02fd7a3 100644 --- a/src/openrct2/world/Scenery.h +++ b/src/openrct2/world/Scenery.h @@ -243,6 +243,13 @@ enum BANNER_ENTRY_FLAG_HAS_PRIMARY_COLOUR = (1 << 0), }; +enum class ScatterToolDensity : uint8_t +{ + LowDensity, + MediumDensity, + HighDensity +}; + #define SCENERY_ENTRIES_BY_TAB 1024 constexpr auto WINDOW_SCENERY_TAB_SELECTION_UNDEFINED = std::numeric_limits::max();