From a53070ba4d0f906711e651f426080e118bfec72e Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Tue, 2 Jun 2020 14:16:14 +0200 Subject: [PATCH] localization! --- TouchyTickets/Attractions/Attraction.cs | 3 +- TouchyTickets/Attractions/AttractionType.cs | 13 +++++- TouchyTickets/Content/Content.mgcb | 3 ++ TouchyTickets/Content/Contentless.json | 9 +++++ .../Content/Localization/Localization.json | 23 +++++++++++ TouchyTickets/Content/Textures/Ui.aseprite | Bin 1502 -> 1619 bytes TouchyTickets/Content/Textures/Ui.png | Bin 2309 -> 2536 bytes TouchyTickets/Localization.cs | 37 ++++++++++++++++++ TouchyTickets/ParkMap.cs | 2 + TouchyTickets/SaveHandler.cs | 2 +- TouchyTickets/Ui.cs | 33 ++++++++-------- TouchyTickets/Upgrade.cs | 5 ++- 12 files changed, 107 insertions(+), 23 deletions(-) create mode 100644 TouchyTickets/Content/Contentless.json create mode 100644 TouchyTickets/Content/Localization/Localization.json create mode 100644 TouchyTickets/Localization.cs diff --git a/TouchyTickets/Attractions/Attraction.cs b/TouchyTickets/Attractions/Attraction.cs index 62a2d97..6ffd768 100644 --- a/TouchyTickets/Attractions/Attraction.cs +++ b/TouchyTickets/Attractions/Attraction.cs @@ -35,8 +35,9 @@ namespace TouchyTickets.Attractions { } public float Update(GameTime time, TimeSpan passed, ParkMap map, Point position) { - var genRate = this.Type.GenerationPerSecond; + var genRate = this.Type.GetGenerationRate(); + // only apply dynamic upgrades here, static ones go into the type! if (Upgrade.FoodCourtModifier.IsActive() && this.GetSurrounding(map, position, AttractionType.FoodCourt).Any()) genRate *= 3; diff --git a/TouchyTickets/Attractions/AttractionType.cs b/TouchyTickets/Attractions/AttractionType.cs index 8855c5a..f97007e 100644 --- a/TouchyTickets/Attractions/AttractionType.cs +++ b/TouchyTickets/Attractions/AttractionType.cs @@ -17,7 +17,7 @@ namespace TouchyTickets.Attractions { public int Width => this.Area.GetLength(1); public int Height => this.Area.GetLength(0); public readonly TextureRegion TextureRegion; - public readonly float GenerationPerSecond; + private readonly float generationPerSecond; public readonly long InitialPrice; private readonly Constructor create; @@ -25,7 +25,7 @@ namespace TouchyTickets.Attractions { this.Name = name; this.Area = area; this.TextureRegion = texture; - this.GenerationPerSecond = generationPerSecond; + this.generationPerSecond = generationPerSecond; this.InitialPrice = initialPrice; this.create = constructor ?? (t => new Attraction(t)); } @@ -34,6 +34,15 @@ namespace TouchyTickets.Attractions { return this.create(this); } + public float GetGenerationRate() { + var genRate = this.generationPerSecond; + + if (this == FerrisWheel && Upgrade.FerrisWheelModifier.IsActive()) + genRate *= 4; + + return genRate; + } + private static AttractionType Register(AttractionType type) { Attractions.Add(type.Name, type); return type; diff --git a/TouchyTickets/Content/Content.mgcb b/TouchyTickets/Content/Content.mgcb index 774eb6a..a96a753 100644 --- a/TouchyTickets/Content/Content.mgcb +++ b/TouchyTickets/Content/Content.mgcb @@ -40,3 +40,6 @@ /processor:TextureProcessor /build:Textures/Tiles.png +#begin Localization/Localization.json +/copy:Localization/Localization.json + diff --git a/TouchyTickets/Content/Contentless.json b/TouchyTickets/Content/Contentless.json new file mode 100644 index 0000000..2528f48 --- /dev/null +++ b/TouchyTickets/Content/Contentless.json @@ -0,0 +1,9 @@ +{ + "exclude": [ + "obj/", + "bin/" + ], + "overrides": { + ".json": "Copy" + } +} \ No newline at end of file diff --git a/TouchyTickets/Content/Localization/Localization.json b/TouchyTickets/Content/Localization/Localization.json new file mode 100644 index 0000000..53bf7e2 --- /dev/null +++ b/TouchyTickets/Content/Localization/Localization.json @@ -0,0 +1,23 @@ +{ + "Back": "Back", + "Place": "Place", + "EarnStar": "Earn ", + "RequiresTickets": "Requires {0}", + "Carousel": "Carousel", + "FoodCourt": "Food Court", + "FerrisWheel": "Ferris Wheel", + "MapSize1": "Big Park", + "MapSize1Description": "Increases your park's buildable area", + "MapSize2": "Bigger Park", + "MapSize2Description": "Increases your park's buildable area more", + "MapSize3": "Biggest Park", + "MapSize3Description": "Increases your park's buildable area even more", + "MapSize4": "Biggester Park", + "MapSize4Description": "Increases your park's buildable area even more", + "MapSize5": "Biggestest Park", + "MapSize5Description": "Increases your park's buildable area to the maximum", + "FoodCourtModifier": "Tasty Treats", + "FoodCourtModifierDescription": "Triples ticket sales for all attractions adjacent to food courts", + "FerrisWheelModifier": "Crowded Pods", + "FerrisWheelModifierDescription": "Quadruples ticket sales for ferris wheels. Who cares about fire safety?" +} \ No newline at end of file diff --git a/TouchyTickets/Content/Textures/Ui.aseprite b/TouchyTickets/Content/Textures/Ui.aseprite index c8ffca6a9f89e30546104ad58ca929ebbcf94146..8ee71c88e47d28b98af7ed29b96caf1d1b773226 100644 GIT binary patch delta 1100 zcmV-S1hf0z3)2h&QwEU&egV_5frtSDN(7S&0vvx&NEJ~O#-&9YR|Rb>5)3j!P2WRB z%jBU*Wtosc5=0afxM|nMO}iF`P(eflQj1V(5mD>fCA1AAYT?dJ+cs@(oPo~{=bd}! z&YORC?7+v|d*{x~{k`*@JHu;hYmPfd4x2orJSwQ5HNKxao2km+{`zr`_cOt~c6uZd za)p0>t7CEOGgIRx$->&sr_%Pzgi^OePzjrqst%O=S&OK#2I$X!-raqOg<*A{l# zHo4fr48^fapXMQr8_Xm16K3PXtl@o(@wSbb_`v*ododDc*Z8>?)7G-jn8r>_Jm1up z((=uD!TjsnzDPXp8h;+OY#Wo@arq{puX%s`#iMpZ0=vcwX3XWxS=X{{%*O7@H~Khg zUgzxKl+0RP-@n?EyRJ`kG}XCl-v*;RYV{4zb57U34iD10mSzv;D&p2^Jd5|YWR@O~ z?C?3b|NN})NLxFN-<~?;FS?^%C7 z=Oi~@x0W}JNsg7loiw!i#=12Y`I~6t5U$5uTYZ%irAFxL%tVV!ma4^IX}+@b6QVP3W>W&g}_ab z*MF#0_;0n|dB7}8)SA@j?NZ0%&TD_;^o+7OWzd>vt#r&oxOdr{GH6X_>c^tBjn(=x z6~A}coHF2Za8HhpdTZw7fK}kGg3rM{HZ*7zXPzGEvkKf*@j19p4L3`2(~%f8FI3Uz zS#np+=f2$YQ@VDu&uz?{yUIQv8tjkM%D%Q+eI8feyV2)W-OoGsx0|&4d0c;e}fyU&w)+qW)4HbH>G+TFsEkUPqAu<}BD>A3bWI ztk#!DJnil_Brv1j%Dss7`^tYxr0vyJEBm`!qb7;c5xOG{F9k80%}vAejXt0Ed||+} zqV$CSV*cESv1z8^|18c(c_vZL(bw{Rclx-wcfQ{#nv*3jYMA&gy}F?a+&=XVfAf5! z4Sqgf>pAMLD|CHI8~SDf5&?BGMLdA_CBiR07DhmnYFajt(635@(4+G*M4 zzOCgOzX5S4+2@~ib*c4D<8rRXjeKj|X_zVGz8&XtIp1~fx9jT>BXVtHrs(Kv7!tAZ zw(O&wmYcIvTl$>)o%`H}`SJ2{G>2Fr+kEiQzQx delta 982 zcmV;{11bE|4BiU@-UX2YegR&wfrtSD)dQ0Y0vvz8YZOrs$Ag7UDg_%A11IDRB%0ij z97baZ9-Y`P_Wx-Et!%{qgwZ2@^xgM_S8o!=n#X@%J{>hAuxq?v##+u?bT8ZHZ0xRjV~nHb zb$*lGDlRFd9b#L)#U!S}7Z7|BC*5B|v=XCAs@F3;2wtOtAh+FINB7VOmv-E&u zhtI+N_h)-gTJALeuzTFeXSEH)3+Jg>q|aVsi66E98Hg z#STov4TL+fwkt+B}OM4N|jKi1m%yDDzp-!>M`ppE%=C9mT=wR*dJZsU+g zo6q^0x^cVw&ApBLwRI`hTlP1vm2FO5llz#qF2(+)oXSv2^(LQFK4mE-?lP4EH$|-f zQ0wsDYJ2R6SzT=PX=$>d&ik%w^YniiRddRqoG4d1#t@!eHKz>9>2mv2mfL)5s!;J~ zSIsE{J_q;3g|orxotw4_+;#9dxaVhQtm4d&Aq~GChUT>U(KQ@yu_}&HXYa6$n+&*^jq1L?KDR^D(+giQx z9T0b(ef~wGq4qb;m&Iobxo`V?F4w!B{cd|ZV??b}VMc(3&ZW<}-?=`|LzthfuV-tB z6^c)jFTfG9ujOH`OAwn&zWeLQEF3 E>o!CQEC2ui diff --git a/TouchyTickets/Content/Textures/Ui.png b/TouchyTickets/Content/Textures/Ui.png index ac06e869fef31b1c6f0563ddea2bbbb8c7c0e7ec..77eef692096d922029a4d19bfbd8b9859f04789d 100644 GIT binary patch delta 2342 zcmV+>3EB3A66h0-`nyGC15Fcbyl5?Y zQBVoh7B3>yA_&DwD*jVT6;i3WNU0@i4eg?~P!QCbi_j{F7Sf^^ywKW23t4JvqKRuw zHfDD=>&EEm#dwZqX3oq`b|=}bJ`aR5=li~M&gA0#&inn$Mt=ZbT5Uyzx1E1(ax5P9 z&|A9;p9jp2_IeeUFJIQu2feWU&6eJ;8Eu>H+=Vf&le`E<)JU%sqiW^v_ZmnKJZoXQ(p<|W3?Tou zPBVcSm+g74?thoK^0G^l2iNsQMDxdI|N5dgJIqi;5T$Sbywb=>L_~D=_O_(#h3#(^ z&INql2}JzzckS`BA0KJ>#cy9b9Q8VZ^zEO0kJ6Da6o6Va89*Ae&6LliEH4fI>uw&3 zhwkf-;l0BVQ9h4|c<8?Vxb5e=vd`-tI8Ye;X}aIt-G3gZo_#|^M11h>V^JOo97!TV zM*ullFyzPQ7oT-T)?n*rse7x-sqkU9zHuO~yLl)c z-#Ac{{(rx^eL+M-T(o>5y1UzB;=?Cu0zaZ0{At^W+Isl1X^W_w`HyJbc)wm*cW-aa zT) zPQ?&ld)M1h8XJv!H}qu+i9-cSB#{wR;XGan}BxC{0YX ze1B_j`u49*_0vuu!sH+1Wjg`$OLe!bdB5T~UHc9l-&lKf`+~x8{`I$xx21K!=W4bB zM?}S&J)aFUa_@$|;~wzUuD^A>t=>4lQ5}3)WgS5ExIC550;+>N?Htk}!NY^6$G$^t zS$TS%ZyOO&nwV(ee*u`TtOKa`>%V+Z=YPlj4-cMR(K$RkczX6ZKZID)nPk_dx)(^r zVJ;|~187G6jh~*U0be~iSlt$w8w%$Dic|-2KFHI$>MS5VPqT$as|LXFmn{QEMD%_0 z^L+sO4z|0MMOFHKR)uwln<-EH!!>E4gvD! z6-?QETD4~I$^7m(;czKFnO~4Kd|aw~Z(#P+{1#wQcjqyC*s;7faP+1e0)HHhg+0Y{ z1{32mzc-1ZKiu~;Mi!m3Q%P7QVma`qGYM!20CP*rh5*el1c13E>j3(DyOM~R&D1aK>5fGmQS&dA-aCC3FuU3! z$^m)anWs;=-@jEB_VmQgy?^h=t`UEx8)j3*9DpC|z?Vzb0W9onVjU0oLdjC_{@$+S z!VAtlE)RYE-@B#%Fb7lw;qjWB6Z|kYRLlV^>FGS?^8lk`W3g*w{FpuiXio930V85^ z@^IaC`$lzBw()B~m@^8u0!Ks)PadwjC!kT?RBdbphPk8RR^UckcYmAN)@$o8%x!gt z0M({S`wJTQiC$A5ehZ-;MJ{T|WKA6?z&tD%Nk1JO6o0x^%s_iS_&2RwnLPQ~=X~(zJA>->^*VuThKAZ6*|;(J z(KFA~%mF-l)m3rh&YjtH&u`n+c27i2C-kjzPp zowj~`JbKkt@!hp+WAwm*7+AHcCiqi7xPNm*MBLaPv48ok$UaxsrJsSBo401ij<%v@ zzQcPDRUA`kn|tltEwK1MpF-_+e*6oDnx=HD^RbRGi-w5!?Q7DB|La z6MF$*W`D9Zw=|$9CMF{ueXZd|M-%+b`0v<6oYu3T+2+|bz|1rZ(saVF*=@kn3I5b$ z*It-(U)tPdr56*MfS?8HZUs&!`cg-m_D{!?zx{es>-*oo=^uh0j-|n+OOy21fYtK@ zMIOHYew%aPi)3)=(x!qR0000000000000000FyoluNwdW0A}0&070n31JC#r^#A|> M07*qoM6N<$f{{kSivR!s delta 2098 zcmV-22+jBC6NM6xFnle)#k^8Xc%&QE9;|k3X8MU$Z*0!^4ps z9*!der{c)Ksr>#-%hs=1T{E-T_{>wubhcADd2~_I+1VN=k1m>%YzFQG6*GXsr*)bM z%)0Et=T&cF<9{8Fp6oD7MM0E4{R?G>ha)1Qv!|yaWk&{1RU8Yr z)d)oV{*SHkn_u0idE>8cABt*?K>GC0-$(XF=n6o&vJ4;%+Iq@oQ&uPq{^wpAjCbBx z8ABI`A|kgR5%JC&E8~^lp3Q&W`PN9q;7`;2&d%0&;D6y4A|m3;^M8(9SKvkx5gGz0 zkPn8!{`pTI`d+@mv2RoNMwgXl0UMurD%t*8cP#5^%Vz+WhbPN!cv(+dL=VGz3tR0W_??KSf#Tj6k&vAbsjbM7+B<6VJUg81L@Q zl%@a22Y;4CM8uP8CZe;mH72gSR~GmYx!_OhMwB0iyG=_(@yLHf`%Ekhw z$^e%2w8iD&$^5obH{dUS=t$B=AR-s=g`bZPEQu}K#y$DrTlowiJ3Ji!dt~(6z0q4W zI-;Rvr$?^FhLRzHGy`~b`%t{Svp0q=o{xy$*nj!fNNj(tyW+Oe7{Hco<1J}-APxA! z20`#cv3vt??84{K`$$J*$3|<_Z-`?hQ-Zl*PN(+j-Ihy7{|le?g;~MLqcZ?C?_X29(HHn8VcSUw$qTx$} z(|@ObX{w(#0ucuPpiq7#VBu8V%Ui!F+RoIaYx5gx#|M^F?B{RUHr|pR18yl>3LFtd zPxiuWpq3rGd*?miOKsUU-cqffU+Wm$t?~^(X}>&Gm<5yudD=LnU4lLRE8^0%mV9}- zUsyLHB0DkBz<&ZTQ~3s<+S`AHL0#DI-+$A;qNs7$)4wABxv&edygkW(H`TdBDh|z{ z;ut_Z3ZMAtej4zlgM+1Yf#y(g44{(IATA8@^jK*YknX41LakW?VE*N&0V5)Me{yRb zz@=*~vAjLWZ!49R9*Zb$7%J7fa5ahVoX;&k@C!k(u<{Fm)~{I|2habz;7}45u74J8 zE0q-=i->~#YV~qs00shK;T0_ferULBA@2p4XGL!VuIagd-Y$IXf(!r_TE*W3m=F5@ zu<(k4@X3`AB$@9&QdVi`@|EaaRy{kYcDz#g;HRI(@v~nFerN(^KM6K;`AUqAjg?ib zR94UN!t$kE#u%WPlr;ctZHptuB7fSJ)%OlSy(TXY<_+OBc6CN~Ta^8!(sQTR0v1+FL@pp7 zdvL{+>-`&LX;)XAx%fq#9e?&S-LQ~~#sIvm19z8v1F*Ecj(I%bj*?HoSN3!yPyFD~ zdAaCE|2Zf9hbB-Ig!45xC-|W`6paBa?`og(ae&dWu{b+CKBw0J>Qnh`z=)Wfyk2$Q zzSglR>v$UwnnuN?z!4Eclh>=R38-~!sydbeL-VM)6u8#X-FlYwT7UWr&8=z|pwv`p zf8AXMT>xkrWeq^h6n(1Tt#w@B!|mnZ+O^5SwQH^0hdWf&`S{Yn-+bc4jOXqTWHR}4 z{bF#?8USb#6@#&V)v6>SVtGeLL_}N~&&}I!J$-uG!FwQ+Nq)3-YeYmW?e30$?b@Xg zfZIX;s#Qta7|g_hOn)XxKKUd$kjdo#()~u>ConT*PvXr#`*GFaoS2x54~~9R*VFqz zCX;MFbSMr!`)sW1>x+np(UFn(xW7Nv_4UaFpb6w>0S>NRo232x$jI#P9GJC55#` zJbXAJA~G8`O#e=ShHEJeK8u!Q}qV_%dfxQ5)pzPnp9a}ZhZQQnuB{&O#_w&KX99x?z;eo z_U}*jy!oa@K5(0;x)eAa=u1sE?FX7)*?$cdksA{z91Y>0D)=KJ1V7wiX8SIa5edH; c0L+*F14$ZH)ae$9TmS$707*qoM6N<$g1_M{8~^|S diff --git a/TouchyTickets/Localization.cs b/TouchyTickets/Localization.cs new file mode 100644 index 0000000..60f80e1 --- /dev/null +++ b/TouchyTickets/Localization.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using Microsoft.Xna.Framework; +using MLEM.Startup; +using Newtonsoft.Json; + +namespace TouchyTickets { + public static class Localization { + + private static readonly Dictionary Strings; + + static Localization() { + var location = GameImpl.Instance.Content.RootDirectory + "/Localization/Localization"; + var culture = CultureInfo.CurrentCulture.TwoLetterISOLanguageName; + foreach (var path in new[] {$"{location}.{culture}.json", $"{location}.json"}) { + try { + using (var reader = new JsonTextReader(new StreamReader(TitleContainer.OpenStream(path)))) { + var ret = SaveHandler.Serializer.Deserialize>(reader); + if (ret == null) + continue; + Strings = ret; + break; + } + } catch (Exception) { + // move on to the next path + } + } + } + + public static string Get(string key) { + return Strings.TryGetValue(key, out var ret) ? ret : $"?{key}?"; + } + + } +} \ No newline at end of file diff --git a/TouchyTickets/ParkMap.cs b/TouchyTickets/ParkMap.cs index 7463100..ae574e3 100644 --- a/TouchyTickets/ParkMap.cs +++ b/TouchyTickets/ParkMap.cs @@ -158,6 +158,8 @@ namespace TouchyTickets { } public Attraction GetAttractionAt(Point position) { + if (position.X < 0 || position.Y < 0 || position.X >= this.Width || position.Y >= this.Height) + return null; return this.attractionGrid[position.X, position.Y]; } diff --git a/TouchyTickets/SaveHandler.cs b/TouchyTickets/SaveHandler.cs index 3b1eccb..9a8e710 100644 --- a/TouchyTickets/SaveHandler.cs +++ b/TouchyTickets/SaveHandler.cs @@ -8,7 +8,7 @@ using Newtonsoft.Json; namespace TouchyTickets { public static class SaveHandler { - private static readonly JsonSerializer Serializer = JsonSerializer.Create(new JsonSerializerSettings { + public static readonly JsonSerializer Serializer = JsonSerializer.Create(new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate, TypeNameHandling = TypeNameHandling.Auto, Formatting = Formatting.Indented diff --git a/TouchyTickets/Ui.cs b/TouchyTickets/Ui.cs index 330f0a2..a964621 100644 --- a/TouchyTickets/Ui.cs +++ b/TouchyTickets/Ui.cs @@ -94,7 +94,7 @@ namespace TouchyTickets { }, OnPressed = e => { var backUi = new Group(Anchor.BottomLeft, new Vector2(1)); - backUi.AddChild(new Button(Anchor.AutoInlineIgnoreOverflow, new Vector2(1, 40), "Back") { + backUi.AddChild(new Button(Anchor.AutoInlineIgnoreOverflow, new Vector2(1, 40), Localization.Get("Back")) { OnPressed = e2 => this.FadeUi(false, () => this.uiSystem.Remove(e2.Root.Name)) }); // we want this to render below the main ui while it fades away @@ -123,10 +123,10 @@ namespace TouchyTickets { map.PlacingPosition = new Point(MathHelper.Clamp(posX, 0, map.Width), MathHelper.Clamp(posY, 0, map.Height)); var yesNoUi = new Group(Anchor.BottomLeft, new Vector2(1)); - yesNoUi.AddChild(new Button(Anchor.AutoInlineIgnoreOverflow, new Vector2(0.5F, 40), "Back") { + yesNoUi.AddChild(new Button(Anchor.AutoInlineIgnoreOverflow, new Vector2(0.5F, 40), Localization.Get("Back")) { OnPressed = e2 => this.FadeUi(false, () => this.uiSystem.Remove(e2.Root.Name)) }); - yesNoUi.AddChild(new Button(Anchor.AutoInlineIgnoreOverflow, new Vector2(0.5F, 40), "Place") { + yesNoUi.AddChild(new Button(Anchor.AutoInlineIgnoreOverflow, new Vector2(0.5F, 40), Localization.Get("Place")) { OnPressed = e2 => { GameImpl.Instance.Tickets -= price; map.Place(map.PlacingPosition, map.PlacingAttraction); @@ -150,13 +150,12 @@ namespace TouchyTickets { button.IsDisabled = GameImpl.Instance.Tickets < price; }; var center = button.AddChild(new Group(Anchor.Center, new Vector2(0.8F, 1), false) {CanBeMoused = false}); - center.AddChild(new Paragraph(Anchor.AutoCenter, 1, attraction.Key, true)); - center.AddChild(new Paragraph(Anchor.AutoCenter, 1, attraction.Value.GenerationPerSecond + "/s", true) {TextScale = 0.08F}); - var image = button.AddChild(new Image(Anchor.CenterLeft, new Vector2(1), attraction.Value.TextureRegion) { + center.AddChild(new Paragraph(Anchor.AutoCenter, 1, Localization.Get(attraction.Key), true)); + center.AddChild(new Paragraph(Anchor.AutoCenter, 1, p => attraction.Value.GetGenerationRate() + "/s", true) {TextScale = 0.08F}); + button.AddChild(new Image(Anchor.CenterLeft, new Vector2(40), attraction.Value.TextureRegion) { Padding = new Vector2(4) }); - button.OnAreaUpdated += e => image.Size = new Vector2(e.DisplayArea.Height / e.Scale); - button.AddChild(new Paragraph(Anchor.CenterRight, 1, p => price + "", true)); + button.AddChild(new Paragraph(Anchor.CenterRight, 1, p => PrettyPrintNumber(price) + "", true)); } this.uiSystem.Add("Buy", buyUi); @@ -167,7 +166,7 @@ namespace TouchyTickets { }; var upgradeHeader = upgradeUi.AddChild(new Group(Anchor.AutoLeft, new Vector2(1, 0.25F), false)); upgradeHeader.AddChild(new Paragraph(Anchor.AutoCenter, 1, p => GameImpl.Instance.Stars + "", true) {TextScale = 0.3F}); - upgradeHeader.AddChild(new Button(Anchor.AutoCenter, new Vector2(0.8F, 20), "Earn ") { + upgradeHeader.AddChild(new Button(Anchor.AutoCenter, new Vector2(0.8F, 20), Localization.Get("EarnStar")) { PositionOffset = new Vector2(0, 4), OnUpdated = (e, time) => ((Button) e).IsDisabled = GameImpl.Instance.Tickets < GameImpl.Instance.GetStarPrice(), OnPressed = e => { @@ -178,14 +177,15 @@ namespace TouchyTickets { game.Tickets = 0; } }); - upgradeHeader.AddChild(new Paragraph(Anchor.AutoCenter, 1, p => $"Requires {PrettyPrintNumber(GameImpl.Instance.GetStarPrice())}", true) { + upgradeHeader.AddChild(new Paragraph(Anchor.AutoCenter, 1, p => string.Format(Localization.Get("RequiresTickets"), PrettyPrintNumber(GameImpl.Instance.GetStarPrice())), true) { PositionOffset = new Vector2(0, 2) }); var upgradeList = upgradeUi.AddChild(new Panel(Anchor.AutoLeft, new Vector2(1, 0.75F), Vector2.Zero, false, true, new Point(10, 30), false) { ChildPadding = new Padding(5, 15, 5, 5) }); foreach (var upgrade in Upgrade.Upgrades.Values) { - var button = upgradeList.AddChild(new Button(Anchor.AutoLeft, new Vector2(1, 40)) { + var button = upgradeList.AddChild(new Button(Anchor.AutoLeft, new Vector2(1)) { + SetHeightBasedOnChildren = true, ChildPadding = new Vector2(4), OnPressed = e => { GameImpl.Instance.Stars--; @@ -198,14 +198,13 @@ namespace TouchyTickets { button.IsHidden = upgrade.IsActive() || upgrade.Dependencies.Any(u => !u.IsActive()); button.IsDisabled = GameImpl.Instance.Stars < upgrade.Price; }; - var center = button.AddChild(new Group(Anchor.Center, new Vector2(0.8F, 1), false) {CanBeMoused = false}); - center.AddChild(new Paragraph(Anchor.AutoCenter, 1, upgrade.Name, true)); - //center.AddChild(new Paragraph(Anchor.AutoCenter, 1, upgrade.Description, true) {TextScale = 0.08F}); - var image = button.AddChild(new Image(Anchor.CenterLeft, new Vector2(1), upgrade.Texture) { + button.AddChild(new Paragraph(Anchor.TopCenter, 1, Localization.Get(upgrade.Name), true)); + button.AddChild(new Image(Anchor.CenterLeft, new Vector2(0.2F, 40), upgrade.Texture) { Padding = new Vector2(4) }); - button.OnAreaUpdated += e => image.Size = new Vector2(e.DisplayArea.Height / e.Scale); - button.AddChild(new Paragraph(Anchor.CenterRight, 1, p => upgrade.Price + "", true)); + var right = button.AddChild(new Group(Anchor.TopRight, new Vector2(0.8F, 1)) {CanBeMoused = false}); + right.AddChild(new Paragraph(Anchor.TopRight, 1, p => upgrade.Price + "", true)); + right.AddChild(new Paragraph(Anchor.AutoLeft, 1, Localization.Get(upgrade.Name + "Description"), true) {TextScale = 0.08F}); } this.uiSystem.Add("Upgrade", upgradeUi); diff --git a/TouchyTickets/Upgrade.cs b/TouchyTickets/Upgrade.cs index 0bcfb97..879d2f0 100644 --- a/TouchyTickets/Upgrade.cs +++ b/TouchyTickets/Upgrade.cs @@ -8,9 +8,10 @@ namespace TouchyTickets { public class Upgrade { public static readonly Dictionary Upgrades = new Dictionary(); - public static readonly Upgrade[] MapSize = RegisterTiers("MapSize", 10, 1, 0.5F, Ui.Texture[0, 3]); + public static readonly Upgrade[] MapSize = RegisterTiers("MapSize", 5, 1, 0.5F, Ui.Texture[0, 3]); public static readonly Upgrade FoodCourtModifier = Register(new Upgrade("FoodCourtModifier", 1, Ui.Texture[1, 3])); - + public static readonly Upgrade FerrisWheelModifier = Register(new Upgrade("FerrisWheelModifier", 1, Ui.Texture[2, 3])); + public readonly string Name; public readonly int Price; public readonly TextureRegion Texture;