From 4ba62594e5f22671cf2aab5e933e4a295e5d9662 Mon Sep 17 00:00:00 2001 From: Richard Wheeler <2762690+zephyris@users.noreply.github.com> Date: Mon, 5 Feb 2024 15:09:18 +0000 Subject: [PATCH 01/25] Change: Update OpenTTD TTF fonts to v0.5 (#11994) Corrects line height in Windows to the exact intended pixel values, along with change of OpenTTD Sans to use tabular lining numerals and minor bugfixes. --- media/baseset/OpenTTD-Mono.ttf | Bin 61660 -> 60480 bytes media/baseset/OpenTTD-Sans.ttf | Bin 63040 -> 64372 bytes media/baseset/OpenTTD-Serif.ttf | Bin 77172 -> 79508 bytes media/baseset/OpenTTD-Small.ttf | Bin 56236 -> 56244 bytes media/baseset/OpenTTD-font.md | 2 +- 5 files changed, 1 insertion(+), 1 deletion(-) diff --git a/media/baseset/OpenTTD-Mono.ttf b/media/baseset/OpenTTD-Mono.ttf index ba1748221386e43ba8fbf3fe459b0a4beae974a8..6022735dbe88ac5e2233dd70335086e6396b4be9 100644 GIT binary patch delta 7381 zcmb_BX>?P^)iY0`DWNn;`Fd!Ozj=~ONFe_{AM3rD zJ9qBfx%bXp=6y24I(wDX3m^bM0M-K*m|I!dH0eO%g((2sF=42BVtGX+Ab}M36PSMe zlx#=a)MJGJz;@i9JAdiC&i`09{}ur5ApltS=Xb55fu49C0RBEa&VFXz%FeMdOc~t4 zU6An1lIIr|o@u-ZKZ31gA9hJ9YeSu5wr0E3qr?EbgL{k&)qo8z<98?U0}jZ+t#z;pUE;2UHOS9f zw&>ll6Jx&_`{|fH^3TZMBBPOyB9|g(BPSy#BCkYtMs`FtM7$3_et7NSM-Q()eCy%* zhwTr`ANn6!zWvG9pWIU4qHZZ}$!>{n@oy#EVvov4$^k} z$ZBNGvNljNQY)E!RHY&R-dm!h^#d58@TfRxYOFke!B0niVE59heD!-|)C>#o( zqDIlIXj613b}KF_t}1RS?kT>d5-11dqiU#Ts*URCrPffJsom58>L_)JI!9fiu2HwC zuaqujk#e!JOWCK~sobv|Ql3zrQC?79QI0C_Dj%r0DzQqdN>_PQWvV*W4AnZ-km`i$ zjOv2wifUAKSM@;6Rg2XYb(MOz`hfbP`l|Y-I-=ogY#NuwuL)@SG&?oNG#53uHN9VH zB3iyyrZs5o+7@k}cBgi~c1U|ddrteIj?lH}g1S!KTHO}i9^E0`uXLw%=XIBLpXff< zeM18}nO4vyI)|>IyXZc8C%vB@qEFCg=nM1}`Zj%EPv`}DrQV`<=zaPceY3tz-=SZl z->l!QKcT;F;2QjfxxI#UhHZv^!=T}q;kwag^ckCtYmGz3VdF*P9h1~#GZmT2O#xGr zX^Cl*Y0z}h^uVk%+st+58Rjb&D(yE0u>u1?oB*CE#(SHzv}UhH1$9&}%E-}7)iHjm#k%d^>Y z%5y!B&TGtDpLgC1ye@CKcd>WBci4MBKRI8KpOfE^-=4oNe<=TS{*3}b0bNj4u(n`d z!Lfpi1vd*pp`oy*aB<;*!Ve4oUBoUD7F8DYHWqCzdb{XGv7orDxT|=u_(JiO;?d%} zKDJNc%k+7D<-SH=t8cNd%Xh?g+IOeKQPNzpt>j3_*^*Je!teFh_!s+E__z6Y`}g|? z{YU*L{BQfO`)~X2l}bzL(#%qCX?bZ=X?y9K(ru+jO3#;GD!p1dT6(ASewnGPv+PV& z*|iD$36&GNCmbu6mN%AfDu1i|UWK@#sA6Zu)k<~ctjax=Hzv{(nK~va9b^L+01_uDlaof5mDF-jfym0$WaSvu zsc3;n$4eAbT1$=wZ58Es3jq#iLJN^U0EAq^3xe2fGBE`ZEi4*j01qg~uF|0;NGX>m z&vTMIOw}sjqJN4!JY|YpqBY4;mN=Kk*9m0&BsL0)t!Rh1F++-<~nnWp~22Ud`Y@aY_MkAWMN0D*d)`4Qj$d)xlt^1gvEw5gF%ss z0+KXq`h;{%DhJk334DdZmQ`Yct&u@fNmiPi;`69l$Vw9HY(*xtS7HhMUUCukezy|| zpg|S@V!RU#lnMxgohXJbACwye9H|E8StLA})8XT|+#e5im+N%p-LcmPVy!eak;6JC zl${gS#XBszXmMY?qrPu((Rjm_tXAb1i}bYP+{Vb4=Qc*WEZh(2WS=KCNq`OjQ6VEp zW_cKuqLDO8M0in%Ik7`yI9ReWV7Js{AM6R&hQkhZnb%vUX3>t?X_laIaxHZbLy6%? zr>@!_v{&m;{qlXGf6(7RpAoAlM9rSUFAu;Tub^W!q z{etw0{!E$7D_Jh~5)bZIOu*}@ zt?d!pnhL`1$(gbgZDwVLAx&(M6T=-`QmNJHHG)!kWQ)91<<8IIFIg@usjV?Mlm#W8 z?BwTFlZ+0zGh2*pmq~&^$ddC*_7q0%02>+0?eY;(GZqk5sg`icJZ_i8z=f^OrhJ=N zTQGm!`~t1qy$}gxlz?)W>P&E#%;L(|St|+*hJp%fT3L}ktg^|HLQ3~WVq!_`;D8t6 z2M4c+6HGAXC5BnF&`K0PZG0>eAGhG61~66$x|xTd8eN_&&s8&AGc;m{PiTQn7>7$d z3CCF}14n1Qa;VWGHNCPbH&c(4QOyIL#7rVF1nb$&@hg^vQVmtXD?h zm%3mPoQ*E!%X!gxgg(l;{^`?*C*d*H^-;Vfh?lPAuKYL*Mi(HgG>b^3Vdg)%Xw9VwObq8bC0 zs52l(tTF|xM7z9c=oe)Qw4*F3WShW(jF#~76UxO@Z22ekH68CngYh~8GBj8&q2db? z7&C5SEkp}8k69>Et|kZ_UPFd<`ozkZ!NA(b7@v-f5gQV+SIA@QJ!Nz{9@W5F6sVxl zKt&?e8nuWYQnA8DbOuw2ZV@(&ukoF+qPrEddvSq-Lywa*l1}EdiHstboiO5;(d`U| zu~#d>$1E&Xo5bN@kVOZB!So4}tdTFFM3qB}Bb`JGjzHf#1W}85ieX0K;Op=6fv#63 zFlKtWGOZyh-bWKL+33l%;BpEZJop*|9*L6?63C2hd)7EXtaTg$88Juk0|34I6B!JI z=1vqrUQ>`cfi&u_S{f4<I}M=g6rZ71Y--}owhQ*3`}M0NeLefKhp5js34{?=M^r*CsK~ytP{uV zfmk@s?IY|abfs=0FFJ=<7&XyrbrhOXpH9VKIB0!O(^w3szy5VP<{?Z!7`5QyjbW|@ zpwfU0JB`kUG+pcfJ&sxu)mTi!E!ZPInmLI9H zBzDT;>wd>ALS>F*Aytn@7rjWL`1+SuqD&9~G`8D%`QjVjd=g z?F@UFfQ$gMu@vRd!pJhz+W2>ft?F(a)>O=1n#WgsM7b5!)nl*O8rt17jl;v`w~z=(|7O&R+PGrv5#skzL0@a52vnc3Xl6#!o#IB_BU_<3Z?cwr^%dD<95 z5KrG4Cp-4Y7Gm%nPjDE6|8yLV@hwp{qHraAIZo(@{QW%C*|vcoav}OUXeO#kkaEHN zGX0O`cPyUM&S7cU4xDoQAi1N=WHK9uA&Vy<_0OZWNTw^SK^yERuYKvHrp2X#BNbN>hxyO!lCACpnco?^0lxA8?slr7mV>iVHY#80qA{Q}U)cmC4Bm zxr{9O8A))lZ}-@b$M)Z~Oix0*;izw8G$+F0LY{|LKeo)$l48!tbt)~sB3nPf6Qv~i zCv!H@UFEhSpM_{KmMxjENu6y_Bn5kFXLJM|{Xxh{Bn8#l7w2uASR3q^QH!l}T$V9m zO=AobM@lAR(uImTKZWpANWEeuI|ch~oRveSywMWq)h<(Z+rB9kUbDw=dhhhjG8s?X zUN~owzv7KID*TJ)6b4CYf_^KD&RGdA69l)S?L z36#CVm`m!(^uOUmq@VyNBrBTdyNrPXozJ5W28m&uvk>RmvUF`mPUJ5*f5~abEQNY^ zbg`fv-QP7cF)Nl05?N@*%T|4Myq7(|u-yiC5i_tLtVB*6o)a2;ITgZubYgcsEC>;Z z!*mk%7%?mNI&oUKN5azOkf>!(mN?0gku0@WxGdu}W)a%A=k+8#ure-*DEl+?RD;ykqM)od0O zq>yVMjr|<_@HwP7NTd9N2XIBh=o4p4l4yA?kLI4FQNTv`4k~MWL>~4J1+xncY?s5~ zV#(6;>a&CW4*b{uKCeK}Y)(WgC2SULEUYkNMm1iSRS|@l4Aa3(FSGxkKxvVohC}~> zc_{Fj3F~V4YZ+{LMX?wie9dMS8E8>3BcCgwG*)R6_G*kw2BH@zCdRelgcx7KeEAwR zi7EbNxZKUCNYkWnm<70$tN zf4zX6Q|FeV*{|CmK$~8F)vgEC*w>hyB*#cbpJu6mmjSW&!T#Tkjf=VHi9MKrFzK+3 zH00*cRB~jnzuytY|FJIGa@Zp03U#?Px$xs~ZEY}!f8iM5_4f|Laz)fswYbhV;&R)H z>i_|k0dC{aDd}H5aNJ|>*V*OA2UfG_KdLYHjf_-pH%6@RBl(m$*&`!;mvK-;tf5sf z19cCnaR}Z!q-&7tQn~#-!QV$dXl$I(!J-!u#KPw^hqpJ*R_y&XLHv4eirJNK3-$+t zb6(wkSQEX_itEFS^^qUdh|`U=!Xl+SZQ|}X()cL}BsZ1ACpZw<-!Pi_ToF%{BoWD# z!kSk8LaZpp72v}k`BRuJ%Bac^v9TLi_C_0oX`v5~h+wZ3{5f{-0N5ZIQt>ti2=VtI zY!dj73zFdScsoV-KgMw!0Z_U$akvm9yBgzd5n#I(#oHu?Z;7{M7=DoX)Wc51RB;Su z+NkZQrne5f6o<2c0x+Mu7#t3up(Wnt0vUFpF?fo8KThLfZ2@pOKa018K;iPn+ai$Q zniFr67~TDJ;iZh2|Lg`Z)UJuS&q;bZys}^pM6Th zXF_j(Y9S2ZE$|yy2kT)2oD3V`6xal(!e%%P{0DpsZh~8|1rej^0q_p&fXiSfme+0Y z8C(HZ!c|}hJ_oztYS;~*hil*qa4qbC>tHWj4>!O*xDjpwSHTE;5pISrfser_;4k0? z_y}%6-J>hm;8l1oba#}79&iGLh$-L{_%CptXaXm}Z^3^PQ^A|y4EO^WCYp(9xZ0Xd z%phhGvxwP5D=`QBFEJOD-z?zcuSx$P))BqL`p~wUnMCN^?T-`D!Fy@aYcDN}=CF@{ GyZb+!|0E>< delta 7239 zcmcIJ4Oo-cx#ygO1o;W%|3CTiLqdKCAwLiTgzzg66jV^Eh=@_KBBC<2t%9YUbxK|9 zp_EZZEp=^YJ9VaW&T_q-*STEp)-fNSJ*`?Rt~%$q*2lTtt<`wXmjtb~_t|~!b4$pV zbKdj5?|IMrciwZp_djG@m}K+<2ms)KZGZtsuWw(|y;+?n zY9#$I;rC(3+GR^$(50a0M)s4&GPT7xBm!$A0Gn1eWh#d zhVHtRZ`T9x$q)cs7+ow`@WFrK++31Y_&1QuV_YMIU~=STZ}j&+9&5zuu!!A`J_CuM z9yh=x@LK3ySdBtoGTuNIvKD$hKoMmH;HRWVYfu50w1}V+_(1}&kya0$U~Rw^?9P>; zdx!76a4$P@D{?*Z$H=+J?;^j9{45fR3`M>l*&XSN2L-b`R7_!GtwPO|{Z&uV3DX7#f!ux_yv*=BYndp^61y`z_XHW4J&ByLVT zo;ZpbQ%S5OS5j?KOHx--U(#UGSkmF7&y!WjwaMMd`;t$muu}9XH7PwQLn-g1 zTuQl+Y)${i9dJpg}@czy>@LTwu{1^E9`S0@2@o(@y7YGD;flE*>=n?D`3<|~s z2L#6irvx_zcZ7*Tfshhfg&twKuwK|K+#wtg?iIcxJSsdXoDfclJfd<@y{K8#F6tHy zh)#+oL>ENYM7PC2oFZN!UN7zu?-UP;$HWK3$Hb?4#b+b}2_>;gJd$!ry`)*PO>#_f zN^(YWQF2}Kxs;Mxr5Vb`IM_V zRZpt6tM;fyRR>hZRX5b->Uwpvx?SC^-lpzX52^R552?r1Vf9({CH0j0?-Y|trxa8! z)kbwvPg2{dJ=7?*zn3~fouJN8m#G`n7aEp^r%`Flnp{n(X0~RbW`$jX(&gjV4nej%(bwiRtWY8MChAzW4!+@dp9m7e(IiuO=H#QqPjXR8cjpLb# znX1gn%+}2HnL9JbGyjlz$7C}Vnrck*O>L%5)03v{rZZ-a*+v;u2wsu>$ZJTYc?Oe7eyCr*f_DJ?b zuU%qqu(#Sf?8ElM_S-q$ocf%WoNYPBa;6*{huu-{=yMD?4mmD3c}}gf)){o}c7EWz z>f*S}uDPxbSD)(x*Cls~yVl*}e%5`|ea3w)H!+vWEzDh!JD7Vs59HbNTJpy7E_!$# zt*6Sf*)!}p>$&dvJfD+q%dgDuZO(r-e=z@e{#1U%Yw#}gZuIth_j^xxFBX7;%z~ww<>&eJ{&IhapY`|q2YUTS{qOrv`)~Na zC}EZGN>nAblG2ifl3+<+$!N)2C5KDKOHP$cltfBvN{33{E&a4iRaRfNy=bkJSFA z_R=hRJ3>H1lARfazLRzY@-smeZ~(w}3Poa}&Sey;7}&=(GOhk1HD1kCCvcRuQZs&$ zYxfiavNfa|kaq;6vrs+=5@z%!0#Fl!A{o;S$_QhJ3JC=)wm8ozWD|}?P6GZ1HW*9k=#6;Z5GeUp|c=IfBPz0KY3@#s|7&?V4Ay=Sc(6lzDTM9{A4Rf41 zMNn&FU>@Hrk(<2P@~}fB&rwLkO1nbj2+QpGCIw!^H&KpSlZ*{(q{-hY8+7?dNhz!1#alJP15qVY(Vy4n`BRjWhI)Gh?o z_?lK#fQld*_fhJ>Kwyw#t{Ak6L>~S+o+n9}!=NH(Yrj~q09qqwGd9B1T4)Vh2i@+; zKwwf-HD(P}>sn_p=79D19jhn#t9tm%Iy2>=wO3}uYF=X3-)9TS zPAKF+vPO|O9CpvKinayR|LdSmiq%dyzMzQoQ2E1t76RI zY#Iw8ZIoV1)60m=Pt&h)tLg9iTxX1nY5k;UsLtz9KPf!JS3f zusJkZ#D_SeLX5k*Soi~985zD!D_x>zg@75SNv07^@K zK@@YR#DuSus&H8;Pr5j&QWhWyVp`RxDcuMc#QZc!5l(HO zYMKFU%Gmrdxe#?2Ctij z$1P)o4WTaxEzX{uh<`mh9WM*;;?v|zqdu?%-W?FfTolfp9=&hk`S^I?S5S+etu@8g z{SA@25TB~efZEVhZ5f1h*go4-7c=j)T)_vE(K!ncV}4D~QOAV$@gGbd^}NPt;IAZM zW@1Mj0j(sinvKJ-5|mfyI8oV&VuFxoIOW~U;{o;_qsHeS~4D?X~8}9 zN|I(q>Zcd`Rh;6eF&E+k^oMk9Vt=7M5T=mZ0LV-cj^V#7*Ru@y#iq#XA@K@- z0$W07B0+#N^PppsfhRF1vl5<3NR!B%3-Tg?XGCTR&!BEn ze{BR$tX3I~v&zgQJp~WCXF^!xf}0}WbJajN(|ynyR49^-k6RDYC|KMS=Co#ng{SWZ_`1kI`(^(9E3=ehu8^Z;vamyMJQAC0ZZ(ieMD@19@Y$n2o*LV^W z1$=|trBdUYYvee!^EiAP|EBXPz7k{tCtWu(HA0<;6jdCA7p}E3>E+^GYZc6>#P6)t zh>5OZhDA-JPzGFL32~ke;>&A^NjH^aPL~2z*5K?ex!|GfOsZnCuf|J{(B`gBApCi# zY5fLfij^+4MRcXDg80LYddo{kD?FZxqc1(ST_j?w+6$Jf@>jh1W`%#%l7gU6kf`|{ zgW4LjEixDu*|24kEL6U!nCT*SSdeTS7P@+KbDdm)r~qxr=Hg#jTyi8 zyegHQZME1VACnru-fj>5?)i-jn2jr6Tr|TLFQROC|BFVAJ>IjA&;qx?7tlhIR*Wbo z4$leQdNB<`FGjcy7KG;F1PDF2X+TG2+cIEARuBI1Ko%ptPKdXxljFY*3?);5qbFqI&plDn1#h~=XzPsfN>faAY!(r)xFhqukukS@^ zIJ9ACE9^z5=_@(nA1uUn8W5ky7YT$Kx4j7F6*2OPQ1tojHG022*8dyMsP|i5-#-(g zg;w%EL;64CxN*{OHlEbHjEjad$?rJ6srgC#yN_%>tA;7OWB666iX2`@To5map5w*Q z3R$S*FtGm>S!HgXV=(AlT%cvT91a&#Td>$09CVPs!BcFnh7`_0Z9bbp=?W?`NYR{8 zQJ@P#D`^FTRu3tq!$A+pxB%~a40-M@wK3Zyoib?IrlV(M)`0bl66LnIvmxIE4v1Vf2|H;IJ)_Gf{0pOp!n#nik<*N9RvB5z{nEXe3`1-2`VWK=|ZUH1_y(|C9m}FQ$}-ST)z}CyDO?;r<=^n5DM5t z)g5D|1PNC$BN4wkrepEa)C!v#|8`6k`tw*TgyvAqJ}&Id1RurTfB+^)f$_H?AOWPq zKpf5j$*?=#PEG%gm@|lT5OL`? zKKCPKZ#{S}4rc-hMDcb4pr9$`5{eB%f^hg{xefgGIkriGc~&dLcbdGml1r<~Wo z_K@wo0cpv>=@9rStb_HCoY>$z*Z>>he7FEMfiJ-w@F}>0H-2oEz)tWUTnoG4I=CKO z1%HAYU^n~@cmp5(SS5nr1s{S*xE($RcYyQY0{9qQ0w3Y2kJmHd3Ghm&?IOweXdXBW zLZ|^80Y3*PQ6qR4{0#hx9BzqYG=c_{Pp`572aSp*kZ=1w|7zxuZ9zX2fK3{C(5 diff --git a/media/baseset/OpenTTD-Sans.ttf b/media/baseset/OpenTTD-Sans.ttf index fb322a3b1dbc78053c6af34c354c584dcbc62ae2..a9ed5d8c838c987071cde945b7724bdeff62d4b5 100644 GIT binary patch delta 4851 zcmb_geRLC7c7Jb1UzTK9Uo)f6(P$*gvMo#U=+m++f8cKec8mch%K?mK$510X#t;Vr zB7_nG)azy(uW=k;T@uL0AuP&Cb5fVmltXoBnx!00n)MPE2%&6BQNpVg} zPtWN;9ckXX@6Mg~-o5wT-+gb+-Nhe#jVA#F04Px*0HD6UW7(0MixB|+)QPyJhT6J% zKmaWOzrUAlx3#Xgp1xiLz=Nv*h_*MZSXuMfzH%h{K#rbYYF**sHmv+(Hvn)yYOn9! z+%@=9zi|lwG9)huc5fSIfE9ZN4T$;#f+xGSBnKZp1UMSt4q`~2?0=^B(2S-Z0Kx>o z#G$^PuDG-1$UCUR%mBeY#K;*J-$(6Q)VB9+9v=Cq6&y!x^nT8R{(3qv{2WF)cYz;=ERc0-200@w3Zm?_nU*>f;# zmft38mf{Q=_W=@{<)6wWQvWDx79?rthNJKdoWlf|1B+m_SUVQShOv{_S?o5h#GUwZ zd^BoQ$pmuRV|Pc$NWN%W@ZiWrEa z;(qZN@pB!li%sG{FTPl|}OM9hzrSC~U zmd?o}GFH|u8<8E6&C0%#E972zy}VbxM?NJ#liQrTD))}UpkNjCiv5ar6<_BW^4xiQ z@@AAurC-^hj4S(X!Ebwa&M{l5CV`jYyp z`i?sJKm#;xO+-_#Y1gdPY|?Dg?9q&BrZg8cmo?WkUuwSAVp@f^NZYR+(eBlbX{WU( zwQ21)gn&>ICc;Vhi7Mh4@iy^3ah|wDTqW)h4@f}D$zF1Z+(jNBC&(G{6nU9aQ#4gX z1*sZpIkk=2Lyb~X)a%rlBz2a$NPR-xq`so&bt0WwN9&4oL0yfmSvR8Fs~giz>rU$4 z)t%FQr2ABNOLtHAtzM$n>KVODAJ*6E+w^Pnefm-Td-@OcAM5AzxAph+3kIoyG_VG@ zq0O+y&}SGo95cLaIB&RQxNW#^STIVBq>(kcjZ2Na#^jK3m+^pc!Z>3*WxQ&Vn6xIw z5?lTXYcbgBHC(Xyrr_C45_st8m zlqPAGcGD5Mo^Gc%&_nbt`T#va&(Npn59kZ@W%?TZCH=JpvnVVs%Ua7m%Q?&Sq-BAT zG9<$?ZYIu5GRK)&=B8C{Wv!gG-MZa6YMrsZX+2~8z;`rZJI21pe#l;A zKVfgOU$OHxkxgx*ZBg5hZI5lzcG{My3ZJ)MZuwTm;9CuuGEEF^s>?=55aLvg%+nqzsapwoltA$KqN8#?m zcMIk!+dUE#J9mW?z`Z7;1BwD`Oo-2^xp|EfttYfz*t~9 z@NVEr;BF8L27`^kMDSSfOmHqF4LL&5P-kc`bSQK>^l9juuq)gfJ`|n|9}mxklef$0 zvbM5B*?8H7viXQTvNX~eiAM$_`yx}3Q;`oM7a~_8*CTf$-;@`XN6I&qpDDi@RYbXH zb97U5EP6WnVf0popu$vPuW(gFDjF+RRjjSpQ*oeTyyE?e^A(pWu2$Ts_$DTg(J^32N2`|~S`z!-NkxIeSiH}{gL{2>(dSL25p0>!PO9LXlv+i z*wt{UQPQ}+@pjXyrlF?YO`}a`n?7#(x|wMXH?M6z(0rtMu0`5X4=|AWz4kQJ6af$L z1EBE{Bt_W#1q3bR-y;h|<`S>Xl*iv7E#e%to_2W6DIxU6eR zMaHoFfIo(DG-ifc1;)BDI9A$Q8aEdbISYf9+L4)&TFYVupXL&;y_Vn>?%}X>UK1Hj_ypiq|=cC5>h+QaUoS+k+JgM==@Ji?-kj`S8k0P|RATy3z#IJLk zWkL%q^_5mY)-B{;a2I>jY=Or~rnx+|oiwX*ySsb3(Ws=!Yo_85#^owAWm7A;w3;ns zSzR7K=XR=!mK2%ugs@pJk?M5Ll1e+T^pI+MWl15Wmx}c*5SOVf&ZwRDd#n)f9i9R> z%s=aCfkHm*St`!-X;B^paDjlS=pz@2`{jz@7ClEy{RU6%6>0m&AlE;Kq@0 zVt9y9K;$_ZQt7lM;Ixto@y?c(ooZ)CBprCnMds43`eL?F%~IHGLPQv7i`A^CrWW>7 z)y63XsMPFM;Lw#$!?BDD zcZN3)?^{_dRvAmcU*&Ny=>bvH5l31e;jpnHEyW>E zlY~}`ZX4_HzyRsvg8l-w7_ttu4q*tDYF0#ONs5bM0Y7xPTJn??j~B8U2n9QmZS?%3 z47I~-yTNgON~+f>aYil@$MxE%cI%1(jt$WhKep*IpT-uMSh&J*r5u!!MFuW)+-J$P z7J^D-VUh~@2r)^K*)Xu7ILMe6^Km|o|GX-MVURagFXLZoBT_r68%0YDS+DpA8{tDs zmr&VMem7=Al`Y_lr_pk$?2gcBwaKnVmcbchv7#l*3KsqYYK&e+y)cM%##311)5>zR zgVV4Me~=@^3h2<1T(BUs=Glpc*4EL-FxWa`aWF8Cl54Qs_JQ{HaB#&-tl6xRk-4eU zozF{QA@A>Iu^7&;?zR->Qj9|zY=pnSI1JZl<@%=L|#_~d>lzZ6dPh&KvUqxxw6&*sM(3GnYc`*%)@5m4XxkJ#pmba zur5szl!X5xv?3+wHHyqW(1?`bXd!{@qE!e{JOz9vNDEOY3;1ZiPpnWIl{o^)Z|e_R z6*fzivv7Bpx3jS*t}q!3Nwtj9D=oC&=+I~-2q1ph|16Z1ph+PMQz6vFs)R$7n_pb& zGw{iTNoex0IvM|J!pIku=cj(1I4;UX!GfR!5?Ya%#`uF46Ry$3hfP4 zg4Cx6|4yuMWJ4Fh4hmfb&L8Kk(QLRwB=`diARxe*A7b9zf|mK>)iS&p?brc$IE^#d zEMS0xpXXUD5966}BZg*BG44q9jNikB`JfPZ_$MY=#N0WV9~D{<_CnXfl{8x>#u;0A zT|VkFzpmUChpuezW{)llH(?h-sKqf5O0l4bpPOW`807ynX~LJixQf>wX3R}{*J?&A znBU0XN@q*aijs$YGmEVlp_06a3M`Cb7ZqC?OZV;Lja?13LLl zQ~4MT`LQWIPPr}oTT?cHqorEQUzys1uK{ts`ITj8>XWau3DDHf@c;fws|3wZR_Jww z`6bhnFrU9Vt)uZ`EP!Gvlr7Tf2`=-GZ|F^1qVXN8c-5;^-V@KQ^l8&A$cpF&fcL-p zuo4}qP~M^u#@kTRE3)Qus?v zxN?b=PaOFjkq=5h+4p!AKz-o|f9V{4_-LUtS3-#Lgi=fh`I)0OnN*|_t7IA#Wl-|} zbkx9qe)JGt2^#qWfnxsEV{(Y|ZypN?4Tav~zu;leqaI76TrcfjZLjgzRPpjcXOu7a zc@uwUlu7OV`Dem)$Tyi|8#1;Mpo1vdcDNxzxop15q<6IS2r?PO6)_I@fNAj5x1qw@ zU|EpQ!rIx{h1prO=cw7a8W)~;lB?OidiC}i?#QoxbtF?Dfbbe7F@F7tw~__mU%$^+ z==d#%`bAoZ4&;rCv7#~rbO}&1tNT9|35_<{bv2pBWYy$fkHi;d^rc#$~ z?vN){+k1uv+=D{{g9Agu8wV0y{mOwv&!ddtryrG25BClAJSwB=9oRbb$Xlx3joTiT zQEu5d@`#9fOHW{1PvTKt&&DVFh96<65*z==jQE!S^e1HpU^2!?D;Nz)OtrI$q-t z98*A8!cl}Utk)1PAzUgv)*&RKxE$rzFN$HP_ZU zSGRxNA17&AzwhhT*WKUa*Xo&B{L+1V6hHug5;YE~ zcR+?C!vNfw_*pFf{p%G8!3QISTjob%TfoagKkSCn!sl=;fm3Ln86k<;gceLBP$DAR zg{ccMoDzm)OE7FI`=zW|G)h7i?t^FHO$@_aSQM+rTCgr`06T`A#ctvlZpLfzUVJ+~ zh2O{jC=!XxBCn`k^qS}!u~xi9JR}|$pA~;9enO}T8<8YBh>gT9VuH9rJd$`Nt0l)J z=Oi~I_X`vST*2Cc;ex#d69s1qE*D%YxK&6MHWUtz79K6UQTS9Eldh5uO5c}Wl>SQk zN10kyFYA%*mrcrU$>!vgJS<-&ACT{rA1~sHl10}PKvAGz6+MaritCEmVrg+l@z&yL zrCiA>Wb>V8mJ4@j5@4NsaL5Fs3+7X)#ucg)T39` zH#LMtt+8o5ny{u`vs}}mS+5z;9MzoGoY!2|T+@81xvRyr4cZp%YHg2pP`h1wO#7Mk zEA6y)MhA3qol!Te+oe08o6w!qozq>?UDe&xeXEb_8})7awfbKDuzr{Rq<&gIV*m!Z z!Dw(9mKxd(yrJK)&9GVjI$=pq%fIHjEOTPO}uHZY0PxobjEbSbj5Vtbjx(lG;7Ap zF0;=ZH}{wa&D+i6=J(7O%va3U&9}_=%(E8ELRn&#(Uhgtvc|H}GGy6dIcxdKGHsb5 z0VyX*k|jIHN%9l&Q}Q$ND{`8gu>z~yYP7nnK5N|CXl=8uwf0(vt-Gv8tyiqqt+%ZA ztg|-Erm&f9j4fZOLM1JrryHZ|)Y9E@YRqsuYmc+IifvET8&Ev18W8{I|kp%2j$ z^hx?0eTlwG-=x2#A37Dz24|adqjQJzi1TCTH_itxsf%*OT&=D?*SPDf>!#~biKv7u zSzapJ;{E{K4hO(cq>vB zLlsjMxr!SVv)-_Gqj$getoM4QsFJLVRj#j`sGJ`h)&8 z{vrQy|26+@j^Lu)YHol#$W3xNZYBT%?m&BBZ{U-_lVE*tD7ZT~8T>Xxgp#4Q(Av;& zXgqW_bS3m8EDv*GK0FjY8on037XcA65{$G&1|t)ZsmQ~qC)yHS9qox8jgFpVvVuYvHsY$*q+!}?0D=<>_Y5*>}fSyJy?CT`m^epxIE6r zTjK-qUGewhSK_zgcjFJ@PZQFFF+n975=#@S5?d3y69*GV6Q>gw64w&96AzR6B$tdQ zQ^}TON0LuYBp=mqJvGZ~UaPrKbHA3VWox@?$7(OvN$c3URdro;lXVa3J@p&w&(}X% zQ?;qa)SA>l>U`>A>PqTH>Tc>uTAy~Ox28XC zlr|n{0!?I-rzzSrm?d>tsBwb|zyY8M==27iGgzv#;leliQW0C5unWZoyI5iM)_bxc z!wu}YDa4?~z=Bvb6!bz`0j*H0H|UeFBoqu&dL$7P181o8nl#m%_NDD}@+sIbH8nRi z1-EeZTc3Y^Yd!bF6FAoXYCU)Ki!YAOH`(!%<5*T{eUm6w0~;dwYRK8Jd0WDVPP6-k z)H@@&OfJWf_0ecOiBnwWd4`W{D|rVgv8lO!dy|*@5Ds{?5*+QO z)GHEx;kC+eJM;(q2}pZ!;a|MvZcACL(vsu!7C&k1?q1i8tm{di)xbl@8>~K3&*jX% zsxnfjsC0AO(lWCIE-}fJ<-S%f!*_S{nST_)3{rUft=!UX*qz~8{T`*vlz|eHC&LN* zD;>f|l?)sZZdPU>F1UP4#RjY2q8GOKULd$uU%65y-1PnHr~{PcU2ntZU9Sp<0$K$o z(K$n2JOP7AETUWRaV{5H!RkjcnGvhj+heG+gsLi} zy+2acWR}nz-IS>*e#NrP$vKzJM{WLu#Qq)yabC~`bV8CdFa%_CIe6et4Lr~9dGGz* zxkv>Y!)iX{b3FQdIJjwW_j7esf3uT=qh1h2KjidwsAHTop*6%{fYa-=67)D}rV@tq z0WKUY^*|({l!%~4O%uBLBnby0%Vvs|i5JRf4HUswM_X)9{!-y7ci!Q+purfxDLEnG zP1?Bj$168;bYv_q>hrR9CFzWf&3(>seh$I_53*FyUPQS;61h@uhy-*JG#$zx1?Hr^ zSl*9;7!=mlMNlXX*DcFV*S$z2jd{lhbWU9WrJGLWR0SC)YMr3~pF;^z(;c(rk_>VJ zP9e{D7A-5C`wyrIr|0^yc3xOfqsty?>{dq9$PUc}!<=5CfQ(kpg-cOsjHR2K_piWU z^RS(vAha=9QS0W`)@XR;LE36nsjS)P3p=Hd5vICn7#41K+nL62xDkGYwdc2*(OJi= zx=bE7r>!d)W~DXVjKU|l`Q;dg3Bx>%rE9Yj{AL(bp`r<)Ko}rOd5JTmDfMDpRdXrS zjG)(XzF48drucO8pT6XuJmKNuoZY0!E?VD9Sc9MmEuXWAQ8GBS3Nh^!hXN$DiMgaW zC|vCgNJxFLOd`SrVpG&npw%#zpv}I$)7ReU;T5E%Os|$1OiH^gXkj$kg6t1AZG$oo zS`KolA(Di`-9Dz8+S0%zw6dNN-g0>G97(9H^xJ8 zp-$0cd%g3GbcXNi$c$v0H|GdBn@>8OmXO$>;2LrfKmBBJG`d)58M4wNy!SrT&8IZc@RH)LX8VD$Q~H_9Ueqsf+)7-hy$>YDxlKptDy>O&+*>}8io1k?c98r z;g-2K!f7}Ive~Us2r1$ItL8AuXadz`7_ujR``Z(L`(vK;H?!^ibDu+}dVRWWkRQaU zugAIZuRA~1#;V+Ka=nRf8_d>jt1SBerkbP1kj=dj!NfFRfKL$Zb3iCC`${l}M_9g( z(nu=Va^KuvEE zl;R7o%-|+~0q|@Br?4qNfl}f0AzCEy5fb6rAq$2<;dh4^2(rqb{vH>*fE#!P;xLVt zRCc%|Dv3FAke&NHM^{O3%2~a*1X(RvT zN@3mGPGWvKRAu|#ei?rebPL$TGPJXni56TEJ0ZL`(Ok$zWo14V@u2Wu6XRxAo<-(4 zN0)C9{Uu;Phqy=h;OE9t?}j&f`P>*c|G}wT2DuqMxgBqrO#KJj9N#O1hd+N-Z9vfq z=xpdrb%ugWDWalz?ngKrL2KT5Di`+Vyy4ubojCP5b#?U4okg!RbAI^G%oQO zQ79C_{Bi;zWCusIY!eB=V`XBaiYzP;HXL)>)WvqvYhSWPx*qumaYD}5<3qt($Q$9q zWBc$VNDKWzR@nHi4EeY&T%jN0m6 zx#JJ-HYw0u5kMB3f(MiYR+e3L{NKca{}-o6-QbHqpFZdoD~IF)7NdJ@W&smG1_u{# zk@BCM-;YrMbC6olD}g-t+yYhsQLuLb>yZAh7qA}bkE4WvqCyl$Zuy0eJ}4LYLlyq)*B_h-2>b3h;Fj!}I}b$Jvv*&W z3t#^sIJy)p2cm}5(l%i3-rPS3TpI?~y#&0yor8Vo5Jn}ADik^U|3LG@=1+YoXajwJ zVUNk%KB(Rte0%sj&O8S=jnm ZE(|{|%KqKs6S(#k;pv+n^S^K7{|(3~d8j9N7$mvV>$XnYEdZ>y|HxAyD^e}rLR6Kc10_O=f&UW8v@ zSloTIfWC8RP>H#TLA0O@jT4L8SBwojevHx31cy)ub8*keqF21X=VO?_h+)6shq~H> zY2O~qMH9xOac2m1aQDZ2joLoc)`ofqhrf9J+m})M7KX*f_w;wR|Ep78f)-FB2ARF> z!vpvXOBm?4t{Ck6{YRr1p!^udtDBVu5(a&G@gG|g z+}~nx3?_OJ`*P3Dtl9fNzgq<@z{Of0eG*@fy@)ZeWpEI*5ack}7QPDZ#hB=2SQFvL zg5)^*UB`lSFS-xU(oM7XVXTw<`pH=MQd|x(HV8K0Ox%b!;al+&_!RyP{%0DSCZpBU z`e+x4ETWBgi&T@<@DZ#L?rb<6e)Oj>qGb@m2BT@kio6h`%0xJ3hh^veYaq>oDtUwrPyr$9|3d zO+t0Tc)~=&RSwP(a@KLqalYc}xgqX89*^het>*3GP4Q+Dy@^W_&m?}pm+^h*>*o*i z&k2}V(z9#-ANtTqAOQRlHHP9lKWCj8ZQ+~wNi`JEiIAON}Hu2>7aC-bgOii^pNzd zj3=XHDKe)lUsfU8Ap1&oSN2fOl=J0Exk-LnenEakeqDY`exJgqcuGv^sWsFlY6rEC zdX+j&U7)^Eq$r$suQX+swvg9>W1pJTB{DJ2i5D; zTh+VNhtwz3XVg>bY4t6QQ!}YKp!r7gK#Ob5+AM8A8`KVH*Jw9scWC!%KhTcd(az}T zI-ZWwrRbcxHTo=lk-l2rqF+7l!noUb*m%--*7$+(s_~}rj&UZLp3F<8l2ekM$@$3@$xX?N zl9wlsCT~tYm%>R2rCc9NjZO8Y`cng`!PJ4&GbXXgVyZPwn$DQMPQ%k;(|BpdGw|wlD32v`^EnrQJ=NG2>>v*<#K#*PA=cL*{YwR`U+?Df3zLMe|kjP4gY| zgLERDm#$1Vqpv%?B)v9$b^3+$8|i{{ zFIc~^71@SupW2mnlReY!vsc-h?IHW1{hUMVSmHSEvq)k>30ryN!C}${V zL(YRS58(-UE_(jpxt*)e-IjaR8}Kgj4tmGEC%jkl*m;4x!MwA15At6t;1swE$_id9 zc<3|ws(ssiCw*TPS__*B_Z3wYjTap$x?LnhJz-m5C9 zT30nyHC=UMLFNMAf<4vjYI}7@^|2aGO`v95&7PVgHLus)u4UI+Ydy7PwSn4T?ef~u z+HJM_YH!qK)pgXJsJm9rtM}J$s(-8gS_88ov!SV>qhU$IaKpxi9SwUL&NN(TxZH53 zVP-5q5AXt1z#J$Fv;+nMuLRBoJ_t+){t&noxYrnLyxG*&w5RFr!tsSynt9DrPw}2A zd+I<7y~WqErsY(tvbC>ux{cqqy6v-eZTrm*W=D0$)=pDrPv^1D2f>cuXI&*-8@ndD z4tJehq+is$XmHWg;;h9ji%*59P(|oex4Ii_4&UZ8@Ua5SkJX}BZ4*$W0yu13jhSxX zQgi{IPA~)-hnbcR1RAbQAQW-UxIrKNI_w_YC1BG8e4!|j>%kp%Jsy~{cU2TxG%?Je zm7&nseAUZx%a?CxY0lIfi2R@ZQ|__WasfXW{N!yifla^c8`mZJ)}CFdTCmEeoSdBM z{Z;5qy7vMpk}2gP24gZZz(`4(XSZmWaFd8q1CqdV6z*oT+c(mZ8{13DlFd@vl8ngP zkN%TU*qUDVJbYJVlILR!u!U$dR-u5;CKx~{%Eb*Dhf1IU6b{)aFbdOcRk;?>ohS!j zCOCtinT+&McE1_6h}}Y2R+c^2td8tVR7FRF!AOrnFNLp(v%~))-b9P5k4{ZQ=LT>@ zR!pmSz6G9_Kg?N zx{@-gB*I4vb<$V)Wv?K~3{`wV80M#v&fndJD3 z_anbRD*D^3!5*JJhOc&H>RP)o4DRwB@vBPNe34kCMsH$4{0x2v0VAZyC*A@W6hJ<&Q6ukm+GZUH zz?+3ej?AtpZMd|3^tA;hjXgomgW@6uPh_?5B~^}w&0X1ccd~#b6TspkD%@FAjmHd- zeA+$Cf@QAr`A3-=?#^794_C2A;6il#Bf9D zS2$0BrOax^N&%6}CSV|U_xp{pZEx-?`p4j#Sv4lO)^CVSEq5LY?(=T@X*v9RzX4$3 zX}^uoCSxw-YZUS1MN-5U@G(-0IXEh-NN*rD4xO0>Qx{0a94(E-E(I;}Ao3OZKEU-B zv$Hhv?IfTXsy$W~3!ER^xbfCT5VHXRQ=H8=N)`tfs^+&0tlM43X5Ws?;5eY)2KR}g zc~1w2c?wP(jzqzXDKrj4mXW9usJQ6oKv&?QIk<>IJt(AWl-~z%6j><3 z>I~90M5cl1;Tm9yOw(=+9<0-%JL)?fIe#(o+Q|DV21}7!UnnO9Y-3JFqj@Pg9Q>{- z7$i>o*9SmfRAnQJg29=$7K``Sb0m#?vCwRxaHC^hVl0PA2MDo;`3vKSxO8M_Pa=&T zrnIKw&+mnSR{hvWWkJ@wRHd003vfo<@nqg4lyETUCXFfu?6({5og zSSnVEZHrD7wSAPV94LO-%_OpZA^|u&bQA?>0-%b9G&9OebC!&f0EOGEPW15HBj2;~ zcB?iH<*rA*sVR~lnTGE`84;BStZEgD#Na;8ROmcK?T+?WTJw_p%O-|wi1F`Qbukau z1cNkX@Szx1?4V$Jn+PYmp|VYYk5s~WZTfIq+bn)Nu6Lww@bC8;5;)4t`AfaPmRnLxs4H8V1i5B>bN7tJ}6+9rxh+?u{|v zE@AWrBGdG|o^wfbnYeCZeaOjyA7<3O3 zyG;Ns&r8`+_GkhQrqdhPKm&EpS!sDEm%_&9ve|Ag0CEr;+~1L(gq&mFbN>K9I;`KK z!%>u3yCsE)E)0)u(UQ>>u<(^F{{c8C0wm5(DFXr|104S5`D}t3e0x3QPUI4;>*v#9 z%|s3gXfI3{W58B;dS^Sr7Lr{f1WUjYz{y=b;yAU;!kH?m*DwIV6=(&?*#%jZZHNQW zOLxiiBosYS$&4+>oQ;z$Bms4TTniEfK*+o||a&mzO`5QtoGsleZ%#jQRJzl^u%2n|0 z5g{$7S__#+o03?ZcsdQ35a66|5At-ZFtKXPowTVL;;L1J$0MteeAl3BdX&b;pYw8Y@@ zSC^xsCluD1b|mgNOoyc**+r!_7to`bYIb6}0KR@w#Z(uS6nLz90laonKE~ik)ajX} z$xr5@DIea5&WA_mn^m6(Qy??=euiiSq-mmQ0w6`$^{D{Cizz_;$ZO`qJ5#{)gkRc* zS@Hh`uiwxAgXqJ3;ky4P#0z)6@!A~7HbnC=3ja?)HZ2OWnZ9Lvj<(F}Dufoh2H|VB z*pO3J41alA39p>~C()cON2M^QxhG=&$2Sf1C#=JNeN)4jlWLgzR(%{o;h|r9Q64$^ z>tfPY*E>82@Bg|`STx#JVUfSZX%eo#sEbLoX)Fe7dKLwLaZx%}ux4d@X>wY{(x*3V^d8jfwxv3Dh+g;i9Gox)gzZ6r%tvc#juP6D4X4Dgnyr z6bakk%S_~@7A!8n>u|8Xd9$$~T_Yk-$ylMWH?OeLXX+Cd;Z6l4RKa{+EEJ#}G{aP>o_}_J`WySdGP_ zjtqcp0R%$|H$N2w4BWqNp;r-!N0DGdaB3>G)Ja9ABhx3=V6) zzKm1D3m=yJP|7VMXKOfEl}d&8Ut;5+1fIAoM{2x$*-dAei(AGjV8X}QWI=CJjtW+M zED!g7yadp4Q1N)}iWV{V_(~St)Lb-=lK^u*nMcp)@HyEmxcZa#WAjm2kIfeKu>8|h zrtg`y`s|e0SUCErn@LJldaW!bCVcMGmjEb+P1712dE4l;i(y&dNmmMD;G5H)7*@Jx zL38i2ycO`_^v@Zc*b?k%Yyuwpt&JN+S-1d|9?`oTpmcQSw=GG4&gIEvI<7HCkwA-8 zs;%NEgHzR$FAUUhAO0KCdZJ*(!PB8==kTA- zZRA1OwPzEb)MQSp$bn8%Xaa=0aCqukDj_siI^b8=^km)3+lF+I{kZ~Ven!+Q>4%V4 znozN1$J{9Y`jBRQpJ(8>0}g%eqETis{Ke;4q`0I?pB29SISIf3ymx&!b@Fc(vf*RD zPXbBh$nemaPE?R+i-f^Uci6SjNCL0_fnxBj_3izm?(JU)n0ce^_3pITI4J!>t!67T zQVb$0BUee;(7|Aak}J`wEq0&rCnplblw8bYz~(P>W9S?nYkK^E{2Jw>glNzOXs@UO z6>#}NrPF~ak$e%(QkrqQ2M{M5y<0AB>2+KLJ1#!D4VVCX@98yDk0UdWr`A0E9=^FW z=n@KD!P3a|L{HBIzQe!%{Iz#B`28E+K{r$Ypjd$1>eg(+z;p=s!%3--j|YNN50Sq; z873*jN;W(vO&ufIv;?3+NSnB6{jQ3s7#RCx+0TDM<&V^?Jl>M}V-33Sr+*y#CE)Ih z;H{@eJ49mqjNEH0O99&=12c4yH@ifl50n{wS?ZM1y1%GH`vb0`iH`G2_?b2{i=Cv% zO^$LfTcO;G9;GEdIU}MozDG=ItscH3PlUT<8N&bCel&7xXI;OusJj#u!~B$%<3pdG zg%MIe29}S^+1WZ=iDO8+9rsued!WvY8=#UMdB7nxAGf-v7K!p%WinAP| zB4L(6hvb_V|2K0rJ^8BGNyw$7;=Sw2|C%M9!t2Y1#nf-(5J%CKkSUPRps;~h*sPFq zP%!L7X2M6oP=~7QzjZLiej>ziq{iy#rW%x5Iz>a~3*e|Sxutf^h6CHHN3K0TQd!oP z??j?Y%L~=cd*Ra4s=8+ue+Xk$d41LTB3Gs^Rj7@l@R`cu?DnCj9lgKZoRCt`xBb%S z+K*o7$uqKZR+i+|`JG0$I$3L%atL#89exHrqLMVxl=Ce*NqYR4_U<{Fi!toa&d~zYe|(M> zqW<@h8UPW4RzrtZQ5w$NkdIYiaIT-gB!E3flb8}@&e3#C43^H(EY)tXeU4^hcH6@_ znuGW$pQE`L+rDa!7NGtY=4c`6e-ml78|%bESUV~*f|wFcetChkBlu^9?Ke#{dzv-; z;>{0jJD(B)C0PH)s1V#E`1lU|@9;@{C%y}R3Ez$X6yJlt{KkM3yc9piTHUq0-`w95 zTroJ((-q&}*Y#s#aMh0^?7`6Tt{=x(i~3hC|KUm2qVAy|$KqFX5C1U4UePtw)%Rnw zt9x;1@P{Ug)z|$OEAEUj0;gsXHi(hFB7ZHWY+v5nhnYG@miJ(pi~1I3C+ky=y=4rSE(u6xAC zFpjV3Q0!Q1to2pfI*z6edM(3HuSLhYyw-6Xuj5c}M{PPgly+v;x@*?Df82FePQJa* z+28s0_xyePCx0fVu9JNL0svU}MgowZUsb%Xof`+B!GmXG3Uc%E0T*xp)WuAX%StQn zPfk3-<5s-jVL@ee_K9y#1n@WoKTj&HOf8k0{~&8_-hFtK*0<+cp~J5wiPY)ovStgzv37(E0p z1YZp8a7_RIwsJK}g2@rx!8eH&U?ZS|4%7wble8kZ+cyCpGf3bCz&90^LH4!59vC2` zL>bXfyh)rTZV?YDBqfUCqIfB1NF!NA9;WiB`P9QS9!*Iz(z0o8S{v;nx{KaPKNAuf z;t1&sImiHvct$p(hcUvqz<3-C=6vQJ=Jm+j$garMk^aajRtT$;b(A&17O-pC+oFi5^r#o3)7OxP-1Cp;=VCma*r7THDFq7qT9sINuTDe4uCimr+7h#rZai$la5v0SVd zr--w}F0n`K6?cex#OuWS#ZxgLCOk$EqmD_6X^FWIGZu3*=6=i*2_a!hc1zxr9F?4v zT#`&kZc83Yo=QWc_0m>pmvpssqjabAp!AX~RK}AjWk#7pmM>c`8H^{~2cRDDf-NBv0sJT@ej6I&a5D)vI`SnSQ%`>{_ngvPBoqB*1SYsNLV zG!HaiYe_9j8>7`}t=cTDOY6~kwH?|X?KWXx3-2z>^Zl!LG zZkuk8ZbWxncTRUjcU^Z^_gEK*3ysT)+ZuN_zP2xZUHsYjOYsx&x8ols*b}xTj3ivq zv-Ea-qrOK!px>z9uRpFotG}SXqJOM^ZV(xA4K72K;YCB2p~tY-Fk(1rxN4X*JTg2t z(u_=Fk}<`YWh^t+8(WPX#$Mw_<8I?HzK$Eu8Lt?p5}k>)iJgffiKB^6lFE`=lllge zjwjtV(M&C-H%%8zUz??7r`c;hV}58UvrI>8w$3(g zXWE_i4*QV(ZZa>~m3$(3GWmImGNmWw&6Mk@tklNTqYmJxb+kA-9lehAjzPz0nlY_2 z?O58mw5#dN^p^Co^jqlGG&3vnT;|oxo0$)?L|Iu`-C5_d zZqCxpYRu+kcV{2WKAOYJ@#bvJIhFG?SCs3@-JN?bFC_19-mQFEeo=l`{&4=S{09Zn zg4G3Mh0?;!g=4ctv+c8cXP+%_?rzv#)F+By5@jLv!D61g0%9@jZn-`!$;@t)$V z#eot>iMM2^7}x$GHF?SS%2B)vb*K(@}BaM^2ZgPiaiw*6}KxMRy?gV zS5{SaR}NHet=v;NQhB2CeC0&t-6~Dh>Z;+YC)M(5PxZFyD{kPHyGz`??!E3|_YwD5 z_o(~2`*sac6I#QmvDReu)wpUrHQt)8nvFFFYmV34@z6XhkI19;7(FSTk-6%*d*@Ep z8f!nQW7d__6ZNk8f%?gLS@U}59iR7TzGwcM4WSK14M!S78{JJ&O({+NO=lK(7VKOw zu~5Eny%%^pyobHVy;r<%0$d%mw*k~B`$Dyr*gZ?GF z)2%0IS?B4R__&CO!9Yid&7PNRWT5}xOC_O1hAh3_n7;8h(Mv+hQ!Fo<0v~?!KlHqY z#Oh4|MGEw?S)dHmV&Tm^E{92>LmuA=P03o7O~F+`DMTKDgQvFE6*=IdXbFT*y-$fV zgMl_a7|@R`>eXiGGq=Ylj}s&EY@v^vO`#GGm9QcM9cvITJ@ z*_85KW>hQ5_WewfPEhQi2u;f3AVh)xau9PHP}7LgA!>{_ z<9ASeK9QM*Zp7!tRs40+{NbOy^t`@hLBvw5er%dxU7{VNc7u3e1|V8tmQv_Uh+GK? z6k=cr>PbjI@BAmv_hCXdJ*=JDO*VpLkO>M68lnzFy9Ndc&-2{LAu< zTYpZ0RjBPmEIM>K2L0-U9Eq;PqGu^;wCPHMuQ;`Z3KP*Wr0HoKpSVx3TvUa zQTst8hy(TL{!K+hG)D+dAWP3+hTDq?S9!}s!cP5g`(zcRmwY4 zZ@e)D%V7sBpHd}Nyz=_~19ST($G6uJb%WzK`sN-u@cJv2&(0o{rg#=_-o1ITCq>E< z2tq>8`Rv%Rl|TV3*vNJ%1x;ngQ)ew-Txvw>92GUnkh^FWD$dcNWjSji{vll{s0+%6 zw7EK@{DTRt&ea+uI&O$Qh1&ndRN$S!*1*4)2>m`+LzATD8XFcNGVefi5c^oT3Y(Km zc0wFSDkTk_&NC3*_2@yKCR3BhVaIW~ap~5y=DMnax8*T&_yUCzy9)$f;tcT+yNfgE zra>>IOL0WfR7#D_YPU?!psIWw(`lPsGrFz!aJgP(Rg2KZd>KpSl8VY~HS3$xtm#4a z=!1Nz??!$Z!Dyj!D35^&q$B%mIY+6+yqt8(_xzL^iX7D{C6vIuJ?Qn>VzgZ;3xli~ zr@^r5x3ljMYzfc>Js8?aezJv&r9vOObc`*Ky7&X{Nlz2{t4qs(^C}K{_cq;GhSbGc zpR3qH_Gy3>yS;Q~5y|IpIe@ALHkQK7*J!CKTdWZ#La3y%cxJoJstdgXk3?h zbMSmtdrP5#5_l50gRduqCdp`@9r$VxQk?w?B|O))X3f1dkTF2*h6IzN6TRTA)6RQ! z^Lx!q=7Ydff`By112{$Ir>^pLOLR19pyP62<>kx2=JO%tkPq)nR>7pfHe~c9;`{vR z`{v-?ch-|h^tFUou_eNS-W09iD%kjE!*^(QQf+KZ;whX?RZ1fb>yyBNErnjnKwuo| zpZ7q0V4QNV^wr8Vc@&9BJpF#)qu=aRiEYqDQp>h*nqjr0rm3h77k-vQu zDTvdgCdjGzUhmUWFZ_a2Pf)|6#2TxdXH1e3I$LVAn(6yVT^Jb_bTBr~jVdF7Mj8?* zjT^JjXAK&X$fz-+ZyRJ%>_~wQYB%K`C1kA>oi!r=hEy2Z4 z8)MNe8xt*Qq9a!m8@<*f^!>EyC|%YQ{~=nI^B-&c#IM2KeEi*RhlvSpV9Cql-{ho5B{#)|e|T!~0m2dvNyZGm{^zo~?3Jc$#aCgYV4YsS*-YVPRe} zGG3FY;C=H;8qb-UXIA=#+LkaWi69MyuhK9$Qi=t#v5+WZl|GzjDP2(v^~EbnEj-k{ zO3hu{{ZhG!GXMF0Q~68XYgga_4m;#Gyy%nmd;=LW5L9h2J*j(Rsh&*>a)hX~H;z>2 zl-tm&z47R+-Z5xIJ$(X5Mcezd^rXt>WiK>|(fK}2bk3{I^;JdX>Z0BK6)(S!T>*R8 z^S&iSWfTwq5GBXjC+J3s4JZk^LIZhG=BQ*Z>2mf@Y~4E1?(jzl zK?o%<)Vps%w(#hN_aHQ&;~QfM4S{ZKj3*dtP}n9lWeN&?)=htftTOB#)2sl&wDvK_|Cl_`cqPV|xRV?`nbs>fg13!s1KNx4YW7k(ykVztF9s zLz2x^bK}x-9HouE*LFXm8u$QP1T=uf;1#SxmRNby=0ktk%cXv2!H9hh+drF>XDwMto+`z*Trq9f(z#ns&YQD+ zwb$YBuHHUp-pMUq9x;idZ0=z{amF8>k{Ro^Ma^NeV%TDVB9>P>7om|_oFSkd zL!NP_dQd4hbLHWYBntmk95NizhT){}?Gw_4OFB&+i2Yw=NoD--U3BGbTgX3sD#4fftIaf_2;h1aH;p`%G`fl% z7lfNZqoXf;G4hn9ORKEbs-;T3b7ikngoces~<{#_NIv@!H=H~G#iGSKkG2Qi-29!JV>hCSF|?aE z?X$#8gF(}3m^h}T1V37(Rd6v{!PXXjlERYaEUzT03HVz5`jl#uJQR69$%|Ze{HKcq zM4q>`m9I7#1nBf9M)c(;127G>U6SIBZ@6TkQ3WC)Ms*i1X=u*2S;kO?Z|c$)kfH|h z=-Q|fWAA69>KsmUZlD8h_26=sw|<@%(h1kDYLM;|7H`4(Ma60iVuUzK2~2Ct@5*;y^yo6xnZ zX=L^4CNmOzD#1;G_0z?Wl7^dt{bOn@*u^minTNDmME_kXS@IK=3g!Rqlh7=H<7v7l zL&EU{+Pt?rs-vTkYdoDs*IP|&mT&9$E(mi_{Dcank26rsL?U{1JQSgc6e_=U=)_$# zKJiO>BX|LHgAJ(vGYfkfN^>#L3_@xN#QFQeXY+ZKP`T19&}GOX|3THZql{|{`P68m zS|U%>v#CE&%M}X}(Wz?|-=D5ELTVwX2Fp;{bvc`Y{fWqgTxJmB5L(=|{OEeQC{mNx z;;Q<^vN}GG#;;j)w0Y?I+PnyRt4N3*T`v$AohEU_bjyJ2v_>L`Nh?hiq_SA3^79mK zLU8wN9x25IYC5KERt#YFey$?rx!q;R|G8A$dg8z`?(;um+eLGi9XQeI_j>)^|NYUL zC;+xiu8qdk8n3jQ`LUZ1VR4Qc!1kv96Y!sn*@5C?XAFpv352#oc@Lh8?NC-GGVl%T{j#Qb$6HV z+6^j%E$HUW-O_*G0{901AcQn*-e|5AO(w*kU0-q)!p!Bb>@KK#>y?6--1$2X_vF;I z=H_YyFb8sL-+HNr%R!-EC}nJ&)2Ni1GUZZ>S#LJU*&?+v$(pPC@sXG~9g~SlzKF$V z#olkf!tLRypa=bbd_s#d?rdXfB>VJVW#F{AlnHnq**3xJL-m=;1v{Uj;xj^CS>K z_6$u0a+o$l(|`cB&(INy-EjL1%>-7<^uadf$-?rK&CIg_)4Fno=HmHnGc*s+p8*wM z5m*RXK@;f2&AJ?||KoYO3D|%Em{8??eW=N1Fd58AW-CC3`(kwWk1U_>{%*?-mlP`C ziuc>4@G<#*mkRC*-?1wR+Gpv35fHigt}4K6YwBvp(2oo%3m>@$wfa33B!XHD#Xji# dm-j_G0!dK#{z((ONOEq{;@g9-{_|P*-vKzPAgBNU diff --git a/media/baseset/OpenTTD-Small.ttf b/media/baseset/OpenTTD-Small.ttf index df0711e1aeed4406772c8cf58850532efda9e297..a1c08fd49e785efd4ef6a902128b83ddea502954 100644 GIT binary patch delta 2462 zcmbVOeM}VT9e!uOciEktnVp%PnVp&abXoSB*D=TGRwZT?q}720JuEw z&doReJR)q}b@uZUVvO4(6T0`>Kin}>d8iryd;)+B+q!*QdeuMwoH@}GY|bjAVF1iC z0H|K<+P1G#F$-=10M*EGj*e}+w%1+%{3`&Y#{k65ox6X#=Yua79szKB0RZ$5E23m! zek{rV%3Ss@P@rg(R$Dr`mB0f z{Z#!@qto!3b($8OGxVv3k0o)GiIQifEJFv*Z!vWnbFwvv0u17sgLK#r1^$Z>L-yiYzQ z7syvu#_F{S*0ipm=30k>19qb!_0YR zjJd_!V;(WjneUl5HiM0{xolxusjb>pZ%f&B+V_As70 zk7Tv@GgP6Yu%WQIu)T1!aMq{u;Xa42#@FEc$amRy(>LXNTx2K`iZ&H(EovWEfFcSgIT!_f!DWO2B- zx;RzbRXkKYS^QkUg|$Mvuutd_&Iwn9Z(>Ny7psf4$A)5)u_v+l*i!6`h>H#}C{~FL zVzbyT?h|{&G4Yo8qC_a!TGCrGT5_XgrerCO$G!2YcvHM1p4l7UAMcI#$Iryi$8W}` z;xqAQ@t5)Cgf4+6Jc(dJOjIRm5?d2H5}k>zL{H*qVj>BWrOD07p5)x>veg}{@2p-d zWlF0{50suOy}JfmQ@^Hf%~YA9Y*SfZ+2wMkTqxgBezN?2`RfW_MXF-BVzv^lj8-Nq z>nfWok7jS;AL>yYuwa$^4_gBXB!O#rg*4O3DKXkCeb;Iw%$_15nM&s#xf-T(F95Q~ z`Sr?oNWlL%jBtx#C<18$5aG5EF(EE`-Dx_R@-wU{t)#39V*#B`(-ynk0xhPJV%WR( z7nMRutyQ6zhK}bJmL|6EkWRN3Wj}ElAnEtNtjf}!iw3PM4#Htb`Yi0W>&zxkyz#M64vD0gE zyHV-uB%Xbh{K8s{$=SpR+)B#Y3rk`I47pw2lJy?k!bYL>(8lVwHYyrvFJ+3_Xu7QF z-SX_KOtwT}KXy3`P_CZ172{?OCY5Fyl?;b`6z=!H zvF)34zE4A`v>>DfyCrS0XX_6AP6f-o(y~&8F~SWiq%Zp-N|S4qq&X5)8X21;9&u;i zJ>pd%EbxF(?pTPJY?OQ|$4>Z^q!X8}pRn<;FG_{{WSKp%5#23U3bgotwfo%(T#@mC zZ&zBj-0Oh}^5?M{AW%~tYk(2@Pg@7TgnZ@>=Xn?~qL9Z3Fo|t>i~_BAFpmkD|7#wT zGJjjXt3WEfd=U`kA!F&IelD{KNO@ib7zoZ|HE=-5Jk|gT`b{32oP*HGJcfZ7Th3!d z*7J5AqW~5^$YVn0kL58b^VdN=Xam0ntza8?AEbdp;!jPgMfn&7=^v+pdNCw~gs30_ t>C;m->66LY~a2<0N0 zOKFS{m!l{_z$P3;2<0e>q9}?`oDvkFh$0kmS1v+aTIF(Snp7x_A{3#N-XTP3*VO&c zk3CB>`0BX<;vOrTsMePqhZ6kXD_1sl#^T^-^=%tD#dx`wxjRA_m(W82S5m!{Aq`8R)n=`BI8XgVIWAgS1yV zDxH$vl|GfehGEzUm%&YNA3OuUfVX6rjF%mf^~i3>=4C6gXR-}>wj7b03@^OwphiP)sS76>CbR(y6Rc9#ak~uPYaoFLTT}O*uU|BRPvXD>*wVuZma2 zRRc-YjA}PGm|LFPlRJ^Sn)^C;Tdh>1>RNS^`kZ=9y`bLKC^ZgEm8MqHrs>l3Y6dk| zG}D@S&1=mz0wXBGB2I)y8j)6{6X`()kTK*catpbKe2#1&J6gFG)0(wzZB!fA4r?d0 z*R?a+1?>avI%-56D2FEZqt$2~nn1_VYv^rs9$iKsp=;;{x}%fp%5*ildR?=wLw8Qs zue+gpp?jm-#grI%%T#SFjt{EVhWPU{A1@*d`8e6^`LCyb`a) zoA8tP8N3%C#K-Y#_-%Y1U&bHdYxoAflO*H>MwkgVQ9&Fd+K98nd19EDAg&WL!~*ev zcuc$?-VnQbv)-+b>Ra`l`V0C|{gi%MKc`>PKh$p+lm^0JHFyn$h6+R6&|w%hOc<^k zW(*642ZqNaOxBalWCwYU>?cRaN%AInm%LA|l26H3ulJKaSO(|74d^p24-MvdjhL&gSU zi*eX^*LdIfgpn{-hG#068m5)$V9qi^XLvonjZ*&)HS>8N1GInSe=UGMJnu-c)9)F}0f}P1B}T(@V3`%$h6BwdOPC zG4n0+lKGhhwiqnDrN+`^>9)*TURhCVjkUqrYVEZ4SO=_Q)=BG@&1tK$b=j`jmThZx zwVkq8+XcPOnI!Vr{CIw2erx_@{)z*3pbpki;fOoB9n+3E$D-qLfxN(9P*YG}&|EN4 zaJ%471=~)yGv;h^b~z?bSYujyf*SjycC*5=Ihwcpz z<|*_vc=|oFo)_M1FYj&jp7D-*@B56t%A~K+*XkSh&H7e+YksBQ=#TlE{b&4R{?z~) za0bc(^?}a7Xkb3@*B}xs3AO}J2fKq)!Rg@BkSb&kRfbwZqoMiGJHOGWCUnxej)SUou*kU~6M=TL@ zK<=fVor**5)VH>IC2SY7V6bq{Yh$!Jdt9N|ldDj~?HH1o25nXz&L8#}Ql#&kLLn+Z z)4E~d(V0Cx zd)qUF+tiTo=LYgi4YH;BR}Efb#!WE=>Ycs8IQ zZHA@53>9S<1_r1t!?~6*=yHbDfD8RA!-%NoP=>WY&7I9KF2;v5Oo;J05CSHzh8DM17T0V6Z8i;AbfF|7S3NrQtyn6g;MLE-PU4HVP~7D J{eP}V{|5KVgW>=H diff --git a/media/baseset/OpenTTD-font.md b/media/baseset/OpenTTD-font.md index 44fcb262f9..25115cca90 100644 --- a/media/baseset/OpenTTD-font.md +++ b/media/baseset/OpenTTD-font.md @@ -3,4 +3,4 @@ The OpenTTD TrueType font was created by Zephyris and is maintained on [Github](https://github.com/zephyris/openttd-ttf). It is licensed under GPL-2.0. -The currently included files correspond to release v0.4. +The currently included files correspond to release v0.5. From c77a45ed8681113f674fd4b7bce89062e528ad99 Mon Sep 17 00:00:00 2001 From: Rubidium Date: Sat, 3 Feb 2024 19:03:47 +0100 Subject: [PATCH 02/25] Codechange: use std::unique_ptr for receiving network packets --- src/network/core/tcp.cpp | 12 ++++-------- src/network/core/tcp.h | 4 ++-- src/network/core/tcp_admin.cpp | 5 ++--- src/network/core/tcp_content.cpp | 5 ++--- src/network/core/tcp_coordinator.cpp | 5 ++--- src/network/core/tcp_game.cpp | 5 ++--- src/network/core/tcp_turn.cpp | 5 ++--- src/network/network_server.cpp | 4 ++-- src/network/network_server.h | 2 +- 9 files changed, 19 insertions(+), 28 deletions(-) diff --git a/src/network/core/tcp.cpp b/src/network/core/tcp.cpp index 626f978b42..b792aa96f9 100644 --- a/src/network/core/tcp.cpp +++ b/src/network/core/tcp.cpp @@ -41,7 +41,6 @@ void NetworkTCPSocketHandler::EmptyPacketQueue() while (this->packet_queue != nullptr) { delete Packet::PopFromQueue(&this->packet_queue); } - delete this->packet_recv; this->packet_recv = nullptr; } @@ -141,17 +140,17 @@ SendPacketsState NetworkTCPSocketHandler::SendPackets(bool closing_down) * Receives a packet for the given client * @return The received packet (or nullptr when it didn't receive one) */ -Packet *NetworkTCPSocketHandler::ReceivePacket() +std::unique_ptr NetworkTCPSocketHandler::ReceivePacket() { ssize_t res; if (!this->IsConnected()) return nullptr; if (this->packet_recv == nullptr) { - this->packet_recv = new Packet(this, TCP_MTU); + this->packet_recv = std::make_unique(this, TCP_MTU); } - Packet *p = this->packet_recv; + Packet *p = this->packet_recv.get(); /* Read packet size */ if (!p->HasPacketSizeData()) { @@ -203,11 +202,8 @@ Packet *NetworkTCPSocketHandler::ReceivePacket() } } - /* Prepare for receiving a new packet */ - this->packet_recv = nullptr; - p->PrepareToRead(); - return p; + return std::move(this->packet_recv); } /** diff --git a/src/network/core/tcp.h b/src/network/core/tcp.h index caade125b0..e4b49b31cd 100644 --- a/src/network/core/tcp.h +++ b/src/network/core/tcp.h @@ -31,7 +31,7 @@ enum SendPacketsState { class NetworkTCPSocketHandler : public NetworkSocketHandler { private: Packet *packet_queue; ///< Packets that are awaiting delivery - Packet *packet_recv; ///< Partially received packet + std::unique_ptr packet_recv; ///< Partially received packet void EmptyPacketQueue(); public: @@ -50,7 +50,7 @@ public: virtual void SendPacket(Packet *packet); SendPacketsState SendPackets(bool closing_down = false); - virtual Packet *ReceivePacket(); + virtual std::unique_ptr ReceivePacket(); bool CanSendReceive(); diff --git a/src/network/core/tcp_admin.cpp b/src/network/core/tcp_admin.cpp index 895817cad3..fe1750482e 100644 --- a/src/network/core/tcp_admin.cpp +++ b/src/network/core/tcp_admin.cpp @@ -108,10 +108,9 @@ NetworkRecvStatus NetworkAdminSocketHandler::HandlePacket(Packet *p) */ NetworkRecvStatus NetworkAdminSocketHandler::ReceivePackets() { - Packet *p; + std::unique_ptr p; while ((p = this->ReceivePacket()) != nullptr) { - NetworkRecvStatus res = this->HandlePacket(p); - delete p; + NetworkRecvStatus res = this->HandlePacket(p.get()); if (res != NETWORK_RECV_STATUS_OKAY) return res; } diff --git a/src/network/core/tcp_content.cpp b/src/network/core/tcp_content.cpp index 11df443b86..199c70b11c 100644 --- a/src/network/core/tcp_content.cpp +++ b/src/network/core/tcp_content.cpp @@ -146,12 +146,11 @@ bool NetworkContentSocketHandler::ReceivePackets() * * What arbitrary number to choose is the ultimate question though. */ - Packet *p; + std::unique_ptr p; static const int MAX_PACKETS_TO_RECEIVE = 42; int i = MAX_PACKETS_TO_RECEIVE; while (--i != 0 && (p = this->ReceivePacket()) != nullptr) { - bool cont = this->HandlePacket(p); - delete p; + bool cont = this->HandlePacket(p.get()); if (!cont) return true; } diff --git a/src/network/core/tcp_coordinator.cpp b/src/network/core/tcp_coordinator.cpp index cffb36ab6d..70533657b8 100644 --- a/src/network/core/tcp_coordinator.cpp +++ b/src/network/core/tcp_coordinator.cpp @@ -64,12 +64,11 @@ bool NetworkCoordinatorSocketHandler::ReceivePackets() * * What arbitrary number to choose is the ultimate question though. */ - Packet *p; + std::unique_ptr p; static const int MAX_PACKETS_TO_RECEIVE = 42; int i = MAX_PACKETS_TO_RECEIVE; while (--i != 0 && (p = this->ReceivePacket()) != nullptr) { - bool cont = this->HandlePacket(p); - delete p; + bool cont = this->HandlePacket(p.get()); if (!cont) return true; } diff --git a/src/network/core/tcp_game.cpp b/src/network/core/tcp_game.cpp index 0f8051eef6..fc199c5d60 100644 --- a/src/network/core/tcp_game.cpp +++ b/src/network/core/tcp_game.cpp @@ -135,10 +135,9 @@ NetworkRecvStatus NetworkGameSocketHandler::HandlePacket(Packet *p) */ NetworkRecvStatus NetworkGameSocketHandler::ReceivePackets() { - Packet *p; + std::unique_ptr p; while ((p = this->ReceivePacket()) != nullptr) { - NetworkRecvStatus res = HandlePacket(p); - delete p; + NetworkRecvStatus res = HandlePacket(p.get()); if (res != NETWORK_RECV_STATUS_OKAY) return res; } diff --git a/src/network/core/tcp_turn.cpp b/src/network/core/tcp_turn.cpp index 76096aeb2b..0fc549aacd 100644 --- a/src/network/core/tcp_turn.cpp +++ b/src/network/core/tcp_turn.cpp @@ -43,12 +43,11 @@ bool NetworkTurnSocketHandler::HandlePacket(Packet *p) */ bool NetworkTurnSocketHandler::ReceivePackets() { - Packet *p; + std::unique_ptr p; static const int MAX_PACKETS_TO_RECEIVE = 4; int i = MAX_PACKETS_TO_RECEIVE; while (--i != 0 && (p = this->ReceivePacket()) != nullptr) { - bool cont = this->HandlePacket(p); - delete p; + bool cont = this->HandlePacket(p.get()); if (!cont) return true; } diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp index 1dda7dbcf4..7e8a11dffa 100644 --- a/src/network/network_server.cpp +++ b/src/network/network_server.cpp @@ -239,7 +239,7 @@ ServerNetworkGameSocketHandler::~ServerNetworkGameSocketHandler() } } -Packet *ServerNetworkGameSocketHandler::ReceivePacket() +std::unique_ptr ServerNetworkGameSocketHandler::ReceivePacket() { /* Only allow receiving when we have some buffer free; this value * can go negative, but eventually it will become positive again. */ @@ -247,7 +247,7 @@ Packet *ServerNetworkGameSocketHandler::ReceivePacket() /* We can receive a packet, so try that and if needed account for * the amount of received data. */ - Packet *p = this->NetworkTCPSocketHandler::ReceivePacket(); + std::unique_ptr p = this->NetworkTCPSocketHandler::ReceivePacket(); if (p != nullptr) this->receive_limit -= p->Size(); return p; } diff --git a/src/network/network_server.h b/src/network/network_server.h index 2ff1c9798f..973b30157e 100644 --- a/src/network/network_server.h +++ b/src/network/network_server.h @@ -75,7 +75,7 @@ public: ServerNetworkGameSocketHandler(SOCKET s); ~ServerNetworkGameSocketHandler(); - Packet *ReceivePacket() override; + std::unique_ptr ReceivePacket() override; NetworkRecvStatus CloseConnection(NetworkRecvStatus status) override; std::string GetClientName() const; From 36e1b32ccf47586eb3cc6eae90090548ca9d10f5 Mon Sep 17 00:00:00 2001 From: Rubidium Date: Sat, 3 Feb 2024 19:35:36 +0100 Subject: [PATCH 03/25] Codechange: use std::deque of std::unique_ptr to queue packets --- src/network/core/packet.cpp | 33 +++--------------- src/network/core/packet.h | 5 --- src/network/core/tcp.cpp | 28 ++++------------ src/network/core/tcp.h | 4 +-- src/network/network_server.cpp | 61 +++++++++++----------------------- 5 files changed, 32 insertions(+), 99 deletions(-) diff --git a/src/network/core/packet.cpp b/src/network/core/packet.cpp index 42de5c2653..d4cf165125 100644 --- a/src/network/core/packet.cpp +++ b/src/network/core/packet.cpp @@ -28,7 +28,7 @@ * loose some the data of the packet, so there you pass the maximum * size for the packet you expect from the network. */ -Packet::Packet(NetworkSocketHandler *cs, size_t limit, size_t initial_read_size) : next(nullptr), pos(0), limit(limit) +Packet::Packet(NetworkSocketHandler *cs, size_t limit, size_t initial_read_size) : pos(0), limit(limit) { assert(cs != nullptr); @@ -44,45 +44,20 @@ Packet::Packet(NetworkSocketHandler *cs, size_t limit, size_t initial_read_size) * the limit as it might break things if the other side is not expecting * much larger packets than what they support. */ -Packet::Packet(PacketType type, size_t limit) : next(nullptr), pos(0), limit(limit), cs(nullptr) +Packet::Packet(PacketType type, size_t limit) : pos(0), limit(limit), cs(nullptr) { /* Allocate space for the the size so we can write that in just before sending the packet. */ this->Send_uint16(0); this->Send_uint8(type); } -/** - * Add the given Packet to the end of the queue of packets. - * @param queue The pointer to the begin of the queue. - * @param packet The packet to append to the queue. - */ -/* static */ void Packet::AddToQueue(Packet **queue, Packet *packet) -{ - while (*queue != nullptr) queue = &(*queue)->next; - *queue = packet; -} - -/** - * Pop the packet from the begin of the queue and set the - * begin of the queue to the second element in the queue. - * @param queue The pointer to the begin of the queue. - * @return The Packet that used to be a the begin of the queue. - */ -/* static */ Packet *Packet::PopFromQueue(Packet **queue) -{ - Packet *p = *queue; - *queue = p->next; - p->next = nullptr; - return p; -} - /** * Writes the packet size from the raw packet from packet->size */ void Packet::PrepareToSend() { - assert(this->cs == nullptr && this->next == nullptr); + assert(this->cs == nullptr); this->buffer[0] = GB(this->Size(), 0, 8); this->buffer[1] = GB(this->Size(), 8, 8); @@ -268,7 +243,7 @@ size_t Packet::Size() const */ bool Packet::ParsePacketSize() { - assert(this->cs != nullptr && this->next == nullptr); + assert(this->cs != nullptr); size_t size = (size_t)this->buffer[0]; size += (size_t)this->buffer[1] << 8; diff --git a/src/network/core/packet.h b/src/network/core/packet.h index 8a1931e971..9cedfd63e1 100644 --- a/src/network/core/packet.h +++ b/src/network/core/packet.h @@ -41,8 +41,6 @@ typedef uint8_t PacketType; ///< Identifier for the packet */ struct Packet { private: - /** The next packet. Used for queueing packets before sending. */ - Packet *next; /** The current read/write position in the packet */ PacketSize pos; /** The buffer of this packet. */ @@ -57,9 +55,6 @@ public: Packet(NetworkSocketHandler *cs, size_t limit, size_t initial_read_size = sizeof(PacketSize)); Packet(PacketType type, size_t limit = COMPAT_MTU); - static void AddToQueue(Packet **queue, Packet *packet); - static Packet *PopFromQueue(Packet **queue); - /* Sending/writing of packets */ void PrepareToSend(); diff --git a/src/network/core/tcp.cpp b/src/network/core/tcp.cpp index b792aa96f9..2222f7be04 100644 --- a/src/network/core/tcp.cpp +++ b/src/network/core/tcp.cpp @@ -22,28 +22,15 @@ */ NetworkTCPSocketHandler::NetworkTCPSocketHandler(SOCKET s) : NetworkSocketHandler(), - packet_queue(nullptr), packet_recv(nullptr), sock(s), writable(false) { } NetworkTCPSocketHandler::~NetworkTCPSocketHandler() { - this->EmptyPacketQueue(); this->CloseSocket(); } -/** - * Free all pending and partially received packets. - */ -void NetworkTCPSocketHandler::EmptyPacketQueue() -{ - while (this->packet_queue != nullptr) { - delete Packet::PopFromQueue(&this->packet_queue); - } - this->packet_recv = nullptr; -} - /** * Close the actual socket of the connection. * Please make sure CloseConnection is called before CloseSocket, as @@ -66,7 +53,8 @@ NetworkRecvStatus NetworkTCPSocketHandler::CloseConnection([[maybe_unused]] bool this->MarkClosed(); this->writable = false; - this->EmptyPacketQueue(); + this->packet_queue.clear(); + this->packet_recv = nullptr; return NETWORK_RECV_STATUS_OKAY; } @@ -82,7 +70,7 @@ void NetworkTCPSocketHandler::SendPacket(Packet *packet) assert(packet != nullptr); packet->PrepareToSend(); - Packet::AddToQueue(&this->packet_queue, packet); + this->packet_queue.push_back(std::unique_ptr(packet)); } /** @@ -97,15 +85,13 @@ void NetworkTCPSocketHandler::SendPacket(Packet *packet) */ SendPacketsState NetworkTCPSocketHandler::SendPackets(bool closing_down) { - ssize_t res; - Packet *p; - /* We can not write to this socket!! */ if (!this->writable) return SPS_NONE_SENT; if (!this->IsConnected()) return SPS_CLOSED; - while ((p = this->packet_queue) != nullptr) { - res = p->TransferOut(send, this->sock, 0); + while (!this->packet_queue.empty()) { + Packet *p = this->packet_queue.front().get(); + ssize_t res = p->TransferOut(send, this->sock, 0); if (res == -1) { NetworkError err = NetworkError::GetLast(); if (!err.WouldBlock()) { @@ -127,7 +113,7 @@ SendPacketsState NetworkTCPSocketHandler::SendPackets(bool closing_down) /* Is this packet sent? */ if (p->RemainingBytesToTransfer() == 0) { /* Go to the next packet */ - delete Packet::PopFromQueue(&this->packet_queue); + this->packet_queue.pop_front(); } else { return SPS_PARTLY_SENT; } diff --git a/src/network/core/tcp.h b/src/network/core/tcp.h index e4b49b31cd..1d77711b94 100644 --- a/src/network/core/tcp.h +++ b/src/network/core/tcp.h @@ -30,7 +30,7 @@ enum SendPacketsState { /** Base socket handler for all TCP sockets */ class NetworkTCPSocketHandler : public NetworkSocketHandler { private: - Packet *packet_queue; ///< Packets that are awaiting delivery + std::deque> packet_queue; ///< Packets that are awaiting delivery. Cannot be std::queue as that does not have a clear() function. std::unique_ptr packet_recv; ///< Partially received packet void EmptyPacketQueue(); @@ -58,7 +58,7 @@ public: * Whether there is something pending in the send queue. * @return true when something is pending in the send queue. */ - bool HasSendQueue() { return this->packet_queue != nullptr; } + bool HasSendQueue() { return !this->packet_queue.empty(); } NetworkTCPSocketHandler(SOCKET s = INVALID_SOCKET); ~NetworkTCPSocketHandler(); diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp index 7e8a11dffa..946956e6ee 100644 --- a/src/network/network_server.cpp +++ b/src/network/network_server.cpp @@ -61,9 +61,9 @@ template SocketList TCPListenHandler current; ///< The packet we're currently writing to. size_t total_size; ///< Total size of the compressed savegame. - Packet *packets; ///< Packet queue of the savegame; send these "slowly" to the client. + std::deque> packets; ///< Packet queue of the savegame; send these "slowly" to the client. Cannot be a std::queue as we want to push the map size packet in front of the data packets. std::mutex mutex; ///< Mutex for making threaded saving safe. std::condition_variable exit_sig; ///< Signal for threaded destruction of this packet writer. @@ -71,7 +71,7 @@ struct PacketWriter : SaveFilter { * Create the packet writer. * @param cs The socket handler we're making the packets for. */ - PacketWriter(ServerNetworkGameSocketHandler *cs) : SaveFilter(nullptr), cs(cs), current(nullptr), total_size(0), packets(nullptr) + PacketWriter(ServerNetworkGameSocketHandler *cs) : SaveFilter(nullptr), cs(cs), total_size(0) { } @@ -84,11 +84,9 @@ struct PacketWriter : SaveFilter { /* This must all wait until the Destroy function is called. */ - while (this->packets != nullptr) { - delete Packet::PopFromQueue(&this->packets); - } - - delete this->current; + Debug(net, 0, "Destruct!"); + this->packets.clear(); + this->current = nullptr; } /** @@ -125,14 +123,14 @@ struct PacketWriter : SaveFilter { bool TransferToNetworkQueue(ServerNetworkGameSocketHandler *socket) { /* Unsafe check for the queue being empty or not. */ - if (this->packets == nullptr) return false; + if (this->packets.empty()) return false; std::lock_guard lock(this->mutex); - while (this->packets != nullptr) { - Packet *p = Packet::PopFromQueue(&this->packets); - bool last_packet = p->GetPacketType() == PACKET_SERVER_MAP_DONE; - socket->SendPacket(p); + while (!this->packets.empty()) { + bool last_packet = this->packets.front()->GetPacketType() == PACKET_SERVER_MAP_DONE; + socket->SendPacket(this->packets.front().release()); + this->packets.pop_front(); if (last_packet) return true; } @@ -140,32 +138,12 @@ struct PacketWriter : SaveFilter { return false; } - /** Append the current packet to the queue. */ - void AppendQueue() - { - if (this->current == nullptr) return; - - Packet::AddToQueue(&this->packets, this->current); - this->current = nullptr; - } - - /** Prepend the current packet to the queue. */ - void PrependQueue() - { - if (this->current == nullptr) return; - - /* Reversed from AppendQueue so the queue gets added to the current one. */ - Packet::AddToQueue(&this->current, this->packets); - this->packets = this->current; - this->current = nullptr; - } - void Write(byte *buf, size_t size) override { /* We want to abort the saving when the socket is closed. */ if (this->cs == nullptr) SlError(STR_NETWORK_ERROR_LOSTCONNECTION); - if (this->current == nullptr) this->current = new Packet(PACKET_SERVER_MAP_DATA, TCP_MTU); + if (this->current == nullptr) this->current = std::make_unique(PACKET_SERVER_MAP_DATA, TCP_MTU); std::lock_guard lock(this->mutex); @@ -175,8 +153,8 @@ struct PacketWriter : SaveFilter { buf += written; if (!this->current->CanWriteToPacket(1)) { - this->AppendQueue(); - if (buf != bufe) this->current = new Packet(PACKET_SERVER_MAP_DATA, TCP_MTU); + this->packets.push_back(std::move(this->current)); + if (buf != bufe) this->current = std::make_unique(PACKET_SERVER_MAP_DATA, TCP_MTU); } } @@ -191,16 +169,15 @@ struct PacketWriter : SaveFilter { std::lock_guard lock(this->mutex); /* Make sure the last packet is flushed. */ - this->AppendQueue(); + if (this->current != nullptr) this->packets.push_back(std::move(this->current)); /* Add a packet stating that this is the end to the queue. */ - this->current = new Packet(PACKET_SERVER_MAP_DONE); - this->AppendQueue(); + this->packets.push_back(std::make_unique(PACKET_SERVER_MAP_DONE)); /* Fast-track the size to the client. */ - this->current = new Packet(PACKET_SERVER_MAP_SIZE); - this->current->Send_uint32((uint32_t)this->total_size); - this->PrependQueue(); + auto p = std::make_unique(PACKET_SERVER_MAP_SIZE); + p->Send_uint32((uint32_t)this->total_size); + this->packets.push_front(std::move(p)); } }; From 031a9d4e264a22fc441b907df1db104c22c1c81b Mon Sep 17 00:00:00 2001 From: Rubidium Date: Sat, 3 Feb 2024 19:55:51 +0100 Subject: [PATCH 04/25] Codechange: use std::unique_ptr for the Packets created to send via TCP --- src/network/core/tcp.cpp | 4 +- src/network/core/tcp.h | 2 +- src/network/network_admin.cpp | 104 ++++++++++++++-------------- src/network/network_client.cpp | 63 +++++++++-------- src/network/network_content.cpp | 16 ++--- src/network/network_coordinator.cpp | 30 ++++---- src/network/network_query.cpp | 2 +- src/network/network_server.cpp | 104 +++++++++++++--------------- src/network/network_stun.cpp | 4 +- src/network/network_turn.cpp | 4 +- 10 files changed, 164 insertions(+), 169 deletions(-) diff --git a/src/network/core/tcp.cpp b/src/network/core/tcp.cpp index 2222f7be04..16259c64ce 100644 --- a/src/network/core/tcp.cpp +++ b/src/network/core/tcp.cpp @@ -65,12 +65,12 @@ NetworkRecvStatus NetworkTCPSocketHandler::CloseConnection([[maybe_unused]] bool * if the OS-network-buffer is full) * @param packet the packet to send */ -void NetworkTCPSocketHandler::SendPacket(Packet *packet) +void NetworkTCPSocketHandler::SendPacket(std::unique_ptr &&packet) { assert(packet != nullptr); packet->PrepareToSend(); - this->packet_queue.push_back(std::unique_ptr(packet)); + this->packet_queue.push_back(std::move(packet)); } /** diff --git a/src/network/core/tcp.h b/src/network/core/tcp.h index 1d77711b94..419a278587 100644 --- a/src/network/core/tcp.h +++ b/src/network/core/tcp.h @@ -47,7 +47,7 @@ public: virtual NetworkRecvStatus CloseConnection(bool error = true); void CloseSocket(); - virtual void SendPacket(Packet *packet); + virtual void SendPacket(std::unique_ptr &&packet); SendPacketsState SendPackets(bool closing_down = false); virtual std::unique_ptr ReceivePacket(); diff --git a/src/network/network_admin.cpp b/src/network/network_admin.cpp index 3df0182937..a5c5483bf2 100644 --- a/src/network/network_admin.cpp +++ b/src/network/network_admin.cpp @@ -134,10 +134,10 @@ ServerNetworkAdminSocketHandler::~ServerNetworkAdminSocketHandler() */ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendError(NetworkErrorCode error) { - Packet *p = new Packet(ADMIN_PACKET_SERVER_ERROR); + auto p = std::make_unique(ADMIN_PACKET_SERVER_ERROR); p->Send_uint8(error); - this->SendPacket(p); + this->SendPacket(std::move(p)); std::string error_message = GetString(GetNetworkErrorMsg(error)); @@ -149,7 +149,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendError(NetworkErrorCode er /** Send the protocol version to the admin. */ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendProtocol() { - Packet *p = new Packet(ADMIN_PACKET_SERVER_PROTOCOL); + auto p = std::make_unique(ADMIN_PACKET_SERVER_PROTOCOL); /* announce the protocol version */ p->Send_uint8(NETWORK_GAME_ADMIN_VERSION); @@ -161,7 +161,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendProtocol() } p->Send_bool(false); - this->SendPacket(p); + this->SendPacket(std::move(p)); return this->SendWelcome(); } @@ -169,7 +169,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendProtocol() /** Send a welcome message to the admin. */ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendWelcome() { - Packet *p = new Packet(ADMIN_PACKET_SERVER_WELCOME); + auto p = std::make_unique(ADMIN_PACKET_SERVER_WELCOME); p->Send_string(_settings_client.network.server_name); p->Send_string(GetNetworkRevisionString()); @@ -182,7 +182,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendWelcome() p->Send_uint16(Map::SizeX()); p->Send_uint16(Map::SizeY()); - this->SendPacket(p); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -190,26 +190,26 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendWelcome() /** Tell the admin we started a new game. */ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendNewGame() { - Packet *p = new Packet(ADMIN_PACKET_SERVER_NEWGAME); - this->SendPacket(p); + auto p = std::make_unique(ADMIN_PACKET_SERVER_NEWGAME); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } /** Tell the admin we're shutting down. */ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendShutdown() { - Packet *p = new Packet(ADMIN_PACKET_SERVER_SHUTDOWN); - this->SendPacket(p); + auto p = std::make_unique(ADMIN_PACKET_SERVER_SHUTDOWN); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } /** Tell the admin the date. */ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendDate() { - Packet *p = new Packet(ADMIN_PACKET_SERVER_DATE); + auto p = std::make_unique(ADMIN_PACKET_SERVER_DATE); p->Send_uint32(TimerGameCalendar::date.base()); - this->SendPacket(p); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -220,10 +220,10 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendDate() */ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendClientJoin(ClientID client_id) { - Packet *p = new Packet(ADMIN_PACKET_SERVER_CLIENT_JOIN); + auto p = std::make_unique(ADMIN_PACKET_SERVER_CLIENT_JOIN); p->Send_uint32(client_id); - this->SendPacket(p); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -238,7 +238,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendClientInfo(const NetworkC /* Only send data when we're a proper client, not just someone trying to query the server. */ if (ci == nullptr) return NETWORK_RECV_STATUS_OKAY; - Packet *p = new Packet(ADMIN_PACKET_SERVER_CLIENT_INFO); + auto p = std::make_unique(ADMIN_PACKET_SERVER_CLIENT_INFO); p->Send_uint32(ci->client_id); p->Send_string(cs == nullptr ? "" : const_cast(cs->client_address).GetHostname()); @@ -247,7 +247,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendClientInfo(const NetworkC p->Send_uint32(ci->join_date.base()); p->Send_uint8 (ci->client_playas); - this->SendPacket(p); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -259,13 +259,13 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendClientInfo(const NetworkC */ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendClientUpdate(const NetworkClientInfo *ci) { - Packet *p = new Packet(ADMIN_PACKET_SERVER_CLIENT_UPDATE); + auto p = std::make_unique(ADMIN_PACKET_SERVER_CLIENT_UPDATE); p->Send_uint32(ci->client_id); p->Send_string(ci->client_name); p->Send_uint8 (ci->client_playas); - this->SendPacket(p); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -276,10 +276,10 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendClientUpdate(const Networ */ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendClientQuit(ClientID client_id) { - Packet *p = new Packet(ADMIN_PACKET_SERVER_CLIENT_QUIT); + auto p = std::make_unique(ADMIN_PACKET_SERVER_CLIENT_QUIT); p->Send_uint32(client_id); - this->SendPacket(p); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -291,11 +291,11 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendClientQuit(ClientID clien */ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendClientError(ClientID client_id, NetworkErrorCode error) { - Packet *p = new Packet(ADMIN_PACKET_SERVER_CLIENT_ERROR); + auto p = std::make_unique(ADMIN_PACKET_SERVER_CLIENT_ERROR); p->Send_uint32(client_id); p->Send_uint8 (error); - this->SendPacket(p); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -306,10 +306,10 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendClientError(ClientID clie */ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyNew(CompanyID company_id) { - Packet *p = new Packet(ADMIN_PACKET_SERVER_COMPANY_NEW); + auto p = std::make_unique(ADMIN_PACKET_SERVER_COMPANY_NEW); p->Send_uint8(company_id); - this->SendPacket(p); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -320,7 +320,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyNew(CompanyID comp */ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyInfo(const Company *c) { - Packet *p = new Packet(ADMIN_PACKET_SERVER_COMPANY_INFO); + auto p = std::make_unique(ADMIN_PACKET_SERVER_COMPANY_INFO); p->Send_uint8 (c->index); SetDParam(0, c->index); @@ -333,7 +333,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyInfo(const Company p->Send_bool (c->is_ai); p->Send_uint8 (CeilDiv(c->months_of_bankruptcy, 3)); // send as quarters_of_bankruptcy - this->SendPacket(p); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -345,7 +345,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyInfo(const Company */ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyUpdate(const Company *c) { - Packet *p = new Packet(ADMIN_PACKET_SERVER_COMPANY_UPDATE); + auto p = std::make_unique(ADMIN_PACKET_SERVER_COMPANY_UPDATE); p->Send_uint8 (c->index); SetDParam(0, c->index); @@ -356,7 +356,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyUpdate(const Compa p->Send_bool (NetworkCompanyIsPassworded(c->index)); p->Send_uint8 (CeilDiv(c->months_of_bankruptcy, 3)); // send as quarters_of_bankruptcy - this->SendPacket(p); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -368,12 +368,12 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyUpdate(const Compa */ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyRemove(CompanyID company_id, AdminCompanyRemoveReason acrr) { - Packet *p = new Packet(ADMIN_PACKET_SERVER_COMPANY_REMOVE); + auto p = std::make_unique(ADMIN_PACKET_SERVER_COMPANY_REMOVE); p->Send_uint8(company_id); p->Send_uint8(acrr); - this->SendPacket(p); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -385,7 +385,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyEconomy() /* Get the income. */ Money income = -std::reduce(std::begin(company->yearly_expenses[0]), std::end(company->yearly_expenses[0])); - Packet *p = new Packet(ADMIN_PACKET_SERVER_COMPANY_ECONOMY); + auto p = std::make_unique(ADMIN_PACKET_SERVER_COMPANY_ECONOMY); p->Send_uint8(company->index); @@ -402,7 +402,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyEconomy() p->Send_uint16(static_cast(std::min(UINT16_MAX, company->old_economy[i].delivered_cargo.GetSum()))); } - this->SendPacket(p); + this->SendPacket(std::move(p)); } @@ -418,7 +418,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyStats() /* Go through all the companies. */ for (const Company *company : Company::Iterate()) { - Packet *p = new Packet(ADMIN_PACKET_SERVER_COMPANY_STATS); + auto p = std::make_unique(ADMIN_PACKET_SERVER_COMPANY_STATS); /* Send the information. */ p->Send_uint8(company->index); @@ -431,7 +431,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyStats() p->Send_uint16(company_stats[company->index].num_station[i]); } - this->SendPacket(p); + this->SendPacket(std::move(p)); } return NETWORK_RECV_STATUS_OKAY; @@ -447,7 +447,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyStats() */ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendChat(NetworkAction action, DestType desttype, ClientID client_id, const std::string &msg, int64_t data) { - Packet *p = new Packet(ADMIN_PACKET_SERVER_CHAT); + auto p = std::make_unique(ADMIN_PACKET_SERVER_CHAT); p->Send_uint8 (action); p->Send_uint8 (desttype); @@ -455,7 +455,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendChat(NetworkAction action p->Send_string(msg); p->Send_uint64(data); - this->SendPacket(p); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -465,10 +465,10 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendChat(NetworkAction action */ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendRconEnd(const std::string_view command) { - Packet *p = new Packet(ADMIN_PACKET_SERVER_RCON_END); + auto p = std::make_unique(ADMIN_PACKET_SERVER_RCON_END); p->Send_string(command); - this->SendPacket(p); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -480,11 +480,11 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendRconEnd(const std::string */ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendRcon(uint16_t colour, const std::string_view result) { - Packet *p = new Packet(ADMIN_PACKET_SERVER_RCON); + auto p = std::make_unique(ADMIN_PACKET_SERVER_RCON); p->Send_uint16(colour); p->Send_string(result); - this->SendPacket(p); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -539,11 +539,11 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendConsole(const std::string * smaller than COMPAT_MTU. */ if (origin.size() + string.size() + 2 + 3 >= COMPAT_MTU) return NETWORK_RECV_STATUS_OKAY; - Packet *p = new Packet(ADMIN_PACKET_SERVER_CONSOLE); + auto p = std::make_unique(ADMIN_PACKET_SERVER_CONSOLE); p->Send_string(origin); p->Send_string(string); - this->SendPacket(p); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -554,10 +554,10 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendConsole(const std::string */ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendGameScript(const std::string_view json) { - Packet *p = new Packet(ADMIN_PACKET_SERVER_GAMESCRIPT); + auto p = std::make_unique(ADMIN_PACKET_SERVER_GAMESCRIPT); p->Send_string(json); - this->SendPacket(p); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -565,10 +565,10 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendGameScript(const std::str /** Send ping-reply (pong) to admin **/ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendPong(uint32_t d1) { - Packet *p = new Packet(ADMIN_PACKET_SERVER_PONG); + auto p = std::make_unique(ADMIN_PACKET_SERVER_PONG); p->Send_uint32(d1); - this->SendPacket(p); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -576,7 +576,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendPong(uint32_t d1) /** Send the names of the commands. */ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCmdNames() { - Packet *p = new Packet(ADMIN_PACKET_SERVER_CMD_NAMES); + auto p = std::make_unique(ADMIN_PACKET_SERVER_CMD_NAMES); for (uint16_t i = 0; i < CMD_END; i++) { const char *cmdname = GetCommandName(static_cast(i)); @@ -586,9 +586,9 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCmdNames() * byte for string '\0' termination and 1 bool "no more data" */ if (!p->CanWriteToPacket(strlen(cmdname) + 5)) { p->Send_bool(false); - this->SendPacket(p); + this->SendPacket(std::move(p)); - p = new Packet(ADMIN_PACKET_SERVER_CMD_NAMES); + p = std::make_unique(ADMIN_PACKET_SERVER_CMD_NAMES); } p->Send_bool(true); @@ -598,7 +598,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCmdNames() /* Marker to notify the end of the packet has been reached. */ p->Send_bool(false); - this->SendPacket(p); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -610,7 +610,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCmdNames() */ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCmdLogging(ClientID client_id, const CommandPacket *cp) { - Packet *p = new Packet(ADMIN_PACKET_SERVER_CMD_LOGGING); + auto p = std::make_unique(ADMIN_PACKET_SERVER_CMD_LOGGING); p->Send_uint32(client_id); p->Send_uint8 (cp->company); @@ -618,7 +618,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCmdLogging(ClientID clien p->Send_buffer(cp->data); p->Send_uint32(cp->frame); - this->SendPacket(p); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } diff --git a/src/network/network_client.cpp b/src/network/network_client.cpp index 670b7db47a..b63b8ff4e3 100644 --- a/src/network/network_client.cpp +++ b/src/network/network_client.cpp @@ -331,7 +331,6 @@ static_assert(NETWORK_SERVER_ID_LENGTH == MD5_HASH_BYTES * 2 + 1); /*********** * Sending functions - * DEF_CLIENT_SEND_COMMAND has no parameters ************/ /** Tell the server we would like to join. */ @@ -345,13 +344,13 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendJoin() _network_join_status = NETWORK_JOIN_STATUS_AUTHORIZING; SetWindowDirty(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_JOIN); - Packet *p = new Packet(PACKET_CLIENT_JOIN); + auto p = std::make_unique(PACKET_CLIENT_JOIN); p->Send_string(GetNetworkRevisionString()); p->Send_uint32(_openttd_newgrf_version); p->Send_string(_settings_client.network.client_name); // Client name p->Send_uint8 (_network_join.company); // PlayAs p->Send_uint8 (0); // Used to be language - my_client->SendPacket(p); + my_client->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -360,8 +359,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendNewGRFsOk() { Debug(net, 9, "Client::SendNewGRFsOk()"); - Packet *p = new Packet(PACKET_CLIENT_NEWGRFS_CHECKED); - my_client->SendPacket(p); + auto p = std::make_unique(PACKET_CLIENT_NEWGRFS_CHECKED); + my_client->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -373,9 +372,9 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendGamePassword(const std::st { Debug(net, 9, "Client::SendGamePassword()"); - Packet *p = new Packet(PACKET_CLIENT_GAME_PASSWORD); + auto p = std::make_unique(PACKET_CLIENT_GAME_PASSWORD); p->Send_string(password); - my_client->SendPacket(p); + my_client->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -387,9 +386,9 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendCompanyPassword(const std: { Debug(net, 9, "Client::SendCompanyPassword()"); - Packet *p = new Packet(PACKET_CLIENT_COMPANY_PASSWORD); + auto p = std::make_unique(PACKET_CLIENT_COMPANY_PASSWORD); p->Send_string(GenerateCompanyPasswordHash(password, _password_server_id, _password_game_seed)); - my_client->SendPacket(p); + my_client->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -401,8 +400,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendGetMap() Debug(net, 9, "Client::status = MAP_WAIT"); my_client->status = STATUS_MAP_WAIT; - Packet *p = new Packet(PACKET_CLIENT_GETMAP); - my_client->SendPacket(p); + auto p = std::make_unique(PACKET_CLIENT_GETMAP); + my_client->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -414,8 +413,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendMapOk() Debug(net, 9, "Client::status = ACTIVE"); my_client->status = STATUS_ACTIVE; - Packet *p = new Packet(PACKET_CLIENT_MAP_OK); - my_client->SendPacket(p); + auto p = std::make_unique(PACKET_CLIENT_MAP_OK); + my_client->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -424,11 +423,11 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendAck() { Debug(net, 9, "Client::SendAck()"); - Packet *p = new Packet(PACKET_CLIENT_ACK); + auto p = std::make_unique(PACKET_CLIENT_ACK); p->Send_uint32(_frame_counter); p->Send_uint8 (my_client->token); - my_client->SendPacket(p); + my_client->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -440,10 +439,10 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendCommand(const CommandPacke { Debug(net, 9, "Client::SendCommand(): cmd={}", cp->cmd); - Packet *p = new Packet(PACKET_CLIENT_COMMAND); - my_client->NetworkGameSocketHandler::SendCommand(p, cp); + auto p = std::make_unique(PACKET_CLIENT_COMMAND); + my_client->NetworkGameSocketHandler::SendCommand(p.get(), cp); - my_client->SendPacket(p); + my_client->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -452,7 +451,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendChat(NetworkAction action, { Debug(net, 9, "Client::SendChat(): action={}, type={}, dest={}", action, type, dest); - Packet *p = new Packet(PACKET_CLIENT_CHAT); + auto p = std::make_unique(PACKET_CLIENT_CHAT); p->Send_uint8 (action); p->Send_uint8 (type); @@ -460,7 +459,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendChat(NetworkAction action, p->Send_string(msg); p->Send_uint64(data); - my_client->SendPacket(p); + my_client->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -469,10 +468,10 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendError(NetworkErrorCode err { Debug(net, 9, "Client::SendError(): errorno={}", errorno); - Packet *p = new Packet(PACKET_CLIENT_ERROR); + auto p = std::make_unique(PACKET_CLIENT_ERROR); p->Send_uint8(errorno); - my_client->SendPacket(p); + my_client->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -484,10 +483,10 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendSetPassword(const std::str { Debug(net, 9, "Client::SendSetPassword()"); - Packet *p = new Packet(PACKET_CLIENT_SET_PASSWORD); + auto p = std::make_unique(PACKET_CLIENT_SET_PASSWORD); p->Send_string(GenerateCompanyPasswordHash(password, _password_server_id, _password_game_seed)); - my_client->SendPacket(p); + my_client->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -499,10 +498,10 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendSetName(const std::string { Debug(net, 9, "Client::SendSetName()"); - Packet *p = new Packet(PACKET_CLIENT_SET_NAME); + auto p = std::make_unique(PACKET_CLIENT_SET_NAME); p->Send_string(name); - my_client->SendPacket(p); + my_client->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -513,9 +512,9 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendQuit() { Debug(net, 9, "Client::SendSetName()"); - Packet *p = new Packet(PACKET_CLIENT_QUIT); + auto p = std::make_unique(PACKET_CLIENT_QUIT); - my_client->SendPacket(p); + my_client->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -528,10 +527,10 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendRCon(const std::string &pa { Debug(net, 9, "Client::SendRCon()"); - Packet *p = new Packet(PACKET_CLIENT_RCON); + auto p = std::make_unique(PACKET_CLIENT_RCON); p->Send_string(pass); p->Send_string(command); - my_client->SendPacket(p); + my_client->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -544,10 +543,10 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendMove(CompanyID company, co { Debug(net, 9, "Client::SendMove(): company={}", company); - Packet *p = new Packet(PACKET_CLIENT_MOVE); + auto p = std::make_unique(PACKET_CLIENT_MOVE); p->Send_uint8(company); p->Send_string(GenerateCompanyPasswordHash(password, _password_server_id, _password_game_seed)); - my_client->SendPacket(p); + my_client->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } diff --git a/src/network/network_content.cpp b/src/network/network_content.cpp index e4a8ea8675..a6fd8ad7c4 100644 --- a/src/network/network_content.cpp +++ b/src/network/network_content.cpp @@ -204,7 +204,7 @@ void ClientNetworkContentSocketHandler::RequestContentList(ContentType type) this->Connect(); - Packet *p = new Packet(PACKET_CONTENT_CLIENT_INFO_LIST); + auto p = std::make_unique(PACKET_CONTENT_CLIENT_INFO_LIST); p->Send_uint8 ((byte)type); p->Send_uint32(0xffffffff); p->Send_uint8 (1); @@ -221,7 +221,7 @@ void ClientNetworkContentSocketHandler::RequestContentList(ContentType type) */ - this->SendPacket(p); + this->SendPacket(std::move(p)); } /** @@ -240,14 +240,14 @@ void ClientNetworkContentSocketHandler::RequestContentList(uint count, const Con * The rest of the packet can be used for the IDs. */ uint p_count = std::min(count, (TCP_MTU - sizeof(PacketSize) - sizeof(byte) - sizeof(uint16_t)) / sizeof(uint32_t)); - Packet *p = new Packet(PACKET_CONTENT_CLIENT_INFO_ID, TCP_MTU); + auto p = std::make_unique(PACKET_CONTENT_CLIENT_INFO_ID, TCP_MTU); p->Send_uint16(p_count); for (uint i = 0; i < p_count; i++) { p->Send_uint32(content_ids[i]); } - this->SendPacket(p); + this->SendPacket(std::move(p)); count -= p_count; content_ids += p_count; } @@ -268,7 +268,7 @@ void ClientNetworkContentSocketHandler::RequestContentList(ContentVector *cv, bo assert(cv->size() < (TCP_MTU - sizeof(PacketSize) - sizeof(byte) - sizeof(uint8_t)) / (sizeof(uint8_t) + sizeof(uint32_t) + (send_md5sum ? MD5_HASH_BYTES : 0))); - Packet *p = new Packet(send_md5sum ? PACKET_CONTENT_CLIENT_INFO_EXTID_MD5 : PACKET_CONTENT_CLIENT_INFO_EXTID, TCP_MTU); + auto p = std::make_unique(send_md5sum ? PACKET_CONTENT_CLIENT_INFO_EXTID_MD5 : PACKET_CONTENT_CLIENT_INFO_EXTID, TCP_MTU); p->Send_uint8((uint8_t)cv->size()); for (const ContentInfo *ci : *cv) { @@ -281,7 +281,7 @@ void ClientNetworkContentSocketHandler::RequestContentList(ContentVector *cv, bo } } - this->SendPacket(p); + this->SendPacket(std::move(p)); for (ContentInfo *ci : *cv) { bool found = false; @@ -365,14 +365,14 @@ void ClientNetworkContentSocketHandler::DownloadSelectedContentFallback(const Co * The rest of the packet can be used for the IDs. */ uint p_count = std::min(count, (TCP_MTU - sizeof(PacketSize) - sizeof(byte) - sizeof(uint16_t)) / sizeof(uint32_t)); - Packet *p = new Packet(PACKET_CONTENT_CLIENT_CONTENT, TCP_MTU); + auto p = std::make_unique(PACKET_CONTENT_CLIENT_CONTENT, TCP_MTU); p->Send_uint16(p_count); for (uint i = 0; i < p_count; i++) { p->Send_uint32(content_ids[i]); } - this->SendPacket(p); + this->SendPacket(std::move(p)); count -= p_count; content_ids += p_count; } diff --git a/src/network/network_coordinator.cpp b/src/network/network_coordinator.cpp index b049376cc9..6ea5ec8e05 100644 --- a/src/network/network_coordinator.cpp +++ b/src/network/network_coordinator.cpp @@ -458,7 +458,7 @@ void ClientNetworkCoordinatorSocketHandler::Register() this->Connect(); - Packet *p = new Packet(PACKET_COORDINATOR_SERVER_REGISTER); + auto p = std::make_unique(PACKET_COORDINATOR_SERVER_REGISTER); p->Send_uint8(NETWORK_COORDINATOR_VERSION); p->Send_uint8(_settings_client.network.server_game_type); p->Send_uint16(_settings_client.network.server_port); @@ -470,7 +470,7 @@ void ClientNetworkCoordinatorSocketHandler::Register() p->Send_string(_settings_client.network.server_invite_code_secret); } - this->SendPacket(p); + this->SendPacket(std::move(p)); } /** @@ -480,11 +480,11 @@ void ClientNetworkCoordinatorSocketHandler::SendServerUpdate() { Debug(net, 6, "Sending server update to Game Coordinator"); - Packet *p = new Packet(PACKET_COORDINATOR_SERVER_UPDATE, TCP_MTU); + auto p = std::make_unique(PACKET_COORDINATOR_SERVER_UPDATE, TCP_MTU); p->Send_uint8(NETWORK_COORDINATOR_VERSION); - SerializeNetworkGameInfo(p, GetCurrentNetworkServerGameInfo(), this->next_update.time_since_epoch() != std::chrono::nanoseconds::zero()); + SerializeNetworkGameInfo(p.get(), GetCurrentNetworkServerGameInfo(), this->next_update.time_since_epoch() != std::chrono::nanoseconds::zero()); - this->SendPacket(p); + this->SendPacket(std::move(p)); this->next_update = std::chrono::steady_clock::now() + NETWORK_COORDINATOR_DELAY_BETWEEN_UPDATES; } @@ -498,13 +498,13 @@ void ClientNetworkCoordinatorSocketHandler::GetListing() _network_game_list_version++; - Packet *p = new Packet(PACKET_COORDINATOR_CLIENT_LISTING); + auto p = std::make_unique(PACKET_COORDINATOR_CLIENT_LISTING); p->Send_uint8(NETWORK_COORDINATOR_VERSION); p->Send_uint8(NETWORK_GAME_INFO_VERSION); p->Send_string(_openttd_revision); p->Send_uint32(this->newgrf_lookup_table_cursor); - this->SendPacket(p); + this->SendPacket(std::move(p)); } /** @@ -530,11 +530,11 @@ void ClientNetworkCoordinatorSocketHandler::ConnectToServer(const std::string &i this->Connect(); - Packet *p = new Packet(PACKET_COORDINATOR_CLIENT_CONNECT); + auto p = std::make_unique(PACKET_COORDINATOR_CLIENT_CONNECT); p->Send_uint8(NETWORK_COORDINATOR_VERSION); p->Send_string(invite_code); - this->SendPacket(p); + this->SendPacket(std::move(p)); } /** @@ -547,12 +547,12 @@ void ClientNetworkCoordinatorSocketHandler::ConnectFailure(const std::string &to /* Connecter will destroy itself. */ this->game_connecter = nullptr; - Packet *p = new Packet(PACKET_COORDINATOR_SERCLI_CONNECT_FAILED); + auto p = std::make_unique(PACKET_COORDINATOR_SERCLI_CONNECT_FAILED); p->Send_uint8(NETWORK_COORDINATOR_VERSION); p->Send_string(token); p->Send_uint8(tracking_number); - this->SendPacket(p); + this->SendPacket(std::move(p)); /* We do not close the associated connecter here yet, as the * Game Coordinator might have other methods of connecting available. */ @@ -578,10 +578,10 @@ void ClientNetworkCoordinatorSocketHandler::ConnectSuccess(const std::string &to } else { /* The client informs the Game Coordinator about the success. The server * doesn't have to, as it is implied by the client telling. */ - Packet *p = new Packet(PACKET_COORDINATOR_CLIENT_CONNECTED); + auto p = std::make_unique(PACKET_COORDINATOR_CLIENT_CONNECTED); p->Send_uint8(NETWORK_COORDINATOR_VERSION); p->Send_string(token); - this->SendPacket(p); + this->SendPacket(std::move(p)); /* Find the connecter; it can happen it no longer exist, in cases where * we aborted the connect but the Game Coordinator was already in the @@ -606,12 +606,12 @@ void ClientNetworkCoordinatorSocketHandler::ConnectSuccess(const std::string &to */ void ClientNetworkCoordinatorSocketHandler::StunResult(const std::string &token, uint8_t family, bool result) { - Packet *p = new Packet(PACKET_COORDINATOR_SERCLI_STUN_RESULT); + auto p = std::make_unique(PACKET_COORDINATOR_SERCLI_STUN_RESULT); p->Send_uint8(NETWORK_COORDINATOR_VERSION); p->Send_string(token); p->Send_uint8(family); p->Send_bool(result); - this->SendPacket(p); + this->SendPacket(std::move(p)); } /** diff --git a/src/network/network_query.cpp b/src/network/network_query.cpp index 0fb128b610..9b0e57b982 100644 --- a/src/network/network_query.cpp +++ b/src/network/network_query.cpp @@ -83,7 +83,7 @@ NetworkRecvStatus QueryNetworkGameSocketHandler::SendGameInfo() { Debug(net, 9, "Query::SendGameInfo()"); - this->SendPacket(new Packet(PACKET_CLIENT_GAME_INFO)); + this->SendPacket(std::make_unique(PACKET_CLIENT_GAME_INFO)); return NETWORK_RECV_STATUS_OKAY; } diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp index 946956e6ee..001e0a7b7c 100644 --- a/src/network/network_server.cpp +++ b/src/network/network_server.cpp @@ -129,7 +129,7 @@ struct PacketWriter : SaveFilter { while (!this->packets.empty()) { bool last_packet = this->packets.front()->GetPacketType() == PACKET_SERVER_MAP_DONE; - socket->SendPacket(this->packets.front().release()); + socket->SendPacket(std::move(this->packets.front())); this->packets.pop_front(); if (last_packet) return true; @@ -315,7 +315,6 @@ static void NetworkHandleCommandQueue(NetworkClientSocket *cs); /*********** * Sending functions - * DEF_SERVER_SEND_COMMAND has parameter: NetworkClientSocket *cs ************/ /** @@ -327,12 +326,12 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendClientInfo(NetworkClientIn Debug(net, 9, "client[{}] SendClientInfo(): client_id={}", this->client_id, ci->client_id); if (ci->client_id != INVALID_CLIENT_ID) { - Packet *p = new Packet(PACKET_SERVER_CLIENT_INFO); + auto p = std::make_unique(PACKET_SERVER_CLIENT_INFO); p->Send_uint32(ci->client_id); p->Send_uint8 (ci->client_playas); p->Send_string(ci->client_name); - this->SendPacket(p); + this->SendPacket(std::move(p)); } return NETWORK_RECV_STATUS_OKAY; } @@ -342,10 +341,10 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendGameInfo() { Debug(net, 9, "client[{}] SendGameInfo()", this->client_id); - Packet *p = new Packet(PACKET_SERVER_GAME_INFO, TCP_MTU); - SerializeNetworkGameInfo(p, GetCurrentNetworkServerGameInfo()); + auto p = std::make_unique(PACKET_SERVER_GAME_INFO, TCP_MTU); + SerializeNetworkGameInfo(p.get(), GetCurrentNetworkServerGameInfo()); - this->SendPacket(p); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -359,11 +358,11 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendError(NetworkErrorCode err { Debug(net, 9, "client[{}] SendError(): error={}", this->client_id, error); - Packet *p = new Packet(PACKET_SERVER_ERROR); + auto p = std::make_unique(PACKET_SERVER_ERROR); p->Send_uint8(error); if (!reason.empty()) p->Send_string(reason); - this->SendPacket(p); + this->SendPacket(std::move(p)); StringID strid = GetNetworkErrorMsg(error); @@ -404,7 +403,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendNewGRFCheck() { Debug(net, 9, "client[{}] SendNewGRFCheck()", this->client_id); - Packet *p = new Packet(PACKET_SERVER_CHECK_NEWGRFS, TCP_MTU); + auto p = std::make_unique(PACKET_SERVER_CHECK_NEWGRFS, TCP_MTU); const GRFConfig *c; uint grf_count = 0; @@ -414,10 +413,10 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendNewGRFCheck() p->Send_uint8 (grf_count); for (c = _grfconfig; c != nullptr; c = c->next) { - if (!HasBit(c->flags, GCF_STATIC)) SerializeGRFIdentifier(p, &c->ident); + if (!HasBit(c->flags, GCF_STATIC)) SerializeGRFIdentifier(p.get(), &c->ident); } - this->SendPacket(p); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -434,8 +433,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendNeedGamePassword() /* Reset 'lag' counters */ this->last_frame = this->last_frame_server = _frame_counter; - Packet *p = new Packet(PACKET_SERVER_NEED_GAME_PASSWORD); - this->SendPacket(p); + auto p = std::make_unique(PACKET_SERVER_NEED_GAME_PASSWORD); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -452,10 +451,10 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendNeedCompanyPassword() /* Reset 'lag' counters */ this->last_frame = this->last_frame_server = _frame_counter; - Packet *p = new Packet(PACKET_SERVER_NEED_COMPANY_PASSWORD); + auto p = std::make_unique(PACKET_SERVER_NEED_COMPANY_PASSWORD); p->Send_uint32(_settings_game.game_creation.generation_seed); p->Send_string(_settings_client.network.network_id); - this->SendPacket(p); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -464,8 +463,6 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendWelcome() { Debug(net, 9, "client[{}] SendWelcome()", this->client_id); - Packet *p; - /* Invalid packet when status is AUTH or higher */ if (this->status >= STATUS_AUTHORIZED) return this->CloseConnection(NETWORK_RECV_STATUS_MALFORMED_PACKET); @@ -476,11 +473,11 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendWelcome() _network_game_info.clients_on++; - p = new Packet(PACKET_SERVER_WELCOME); + auto p = std::make_unique(PACKET_SERVER_WELCOME); p->Send_uint32(this->client_id); p->Send_uint32(_settings_game.game_creation.generation_seed); p->Send_string(_settings_client.network.network_id); - this->SendPacket(p); + this->SendPacket(std::move(p)); /* Transmit info about all the active clients */ for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) { @@ -498,7 +495,6 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendWait() Debug(net, 9, "client[{}] SendWait()", this->client_id); int waiting = 1; // current player getting the map counts as 1 - Packet *p; /* Count how many clients are waiting in the queue, in front of you! */ for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) { @@ -506,9 +502,9 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendWait() if (new_cs->GetInfo()->join_date < this->GetInfo()->join_date || (new_cs->GetInfo()->join_date == this->GetInfo()->join_date && new_cs->client_id < this->client_id)) waiting++; } - p = new Packet(PACKET_SERVER_WAIT); + auto p = std::make_unique(PACKET_SERVER_WAIT); p->Send_uint8(waiting); - this->SendPacket(p); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -556,9 +552,9 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendMap() this->savegame = std::make_shared(this); /* Now send the _frame_counter and how many packets are coming */ - Packet *p = new Packet(PACKET_SERVER_MAP_BEGIN); + auto p = std::make_unique(PACKET_SERVER_MAP_BEGIN); p->Send_uint32(_frame_counter); - this->SendPacket(p); + this->SendPacket(std::move(p)); NetworkSyncCommandQueue(this); Debug(net, 9, "client[{}] status = MAP", this->client_id); @@ -599,18 +595,18 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendJoin(ClientID client_id) { Debug(net, 9, "client[{}] SendJoin(): client_id={}", this->client_id, client_id); - Packet *p = new Packet(PACKET_SERVER_JOIN); + auto p = std::make_unique(PACKET_SERVER_JOIN); p->Send_uint32(client_id); - this->SendPacket(p); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } /** Tell the client that they may run to a particular frame. */ NetworkRecvStatus ServerNetworkGameSocketHandler::SendFrame() { - Packet *p = new Packet(PACKET_SERVER_FRAME); + auto p = std::make_unique(PACKET_SERVER_FRAME); p->Send_uint32(_frame_counter); p->Send_uint32(_frame_counter_max); #ifdef ENABLE_NETWORK_SYNC_EVERY_FRAME @@ -626,7 +622,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendFrame() p->Send_uint8(this->last_token); } - this->SendPacket(p); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -635,14 +631,14 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendSync() { Debug(net, 9, "client[{}] SendSync(), frame_counter={}, sync_seed_1={}", this->client_id, _frame_counter, _sync_seed_1); - Packet *p = new Packet(PACKET_SERVER_SYNC); + auto p = std::make_unique(PACKET_SERVER_SYNC); p->Send_uint32(_frame_counter); p->Send_uint32(_sync_seed_1); #ifdef NETWORK_SEND_DOUBLE_SEED p->Send_uint32(_sync_seed_2); #endif - this->SendPacket(p); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -654,13 +650,13 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendCommand(const CommandPacke { Debug(net, 9, "client[{}] SendCommand(): cmd={}", this->client_id, cp->cmd); - Packet *p = new Packet(PACKET_SERVER_COMMAND); + auto p = std::make_unique(PACKET_SERVER_COMMAND); - this->NetworkGameSocketHandler::SendCommand(p, cp); + this->NetworkGameSocketHandler::SendCommand(p.get(), cp); p->Send_uint32(cp->frame); p->Send_bool (cp->my_cmd); - this->SendPacket(p); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -678,7 +674,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendChat(NetworkAction action, if (this->status < STATUS_PRE_ACTIVE) return NETWORK_RECV_STATUS_OKAY; - Packet *p = new Packet(PACKET_SERVER_CHAT); + auto p = std::make_unique(PACKET_SERVER_CHAT); p->Send_uint8 (action); p->Send_uint32(client_id); @@ -686,7 +682,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendChat(NetworkAction action, p->Send_string(msg); p->Send_uint64(data); - this->SendPacket(p); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -703,14 +699,14 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendExternalChat(const std::st if (this->status < STATUS_PRE_ACTIVE) return NETWORK_RECV_STATUS_OKAY; - Packet *p = new Packet(PACKET_SERVER_EXTERNAL_CHAT); + auto p = std::make_unique(PACKET_SERVER_EXTERNAL_CHAT); p->Send_string(source); p->Send_uint16(colour); p->Send_string(user); p->Send_string(msg); - this->SendPacket(p); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -723,12 +719,12 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendErrorQuit(ClientID client_ { Debug(net, 9, "client[{}] SendErrorQuit(): client_id={}, errorno={}", this->client_id, client_id, errorno); - Packet *p = new Packet(PACKET_SERVER_ERROR_QUIT); + auto p = std::make_unique(PACKET_SERVER_ERROR_QUIT); p->Send_uint32(client_id); p->Send_uint8 (errorno); - this->SendPacket(p); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -740,11 +736,11 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendQuit(ClientID client_id) { Debug(net, 9, "client[{}] SendQuit(): client_id={}", this->client_id, client_id); - Packet *p = new Packet(PACKET_SERVER_QUIT); + auto p = std::make_unique(PACKET_SERVER_QUIT); p->Send_uint32(client_id); - this->SendPacket(p); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -753,8 +749,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendShutdown() { Debug(net, 9, "client[{}] SendShutdown()", this->client_id); - Packet *p = new Packet(PACKET_SERVER_SHUTDOWN); - this->SendPacket(p); + auto p = std::make_unique(PACKET_SERVER_SHUTDOWN); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -763,8 +759,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendNewGame() { Debug(net, 9, "client[{}] SendNewGame()", this->client_id); - Packet *p = new Packet(PACKET_SERVER_NEWGAME); - this->SendPacket(p); + auto p = std::make_unique(PACKET_SERVER_NEWGAME); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -777,11 +773,11 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendRConResult(uint16_t colour { Debug(net, 9, "client[{}] SendRConResult()", this->client_id); - Packet *p = new Packet(PACKET_SERVER_RCON); + auto p = std::make_unique(PACKET_SERVER_RCON); p->Send_uint16(colour); p->Send_string(command); - this->SendPacket(p); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -794,11 +790,11 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendMove(ClientID client_id, C { Debug(net, 9, "client[{}] SendMove(): client_id={}", this->client_id, client_id); - Packet *p = new Packet(PACKET_SERVER_MOVE); + auto p = std::make_unique(PACKET_SERVER_MOVE); p->Send_uint32(client_id); p->Send_uint8(company_id); - this->SendPacket(p); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -807,11 +803,11 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendCompanyUpdate() { Debug(net, 9, "client[{}] SendCompanyUpdate()", this->client_id); - Packet *p = new Packet(PACKET_SERVER_COMPANY_UPDATE); + auto p = std::make_unique(PACKET_SERVER_COMPANY_UPDATE); static_assert(sizeof(_network_company_passworded) <= sizeof(uint16_t)); p->Send_uint16(_network_company_passworded); - this->SendPacket(p); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -820,11 +816,11 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendConfigUpdate() { Debug(net, 9, "client[{}] SendConfigUpdate()", this->client_id); - Packet *p = new Packet(PACKET_SERVER_CONFIG_UPDATE); + auto p = std::make_unique(PACKET_SERVER_CONFIG_UPDATE); p->Send_uint8(_settings_client.network.max_companies); p->Send_string(_settings_client.network.server_name); - this->SendPacket(p); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } diff --git a/src/network/network_stun.cpp b/src/network/network_stun.cpp index dd394c669b..c606ff0c83 100644 --- a/src/network/network_stun.cpp +++ b/src/network/network_stun.cpp @@ -92,12 +92,12 @@ std::unique_ptr ClientNetworkStunSocketHandler:: stun_handler->Connect(token, family); - Packet *p = new Packet(PACKET_STUN_SERCLI_STUN); + auto p = std::make_unique(PACKET_STUN_SERCLI_STUN); p->Send_uint8(NETWORK_COORDINATOR_VERSION); p->Send_string(token); p->Send_uint8(family); - stun_handler->SendPacket(p); + stun_handler->SendPacket(std::move(p)); return stun_handler; } diff --git a/src/network/network_turn.cpp b/src/network/network_turn.cpp index 7a9bd43fc5..83b1afdd28 100644 --- a/src/network/network_turn.cpp +++ b/src/network/network_turn.cpp @@ -100,11 +100,11 @@ void ClientNetworkTurnSocketHandler::Connect() { auto turn_handler = std::make_unique(token, tracking_number, connection_string); - Packet *p = new Packet(PACKET_TURN_SERCLI_CONNECT); + auto p = std::make_unique(PACKET_TURN_SERCLI_CONNECT); p->Send_uint8(NETWORK_COORDINATOR_VERSION); p->Send_string(ticket); - turn_handler->SendPacket(p); + turn_handler->SendPacket(std::move(p)); return turn_handler; } From 84623d212399cf3f374250da2314a9075a4073f3 Mon Sep 17 00:00:00 2001 From: Rubidium Date: Sat, 3 Feb 2024 19:43:38 +0100 Subject: [PATCH 05/25] Codechange: use references for UDP packets --- src/network/core/udp.cpp | 26 +++++++++++++------------- src/network/core/udp.h | 10 +++++----- src/network/network_udp.cpp | 18 +++++++++--------- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/network/core/udp.cpp b/src/network/core/udp.cpp index 2efb14e1dd..04324e0098 100644 --- a/src/network/core/udp.cpp +++ b/src/network/core/udp.cpp @@ -71,19 +71,19 @@ void NetworkUDPSocketHandler::CloseSocket() * @param all send the packet using all sockets that can send it * @param broadcast whether to send a broadcast message */ -void NetworkUDPSocketHandler::SendPacket(Packet *p, NetworkAddress *recv, bool all, bool broadcast) +void NetworkUDPSocketHandler::SendPacket(Packet &p, NetworkAddress &recv, bool all, bool broadcast) { if (this->sockets.empty()) this->Listen(); for (auto &s : this->sockets) { /* Make a local copy because if we resolve it we cannot * easily unresolve it so we can resolve it later again. */ - NetworkAddress send(*recv); + NetworkAddress send(recv); /* Not the same type */ if (!send.IsFamily(s.second.GetAddress()->ss_family)) continue; - p->PrepareToSend(); + p.PrepareToSend(); if (broadcast) { /* Enable broadcast */ @@ -94,7 +94,7 @@ void NetworkUDPSocketHandler::SendPacket(Packet *p, NetworkAddress *recv, bool a } /* Send the buffer */ - ssize_t res = p->TransferOut(sendto, s.first, 0, (const struct sockaddr *)send.GetAddress(), send.GetAddressLength()); + ssize_t res = p.TransferOut(sendto, s.first, 0, (const struct sockaddr *)send.GetAddress(), send.GetAddressLength()); Debug(net, 7, "sendto({})", send.GetAddressAsString()); /* Check for any errors, but ignore it otherwise */ @@ -140,7 +140,7 @@ void NetworkUDPSocketHandler::ReceivePackets() p.PrepareToRead(); /* Handle the packet */ - this->HandleUDPPacket(&p, &address); + this->HandleUDPPacket(p, address); } } } @@ -150,14 +150,14 @@ void NetworkUDPSocketHandler::ReceivePackets() * @param p the received packet * @param client_addr the sender of the packet */ -void NetworkUDPSocketHandler::HandleUDPPacket(Packet *p, NetworkAddress *client_addr) +void NetworkUDPSocketHandler::HandleUDPPacket(Packet &p, NetworkAddress &client_addr) { PacketUDPType type; /* New packet == new client, which has not quit yet */ this->Reopen(); - type = (PacketUDPType)p->Recv_uint8(); + type = (PacketUDPType)p.Recv_uint8(); switch (this->HasClientQuit() ? PACKET_UDP_END : type) { case PACKET_UDP_CLIENT_FIND_SERVER: this->Receive_CLIENT_FIND_SERVER(p, client_addr); break; @@ -165,9 +165,9 @@ void NetworkUDPSocketHandler::HandleUDPPacket(Packet *p, NetworkAddress *client_ default: if (this->HasClientQuit()) { - Debug(net, 0, "[udp] Received invalid packet type {} from {}", type, client_addr->GetAddressAsString()); + Debug(net, 0, "[udp] Received invalid packet type {} from {}", type, client_addr.GetAddressAsString()); } else { - Debug(net, 0, "[udp] Received illegal packet from {}", client_addr->GetAddressAsString()); + Debug(net, 0, "[udp] Received illegal packet from {}", client_addr.GetAddressAsString()); } break; } @@ -178,10 +178,10 @@ void NetworkUDPSocketHandler::HandleUDPPacket(Packet *p, NetworkAddress *client_ * @param type The received packet type. * @param client_addr The address we received the packet from. */ -void NetworkUDPSocketHandler::ReceiveInvalidPacket(PacketUDPType type, NetworkAddress *client_addr) +void NetworkUDPSocketHandler::ReceiveInvalidPacket(PacketUDPType type, NetworkAddress &client_addr) { - Debug(net, 0, "[udp] Received packet type {} on wrong port from {}", type, client_addr->GetAddressAsString()); + Debug(net, 0, "[udp] Received packet type {} on wrong port from {}", type, client_addr.GetAddressAsString()); } -void NetworkUDPSocketHandler::Receive_CLIENT_FIND_SERVER(Packet *, NetworkAddress *client_addr) { this->ReceiveInvalidPacket(PACKET_UDP_CLIENT_FIND_SERVER, client_addr); } -void NetworkUDPSocketHandler::Receive_SERVER_RESPONSE(Packet *, NetworkAddress *client_addr) { this->ReceiveInvalidPacket(PACKET_UDP_SERVER_RESPONSE, client_addr); } +void NetworkUDPSocketHandler::Receive_CLIENT_FIND_SERVER(Packet &, NetworkAddress &client_addr) { this->ReceiveInvalidPacket(PACKET_UDP_CLIENT_FIND_SERVER, client_addr); } +void NetworkUDPSocketHandler::Receive_SERVER_RESPONSE(Packet &, NetworkAddress &client_addr) { this->ReceiveInvalidPacket(PACKET_UDP_SERVER_RESPONSE, client_addr); } diff --git a/src/network/core/udp.h b/src/network/core/udp.h index 61866351d8..f31850b7cb 100644 --- a/src/network/core/udp.h +++ b/src/network/core/udp.h @@ -30,23 +30,23 @@ protected: /** The opened sockets. */ SocketList sockets; - void ReceiveInvalidPacket(PacketUDPType, NetworkAddress *client_addr); + void ReceiveInvalidPacket(PacketUDPType, NetworkAddress &client_addr); /** * Queries to the server for information about the game. * @param p The received packet. * @param client_addr The origin of the packet. */ - virtual void Receive_CLIENT_FIND_SERVER(Packet *p, NetworkAddress *client_addr); + virtual void Receive_CLIENT_FIND_SERVER(Packet &p, NetworkAddress &client_addr); /** * Response to a query letting the client know we are here. * @param p The received packet. * @param client_addr The origin of the packet. */ - virtual void Receive_SERVER_RESPONSE(Packet *p, NetworkAddress *client_addr); + virtual void Receive_SERVER_RESPONSE(Packet &p, NetworkAddress &client_addr); - void HandleUDPPacket(Packet *p, NetworkAddress *client_addr); + void HandleUDPPacket(Packet &p, NetworkAddress &client_addr); public: NetworkUDPSocketHandler(NetworkAddressList *bind = nullptr); @@ -56,7 +56,7 @@ public: bool Listen(); void CloseSocket(); - void SendPacket(Packet *p, NetworkAddress *recv, bool all = false, bool broadcast = false); + void SendPacket(Packet &p, NetworkAddress &recv, bool all = false, bool broadcast = false); void ReceivePackets(); }; diff --git a/src/network/network_udp.cpp b/src/network/network_udp.cpp index 4d5ff526ea..478e804eaf 100644 --- a/src/network/network_udp.cpp +++ b/src/network/network_udp.cpp @@ -63,7 +63,7 @@ static UDPSocket _udp_server("Server"); ///< udp server socket /** Helper class for handling all server side communication. */ class ServerNetworkUDPSocketHandler : public NetworkUDPSocketHandler { protected: - void Receive_CLIENT_FIND_SERVER(Packet *p, NetworkAddress *client_addr) override; + void Receive_CLIENT_FIND_SERVER(Packet &p, NetworkAddress &client_addr) override; public: /** * Create the socket. @@ -73,12 +73,12 @@ public: virtual ~ServerNetworkUDPSocketHandler() = default; }; -void ServerNetworkUDPSocketHandler::Receive_CLIENT_FIND_SERVER(Packet *, NetworkAddress *client_addr) +void ServerNetworkUDPSocketHandler::Receive_CLIENT_FIND_SERVER(Packet &, NetworkAddress &client_addr) { Packet packet(PACKET_UDP_SERVER_RESPONSE); - this->SendPacket(&packet, client_addr); + this->SendPacket(packet, client_addr); - Debug(net, 7, "Queried from {}", client_addr->GetHostname()); + Debug(net, 7, "Queried from {}", client_addr.GetHostname()); } ///*** Communication with servers (we are client) ***/ @@ -86,16 +86,16 @@ void ServerNetworkUDPSocketHandler::Receive_CLIENT_FIND_SERVER(Packet *, Network /** Helper class for handling all client side communication. */ class ClientNetworkUDPSocketHandler : public NetworkUDPSocketHandler { protected: - void Receive_SERVER_RESPONSE(Packet *p, NetworkAddress *client_addr) override; + void Receive_SERVER_RESPONSE(Packet &p, NetworkAddress &client_addr) override; public: virtual ~ClientNetworkUDPSocketHandler() = default; }; -void ClientNetworkUDPSocketHandler::Receive_SERVER_RESPONSE(Packet *, NetworkAddress *client_addr) +void ClientNetworkUDPSocketHandler::Receive_SERVER_RESPONSE(Packet &, NetworkAddress &client_addr) { - Debug(net, 3, "Server response from {}", client_addr->GetAddressAsString()); + Debug(net, 3, "Server response from {}", client_addr.GetAddressAsString()); - NetworkAddServer(client_addr->GetAddressAsString(false), false, true); + NetworkAddServer(client_addr.GetAddressAsString(false), false, true); } /** Broadcast to all ips */ @@ -105,7 +105,7 @@ static void NetworkUDPBroadCast(NetworkUDPSocketHandler *socket) Debug(net, 5, "Broadcasting to {}", addr.GetHostname()); Packet p(PACKET_UDP_CLIENT_FIND_SERVER); - socket->SendPacket(&p, &addr, true, true); + socket->SendPacket(p, addr, true, true); } } From 8add0bf8ec902b3ca1929852366c411b1c01cdbd Mon Sep 17 00:00:00 2001 From: Rubidium Date: Sat, 3 Feb 2024 20:05:42 +0100 Subject: [PATCH 06/25] Codechange: use references for game info serialization --- src/network/core/network_game_info.cpp | 142 ++++++++++++------------- src/network/core/network_game_info.h | 12 +-- src/network/network_client.cpp | 2 +- src/network/network_coordinator.cpp | 6 +- src/network/network_query.cpp | 2 +- src/network/network_server.cpp | 4 +- 6 files changed, 84 insertions(+), 84 deletions(-) diff --git a/src/network/core/network_game_info.cpp b/src/network/core/network_game_info.cpp index ceffa9e227..adecf1643f 100644 --- a/src/network/core/network_game_info.cpp +++ b/src/network/core/network_game_info.cpp @@ -141,7 +141,7 @@ void FillStaticNetworkServerGameInfo() * Get the NetworkServerGameInfo structure with the latest information of the server. * @return The current NetworkServerGameInfo. */ -const NetworkServerGameInfo *GetCurrentNetworkServerGameInfo() +const NetworkServerGameInfo &GetCurrentNetworkServerGameInfo() { /* These variables are updated inside _network_game_info as if they are global variables: * - clients_on @@ -152,7 +152,7 @@ const NetworkServerGameInfo *GetCurrentNetworkServerGameInfo() _network_game_info.spectators_on = NetworkSpectatorCount(); _network_game_info.calendar_date = TimerGameCalendar::date; _network_game_info.ticks_playing = TimerGameTick::counter; - return &_network_game_info; + return _network_game_info; } /** @@ -184,9 +184,9 @@ static void HandleIncomingNetworkGameInfoGRFConfig(GRFConfig *config, std::strin * @param p the packet to write the data to. * @param info the NetworkGameInfo struct to serialize from. */ -void SerializeNetworkGameInfo(Packet *p, const NetworkServerGameInfo *info, bool send_newgrf_names) +void SerializeNetworkGameInfo(Packet &p, const NetworkServerGameInfo &info, bool send_newgrf_names) { - p->Send_uint8 (NETWORK_GAME_INFO_VERSION); + p.Send_uint8 (NETWORK_GAME_INFO_VERSION); /* * Please observe the order. @@ -197,15 +197,15 @@ void SerializeNetworkGameInfo(Packet *p, const NetworkServerGameInfo *info, bool * to the NetworkGameInfo wire-protocol! */ /* NETWORK_GAME_INFO_VERSION = 7 */ - p->Send_uint64(info->ticks_playing); + p.Send_uint64(info.ticks_playing); /* NETWORK_GAME_INFO_VERSION = 6 */ - p->Send_uint8(send_newgrf_names ? NST_GRFID_MD5_NAME : NST_GRFID_MD5); + p.Send_uint8(send_newgrf_names ? NST_GRFID_MD5_NAME : NST_GRFID_MD5); /* NETWORK_GAME_INFO_VERSION = 5 */ GameInfo *game_info = Game::GetInfo(); - p->Send_uint32(game_info == nullptr ? -1 : (uint32_t)game_info->GetVersion()); - p->Send_string(game_info == nullptr ? "" : game_info->GetName()); + p.Send_uint32(game_info == nullptr ? -1 : (uint32_t)game_info->GetVersion()); + p.Send_string(game_info == nullptr ? "" : game_info->GetName()); /* NETWORK_GAME_INFO_VERSION = 4 */ { @@ -217,40 +217,40 @@ void SerializeNetworkGameInfo(Packet *p, const NetworkServerGameInfo *info, bool uint count = 0; /* Count number of GRFs to send information about */ - for (c = info->grfconfig; c != nullptr; c = c->next) { + for (c = info.grfconfig; c != nullptr; c = c->next) { if (!HasBit(c->flags, GCF_STATIC)) count++; } - p->Send_uint8 (count); // Send number of GRFs + p.Send_uint8 (count); // Send number of GRFs /* Send actual GRF Identifications */ - for (c = info->grfconfig; c != nullptr; c = c->next) { + for (c = info.grfconfig; c != nullptr; c = c->next) { if (HasBit(c->flags, GCF_STATIC)) continue; - SerializeGRFIdentifier(p, &c->ident); - if (send_newgrf_names) p->Send_string(c->GetName()); + SerializeGRFIdentifier(p, c->ident); + if (send_newgrf_names) p.Send_string(c->GetName()); } } /* NETWORK_GAME_INFO_VERSION = 3 */ - p->Send_uint32(info->calendar_date.base()); - p->Send_uint32(info->calendar_start.base()); + p.Send_uint32(info.calendar_date.base()); + p.Send_uint32(info.calendar_start.base()); /* NETWORK_GAME_INFO_VERSION = 2 */ - p->Send_uint8 (info->companies_max); - p->Send_uint8 (info->companies_on); - p->Send_uint8 (info->clients_max); // Used to be max-spectators + p.Send_uint8 (info.companies_max); + p.Send_uint8 (info.companies_on); + p.Send_uint8 (info.clients_max); // Used to be max-spectators /* NETWORK_GAME_INFO_VERSION = 1 */ - p->Send_string(info->server_name); - p->Send_string(info->server_revision); - p->Send_bool (info->use_password); - p->Send_uint8 (info->clients_max); - p->Send_uint8 (info->clients_on); - p->Send_uint8 (info->spectators_on); - p->Send_uint16(info->map_width); - p->Send_uint16(info->map_height); - p->Send_uint8 (info->landscape); - p->Send_bool (info->dedicated); + p.Send_string(info.server_name); + p.Send_string(info.server_revision); + p.Send_bool (info.use_password); + p.Send_uint8 (info.clients_max); + p.Send_uint8 (info.clients_on); + p.Send_uint8 (info.spectators_on); + p.Send_uint16(info.map_width); + p.Send_uint16(info.map_height); + p.Send_uint8 (info.landscape); + p.Send_bool (info.dedicated); } /** @@ -258,9 +258,9 @@ void SerializeNetworkGameInfo(Packet *p, const NetworkServerGameInfo *info, bool * @param p the packet to read the data from. * @param info the NetworkGameInfo to deserialize into. */ -void DeserializeNetworkGameInfo(Packet *p, NetworkGameInfo *info, const GameInfoNewGRFLookupTable *newgrf_lookup_table) +void DeserializeNetworkGameInfo(Packet &p, NetworkGameInfo &info, const GameInfoNewGRFLookupTable *newgrf_lookup_table) { - byte game_info_version = p->Recv_uint8(); + byte game_info_version = p.Recv_uint8(); NewGRFSerializationType newgrf_serialisation = NST_GRFID_MD5; /* @@ -273,17 +273,17 @@ void DeserializeNetworkGameInfo(Packet *p, NetworkGameInfo *info, const GameInfo switch (game_info_version) { case 7: - info->ticks_playing = p->Recv_uint64(); + info.ticks_playing = p.Recv_uint64(); [[fallthrough]]; case 6: - newgrf_serialisation = (NewGRFSerializationType)p->Recv_uint8(); + newgrf_serialisation = (NewGRFSerializationType)p.Recv_uint8(); if (newgrf_serialisation >= NST_END) return; [[fallthrough]]; case 5: { - info->gamescript_version = (int)p->Recv_uint32(); - info->gamescript_name = p->Recv_string(NETWORK_NAME_LENGTH); + info.gamescript_version = (int)p.Recv_uint32(); + info.gamescript_name = p.Recv_string(NETWORK_NAME_LENGTH); [[fallthrough]]; } @@ -292,23 +292,23 @@ void DeserializeNetworkGameInfo(Packet *p, NetworkGameInfo *info, const GameInfo * protocol are matched to eachother. If that is not the case anymore a * check must be added to ensure the received data is still valid. */ static_assert(std::numeric_limits::max() == NETWORK_MAX_GRF_COUNT); - uint num_grfs = p->Recv_uint8(); + uint num_grfs = p.Recv_uint8(); - GRFConfig **dst = &info->grfconfig; + GRFConfig **dst = &info.grfconfig; for (uint i = 0; i < num_grfs; i++) { NamedGRFIdentifier grf; switch (newgrf_serialisation) { case NST_GRFID_MD5: - DeserializeGRFIdentifier(p, &grf.ident); + DeserializeGRFIdentifier(p, grf.ident); break; case NST_GRFID_MD5_NAME: - DeserializeGRFIdentifierWithName(p, &grf); + DeserializeGRFIdentifierWithName(p, grf); break; case NST_LOOKUP_ID: { if (newgrf_lookup_table == nullptr) return; - auto it = newgrf_lookup_table->find(p->Recv_uint32()); + auto it = newgrf_lookup_table->find(p.Recv_uint32()); if (it == newgrf_lookup_table->end()) return; grf = it->second; break; @@ -330,40 +330,40 @@ void DeserializeNetworkGameInfo(Packet *p, NetworkGameInfo *info, const GameInfo } case 3: - info->calendar_date = Clamp(p->Recv_uint32(), 0, CalendarTime::MAX_DATE.base()); - info->calendar_start = Clamp(p->Recv_uint32(), 0, CalendarTime::MAX_DATE.base()); + info.calendar_date = Clamp(p.Recv_uint32(), 0, CalendarTime::MAX_DATE.base()); + info.calendar_start = Clamp(p.Recv_uint32(), 0, CalendarTime::MAX_DATE.base()); [[fallthrough]]; case 2: - info->companies_max = p->Recv_uint8 (); - info->companies_on = p->Recv_uint8 (); - p->Recv_uint8(); // Used to contain max-spectators. + info.companies_max = p.Recv_uint8 (); + info.companies_on = p.Recv_uint8 (); + p.Recv_uint8(); // Used to contain max-spectators. [[fallthrough]]; case 1: - info->server_name = p->Recv_string(NETWORK_NAME_LENGTH); - info->server_revision = p->Recv_string(NETWORK_REVISION_LENGTH); - if (game_info_version < 6) p->Recv_uint8 (); // Used to contain server-lang. - info->use_password = p->Recv_bool (); - info->clients_max = p->Recv_uint8 (); - info->clients_on = p->Recv_uint8 (); - info->spectators_on = p->Recv_uint8 (); + info.server_name = p.Recv_string(NETWORK_NAME_LENGTH); + info.server_revision = p.Recv_string(NETWORK_REVISION_LENGTH); + if (game_info_version < 6) p.Recv_uint8 (); // Used to contain server-lang. + info.use_password = p.Recv_bool (); + info.clients_max = p.Recv_uint8 (); + info.clients_on = p.Recv_uint8 (); + info.spectators_on = p.Recv_uint8 (); if (game_info_version < 3) { // 16 bits dates got scrapped and are read earlier - info->calendar_date = p->Recv_uint16() + CalendarTime::DAYS_TILL_ORIGINAL_BASE_YEAR; - info->calendar_start = p->Recv_uint16() + CalendarTime::DAYS_TILL_ORIGINAL_BASE_YEAR; + info.calendar_date = p.Recv_uint16() + CalendarTime::DAYS_TILL_ORIGINAL_BASE_YEAR; + info.calendar_start = p.Recv_uint16() + CalendarTime::DAYS_TILL_ORIGINAL_BASE_YEAR; } - if (game_info_version < 6) while (p->Recv_uint8() != 0) {} // Used to contain the map-name. - info->map_width = p->Recv_uint16(); - info->map_height = p->Recv_uint16(); - info->landscape = p->Recv_uint8 (); - info->dedicated = p->Recv_bool (); + if (game_info_version < 6) while (p.Recv_uint8() != 0) {} // Used to contain the map-name. + info.map_width = p.Recv_uint16(); + info.map_height = p.Recv_uint16(); + info.landscape = p.Recv_uint8 (); + info.dedicated = p.Recv_bool (); - if (info->landscape >= NUM_LANDSCAPE) info->landscape = 0; + if (info.landscape >= NUM_LANDSCAPE) info.landscape = 0; } /* For older servers, estimate the ticks running based on the calendar date. */ if (game_info_version < 7) { - info->ticks_playing = static_cast(std::max(0, info->calendar_date.base() - info->calendar_start.base())) * Ticks::DAY_TICKS; + info.ticks_playing = static_cast(std::max(0, info.calendar_date.base() - info.calendar_start.base())) * Ticks::DAY_TICKS; } } @@ -372,11 +372,11 @@ void DeserializeNetworkGameInfo(Packet *p, NetworkGameInfo *info, const GameInfo * @param p the packet to write the data to. * @param grf the GRFIdentifier to serialize. */ -void SerializeGRFIdentifier(Packet *p, const GRFIdentifier *grf) +void SerializeGRFIdentifier(Packet &p, const GRFIdentifier &grf) { - p->Send_uint32(grf->grfid); - for (size_t j = 0; j < grf->md5sum.size(); j++) { - p->Send_uint8(grf->md5sum[j]); + p.Send_uint32(grf.grfid); + for (size_t j = 0; j < grf.md5sum.size(); j++) { + p.Send_uint8(grf.md5sum[j]); } } @@ -385,11 +385,11 @@ void SerializeGRFIdentifier(Packet *p, const GRFIdentifier *grf) * @param p the packet to read the data from. * @param grf the GRFIdentifier to deserialize. */ -void DeserializeGRFIdentifier(Packet *p, GRFIdentifier *grf) +void DeserializeGRFIdentifier(Packet &p, GRFIdentifier &grf) { - grf->grfid = p->Recv_uint32(); - for (size_t j = 0; j < grf->md5sum.size(); j++) { - grf->md5sum[j] = p->Recv_uint8(); + grf.grfid = p.Recv_uint32(); + for (size_t j = 0; j < grf.md5sum.size(); j++) { + grf.md5sum[j] = p.Recv_uint8(); } } @@ -398,8 +398,8 @@ void DeserializeGRFIdentifier(Packet *p, GRFIdentifier *grf) * @param p the packet to read the data from. * @param grf the NamedGRFIdentifier to deserialize. */ -void DeserializeGRFIdentifierWithName(Packet *p, NamedGRFIdentifier *grf) +void DeserializeGRFIdentifierWithName(Packet &p, NamedGRFIdentifier &grf) { - DeserializeGRFIdentifier(p, &grf->ident); - grf->name = p->Recv_string(NETWORK_GRF_NAME_LENGTH); + DeserializeGRFIdentifier(p, grf.ident); + grf.name = p.Recv_string(NETWORK_GRF_NAME_LENGTH); } diff --git a/src/network/core/network_game_info.h b/src/network/core/network_game_info.h index 293a20f92a..8b63d2d151 100644 --- a/src/network/core/network_game_info.h +++ b/src/network/core/network_game_info.h @@ -141,13 +141,13 @@ bool IsNetworkCompatibleVersion(std::string_view other); void CheckGameCompatibility(NetworkGameInfo &ngi); void FillStaticNetworkServerGameInfo(); -const NetworkServerGameInfo *GetCurrentNetworkServerGameInfo(); +const NetworkServerGameInfo &GetCurrentNetworkServerGameInfo(); -void DeserializeGRFIdentifier(Packet *p, GRFIdentifier *grf); -void DeserializeGRFIdentifierWithName(Packet *p, NamedGRFIdentifier *grf); -void SerializeGRFIdentifier(Packet *p, const GRFIdentifier *grf); +void DeserializeGRFIdentifier(Packet &p, GRFIdentifier &grf); +void DeserializeGRFIdentifierWithName(Packet &p, NamedGRFIdentifier &grf); +void SerializeGRFIdentifier(Packet &p, const GRFIdentifier &grf); -void DeserializeNetworkGameInfo(Packet *p, NetworkGameInfo *info, const GameInfoNewGRFLookupTable *newgrf_lookup_table = nullptr); -void SerializeNetworkGameInfo(Packet *p, const NetworkServerGameInfo *info, bool send_newgrf_names = true); +void DeserializeNetworkGameInfo(Packet &p, NetworkGameInfo &info, const GameInfoNewGRFLookupTable *newgrf_lookup_table = nullptr); +void SerializeNetworkGameInfo(Packet &p, const NetworkServerGameInfo &info, bool send_newgrf_names = true); #endif /* NETWORK_CORE_GAME_INFO_H */ diff --git a/src/network/network_client.cpp b/src/network/network_client.cpp index b63b8ff4e3..61db0a152a 100644 --- a/src/network/network_client.cpp +++ b/src/network/network_client.cpp @@ -707,7 +707,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CHECK_NEWGRFS(P /* Check all GRFs */ for (; grf_count > 0; grf_count--) { GRFIdentifier c; - DeserializeGRFIdentifier(p, &c); + DeserializeGRFIdentifier(*p, c); /* Check whether we know this GRF */ const GRFConfig *f = FindGRFConfig(c.grfid, FGCM_EXACT, &c.md5sum); diff --git a/src/network/network_coordinator.cpp b/src/network/network_coordinator.cpp index 6ea5ec8e05..0e9606ff43 100644 --- a/src/network/network_coordinator.cpp +++ b/src/network/network_coordinator.cpp @@ -245,7 +245,7 @@ bool ClientNetworkCoordinatorSocketHandler::Receive_GC_LISTING(Packet *p) /* Read the NetworkGameInfo from the packet. */ NetworkGameInfo ngi = {}; - DeserializeNetworkGameInfo(p, &ngi, &this->newgrf_lookup_table); + DeserializeNetworkGameInfo(*p, ngi, &this->newgrf_lookup_table); /* Now we know the connection string, we can add it to our list. */ NetworkGameList *item = NetworkGameListAddItem(connection_string); @@ -360,7 +360,7 @@ bool ClientNetworkCoordinatorSocketHandler::Receive_GC_NEWGRF_LOOKUP(Packet *p) uint16_t newgrfs = p->Recv_uint16(); for (; newgrfs> 0; newgrfs--) { uint32_t index = p->Recv_uint32(); - DeserializeGRFIdentifierWithName(p, &this->newgrf_lookup_table[index]); + DeserializeGRFIdentifierWithName(*p, this->newgrf_lookup_table[index]); } return true; } @@ -482,7 +482,7 @@ void ClientNetworkCoordinatorSocketHandler::SendServerUpdate() auto p = std::make_unique(PACKET_COORDINATOR_SERVER_UPDATE, TCP_MTU); p->Send_uint8(NETWORK_COORDINATOR_VERSION); - SerializeNetworkGameInfo(p.get(), GetCurrentNetworkServerGameInfo(), this->next_update.time_since_epoch() != std::chrono::nanoseconds::zero()); + SerializeNetworkGameInfo(*p, GetCurrentNetworkServerGameInfo(), this->next_update.time_since_epoch() != std::chrono::nanoseconds::zero()); this->SendPacket(std::move(p)); diff --git a/src/network/network_query.cpp b/src/network/network_query.cpp index 9b0e57b982..9a34aff71d 100644 --- a/src/network/network_query.cpp +++ b/src/network/network_query.cpp @@ -122,7 +122,7 @@ NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_GAME_INFO(Packet /* Clear any existing GRFConfig chain. */ ClearGRFConfigList(&item->info.grfconfig); /* Retrieve the NetworkGameInfo from the packet. */ - DeserializeNetworkGameInfo(p, &item->info); + DeserializeNetworkGameInfo(*p, item->info); /* Check for compatability with the client. */ CheckGameCompatibility(item->info); /* Ensure we consider the server online. */ diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp index 001e0a7b7c..70cbfd3b83 100644 --- a/src/network/network_server.cpp +++ b/src/network/network_server.cpp @@ -342,7 +342,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendGameInfo() Debug(net, 9, "client[{}] SendGameInfo()", this->client_id); auto p = std::make_unique(PACKET_SERVER_GAME_INFO, TCP_MTU); - SerializeNetworkGameInfo(p.get(), GetCurrentNetworkServerGameInfo()); + SerializeNetworkGameInfo(*p, GetCurrentNetworkServerGameInfo()); this->SendPacket(std::move(p)); @@ -413,7 +413,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendNewGRFCheck() p->Send_uint8 (grf_count); for (c = _grfconfig; c != nullptr; c = c->next) { - if (!HasBit(c->flags, GCF_STATIC)) SerializeGRFIdentifier(p.get(), &c->ident); + if (!HasBit(c->flags, GCF_STATIC)) SerializeGRFIdentifier(*p, c->ident); } this->SendPacket(std::move(p)); From 794f12dc247705f8fba247ef6ef903b083cbebc7 Mon Sep 17 00:00:00 2001 From: Rubidium Date: Sat, 3 Feb 2024 20:27:25 +0100 Subject: [PATCH 07/25] Codechange: cascade through SendNeedGame/CompanyPassword functions, instead of duplicating logic for determining whether to call these functions --- src/network/network_server.cpp | 35 ++++++++++++++-------------------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp index 70cbfd3b83..322966a9ea 100644 --- a/src/network/network_server.cpp +++ b/src/network/network_server.cpp @@ -423,6 +423,11 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendNewGRFCheck() /** Request the game password. */ NetworkRecvStatus ServerNetworkGameSocketHandler::SendNeedGamePassword() { + if (_settings_client.network.server_password.empty()) { + /* Do not actually need a game password, continue with the company password. */ + return this->SendNeedCompanyPassword(); + } + Debug(net, 9, "client[{}] SendNeedGamePassword()", this->client_id); /* Invalid packet when status is STATUS_AUTH_GAME or higher */ @@ -441,6 +446,11 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendNeedGamePassword() /** Request the company password. */ NetworkRecvStatus ServerNetworkGameSocketHandler::SendNeedCompanyPassword() { + NetworkClientInfo *ci = this->GetInfo(); + if (!Company::IsValidID(ci->client_playas) || _network_company_states[ci->client_playas].password.empty()) { + return this->SendWelcome(); + } + Debug(net, 9, "client[{}] SendNeedCompanyPassword()", this->client_id); /* Invalid packet when status is STATUS_AUTH_COMPANY or higher */ @@ -845,18 +855,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_NEWGRFS_CHECKED Debug(net, 9, "client[{}] Receive_CLIENT_NEWGRFS_CHECKED()", this->client_id); - NetworkClientInfo *ci = this->GetInfo(); - - /* We now want a password from the client else we do not allow them in! */ - if (!_settings_client.network.server_password.empty()) { - return this->SendNeedGamePassword(); - } - - if (Company::IsValidID(ci->client_playas) && !_network_company_states[ci->client_playas].password.empty()) { - return this->SendNeedCompanyPassword(); - } - - return this->SendWelcome(); + return this->SendNeedGamePassword(); } NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_JOIN(Packet *p) @@ -930,8 +929,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_JOIN(Packet *p) this->status = STATUS_NEWGRFS_CHECK; if (_grfconfig == nullptr) { - /* Behave as if we received PACKET_CLIENT_NEWGRFS_CHECKED */ - return this->Receive_CLIENT_NEWGRFS_CHECKED(nullptr); + /* Continue asking for the game password. */ + return this->SendNeedGamePassword(); } return this->SendNewGRFCheck(); @@ -954,13 +953,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_GAME_PASSWORD(P return this->SendError(NETWORK_ERROR_WRONG_PASSWORD); } - const NetworkClientInfo *ci = this->GetInfo(); - if (Company::IsValidID(ci->client_playas) && !_network_company_states[ci->client_playas].password.empty()) { - return this->SendNeedCompanyPassword(); - } - - /* Valid password, allow user */ - return this->SendWelcome(); + return this->SendNeedCompanyPassword(); } NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_COMPANY_PASSWORD(Packet *p) From 72a44b0df67bed530b922a01ed8abe3a4041731e Mon Sep 17 00:00:00 2001 From: Rubidium Date: Sat, 3 Feb 2024 20:28:52 +0100 Subject: [PATCH 08/25] Codechange: use references for handling received TCP packets --- src/network/core/tcp.cpp | 22 ++-- src/network/core/tcp_admin.cpp | 80 ++++++------- src/network/core/tcp_admin.h | 72 ++++++------ src/network/core/tcp_content.cpp | 20 ++-- src/network/core/tcp_content.h | 16 +-- src/network/core/tcp_coordinator.cpp | 40 +++---- src/network/core/tcp_coordinator.h | 36 +++--- src/network/core/tcp_game.cpp | 94 ++++++++-------- src/network/core/tcp_game.h | 94 ++++++++-------- src/network/core/tcp_stun.cpp | 2 +- src/network/core/tcp_stun.h | 2 +- src/network/core/tcp_turn.cpp | 12 +- src/network/core/tcp_turn.h | 8 +- src/network/network_admin.cpp | 54 ++++----- src/network/network_admin.h | 18 +-- src/network/network_client.cpp | 161 +++++++++++++-------------- src/network/network_client.h | 54 ++++----- src/network/network_command.cpp | 24 ++-- src/network/network_content.cpp | 42 +++---- src/network/network_content.h | 4 +- src/network/network_coordinator.cpp | 78 ++++++------- src/network/network_coordinator.h | 20 ++-- src/network/network_query.cpp | 12 +- src/network/network_query.h | 8 +- src/network/network_server.cpp | 75 ++++++------- src/network/network_server.h | 32 +++--- src/network/network_turn.cpp | 6 +- src/network/network_turn.h | 4 +- 28 files changed, 544 insertions(+), 546 deletions(-) diff --git a/src/network/core/tcp.cpp b/src/network/core/tcp.cpp index 16259c64ce..b01b8cd075 100644 --- a/src/network/core/tcp.cpp +++ b/src/network/core/tcp.cpp @@ -90,8 +90,8 @@ SendPacketsState NetworkTCPSocketHandler::SendPackets(bool closing_down) if (!this->IsConnected()) return SPS_CLOSED; while (!this->packet_queue.empty()) { - Packet *p = this->packet_queue.front().get(); - ssize_t res = p->TransferOut(send, this->sock, 0); + Packet &p = *this->packet_queue.front(); + ssize_t res = p.TransferOut(send, this->sock, 0); if (res == -1) { NetworkError err = NetworkError::GetLast(); if (!err.WouldBlock()) { @@ -111,7 +111,7 @@ SendPacketsState NetworkTCPSocketHandler::SendPackets(bool closing_down) } /* Is this packet sent? */ - if (p->RemainingBytesToTransfer() == 0) { + if (p.RemainingBytesToTransfer() == 0) { /* Go to the next packet */ this->packet_queue.pop_front(); } else { @@ -136,12 +136,12 @@ std::unique_ptr NetworkTCPSocketHandler::ReceivePacket() this->packet_recv = std::make_unique(this, TCP_MTU); } - Packet *p = this->packet_recv.get(); + Packet &p = *this->packet_recv.get(); /* Read packet size */ - if (!p->HasPacketSizeData()) { - while (p->RemainingBytesToTransfer() != 0) { - res = p->TransferIn(recv, this->sock, 0); + if (!p.HasPacketSizeData()) { + while (p.RemainingBytesToTransfer() != 0) { + res = p.TransferIn(recv, this->sock, 0); if (res == -1) { NetworkError err = NetworkError::GetLast(); if (!err.WouldBlock()) { @@ -161,15 +161,15 @@ std::unique_ptr NetworkTCPSocketHandler::ReceivePacket() } /* Parse the size in the received packet and if not valid, close the connection. */ - if (!p->ParsePacketSize()) { + if (!p.ParsePacketSize()) { this->CloseConnection(); return nullptr; } } /* Read rest of packet */ - while (p->RemainingBytesToTransfer() != 0) { - res = p->TransferIn(recv, this->sock, 0); + while (p.RemainingBytesToTransfer() != 0) { + res = p.TransferIn(recv, this->sock, 0); if (res == -1) { NetworkError err = NetworkError::GetLast(); if (!err.WouldBlock()) { @@ -188,7 +188,7 @@ std::unique_ptr NetworkTCPSocketHandler::ReceivePacket() } } - p->PrepareToRead(); + p.PrepareToRead(); return std::move(this->packet_recv); } diff --git a/src/network/core/tcp_admin.cpp b/src/network/core/tcp_admin.cpp index fe1750482e..d29e08ba63 100644 --- a/src/network/core/tcp_admin.cpp +++ b/src/network/core/tcp_admin.cpp @@ -43,9 +43,9 @@ NetworkRecvStatus NetworkAdminSocketHandler::CloseConnection(bool) * @param p the packet to handle. * @return #NetworkRecvStatus of handling. */ -NetworkRecvStatus NetworkAdminSocketHandler::HandlePacket(Packet *p) +NetworkRecvStatus NetworkAdminSocketHandler::HandlePacket(Packet &p) { - PacketAdminType type = (PacketAdminType)p->Recv_uint8(); + PacketAdminType type = (PacketAdminType)p.Recv_uint8(); if (this->HasClientQuit()) { Debug(net, 0, "[tcp/admin] Received invalid packet from '{}' ({})", this->admin_name, this->admin_version); @@ -110,7 +110,7 @@ NetworkRecvStatus NetworkAdminSocketHandler::ReceivePackets() { std::unique_ptr p; while ((p = this->ReceivePacket()) != nullptr) { - NetworkRecvStatus res = this->HandlePacket(p.get()); + NetworkRecvStatus res = this->HandlePacket(*p); if (res != NETWORK_RECV_STATUS_OKAY) return res; } @@ -128,40 +128,40 @@ NetworkRecvStatus NetworkAdminSocketHandler::ReceiveInvalidPacket(PacketAdminTyp return NETWORK_RECV_STATUS_MALFORMED_PACKET; } -NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_JOIN(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_JOIN); } -NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_QUIT(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_QUIT); } -NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_UPDATE_FREQUENCY(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_UPDATE_FREQUENCY); } -NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_POLL(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_POLL); } -NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_CHAT(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_CHAT); } -NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_EXTERNAL_CHAT(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_EXTERNAL_CHAT); } -NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_RCON(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_RCON); } -NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_GAMESCRIPT(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_GAMESCRIPT); } -NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_PING(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_PING); } - -NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_FULL(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_FULL); } -NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_BANNED(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_BANNED); } -NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_ERROR(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_ERROR); } -NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_PROTOCOL(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_PROTOCOL); } -NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_WELCOME(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_WELCOME); } -NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_NEWGAME(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_NEWGAME); } -NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_SHUTDOWN(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_SHUTDOWN); } - -NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_DATE(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_DATE); } -NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CLIENT_JOIN(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CLIENT_JOIN); } -NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CLIENT_INFO(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CLIENT_INFO); } -NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CLIENT_UPDATE(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CLIENT_UPDATE); } -NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CLIENT_QUIT(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CLIENT_QUIT); } -NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CLIENT_ERROR(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CLIENT_ERROR); } -NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_COMPANY_NEW(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_NEW); } -NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_COMPANY_INFO(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_INFO); } -NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_COMPANY_UPDATE(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_UPDATE); } -NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_COMPANY_REMOVE(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_REMOVE); } -NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_COMPANY_ECONOMY(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_ECONOMY); } -NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_COMPANY_STATS(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_STATS); } -NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CHAT(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CHAT); } -NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_RCON(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_RCON); } -NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CONSOLE(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CONSOLE); } -NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CMD_NAMES(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CMD_NAMES); } -NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CMD_LOGGING(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CMD_LOGGING); } -NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_RCON_END(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_RCON_END); } -NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_PONG(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_PONG); } +NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_JOIN(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_JOIN); } +NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_QUIT(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_QUIT); } +NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_UPDATE_FREQUENCY(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_UPDATE_FREQUENCY); } +NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_POLL(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_POLL); } +NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_CHAT(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_CHAT); } +NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_EXTERNAL_CHAT(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_EXTERNAL_CHAT); } +NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_RCON(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_RCON); } +NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_GAMESCRIPT(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_GAMESCRIPT); } +NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_PING(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_PING); } + +NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_FULL(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_FULL); } +NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_BANNED(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_BANNED); } +NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_ERROR(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_ERROR); } +NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_PROTOCOL(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_PROTOCOL); } +NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_WELCOME(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_WELCOME); } +NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_NEWGAME(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_NEWGAME); } +NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_SHUTDOWN(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_SHUTDOWN); } + +NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_DATE(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_DATE); } +NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CLIENT_JOIN(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CLIENT_JOIN); } +NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CLIENT_INFO(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CLIENT_INFO); } +NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CLIENT_UPDATE(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CLIENT_UPDATE); } +NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CLIENT_QUIT(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CLIENT_QUIT); } +NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CLIENT_ERROR(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CLIENT_ERROR); } +NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_COMPANY_NEW(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_NEW); } +NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_COMPANY_INFO(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_INFO); } +NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_COMPANY_UPDATE(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_UPDATE); } +NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_COMPANY_REMOVE(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_REMOVE); } +NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_COMPANY_ECONOMY(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_ECONOMY); } +NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_COMPANY_STATS(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_STATS); } +NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CHAT(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CHAT); } +NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_RCON(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_RCON); } +NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CONSOLE(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CONSOLE); } +NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CMD_NAMES(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CMD_NAMES); } +NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CMD_LOGGING(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CMD_LOGGING); } +NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_RCON_END(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_RCON_END); } +NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_PONG(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_PONG); } diff --git a/src/network/core/tcp_admin.h b/src/network/core/tcp_admin.h index 567a791496..8dbec673aa 100644 --- a/src/network/core/tcp_admin.h +++ b/src/network/core/tcp_admin.h @@ -125,14 +125,14 @@ protected: * @param p The packet that was just received. * @return The state the network should have. */ - virtual NetworkRecvStatus Receive_ADMIN_JOIN(Packet *p); + virtual NetworkRecvStatus Receive_ADMIN_JOIN(Packet &p); /** * Notification to the server that this admin is quitting. * @param p The packet that was just received. * @return The state the network should have. */ - virtual NetworkRecvStatus Receive_ADMIN_QUIT(Packet *p); + virtual NetworkRecvStatus Receive_ADMIN_QUIT(Packet &p); /** * Register updates to be sent at certain frequencies (as announced in the PROTOCOL packet): @@ -141,7 +141,7 @@ protected: * @param p The packet that was just received. * @return The state the network should have. */ - virtual NetworkRecvStatus Receive_ADMIN_UPDATE_FREQUENCY(Packet *p); + virtual NetworkRecvStatus Receive_ADMIN_UPDATE_FREQUENCY(Packet &p); /** * Poll the server for certain updates, an invalid poll (e.g. not existent id) gets silently dropped: @@ -152,7 +152,7 @@ protected: * @param p The packet that was just received. * @return The state the network should have. */ - virtual NetworkRecvStatus Receive_ADMIN_POLL(Packet *p); + virtual NetworkRecvStatus Receive_ADMIN_POLL(Packet &p); /** * Send chat as the server: @@ -163,7 +163,7 @@ protected: * @param p The packet that was just received. * @return The state the network should have. */ - virtual NetworkRecvStatus Receive_ADMIN_CHAT(Packet *p); + virtual NetworkRecvStatus Receive_ADMIN_CHAT(Packet &p); /** * Send chat from the external source: @@ -174,7 +174,7 @@ protected: * @param p The packet that was just received. * @return The state the network should have. */ - virtual NetworkRecvStatus Receive_ADMIN_EXTERNAL_CHAT(Packet *p); + virtual NetworkRecvStatus Receive_ADMIN_EXTERNAL_CHAT(Packet &p); /** * Execute a command on the servers console: @@ -182,7 +182,7 @@ protected: * @param p The packet that was just received. * @return The state the network should have. */ - virtual NetworkRecvStatus Receive_ADMIN_RCON(Packet *p); + virtual NetworkRecvStatus Receive_ADMIN_RCON(Packet &p); /** * Send a JSON string to the current active GameScript. @@ -190,7 +190,7 @@ protected: * @param p The packet that was just received. * @return The state the network should have. */ - virtual NetworkRecvStatus Receive_ADMIN_GAMESCRIPT(Packet *p); + virtual NetworkRecvStatus Receive_ADMIN_GAMESCRIPT(Packet &p); /** * Ping the server, requiring the server to reply with a pong packet. @@ -198,21 +198,21 @@ protected: * @param p The packet that was just received. * @return The state the network should have. */ - virtual NetworkRecvStatus Receive_ADMIN_PING(Packet *p); + virtual NetworkRecvStatus Receive_ADMIN_PING(Packet &p); /** * The server is full (connection gets closed). * @param p The packet that was just received. * @return The state the network should have. */ - virtual NetworkRecvStatus Receive_SERVER_FULL(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_FULL(Packet &p); /** * The source IP address is banned (connection gets closed). * @param p The packet that was just received. * @return The state the network should have. */ - virtual NetworkRecvStatus Receive_SERVER_BANNED(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_BANNED(Packet &p); /** * An error was caused by this admin connection (connection gets closed). @@ -220,7 +220,7 @@ protected: * @param p The packet that was just received. * @return The state the network should have. */ - virtual NetworkRecvStatus Receive_SERVER_ERROR(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_ERROR(Packet &p); /** * Inform a just joined admin about the protocol specifics: @@ -231,7 +231,7 @@ protected: * @param p The packet that was just received. * @return The state the network should have. */ - virtual NetworkRecvStatus Receive_SERVER_PROTOCOL(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_PROTOCOL(Packet &p); /** * Welcome a connected admin to the game: @@ -247,21 +247,21 @@ protected: * @param p The packet that was just received. * @return The state the network should have. */ - virtual NetworkRecvStatus Receive_SERVER_WELCOME(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_WELCOME(Packet &p); /** * Notification about a newgame. * @param p The packet that was just received. * @return The state the network should have. */ - virtual NetworkRecvStatus Receive_SERVER_NEWGAME(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_NEWGAME(Packet &p); /** * Notification about the server shutting down. * @param p The packet that was just received. * @return The state the network should have. */ - virtual NetworkRecvStatus Receive_SERVER_SHUTDOWN(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_SHUTDOWN(Packet &p); /** * Send the current date of the game: @@ -269,7 +269,7 @@ protected: * @param p The packet that was just received. * @return The state the network should have. */ - virtual NetworkRecvStatus Receive_SERVER_DATE(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_DATE(Packet &p); /** * Notification of a new client: @@ -277,7 +277,7 @@ protected: * @param p The packet that was just received. * @return The state the network should have. */ - virtual NetworkRecvStatus Receive_SERVER_CLIENT_JOIN(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_CLIENT_JOIN(Packet &p); /** * Client information of a specific client: @@ -290,7 +290,7 @@ protected: * @param p The packet that was just received. * @return The state the network should have. */ - virtual NetworkRecvStatus Receive_SERVER_CLIENT_INFO(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_CLIENT_INFO(Packet &p); /** * Client update details on a specific client (e.g. after rename or move): @@ -300,7 +300,7 @@ protected: * @param p The packet that was just received. * @return The state the network should have. */ - virtual NetworkRecvStatus Receive_SERVER_CLIENT_UPDATE(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_CLIENT_UPDATE(Packet &p); /** * Notification about a client leaving the game. @@ -308,7 +308,7 @@ protected: * @param p The packet that was just received. * @return The state the network should have. */ - virtual NetworkRecvStatus Receive_SERVER_CLIENT_QUIT(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_CLIENT_QUIT(Packet &p); /** * Notification about a client error (and thus the clients disconnection). @@ -317,7 +317,7 @@ protected: * @param p The packet that was just received. * @return The state the network should have. */ - virtual NetworkRecvStatus Receive_SERVER_CLIENT_ERROR(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_CLIENT_ERROR(Packet &p); /** * Notification of a new company: @@ -325,7 +325,7 @@ protected: * @param p The packet that was just received. * @return The state the network should have. */ - virtual NetworkRecvStatus Receive_SERVER_COMPANY_NEW(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_COMPANY_NEW(Packet &p); /** * Company information on a specific company: @@ -339,7 +339,7 @@ protected: * @param p The packet that was just received. * @return The state the network should have. */ - virtual NetworkRecvStatus Receive_SERVER_COMPANY_INFO(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_COMPANY_INFO(Packet &p); /** * Company information of a specific company: @@ -356,7 +356,7 @@ protected: * @param p The packet that was just received. * @return The state the network should have. */ - virtual NetworkRecvStatus Receive_SERVER_COMPANY_UPDATE(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_COMPANY_UPDATE(Packet &p); /** * Notification about a removed company (e.g. due to bankruptcy). @@ -365,7 +365,7 @@ protected: * @param p The packet that was just received. * @return The state the network should have. */ - virtual NetworkRecvStatus Receive_SERVER_COMPANY_REMOVE(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_COMPANY_REMOVE(Packet &p); /** * Economy update of a specific company: @@ -383,7 +383,7 @@ protected: * @param p The packet that was just received. * @return The state the network should have. */ - virtual NetworkRecvStatus Receive_SERVER_COMPANY_ECONOMY(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_COMPANY_ECONOMY(Packet &p); /** * Company statistics on stations and vehicles: @@ -401,7 +401,7 @@ protected: * @param p The packet that was just received. * @return The state the network should have. */ - virtual NetworkRecvStatus Receive_SERVER_COMPANY_STATS(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_COMPANY_STATS(Packet &p); /** * Send chat from the game into the admin network: @@ -413,7 +413,7 @@ protected: * @param p The packet that was just received. * @return The state the network should have. */ - virtual NetworkRecvStatus Receive_SERVER_CHAT(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_CHAT(Packet &p); /** * Result of an rcon command: @@ -422,7 +422,7 @@ protected: * @param p The packet that was just received. * @return The state the network should have. */ - virtual NetworkRecvStatus Receive_SERVER_RCON(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_RCON(Packet &p); /** * Send what would be printed on the server's console also into the admin network. @@ -431,7 +431,7 @@ protected: * @param p The packet that was just received. * @return The state the network should have. */ - virtual NetworkRecvStatus Receive_SERVER_CONSOLE(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_CONSOLE(Packet &p); /** * Send DoCommand names to the bot upon request only. @@ -450,7 +450,7 @@ protected: * @param p The packet that was just received. * @return The state the network should have. */ - virtual NetworkRecvStatus Receive_SERVER_CMD_NAMES(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_CMD_NAMES(Packet &p); /** * Send incoming command packets to the admin network. @@ -470,7 +470,7 @@ protected: * @param p The packet that was just received. * @return The state the network should have. */ - virtual NetworkRecvStatus Receive_SERVER_CMD_LOGGING(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_CMD_LOGGING(Packet &p); /** * Send a ping-reply (pong) to the admin that sent us the ping packet. @@ -478,7 +478,7 @@ protected: * @param p The packet that was just received. * @return The state the network should have. */ - virtual NetworkRecvStatus Receive_SERVER_PONG(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_PONG(Packet &p); /** * Notify the admin connection that the rcon command has finished. @@ -486,9 +486,9 @@ protected: * @param p The packet that was just received. * @return The state the network should have. */ - virtual NetworkRecvStatus Receive_SERVER_RCON_END(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_RCON_END(Packet &p); - NetworkRecvStatus HandlePacket(Packet *p); + NetworkRecvStatus HandlePacket(Packet &p); public: NetworkRecvStatus CloseConnection(bool error = true) override; diff --git a/src/network/core/tcp_content.cpp b/src/network/core/tcp_content.cpp index 199c70b11c..4c22c8e47c 100644 --- a/src/network/core/tcp_content.cpp +++ b/src/network/core/tcp_content.cpp @@ -98,9 +98,9 @@ std::optional ContentInfo::GetTextfile(TextfileType type) const * @param p the packet to handle * @return true if we should immediately handle further packets, false otherwise */ -bool NetworkContentSocketHandler::HandlePacket(Packet *p) +bool NetworkContentSocketHandler::HandlePacket(Packet &p) { - PacketContentType type = (PacketContentType)p->Recv_uint8(); + PacketContentType type = (PacketContentType)p.Recv_uint8(); switch (this->HasClientQuit() ? PACKET_CONTENT_END : type) { case PACKET_CONTENT_CLIENT_INFO_LIST: return this->Receive_CLIENT_INFO_LIST(p); @@ -150,7 +150,7 @@ bool NetworkContentSocketHandler::ReceivePackets() static const int MAX_PACKETS_TO_RECEIVE = 42; int i = MAX_PACKETS_TO_RECEIVE; while (--i != 0 && (p = this->ReceivePacket()) != nullptr) { - bool cont = this->HandlePacket(p.get()); + bool cont = this->HandlePacket(*p); if (!cont) return true; } @@ -169,13 +169,13 @@ bool NetworkContentSocketHandler::ReceiveInvalidPacket(PacketContentType type) return false; } -bool NetworkContentSocketHandler::Receive_CLIENT_INFO_LIST(Packet *) { return this->ReceiveInvalidPacket(PACKET_CONTENT_CLIENT_INFO_LIST); } -bool NetworkContentSocketHandler::Receive_CLIENT_INFO_ID(Packet *) { return this->ReceiveInvalidPacket(PACKET_CONTENT_CLIENT_INFO_ID); } -bool NetworkContentSocketHandler::Receive_CLIENT_INFO_EXTID(Packet *) { return this->ReceiveInvalidPacket(PACKET_CONTENT_CLIENT_INFO_EXTID); } -bool NetworkContentSocketHandler::Receive_CLIENT_INFO_EXTID_MD5(Packet *) { return this->ReceiveInvalidPacket(PACKET_CONTENT_CLIENT_INFO_EXTID_MD5); } -bool NetworkContentSocketHandler::Receive_SERVER_INFO(Packet *) { return this->ReceiveInvalidPacket(PACKET_CONTENT_SERVER_INFO); } -bool NetworkContentSocketHandler::Receive_CLIENT_CONTENT(Packet *) { return this->ReceiveInvalidPacket(PACKET_CONTENT_CLIENT_CONTENT); } -bool NetworkContentSocketHandler::Receive_SERVER_CONTENT(Packet *) { return this->ReceiveInvalidPacket(PACKET_CONTENT_SERVER_CONTENT); } +bool NetworkContentSocketHandler::Receive_CLIENT_INFO_LIST(Packet &) { return this->ReceiveInvalidPacket(PACKET_CONTENT_CLIENT_INFO_LIST); } +bool NetworkContentSocketHandler::Receive_CLIENT_INFO_ID(Packet &) { return this->ReceiveInvalidPacket(PACKET_CONTENT_CLIENT_INFO_ID); } +bool NetworkContentSocketHandler::Receive_CLIENT_INFO_EXTID(Packet &) { return this->ReceiveInvalidPacket(PACKET_CONTENT_CLIENT_INFO_EXTID); } +bool NetworkContentSocketHandler::Receive_CLIENT_INFO_EXTID_MD5(Packet &) { return this->ReceiveInvalidPacket(PACKET_CONTENT_CLIENT_INFO_EXTID_MD5); } +bool NetworkContentSocketHandler::Receive_SERVER_INFO(Packet &) { return this->ReceiveInvalidPacket(PACKET_CONTENT_SERVER_INFO); } +bool NetworkContentSocketHandler::Receive_CLIENT_CONTENT(Packet &) { return this->ReceiveInvalidPacket(PACKET_CONTENT_CLIENT_CONTENT); } +bool NetworkContentSocketHandler::Receive_SERVER_CONTENT(Packet &) { return this->ReceiveInvalidPacket(PACKET_CONTENT_SERVER_CONTENT); } /** * Helper to get the subdirectory a #ContentInfo is located in. diff --git a/src/network/core/tcp_content.h b/src/network/core/tcp_content.h index 05924f05e4..95ee2805ef 100644 --- a/src/network/core/tcp_content.h +++ b/src/network/core/tcp_content.h @@ -34,7 +34,7 @@ protected: * @param p The packet that was just received. * @return True upon success, otherwise false. */ - virtual bool Receive_CLIENT_INFO_LIST(Packet *p); + virtual bool Receive_CLIENT_INFO_LIST(Packet &p); /** * Client requesting a list of content info: @@ -43,7 +43,7 @@ protected: * @param p The packet that was just received. * @return True upon success, otherwise false. */ - virtual bool Receive_CLIENT_INFO_ID(Packet *p); + virtual bool Receive_CLIENT_INFO_ID(Packet &p); /** * Client requesting a list of content info based on an external @@ -57,7 +57,7 @@ protected: * @param p The packet that was just received. * @return True upon success, otherwise false. */ - virtual bool Receive_CLIENT_INFO_EXTID(Packet *p); + virtual bool Receive_CLIENT_INFO_EXTID(Packet &p); /** * Client requesting a list of content info based on an external @@ -72,7 +72,7 @@ protected: * @param p The packet that was just received. * @return True upon success, otherwise false. */ - virtual bool Receive_CLIENT_INFO_EXTID_MD5(Packet *p); + virtual bool Receive_CLIENT_INFO_EXTID_MD5(Packet &p); /** * Server sending list of content info: @@ -90,7 +90,7 @@ protected: * @param p The packet that was just received. * @return True upon success, otherwise false. */ - virtual bool Receive_SERVER_INFO(Packet *p); + virtual bool Receive_SERVER_INFO(Packet &p); /** * Client requesting the actual content: @@ -99,7 +99,7 @@ protected: * @param p The packet that was just received. * @return True upon success, otherwise false. */ - virtual bool Receive_CLIENT_CONTENT(Packet *p); + virtual bool Receive_CLIENT_CONTENT(Packet &p); /** * Server sending list of content info: @@ -111,9 +111,9 @@ protected: * @param p The packet that was just received. * @return True upon success, otherwise false. */ - virtual bool Receive_SERVER_CONTENT(Packet *p); + virtual bool Receive_SERVER_CONTENT(Packet &p); - bool HandlePacket(Packet *p); + bool HandlePacket(Packet &p); public: /** * Create a new cs socket handler for a given cs diff --git a/src/network/core/tcp_coordinator.cpp b/src/network/core/tcp_coordinator.cpp index 70533657b8..da030dd680 100644 --- a/src/network/core/tcp_coordinator.cpp +++ b/src/network/core/tcp_coordinator.cpp @@ -22,9 +22,9 @@ * @param p The packet to handle. * @return True iff we should immediately handle further packets. */ -bool NetworkCoordinatorSocketHandler::HandlePacket(Packet *p) +bool NetworkCoordinatorSocketHandler::HandlePacket(Packet &p) { - PacketCoordinatorType type = (PacketCoordinatorType)p->Recv_uint8(); + PacketCoordinatorType type = (PacketCoordinatorType)p.Recv_uint8(); switch (type) { case PACKET_COORDINATOR_GC_ERROR: return this->Receive_GC_ERROR(p); @@ -68,7 +68,7 @@ bool NetworkCoordinatorSocketHandler::ReceivePackets() static const int MAX_PACKETS_TO_RECEIVE = 42; int i = MAX_PACKETS_TO_RECEIVE; while (--i != 0 && (p = this->ReceivePacket()) != nullptr) { - bool cont = this->HandlePacket(p.get()); + bool cont = this->HandlePacket(*p); if (!cont) return true; } @@ -86,20 +86,20 @@ bool NetworkCoordinatorSocketHandler::ReceiveInvalidPacket(PacketCoordinatorType return false; } -bool NetworkCoordinatorSocketHandler::Receive_GC_ERROR(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_ERROR); } -bool NetworkCoordinatorSocketHandler::Receive_SERVER_REGISTER(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_SERVER_REGISTER); } -bool NetworkCoordinatorSocketHandler::Receive_GC_REGISTER_ACK(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_REGISTER_ACK); } -bool NetworkCoordinatorSocketHandler::Receive_SERVER_UPDATE(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_SERVER_UPDATE); } -bool NetworkCoordinatorSocketHandler::Receive_CLIENT_LISTING(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_CLIENT_LISTING); } -bool NetworkCoordinatorSocketHandler::Receive_GC_LISTING(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_LISTING); } -bool NetworkCoordinatorSocketHandler::Receive_CLIENT_CONNECT(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_CLIENT_CONNECT); } -bool NetworkCoordinatorSocketHandler::Receive_GC_CONNECTING(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_CONNECTING); } -bool NetworkCoordinatorSocketHandler::Receive_SERCLI_CONNECT_FAILED(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_SERCLI_CONNECT_FAILED); } -bool NetworkCoordinatorSocketHandler::Receive_GC_CONNECT_FAILED(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_CONNECT_FAILED); } -bool NetworkCoordinatorSocketHandler::Receive_CLIENT_CONNECTED(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_CLIENT_CONNECTED); } -bool NetworkCoordinatorSocketHandler::Receive_GC_DIRECT_CONNECT(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_DIRECT_CONNECT); } -bool NetworkCoordinatorSocketHandler::Receive_GC_STUN_REQUEST(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_STUN_REQUEST); } -bool NetworkCoordinatorSocketHandler::Receive_SERCLI_STUN_RESULT(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_SERCLI_STUN_RESULT); } -bool NetworkCoordinatorSocketHandler::Receive_GC_STUN_CONNECT(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_STUN_CONNECT); } -bool NetworkCoordinatorSocketHandler::Receive_GC_NEWGRF_LOOKUP(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_NEWGRF_LOOKUP); } -bool NetworkCoordinatorSocketHandler::Receive_GC_TURN_CONNECT(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_TURN_CONNECT); } +bool NetworkCoordinatorSocketHandler::Receive_GC_ERROR(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_ERROR); } +bool NetworkCoordinatorSocketHandler::Receive_SERVER_REGISTER(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_SERVER_REGISTER); } +bool NetworkCoordinatorSocketHandler::Receive_GC_REGISTER_ACK(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_REGISTER_ACK); } +bool NetworkCoordinatorSocketHandler::Receive_SERVER_UPDATE(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_SERVER_UPDATE); } +bool NetworkCoordinatorSocketHandler::Receive_CLIENT_LISTING(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_CLIENT_LISTING); } +bool NetworkCoordinatorSocketHandler::Receive_GC_LISTING(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_LISTING); } +bool NetworkCoordinatorSocketHandler::Receive_CLIENT_CONNECT(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_CLIENT_CONNECT); } +bool NetworkCoordinatorSocketHandler::Receive_GC_CONNECTING(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_CONNECTING); } +bool NetworkCoordinatorSocketHandler::Receive_SERCLI_CONNECT_FAILED(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_SERCLI_CONNECT_FAILED); } +bool NetworkCoordinatorSocketHandler::Receive_GC_CONNECT_FAILED(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_CONNECT_FAILED); } +bool NetworkCoordinatorSocketHandler::Receive_CLIENT_CONNECTED(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_CLIENT_CONNECTED); } +bool NetworkCoordinatorSocketHandler::Receive_GC_DIRECT_CONNECT(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_DIRECT_CONNECT); } +bool NetworkCoordinatorSocketHandler::Receive_GC_STUN_REQUEST(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_STUN_REQUEST); } +bool NetworkCoordinatorSocketHandler::Receive_SERCLI_STUN_RESULT(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_SERCLI_STUN_RESULT); } +bool NetworkCoordinatorSocketHandler::Receive_GC_STUN_CONNECT(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_STUN_CONNECT); } +bool NetworkCoordinatorSocketHandler::Receive_GC_NEWGRF_LOOKUP(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_NEWGRF_LOOKUP); } +bool NetworkCoordinatorSocketHandler::Receive_GC_TURN_CONNECT(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_TURN_CONNECT); } diff --git a/src/network/core/tcp_coordinator.h b/src/network/core/tcp_coordinator.h index 6e6b98f5c1..1155550744 100644 --- a/src/network/core/tcp_coordinator.h +++ b/src/network/core/tcp_coordinator.h @@ -83,7 +83,7 @@ protected: * @param p The packet that was just received. * @return True upon success, otherwise false. */ - virtual bool Receive_GC_ERROR(Packet *p); + virtual bool Receive_GC_ERROR(Packet &p); /** * Server is starting a multiplayer game and wants to let the @@ -98,7 +98,7 @@ protected: * @param p The packet that was just received. * @return True upon success, otherwise false. */ - virtual bool Receive_SERVER_REGISTER(Packet *p); + virtual bool Receive_SERVER_REGISTER(Packet &p); /** * Game Coordinator acknowledges the registration. @@ -110,7 +110,7 @@ protected: * @param p The packet that was just received. * @return True upon success, otherwise false. */ - virtual bool Receive_GC_REGISTER_ACK(Packet *p); + virtual bool Receive_GC_REGISTER_ACK(Packet &p); /** * Send an update of the current state of the server to the Game Coordinator. @@ -121,7 +121,7 @@ protected: * @param p The packet that was just received. * @return True upon success, otherwise false. */ - virtual bool Receive_SERVER_UPDATE(Packet *p); + virtual bool Receive_SERVER_UPDATE(Packet &p); /** * Client requests a list of all public servers. @@ -134,7 +134,7 @@ protected: * @param p The packet that was just received. * @return True upon success, otherwise false. */ - virtual bool Receive_CLIENT_LISTING(Packet *p); + virtual bool Receive_CLIENT_LISTING(Packet &p); /** * Game Coordinator replies with a list of all public servers. Multiple @@ -149,7 +149,7 @@ protected: * @param p The packet that was just received. * @return True upon success, otherwise false. */ - virtual bool Receive_GC_LISTING(Packet *p); + virtual bool Receive_GC_LISTING(Packet &p); /** * Client wants to connect to a Server. @@ -160,7 +160,7 @@ protected: * @param p The packet that was just received. * @return True upon success, otherwise false. */ - virtual bool Receive_CLIENT_CONNECT(Packet *p); + virtual bool Receive_CLIENT_CONNECT(Packet &p); /** * Game Coordinator informs the Client under what token it will start the @@ -172,7 +172,7 @@ protected: * @param p The packet that was just received. * @return True upon success, otherwise false. */ - virtual bool Receive_GC_CONNECTING(Packet *p); + virtual bool Receive_GC_CONNECTING(Packet &p); /** * Client or Server failed to connect to the remote side. @@ -184,7 +184,7 @@ protected: * @param p The packet that was just received. * @return True upon success, otherwise false. */ - virtual bool Receive_SERCLI_CONNECT_FAILED(Packet *p); + virtual bool Receive_SERCLI_CONNECT_FAILED(Packet &p); /** * Game Coordinator informs the Client that it failed to find a way to @@ -196,7 +196,7 @@ protected: * @param p The packet that was just received. * @return True upon success, otherwise false. */ - virtual bool Receive_GC_CONNECT_FAILED(Packet *p); + virtual bool Receive_GC_CONNECT_FAILED(Packet &p); /** * Client informs the Game Coordinator the connection with the Server is @@ -208,7 +208,7 @@ protected: * @param p The packet that was just received. * @return True upon success, otherwise false. */ - virtual bool Receive_CLIENT_CONNECTED(Packet *p); + virtual bool Receive_CLIENT_CONNECTED(Packet &p); /** * Game Coordinator requests that the Client makes a direct connection to @@ -222,7 +222,7 @@ protected: * @param p The packet that was just received. * @return True upon success, otherwise false. */ - virtual bool Receive_GC_DIRECT_CONNECT(Packet *p); + virtual bool Receive_GC_DIRECT_CONNECT(Packet &p); /** * Game Coordinator requests the client/server to do a STUN request to the @@ -237,7 +237,7 @@ protected: * @param p The packet that was just received. * @return True upon success, otherwise false. */ - virtual bool Receive_GC_STUN_REQUEST(Packet *p); + virtual bool Receive_GC_STUN_REQUEST(Packet &p); /** * Client/server informs the Game Coordinator the result of a STUN request. @@ -250,7 +250,7 @@ protected: * @param p The packet that was just received. * @return True upon success, otherwise false. */ - virtual bool Receive_SERCLI_STUN_RESULT(Packet *p); + virtual bool Receive_SERCLI_STUN_RESULT(Packet &p); /** * Game Coordinator informs the client/server of its STUN peer (the host:ip @@ -266,7 +266,7 @@ protected: * @param p The packet that was just received. * @return True upon success, otherwise false. */ - virtual bool Receive_GC_STUN_CONNECT(Packet *p); + virtual bool Receive_GC_STUN_CONNECT(Packet &p); /** * Game Coordinator informs the client of updates for the NewGRFs lookup table @@ -289,7 +289,7 @@ protected: * @param p The packet that was just received. * @return True upon success, otherwise false. */ - virtual bool Receive_GC_NEWGRF_LOOKUP(Packet *p); + virtual bool Receive_GC_NEWGRF_LOOKUP(Packet &p); /** * Game Coordinator requests that we make a connection to the indicated @@ -303,9 +303,9 @@ protected: * @param p The packet that was just received. * @return True upon success, otherwise false. */ - virtual bool Receive_GC_TURN_CONNECT(Packet *p); + virtual bool Receive_GC_TURN_CONNECT(Packet &p); - bool HandlePacket(Packet *p); + bool HandlePacket(Packet &p); public: /** * Create a new cs socket handler for a given cs. diff --git a/src/network/core/tcp_game.cpp b/src/network/core/tcp_game.cpp index fc199c5d60..4bd32ec153 100644 --- a/src/network/core/tcp_game.cpp +++ b/src/network/core/tcp_game.cpp @@ -61,9 +61,9 @@ NetworkRecvStatus NetworkGameSocketHandler::CloseConnection(bool) * @param p the packet to handle * @return #NetworkRecvStatus of handling. */ -NetworkRecvStatus NetworkGameSocketHandler::HandlePacket(Packet *p) +NetworkRecvStatus NetworkGameSocketHandler::HandlePacket(Packet &p) { - PacketGameType type = (PacketGameType)p->Recv_uint8(); + PacketGameType type = (PacketGameType)p.Recv_uint8(); if (this->HasClientQuit()) { Debug(net, 0, "[tcp/game] Received invalid packet from client {}", this->client_id); @@ -137,7 +137,7 @@ NetworkRecvStatus NetworkGameSocketHandler::ReceivePackets() { std::unique_ptr p; while ((p = this->ReceivePacket()) != nullptr) { - NetworkRecvStatus res = HandlePacket(p.get()); + NetworkRecvStatus res = HandlePacket(*p); if (res != NETWORK_RECV_STATUS_OKAY) return res; } @@ -155,50 +155,50 @@ NetworkRecvStatus NetworkGameSocketHandler::ReceiveInvalidPacket(PacketGameType return NETWORK_RECV_STATUS_MALFORMED_PACKET; } -NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_FULL(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_FULL); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_BANNED(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_BANNED); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_JOIN(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_JOIN); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_ERROR(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_ERROR); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_GAME_INFO(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_GAME_INFO); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_GAME_INFO(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_GAME_INFO); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_CLIENT_INFO(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_CLIENT_INFO); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_NEED_GAME_PASSWORD(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_NEED_GAME_PASSWORD); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_NEED_COMPANY_PASSWORD(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_NEED_COMPANY_PASSWORD); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_GAME_PASSWORD(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_GAME_PASSWORD); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_COMPANY_PASSWORD(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_COMPANY_PASSWORD); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_WELCOME(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_WELCOME); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_GETMAP(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_GETMAP); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_WAIT(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_WAIT); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_MAP_BEGIN(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_MAP_BEGIN); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_MAP_SIZE(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_MAP_SIZE); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_MAP_DATA(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_MAP_DATA); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_MAP_DONE(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_MAP_DONE); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_MAP_OK(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_MAP_OK); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_JOIN(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_JOIN); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_FRAME(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_FRAME); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_SYNC(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_SYNC); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_ACK(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_ACK); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_COMMAND(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_COMMAND); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_COMMAND(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_COMMAND); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_CHAT(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_CHAT); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_CHAT(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_CHAT); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_EXTERNAL_CHAT(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_EXTERNAL_CHAT); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_SET_PASSWORD(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_SET_PASSWORD); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_SET_NAME(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_SET_NAME); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_QUIT(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_QUIT); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_ERROR(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_ERROR); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_QUIT(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_QUIT); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_ERROR_QUIT(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_ERROR_QUIT); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_SHUTDOWN(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_SHUTDOWN); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_NEWGAME(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_NEWGAME); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_RCON(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_RCON); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_RCON(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_RCON); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_CHECK_NEWGRFS(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_CHECK_NEWGRFS); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_NEWGRFS_CHECKED(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_NEWGRFS_CHECKED); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_MOVE(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_MOVE); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_MOVE(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_MOVE); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_COMPANY_UPDATE(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_COMPANY_UPDATE); } -NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_CONFIG_UPDATE(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_CONFIG_UPDATE); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_FULL(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_FULL); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_BANNED(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_BANNED); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_JOIN(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_JOIN); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_ERROR(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_ERROR); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_GAME_INFO(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_GAME_INFO); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_GAME_INFO(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_GAME_INFO); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_CLIENT_INFO(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_CLIENT_INFO); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_NEED_GAME_PASSWORD(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_NEED_GAME_PASSWORD); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_NEED_COMPANY_PASSWORD(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_NEED_COMPANY_PASSWORD); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_GAME_PASSWORD(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_GAME_PASSWORD); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_COMPANY_PASSWORD(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_COMPANY_PASSWORD); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_WELCOME(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_WELCOME); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_GETMAP(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_GETMAP); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_WAIT(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_WAIT); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_MAP_BEGIN(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_MAP_BEGIN); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_MAP_SIZE(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_MAP_SIZE); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_MAP_DATA(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_MAP_DATA); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_MAP_DONE(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_MAP_DONE); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_MAP_OK(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_MAP_OK); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_JOIN(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_JOIN); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_FRAME(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_FRAME); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_SYNC(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_SYNC); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_ACK(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_ACK); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_COMMAND(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_COMMAND); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_COMMAND(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_COMMAND); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_CHAT(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_CHAT); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_CHAT(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_CHAT); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_EXTERNAL_CHAT(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_EXTERNAL_CHAT); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_SET_PASSWORD(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_SET_PASSWORD); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_SET_NAME(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_SET_NAME); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_QUIT(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_QUIT); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_ERROR(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_ERROR); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_QUIT(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_QUIT); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_ERROR_QUIT(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_ERROR_QUIT); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_SHUTDOWN(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_SHUTDOWN); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_NEWGAME(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_NEWGAME); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_RCON(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_RCON); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_RCON(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_RCON); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_CHECK_NEWGRFS(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_CHECK_NEWGRFS); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_NEWGRFS_CHECKED(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_NEWGRFS_CHECKED); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_MOVE(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_MOVE); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_MOVE(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_MOVE); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_COMPANY_UPDATE(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_COMPANY_UPDATE); } +NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_CONFIG_UPDATE(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_CONFIG_UPDATE); } void NetworkGameSocketHandler::DeferDeletion() { diff --git a/src/network/core/tcp_game.h b/src/network/core/tcp_game.h index 86705a0723..e5676dc21c 100644 --- a/src/network/core/tcp_game.h +++ b/src/network/core/tcp_game.h @@ -164,13 +164,13 @@ protected: * Notification that the server is full. * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_SERVER_FULL(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_FULL(Packet &p); /** * Notification that the client trying to join is banned. * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_SERVER_BANNED(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_BANNED(Packet &p); /** * Try to join the server: @@ -180,27 +180,27 @@ protected: * uint8_t ID of the clients Language. * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_CLIENT_JOIN(Packet *p); + virtual NetworkRecvStatus Receive_CLIENT_JOIN(Packet &p); /** * The client made an error: * uint8_t Error code caused (see NetworkErrorCode). * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_SERVER_ERROR(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_ERROR(Packet &p); /** * Request game information. * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_CLIENT_GAME_INFO(Packet *p); + virtual NetworkRecvStatus Receive_CLIENT_GAME_INFO(Packet &p); /** * Sends information about the game. * Serialized NetworkGameInfo. See game_info.h for details. * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_SERVER_GAME_INFO(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_GAME_INFO(Packet &p); /** * Send information about a client: @@ -209,13 +209,13 @@ protected: * string Name of the client. * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_SERVER_CLIENT_INFO(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_CLIENT_INFO(Packet &p); /** * Indication to the client that the server needs a game password. * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_SERVER_NEED_GAME_PASSWORD(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_NEED_GAME_PASSWORD(Packet &p); /** * Indication to the client that the server needs a company password: @@ -223,7 +223,7 @@ protected: * string Network ID of the server. * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_SERVER_NEED_COMPANY_PASSWORD(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_NEED_COMPANY_PASSWORD(Packet &p); /** * Send a password to the server to authorize: @@ -231,7 +231,7 @@ protected: * string The password. * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_CLIENT_GAME_PASSWORD(Packet *p); + virtual NetworkRecvStatus Receive_CLIENT_GAME_PASSWORD(Packet &p); /** * Send a password to the server to authorize @@ -239,7 +239,7 @@ protected: * string The password. * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_CLIENT_COMPANY_PASSWORD(Packet *p); + virtual NetworkRecvStatus Receive_CLIENT_COMPANY_PASSWORD(Packet &p); /** * The client is joined and ready to receive their map: @@ -248,61 +248,61 @@ protected: * string Network ID of the server. * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_SERVER_WELCOME(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_WELCOME(Packet &p); /** * Request the map from the server. * uint32_t NewGRF version (release versions of OpenTTD only). * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_CLIENT_GETMAP(Packet *p); + virtual NetworkRecvStatus Receive_CLIENT_GETMAP(Packet &p); /** * Notification that another client is currently receiving the map: * uint8_t Number of clients waiting in front of you. * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_SERVER_WAIT(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_WAIT(Packet &p); /** * Sends that the server will begin with sending the map to the client: * uint32_t Current frame. * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_SERVER_MAP_BEGIN(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_MAP_BEGIN(Packet &p); /** * Sends the size of the map to the client. * uint32_t Size of the (compressed) map (in bytes). * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_SERVER_MAP_SIZE(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_MAP_SIZE(Packet &p); /** * Sends the data of the map to the client: * Contains a part of the map (until max size of packet). * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_SERVER_MAP_DATA(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_MAP_DATA(Packet &p); /** * Sends that all data of the map are sent to the client: * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_SERVER_MAP_DONE(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_MAP_DONE(Packet &p); /** * Tell the server that we are done receiving/loading the map. * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_CLIENT_MAP_OK(Packet *p); + virtual NetworkRecvStatus Receive_CLIENT_MAP_OK(Packet &p); /** * A client joined (PACKET_CLIENT_MAP_OK), what usually directly follows is a PACKET_SERVER_CLIENT_INFO: * uint32_t ID of the client that just joined the game. * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_SERVER_JOIN(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_JOIN(Packet &p); /** * Sends the current frame counter to the client: @@ -313,7 +313,7 @@ protected: * uint8_t Random token to validate the client is actually listening (only occasionally present). * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_SERVER_FRAME(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_FRAME(Packet &p); /** * Sends a sync-check to the client: @@ -322,7 +322,7 @@ protected: * uint32_t General seed 2 (dependent on compile settings, not default). * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_SERVER_SYNC(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_SYNC(Packet &p); /** * Tell the server we are done with this frame: @@ -330,7 +330,7 @@ protected: * uint8_t The random token that the server sent in the PACKET_SERVER_FRAME packet. * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_CLIENT_ACK(Packet *p); + virtual NetworkRecvStatus Receive_CLIENT_ACK(Packet &p); /** * Send a DoCommand to the Server: @@ -341,7 +341,7 @@ protected: * uint8_t ID of the callback. * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_CLIENT_COMMAND(Packet *p); + virtual NetworkRecvStatus Receive_CLIENT_COMMAND(Packet &p); /** * Sends a DoCommand to the client: @@ -353,7 +353,7 @@ protected: * uint32_t Frame of execution. * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_SERVER_COMMAND(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_COMMAND(Packet &p); /** * Sends a chat-packet to the server: @@ -364,7 +364,7 @@ protected: * uint64_t data (used e.g. for 'give money' actions). * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_CLIENT_CHAT(Packet *p); + virtual NetworkRecvStatus Receive_CLIENT_CHAT(Packet &p); /** * Sends a chat-packet to the client: @@ -374,7 +374,7 @@ protected: * uint64_t data (used e.g. for 'give money' actions). * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_SERVER_CHAT(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_CHAT(Packet &p); /** * Sends a chat-packet for external source to the client: @@ -384,41 +384,41 @@ protected: * string Message (max NETWORK_CHAT_LENGTH). * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_SERVER_EXTERNAL_CHAT(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_EXTERNAL_CHAT(Packet &p); /** * Set the password for the clients current company: * string The password. * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_CLIENT_SET_PASSWORD(Packet *p); + virtual NetworkRecvStatus Receive_CLIENT_SET_PASSWORD(Packet &p); /** * Gives the client a new name: * string New name of the client. * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_CLIENT_SET_NAME(Packet *p); + virtual NetworkRecvStatus Receive_CLIENT_SET_NAME(Packet &p); /** * The client is quitting the game. * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_CLIENT_QUIT(Packet *p); + virtual NetworkRecvStatus Receive_CLIENT_QUIT(Packet &p); /** * The client made an error and is quitting the game. * uint8_t Error of the code caused (see NetworkErrorCode). * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_CLIENT_ERROR(Packet *p); + virtual NetworkRecvStatus Receive_CLIENT_ERROR(Packet &p); /** * Notification that a client left the game: * uint32_t ID of the client. * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_SERVER_QUIT(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_QUIT(Packet &p); /** * Inform all clients that one client made an error and thus has quit/been disconnected: @@ -426,19 +426,19 @@ protected: * uint8_t Code of the error caused (see NetworkErrorCode). * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_SERVER_ERROR_QUIT(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_ERROR_QUIT(Packet &p); /** * Let the clients know that the server is closing. * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_SERVER_SHUTDOWN(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_SHUTDOWN(Packet &p); /** * Let the clients know that the server is loading a new map. * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_SERVER_NEWGAME(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_NEWGAME(Packet &p); /** * Send the result of an issues RCon command back to the client: @@ -446,7 +446,7 @@ protected: * string Output of the RCon command * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_SERVER_RCON(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_RCON(Packet &p); /** * Send an RCon command to the server: @@ -454,7 +454,7 @@ protected: * string Command to be executed. * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_CLIENT_RCON(Packet *p); + virtual NetworkRecvStatus Receive_CLIENT_RCON(Packet &p); /** * Sends information about all used GRFs to the client: @@ -463,13 +463,13 @@ protected: * 16 * uint8_t MD5 checksum of the GRF * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_SERVER_CHECK_NEWGRFS(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_CHECK_NEWGRFS(Packet &p); /** * Tell the server that we have the required GRFs * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_CLIENT_NEWGRFS_CHECKED(Packet *p); + virtual NetworkRecvStatus Receive_CLIENT_NEWGRFS_CHECKED(Packet &p); /** * Move a client from one company into another: @@ -477,7 +477,7 @@ protected: * uint8_t ID of the new company. * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_SERVER_MOVE(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_MOVE(Packet &p); /** * Request the server to move this client into another company: @@ -485,14 +485,14 @@ protected: * string Password, if the company is password protected. * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_CLIENT_MOVE(Packet *p); + virtual NetworkRecvStatus Receive_CLIENT_MOVE(Packet &p); /** * Update the clients knowledge of which company is password protected: * uint16_t Bitwise representation of each company * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_SERVER_COMPANY_UPDATE(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_COMPANY_UPDATE(Packet &p); /** * Update the clients knowledge of the max settings: @@ -500,9 +500,9 @@ protected: * uint8_t Maximum number of spectators allowed. * @param p The packet that was just received. */ - virtual NetworkRecvStatus Receive_SERVER_CONFIG_UPDATE(Packet *p); + virtual NetworkRecvStatus Receive_SERVER_CONFIG_UPDATE(Packet &p); - NetworkRecvStatus HandlePacket(Packet *p); + NetworkRecvStatus HandlePacket(Packet &p); NetworkGameSocketHandler(SOCKET s); public: @@ -542,8 +542,8 @@ public: NetworkRecvStatus ReceivePackets(); - const char *ReceiveCommand(Packet *p, CommandPacket *cp); - void SendCommand(Packet *p, const CommandPacket *cp); + const char *ReceiveCommand(Packet &p, CommandPacket *cp); + void SendCommand(Packet &p, const CommandPacket *cp); bool IsPendingDeletion() const { return this->is_pending_deletion; } diff --git a/src/network/core/tcp_stun.cpp b/src/network/core/tcp_stun.cpp index 1445fe30e5..a03bb7cf72 100644 --- a/src/network/core/tcp_stun.cpp +++ b/src/network/core/tcp_stun.cpp @@ -26,4 +26,4 @@ bool NetworkStunSocketHandler::ReceiveInvalidPacket(PacketStunType type) return false; } -bool NetworkStunSocketHandler::Receive_SERCLI_STUN(Packet *) { return this->ReceiveInvalidPacket(PACKET_STUN_SERCLI_STUN); } +bool NetworkStunSocketHandler::Receive_SERCLI_STUN(Packet &) { return this->ReceiveInvalidPacket(PACKET_STUN_SERCLI_STUN); } diff --git a/src/network/core/tcp_stun.h b/src/network/core/tcp_stun.h index 2eca700181..72ebc470bd 100644 --- a/src/network/core/tcp_stun.h +++ b/src/network/core/tcp_stun.h @@ -39,7 +39,7 @@ protected: * @param p The packet that was just received. * @return True upon success, otherwise false. */ - virtual bool Receive_SERCLI_STUN(Packet *p); + virtual bool Receive_SERCLI_STUN(Packet &p); public: /** diff --git a/src/network/core/tcp_turn.cpp b/src/network/core/tcp_turn.cpp index 0fc549aacd..ae600e7bfb 100644 --- a/src/network/core/tcp_turn.cpp +++ b/src/network/core/tcp_turn.cpp @@ -22,9 +22,9 @@ * @param p the packet to handle * @return true if we should immediately handle further packets, false otherwise */ -bool NetworkTurnSocketHandler::HandlePacket(Packet *p) +bool NetworkTurnSocketHandler::HandlePacket(Packet &p) { - PacketTurnType type = (PacketTurnType)p->Recv_uint8(); + PacketTurnType type = (PacketTurnType)p.Recv_uint8(); switch (type) { case PACKET_TURN_TURN_ERROR: return this->Receive_TURN_ERROR(p); @@ -47,7 +47,7 @@ bool NetworkTurnSocketHandler::ReceivePackets() static const int MAX_PACKETS_TO_RECEIVE = 4; int i = MAX_PACKETS_TO_RECEIVE; while (--i != 0 && (p = this->ReceivePacket()) != nullptr) { - bool cont = this->HandlePacket(p.get()); + bool cont = this->HandlePacket(*p); if (!cont) return true; } @@ -65,6 +65,6 @@ bool NetworkTurnSocketHandler::ReceiveInvalidPacket(PacketTurnType type) return false; } -bool NetworkTurnSocketHandler::Receive_TURN_ERROR(Packet *) { return this->ReceiveInvalidPacket(PACKET_TURN_TURN_ERROR); } -bool NetworkTurnSocketHandler::Receive_SERCLI_CONNECT(Packet *) { return this->ReceiveInvalidPacket(PACKET_TURN_SERCLI_CONNECT); } -bool NetworkTurnSocketHandler::Receive_TURN_CONNECTED(Packet *) { return this->ReceiveInvalidPacket(PACKET_TURN_TURN_CONNECTED); } +bool NetworkTurnSocketHandler::Receive_TURN_ERROR(Packet &) { return this->ReceiveInvalidPacket(PACKET_TURN_TURN_ERROR); } +bool NetworkTurnSocketHandler::Receive_SERCLI_CONNECT(Packet &) { return this->ReceiveInvalidPacket(PACKET_TURN_SERCLI_CONNECT); } +bool NetworkTurnSocketHandler::Receive_TURN_CONNECTED(Packet &) { return this->ReceiveInvalidPacket(PACKET_TURN_TURN_CONNECTED); } diff --git a/src/network/core/tcp_turn.h b/src/network/core/tcp_turn.h index b54a857982..5488a2b2d3 100644 --- a/src/network/core/tcp_turn.h +++ b/src/network/core/tcp_turn.h @@ -38,7 +38,7 @@ protected: * @param p The packet that was just received. * @return True upon success, otherwise false. */ - virtual bool Receive_TURN_ERROR(Packet *p); + virtual bool Receive_TURN_ERROR(Packet &p); /** * Client or servers wants to connect to the TURN server (on request by @@ -50,7 +50,7 @@ protected: * @param p The packet that was just received. * @return True upon success, otherwise false. */ - virtual bool Receive_SERCLI_CONNECT(Packet *p); + virtual bool Receive_SERCLI_CONNECT(Packet &p); /** * TURN server has connected client and server together and will now relay @@ -62,9 +62,9 @@ protected: * @param p The packet that was just received. * @return True upon success, otherwise false. */ - virtual bool Receive_TURN_CONNECTED(Packet *p); + virtual bool Receive_TURN_CONNECTED(Packet &p); - bool HandlePacket(Packet *p); + bool HandlePacket(Packet &p); public: /** * Create a new cs socket handler for a given cs. diff --git a/src/network/network_admin.cpp b/src/network/network_admin.cpp index a5c5483bf2..e16595f32a 100644 --- a/src/network/network_admin.cpp +++ b/src/network/network_admin.cpp @@ -489,11 +489,11 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendRcon(uint16_t colour, con return NETWORK_RECV_STATUS_OKAY; } -NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_RCON(Packet *p) +NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_RCON(Packet &p) { if (this->status == ADMIN_STATUS_INACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED); - std::string command = p->Recv_string(NETWORK_RCONCOMMAND_LENGTH); + std::string command = p.Recv_string(NETWORK_RCONCOMMAND_LENGTH); Debug(net, 3, "[admin] Rcon command from '{}' ({}): {}", this->admin_name, this->admin_version, command); @@ -503,11 +503,11 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_RCON(Packet *p) return this->SendRconEnd(command); } -NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_GAMESCRIPT(Packet *p) +NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_GAMESCRIPT(Packet &p) { if (this->status == ADMIN_STATUS_INACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED); - std::string json = p->Recv_string(NETWORK_GAMESCRIPT_JSON_LENGTH); + std::string json = p.Recv_string(NETWORK_GAMESCRIPT_JSON_LENGTH); Debug(net, 6, "[admin] GameScript JSON from '{}' ({}): {}", this->admin_name, this->admin_version, json); @@ -515,11 +515,11 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_GAMESCRIPT(Pack return NETWORK_RECV_STATUS_OKAY; } -NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_PING(Packet *p) +NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_PING(Packet &p) { if (this->status == ADMIN_STATUS_INACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED); - uint32_t d1 = p->Recv_uint32(); + uint32_t d1 = p.Recv_uint32(); Debug(net, 6, "[admin] Ping from '{}' ({}): {}", this->admin_name, this->admin_version, d1); @@ -627,11 +627,11 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCmdLogging(ClientID clien * Receiving functions ************/ -NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_JOIN(Packet *p) +NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_JOIN(Packet &p) { if (this->status != ADMIN_STATUS_INACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED); - std::string password = p->Recv_string(NETWORK_PASSWORD_LENGTH); + std::string password = p.Recv_string(NETWORK_PASSWORD_LENGTH); if (_settings_client.network.admin_password.empty() || _settings_client.network.admin_password.compare(password) != 0) { @@ -639,8 +639,8 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_JOIN(Packet *p) return this->SendError(NETWORK_ERROR_WRONG_PASSWORD); } - this->admin_name = p->Recv_string(NETWORK_CLIENT_NAME_LENGTH); - this->admin_version = p->Recv_string(NETWORK_REVISION_LENGTH); + this->admin_name = p.Recv_string(NETWORK_CLIENT_NAME_LENGTH); + this->admin_version = p.Recv_string(NETWORK_REVISION_LENGTH); if (this->admin_name.empty() || this->admin_version.empty()) { /* no name or version supplied */ @@ -654,18 +654,18 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_JOIN(Packet *p) return this->SendProtocol(); } -NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_QUIT(Packet *) +NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_QUIT(Packet &) { /* The admin is leaving nothing else to do */ return this->CloseConnection(); } -NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_UPDATE_FREQUENCY(Packet *p) +NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_UPDATE_FREQUENCY(Packet &p) { if (this->status == ADMIN_STATUS_INACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED); - AdminUpdateType type = (AdminUpdateType)p->Recv_uint16(); - AdminUpdateFrequency freq = (AdminUpdateFrequency)p->Recv_uint16(); + AdminUpdateType type = (AdminUpdateType)p.Recv_uint16(); + AdminUpdateFrequency freq = (AdminUpdateFrequency)p.Recv_uint16(); if (type >= ADMIN_UPDATE_END || (_admin_update_type_frequencies[type] & freq) != freq) { /* The server does not know of this UpdateType. */ @@ -680,12 +680,12 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_UPDATE_FREQUENC return NETWORK_RECV_STATUS_OKAY; } -NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_POLL(Packet *p) +NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_POLL(Packet &p) { if (this->status == ADMIN_STATUS_INACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED); - AdminUpdateType type = (AdminUpdateType)p->Recv_uint8(); - uint32_t d1 = p->Recv_uint32(); + AdminUpdateType type = (AdminUpdateType)p.Recv_uint8(); + uint32_t d1 = p.Recv_uint32(); switch (type) { case ADMIN_UPDATE_DATE: @@ -746,15 +746,15 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_POLL(Packet *p) return NETWORK_RECV_STATUS_OKAY; } -NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_CHAT(Packet *p) +NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_CHAT(Packet &p) { if (this->status == ADMIN_STATUS_INACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED); - NetworkAction action = (NetworkAction)p->Recv_uint8(); - DestType desttype = (DestType)p->Recv_uint8(); - int dest = p->Recv_uint32(); + NetworkAction action = (NetworkAction)p.Recv_uint8(); + DestType desttype = (DestType)p.Recv_uint8(); + int dest = p.Recv_uint32(); - std::string msg = p->Recv_string(NETWORK_CHAT_LENGTH); + std::string msg = p.Recv_string(NETWORK_CHAT_LENGTH); switch (action) { case NETWORK_ACTION_CHAT: @@ -772,14 +772,14 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_CHAT(Packet *p) return NETWORK_RECV_STATUS_OKAY; } -NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_EXTERNAL_CHAT(Packet *p) +NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_EXTERNAL_CHAT(Packet &p) { if (this->status == ADMIN_STATUS_INACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED); - std::string source = p->Recv_string(NETWORK_CHAT_LENGTH); - TextColour colour = (TextColour)p->Recv_uint16(); - std::string user = p->Recv_string(NETWORK_CHAT_LENGTH); - std::string msg = p->Recv_string(NETWORK_CHAT_LENGTH); + std::string source = p.Recv_string(NETWORK_CHAT_LENGTH); + TextColour colour = (TextColour)p.Recv_uint16(); + std::string user = p.Recv_string(NETWORK_CHAT_LENGTH); + std::string msg = p.Recv_string(NETWORK_CHAT_LENGTH); if (!IsValidConsoleColour(colour)) { Debug(net, 1, "[admin] Not supported chat colour {} ({}, {}, {}) from '{}' ({}).", (uint16_t)colour, source, user, msg, this->admin_name, this->admin_version); diff --git a/src/network/network_admin.h b/src/network/network_admin.h index 0d39a313df..3873d66293 100644 --- a/src/network/network_admin.h +++ b/src/network/network_admin.h @@ -24,15 +24,15 @@ extern NetworkAdminSocketPool _networkadminsocket_pool; /** Class for handling the server side of the game connection. */ class ServerNetworkAdminSocketHandler : public NetworkAdminSocketPool::PoolItem<&_networkadminsocket_pool>, public NetworkAdminSocketHandler, public TCPListenHandler { protected: - NetworkRecvStatus Receive_ADMIN_JOIN(Packet *p) override; - NetworkRecvStatus Receive_ADMIN_QUIT(Packet *p) override; - NetworkRecvStatus Receive_ADMIN_UPDATE_FREQUENCY(Packet *p) override; - NetworkRecvStatus Receive_ADMIN_POLL(Packet *p) override; - NetworkRecvStatus Receive_ADMIN_CHAT(Packet *p) override; - NetworkRecvStatus Receive_ADMIN_EXTERNAL_CHAT(Packet *p) override; - NetworkRecvStatus Receive_ADMIN_RCON(Packet *p) override; - NetworkRecvStatus Receive_ADMIN_GAMESCRIPT(Packet *p) override; - NetworkRecvStatus Receive_ADMIN_PING(Packet *p) override; + NetworkRecvStatus Receive_ADMIN_JOIN(Packet &p) override; + NetworkRecvStatus Receive_ADMIN_QUIT(Packet &p) override; + NetworkRecvStatus Receive_ADMIN_UPDATE_FREQUENCY(Packet &p) override; + NetworkRecvStatus Receive_ADMIN_POLL(Packet &p) override; + NetworkRecvStatus Receive_ADMIN_CHAT(Packet &p) override; + NetworkRecvStatus Receive_ADMIN_EXTERNAL_CHAT(Packet &p) override; + NetworkRecvStatus Receive_ADMIN_RCON(Packet &p) override; + NetworkRecvStatus Receive_ADMIN_GAMESCRIPT(Packet &p) override; + NetworkRecvStatus Receive_ADMIN_PING(Packet &p) override; NetworkRecvStatus SendProtocol(); NetworkRecvStatus SendPong(uint32_t d1); diff --git a/src/network/network_client.cpp b/src/network/network_client.cpp index 61db0a152a..083823431f 100644 --- a/src/network/network_client.cpp +++ b/src/network/network_client.cpp @@ -81,19 +81,19 @@ struct PacketReader : LoadFilter { * Add a packet to this buffer. * @param p The packet to add. */ - void AddPacket(Packet *p) + void AddPacket(Packet &p) { assert(this->read_bytes == 0); - p->TransferOutWithLimit(TransferOutMemCopy, this->bufe - this->buf, this); + p.TransferOutWithLimit(TransferOutMemCopy, this->bufe - this->buf, this); /* Did everything fit in the current chunk, then we're done. */ - if (p->RemainingBytesToTransfer() == 0) return; + if (p.RemainingBytesToTransfer() == 0) return; /* Allocate a new chunk and add the remaining data. */ this->blocks.push_back(this->buf = CallocT(CHUNK)); this->bufe = this->buf + CHUNK; - p->TransferOutWithLimit(TransferOutMemCopy, this->bufe - this->buf, this); + p.TransferOutWithLimit(TransferOutMemCopy, this->bufe - this->buf, this); } size_t Read(byte *rbuf, size_t size) override @@ -440,7 +440,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendCommand(const CommandPacke Debug(net, 9, "Client::SendCommand(): cmd={}", cp->cmd); auto p = std::make_unique(PACKET_CLIENT_COMMAND); - my_client->NetworkGameSocketHandler::SendCommand(p.get(), cp); + my_client->NetworkGameSocketHandler::SendCommand(*p, cp); my_client->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; @@ -562,12 +562,11 @@ bool ClientNetworkGameSocketHandler::IsConnected() /*********** * Receiving functions - * DEF_CLIENT_RECEIVE_COMMAND has parameter: Packet *p ************/ extern bool SafeLoad(const std::string &filename, SaveLoadOperation fop, DetailedFileType dft, GameMode newgm, Subdirectory subdir, std::shared_ptr lf); -NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_FULL(Packet *) +NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_FULL(Packet &) { Debug(net, 9, "Client::Receive_SERVER_FULL()"); @@ -577,7 +576,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_FULL(Packet *) return NETWORK_RECV_STATUS_SERVER_FULL; } -NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_BANNED(Packet *) +NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_BANNED(Packet &) { Debug(net, 9, "Client::Receive_SERVER_BANNED()"); @@ -590,15 +589,15 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_BANNED(Packet * /* This packet contains info about the client (playas and name) * as client we save this in NetworkClientInfo, linked via 'client_id' * which is always an unique number on a server. */ -NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CLIENT_INFO(Packet *p) +NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CLIENT_INFO(Packet &p) { NetworkClientInfo *ci; - ClientID client_id = (ClientID)p->Recv_uint32(); - CompanyID playas = (CompanyID)p->Recv_uint8(); + ClientID client_id = (ClientID)p.Recv_uint32(); + CompanyID playas = (CompanyID)p.Recv_uint8(); Debug(net, 9, "Client::Receive_SERVER_CLIENT_INFO(): client_id={}, playas={}", client_id, playas); - std::string name = p->Recv_string(NETWORK_NAME_LENGTH); + std::string name = p.Recv_string(NETWORK_NAME_LENGTH); if (this->status < STATUS_AUTHORIZED) return NETWORK_RECV_STATUS_MALFORMED_PACKET; if (this->HasClientQuit()) return NETWORK_RECV_STATUS_CLIENT_QUIT; @@ -648,7 +647,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CLIENT_INFO(Pac return NETWORK_RECV_STATUS_OKAY; } -NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_ERROR(Packet *p) +NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_ERROR(Packet &p) { static const StringID network_error_strings[] = { STR_NETWORK_ERROR_LOSTCONNECTION, // NETWORK_ERROR_GENERAL @@ -675,15 +674,15 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_ERROR(Packet *p }; static_assert(lengthof(network_error_strings) == NETWORK_ERROR_END); - NetworkErrorCode error = (NetworkErrorCode)p->Recv_uint8(); + NetworkErrorCode error = (NetworkErrorCode)p.Recv_uint8(); Debug(net, 9, "Client::Receive_SERVER_ERROR(): error={}", error); StringID err = STR_NETWORK_ERROR_LOSTCONNECTION; if (error < (ptrdiff_t)lengthof(network_error_strings)) err = network_error_strings[error]; /* In case of kicking a client, we assume there is a kick message in the packet if we can read one byte */ - if (error == NETWORK_ERROR_KICKED && p->CanReadFromPacket(1)) { - SetDParamStr(0, p->Recv_string(NETWORK_CHAT_LENGTH)); + if (error == NETWORK_ERROR_KICKED && p.CanReadFromPacket(1)) { + SetDParamStr(0, p.Recv_string(NETWORK_CHAT_LENGTH)); ShowErrorMessage(err, STR_NETWORK_ERROR_KICK_MESSAGE, WL_CRITICAL); } else { ShowErrorMessage(err, INVALID_STRING_ID, WL_CRITICAL); @@ -695,11 +694,11 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_ERROR(Packet *p return NETWORK_RECV_STATUS_SERVER_ERROR; } -NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CHECK_NEWGRFS(Packet *p) +NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CHECK_NEWGRFS(Packet &p) { if (this->status != STATUS_JOIN) return NETWORK_RECV_STATUS_MALFORMED_PACKET; - uint grf_count = p->Recv_uint8(); + uint grf_count = p.Recv_uint8(); NetworkRecvStatus ret = NETWORK_RECV_STATUS_OKAY; Debug(net, 9, "Client::Receive_SERVER_CHECK_NEWGRFS(): grf_count={}", grf_count); @@ -707,7 +706,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CHECK_NEWGRFS(P /* Check all GRFs */ for (; grf_count > 0; grf_count--) { GRFIdentifier c; - DeserializeGRFIdentifier(*p, c); + DeserializeGRFIdentifier(p, c); /* Check whether we know this GRF */ const GRFConfig *f = FindGRFConfig(c.grfid, FGCM_EXACT, &c.md5sum); @@ -728,7 +727,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CHECK_NEWGRFS(P return ret; } -NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_NEED_GAME_PASSWORD(Packet *) +NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_NEED_GAME_PASSWORD(Packet &) { if (this->status < STATUS_JOIN || this->status >= STATUS_AUTH_GAME) return NETWORK_RECV_STATUS_MALFORMED_PACKET; Debug(net, 9, "Client::status = AUTH_GAME"); @@ -745,7 +744,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_NEED_GAME_PASSW return NETWORK_RECV_STATUS_OKAY; } -NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_NEED_COMPANY_PASSWORD(Packet *p) +NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_NEED_COMPANY_PASSWORD(Packet &p) { if (this->status < STATUS_JOIN || this->status >= STATUS_AUTH_COMPANY) return NETWORK_RECV_STATUS_MALFORMED_PACKET; Debug(net, 9, "Client::status = AUTH_COMPANY"); @@ -753,8 +752,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_NEED_COMPANY_PA Debug(net, 9, "Client::Receive_SERVER_NEED_COMPANY_PASSWORD()"); - _password_game_seed = p->Recv_uint32(); - _password_server_id = p->Recv_string(NETWORK_SERVER_ID_LENGTH); + _password_game_seed = p.Recv_uint32(); + _password_server_id = p.Recv_string(NETWORK_SERVER_ID_LENGTH); if (this->HasClientQuit()) return NETWORK_RECV_STATUS_MALFORMED_PACKET; if (!_network_join.company_password.empty()) { @@ -766,25 +765,25 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_NEED_COMPANY_PA return NETWORK_RECV_STATUS_OKAY; } -NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_WELCOME(Packet *p) +NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_WELCOME(Packet &p) { if (this->status < STATUS_JOIN || this->status >= STATUS_AUTHORIZED) return NETWORK_RECV_STATUS_MALFORMED_PACKET; Debug(net, 9, "Client::status = AUTHORIZED"); this->status = STATUS_AUTHORIZED; - _network_own_client_id = (ClientID)p->Recv_uint32(); + _network_own_client_id = (ClientID)p.Recv_uint32(); Debug(net, 9, "Client::Receive_SERVER_WELCOME(): client_id={}", _network_own_client_id); /* Initialize the password hash salting variables, even if they were previously. */ - _password_game_seed = p->Recv_uint32(); - _password_server_id = p->Recv_string(NETWORK_SERVER_ID_LENGTH); + _password_game_seed = p.Recv_uint32(); + _password_server_id = p.Recv_string(NETWORK_SERVER_ID_LENGTH); /* Start receiving the map */ return SendGetMap(); } -NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_WAIT(Packet *p) +NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_WAIT(Packet &p) { /* We set the internal wait state when requesting the map. */ if (this->status != STATUS_MAP_WAIT) return NETWORK_RECV_STATUS_MALFORMED_PACKET; @@ -794,13 +793,13 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_WAIT(Packet *p) /* But... only now we set the join status to waiting, instead of requesting. */ Debug(net, 9, "Client::join_status = WAITING"); _network_join_status = NETWORK_JOIN_STATUS_WAITING; - _network_join_waiting = p->Recv_uint8(); + _network_join_waiting = p.Recv_uint8(); SetWindowDirty(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_JOIN); return NETWORK_RECV_STATUS_OKAY; } -NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_BEGIN(Packet *p) +NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_BEGIN(Packet &p) { if (this->status < STATUS_AUTHORIZED || this->status >= STATUS_MAP) return NETWORK_RECV_STATUS_MALFORMED_PACKET; Debug(net, 9, "Client::status = MAP"); @@ -810,7 +809,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_BEGIN(Packe this->savegame = std::make_shared(); - _frame_counter = _frame_counter_server = _frame_counter_max = p->Recv_uint32(); + _frame_counter = _frame_counter_server = _frame_counter_max = p.Recv_uint32(); Debug(net, 9, "Client::Receive_SERVER_MAP_BEGIN(): frame_counter={}", _frame_counter); @@ -824,12 +823,12 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_BEGIN(Packe return NETWORK_RECV_STATUS_OKAY; } -NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_SIZE(Packet *p) +NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_SIZE(Packet &p) { if (this->status != STATUS_MAP) return NETWORK_RECV_STATUS_MALFORMED_PACKET; if (this->savegame == nullptr) return NETWORK_RECV_STATUS_MALFORMED_PACKET; - _network_join_bytes_total = p->Recv_uint32(); + _network_join_bytes_total = p.Recv_uint32(); SetWindowDirty(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_JOIN); Debug(net, 9, "Client::Receive_SERVER_MAP_SIZE(): bytes_total={}", _network_join_bytes_total); @@ -837,7 +836,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_SIZE(Packet return NETWORK_RECV_STATUS_OKAY; } -NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_DATA(Packet *p) +NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_DATA(Packet &p) { if (this->status != STATUS_MAP) return NETWORK_RECV_STATUS_MALFORMED_PACKET; if (this->savegame == nullptr) return NETWORK_RECV_STATUS_MALFORMED_PACKET; @@ -851,7 +850,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_DATA(Packet return NETWORK_RECV_STATUS_OKAY; } -NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_DONE(Packet *) +NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_DONE(Packet &) { if (this->status != STATUS_MAP) return NETWORK_RECV_STATUS_MALFORMED_PACKET; if (this->savegame == nullptr) return NETWORK_RECV_STATUS_MALFORMED_PACKET; @@ -907,29 +906,29 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_DONE(Packet return NETWORK_RECV_STATUS_OKAY; } -NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_FRAME(Packet *p) +NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_FRAME(Packet &p) { if (this->status != STATUS_ACTIVE) return NETWORK_RECV_STATUS_MALFORMED_PACKET; - _frame_counter_server = p->Recv_uint32(); - _frame_counter_max = p->Recv_uint32(); + _frame_counter_server = p.Recv_uint32(); + _frame_counter_max = p.Recv_uint32(); #ifdef ENABLE_NETWORK_SYNC_EVERY_FRAME /* Test if the server supports this option * and if we are at the frame the server is */ #ifdef NETWORK_SEND_DOUBLE_SEED - if (p->CanReadFromPacket(sizeof(uint32_t) + sizeof(uint32_t))) { + if (p.CanReadFromPacket(sizeof(uint32_t) + sizeof(uint32_t))) { #else - if (p->CanReadFromPacket(sizeof(uint32_t))) { + if (p.CanReadFromPacket(sizeof(uint32_t))) { #endif _sync_frame = _frame_counter_server; - _sync_seed_1 = p->Recv_uint32(); + _sync_seed_1 = p.Recv_uint32(); #ifdef NETWORK_SEND_DOUBLE_SEED - _sync_seed_2 = p->Recv_uint32(); + _sync_seed_2 = p.Recv_uint32(); #endif } #endif /* Receive the token. */ - if (p->CanReadFromPacket(sizeof(uint8_t))) this->token = p->Recv_uint8(); + if (p.CanReadFromPacket(sizeof(uint8_t))) this->token = p.Recv_uint8(); /* Let the server know that we received this frame correctly * We do this only once per day, to save some bandwidth ;) */ @@ -942,14 +941,14 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_FRAME(Packet *p return NETWORK_RECV_STATUS_OKAY; } -NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_SYNC(Packet *p) +NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_SYNC(Packet &p) { if (this->status != STATUS_ACTIVE) return NETWORK_RECV_STATUS_MALFORMED_PACKET; - _sync_frame = p->Recv_uint32(); - _sync_seed_1 = p->Recv_uint32(); + _sync_frame = p.Recv_uint32(); + _sync_seed_1 = p.Recv_uint32(); #ifdef NETWORK_SEND_DOUBLE_SEED - _sync_seed_2 = p->Recv_uint32(); + _sync_seed_2 = p.Recv_uint32(); #endif Debug(net, 9, "Client::Receive_SERVER_SYNC(): sync_frame={}, sync_seed_1={}", _sync_frame, _sync_seed_1); @@ -957,14 +956,14 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_SYNC(Packet *p) return NETWORK_RECV_STATUS_OKAY; } -NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_COMMAND(Packet *p) +NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_COMMAND(Packet &p) { if (this->status != STATUS_ACTIVE) return NETWORK_RECV_STATUS_MALFORMED_PACKET; CommandPacket cp; const char *err = this->ReceiveCommand(p, &cp); - cp.frame = p->Recv_uint32(); - cp.my_cmd = p->Recv_bool(); + cp.frame = p.Recv_uint32(); + cp.my_cmd = p.Recv_bool(); Debug(net, 9, "Client::Receive_SERVER_COMMAND(): cmd={}, frame={}", cp.cmd, cp.frame); @@ -978,18 +977,18 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_COMMAND(Packet return NETWORK_RECV_STATUS_OKAY; } -NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CHAT(Packet *p) +NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CHAT(Packet &p) { if (this->status != STATUS_ACTIVE) return NETWORK_RECV_STATUS_MALFORMED_PACKET; std::string name; const NetworkClientInfo *ci = nullptr, *ci_to; - NetworkAction action = (NetworkAction)p->Recv_uint8(); - ClientID client_id = (ClientID)p->Recv_uint32(); - bool self_send = p->Recv_bool(); - std::string msg = p->Recv_string(NETWORK_CHAT_LENGTH); - int64_t data = p->Recv_uint64(); + NetworkAction action = (NetworkAction)p.Recv_uint8(); + ClientID client_id = (ClientID)p.Recv_uint32(); + bool self_send = p.Recv_bool(); + std::string msg = p.Recv_string(NETWORK_CHAT_LENGTH); + int64_t data = p.Recv_uint64(); Debug(net, 9, "Client::Receive_SERVER_CHAT(): action={}, client_id={}, self_send={}", action, client_id, self_send); @@ -1029,14 +1028,14 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CHAT(Packet *p) return NETWORK_RECV_STATUS_OKAY; } -NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_EXTERNAL_CHAT(Packet *p) +NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_EXTERNAL_CHAT(Packet &p) { if (this->status != STATUS_ACTIVE) return NETWORK_RECV_STATUS_MALFORMED_PACKET; - std::string source = p->Recv_string(NETWORK_CHAT_LENGTH); - TextColour colour = (TextColour)p->Recv_uint16(); - std::string user = p->Recv_string(NETWORK_CHAT_LENGTH); - std::string msg = p->Recv_string(NETWORK_CHAT_LENGTH); + std::string source = p.Recv_string(NETWORK_CHAT_LENGTH); + TextColour colour = (TextColour)p.Recv_uint16(); + std::string user = p.Recv_string(NETWORK_CHAT_LENGTH); + std::string msg = p.Recv_string(NETWORK_CHAT_LENGTH); Debug(net, 9, "Client::Receive_SERVER_EXTERNAL_CHAT(): source={}", source); @@ -1047,17 +1046,17 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_EXTERNAL_CHAT(P return NETWORK_RECV_STATUS_OKAY; } -NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_ERROR_QUIT(Packet *p) +NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_ERROR_QUIT(Packet &p) { if (this->status < STATUS_AUTHORIZED) return NETWORK_RECV_STATUS_MALFORMED_PACKET; - ClientID client_id = (ClientID)p->Recv_uint32(); + ClientID client_id = (ClientID)p.Recv_uint32(); Debug(net, 9, "Client::Receive_SERVER_ERROR_QUIT(): client_id={}", client_id); NetworkClientInfo *ci = NetworkClientInfo::GetByClientID(client_id); if (ci != nullptr) { - NetworkTextMessage(NETWORK_ACTION_LEAVE, CC_DEFAULT, false, ci->client_name, "", GetNetworkErrorMsg((NetworkErrorCode)p->Recv_uint8())); + NetworkTextMessage(NETWORK_ACTION_LEAVE, CC_DEFAULT, false, ci->client_name, "", GetNetworkErrorMsg((NetworkErrorCode)p.Recv_uint8())); delete ci; } @@ -1066,11 +1065,11 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_ERROR_QUIT(Pack return NETWORK_RECV_STATUS_OKAY; } -NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_QUIT(Packet *p) +NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_QUIT(Packet &p) { if (this->status < STATUS_AUTHORIZED) return NETWORK_RECV_STATUS_MALFORMED_PACKET; - ClientID client_id = (ClientID)p->Recv_uint32(); + ClientID client_id = (ClientID)p.Recv_uint32(); Debug(net, 9, "Client::Receive_SERVER_QUIT(): client_id={}", client_id); @@ -1088,11 +1087,11 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_QUIT(Packet *p) return NETWORK_RECV_STATUS_OKAY; } -NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_JOIN(Packet *p) +NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_JOIN(Packet &p) { if (this->status < STATUS_AUTHORIZED) return NETWORK_RECV_STATUS_MALFORMED_PACKET; - ClientID client_id = (ClientID)p->Recv_uint32(); + ClientID client_id = (ClientID)p.Recv_uint32(); Debug(net, 9, "Client::Receive_SERVER_JOIN(): client_id={}", client_id); @@ -1106,7 +1105,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_JOIN(Packet *p) return NETWORK_RECV_STATUS_OKAY; } -NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_SHUTDOWN(Packet *) +NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_SHUTDOWN(Packet &) { Debug(net, 9, "Client::Receive_SERVER_SHUTDOWN()"); @@ -1121,7 +1120,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_SHUTDOWN(Packet return NETWORK_RECV_STATUS_SERVER_ERROR; } -NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_NEWGAME(Packet *) +NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_NEWGAME(Packet &) { Debug(net, 9, "Client::Receive_SERVER_NEWGAME()"); @@ -1140,29 +1139,29 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_NEWGAME(Packet return NETWORK_RECV_STATUS_SERVER_ERROR; } -NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_RCON(Packet *p) +NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_RCON(Packet &p) { if (this->status < STATUS_AUTHORIZED) return NETWORK_RECV_STATUS_MALFORMED_PACKET; Debug(net, 9, "Client::Receive_SERVER_RCON()"); - TextColour colour_code = (TextColour)p->Recv_uint16(); + TextColour colour_code = (TextColour)p.Recv_uint16(); if (!IsValidConsoleColour(colour_code)) return NETWORK_RECV_STATUS_MALFORMED_PACKET; - std::string rcon_out = p->Recv_string(NETWORK_RCONCOMMAND_LENGTH); + std::string rcon_out = p.Recv_string(NETWORK_RCONCOMMAND_LENGTH); IConsolePrint(colour_code, rcon_out); return NETWORK_RECV_STATUS_OKAY; } -NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MOVE(Packet *p) +NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MOVE(Packet &p) { if (this->status < STATUS_AUTHORIZED) return NETWORK_RECV_STATUS_MALFORMED_PACKET; /* Nothing more in this packet... */ - ClientID client_id = (ClientID)p->Recv_uint32(); - CompanyID company_id = (CompanyID)p->Recv_uint8(); + ClientID client_id = (ClientID)p.Recv_uint32(); + CompanyID company_id = (CompanyID)p.Recv_uint8(); Debug(net, 9, "Client::Receive_SERVER_MOVE(): client_id={}, comapny_id={}", client_id, company_id); @@ -1186,12 +1185,12 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MOVE(Packet *p) return NETWORK_RECV_STATUS_OKAY; } -NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CONFIG_UPDATE(Packet *p) +NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CONFIG_UPDATE(Packet &p) { if (this->status < STATUS_ACTIVE) return NETWORK_RECV_STATUS_MALFORMED_PACKET; - _network_server_max_companies = p->Recv_uint8(); - _network_server_name = p->Recv_string(NETWORK_NAME_LENGTH); + _network_server_max_companies = p.Recv_uint8(); + _network_server_name = p.Recv_string(NETWORK_NAME_LENGTH); SetWindowClassesDirty(WC_CLIENT_LIST); Debug(net, 9, "Client::Receive_SERVER_CONFIG_UPDATE(): max_companies={}", _network_server_max_companies); @@ -1199,12 +1198,12 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CONFIG_UPDATE(P return NETWORK_RECV_STATUS_OKAY; } -NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_COMPANY_UPDATE(Packet *p) +NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_COMPANY_UPDATE(Packet &p) { if (this->status < STATUS_ACTIVE) return NETWORK_RECV_STATUS_MALFORMED_PACKET; static_assert(sizeof(_network_company_passworded) <= sizeof(uint16_t)); - _network_company_passworded = p->Recv_uint16(); + _network_company_passworded = p.Recv_uint16(); SetWindowClassesDirty(WC_COMPANY); Debug(net, 9, "Client::Receive_SERVER_COMPANY_UPDATE()"); diff --git a/src/network/network_client.h b/src/network/network_client.h index 038ed0e551..aede7359e8 100644 --- a/src/network/network_client.h +++ b/src/network/network_client.h @@ -40,33 +40,33 @@ protected: friend void NetworkClose(bool close_admins); static ClientNetworkGameSocketHandler *my_client; ///< This is us! - NetworkRecvStatus Receive_SERVER_FULL(Packet *p) override; - NetworkRecvStatus Receive_SERVER_BANNED(Packet *p) override; - NetworkRecvStatus Receive_SERVER_ERROR(Packet *p) override; - NetworkRecvStatus Receive_SERVER_CLIENT_INFO(Packet *p) override; - NetworkRecvStatus Receive_SERVER_NEED_GAME_PASSWORD(Packet *p) override; - NetworkRecvStatus Receive_SERVER_NEED_COMPANY_PASSWORD(Packet *p) override; - NetworkRecvStatus Receive_SERVER_WELCOME(Packet *p) override; - NetworkRecvStatus Receive_SERVER_WAIT(Packet *p) override; - NetworkRecvStatus Receive_SERVER_MAP_BEGIN(Packet *p) override; - NetworkRecvStatus Receive_SERVER_MAP_SIZE(Packet *p) override; - NetworkRecvStatus Receive_SERVER_MAP_DATA(Packet *p) override; - NetworkRecvStatus Receive_SERVER_MAP_DONE(Packet *p) override; - NetworkRecvStatus Receive_SERVER_JOIN(Packet *p) override; - NetworkRecvStatus Receive_SERVER_FRAME(Packet *p) override; - NetworkRecvStatus Receive_SERVER_SYNC(Packet *p) override; - NetworkRecvStatus Receive_SERVER_COMMAND(Packet *p) override; - NetworkRecvStatus Receive_SERVER_CHAT(Packet *p) override; - NetworkRecvStatus Receive_SERVER_EXTERNAL_CHAT(Packet *p) override; - NetworkRecvStatus Receive_SERVER_QUIT(Packet *p) override; - NetworkRecvStatus Receive_SERVER_ERROR_QUIT(Packet *p) override; - NetworkRecvStatus Receive_SERVER_SHUTDOWN(Packet *p) override; - NetworkRecvStatus Receive_SERVER_NEWGAME(Packet *p) override; - NetworkRecvStatus Receive_SERVER_RCON(Packet *p) override; - NetworkRecvStatus Receive_SERVER_CHECK_NEWGRFS(Packet *p) override; - NetworkRecvStatus Receive_SERVER_MOVE(Packet *p) override; - NetworkRecvStatus Receive_SERVER_COMPANY_UPDATE(Packet *p) override; - NetworkRecvStatus Receive_SERVER_CONFIG_UPDATE(Packet *p) override; + NetworkRecvStatus Receive_SERVER_FULL(Packet &p) override; + NetworkRecvStatus Receive_SERVER_BANNED(Packet &p) override; + NetworkRecvStatus Receive_SERVER_ERROR(Packet &p) override; + NetworkRecvStatus Receive_SERVER_CLIENT_INFO(Packet &p) override; + NetworkRecvStatus Receive_SERVER_NEED_GAME_PASSWORD(Packet &p) override; + NetworkRecvStatus Receive_SERVER_NEED_COMPANY_PASSWORD(Packet &p) override; + NetworkRecvStatus Receive_SERVER_WELCOME(Packet &p) override; + NetworkRecvStatus Receive_SERVER_WAIT(Packet &p) override; + NetworkRecvStatus Receive_SERVER_MAP_BEGIN(Packet &p) override; + NetworkRecvStatus Receive_SERVER_MAP_SIZE(Packet &p) override; + NetworkRecvStatus Receive_SERVER_MAP_DATA(Packet &p) override; + NetworkRecvStatus Receive_SERVER_MAP_DONE(Packet &p) override; + NetworkRecvStatus Receive_SERVER_JOIN(Packet &p) override; + NetworkRecvStatus Receive_SERVER_FRAME(Packet &p) override; + NetworkRecvStatus Receive_SERVER_SYNC(Packet &p) override; + NetworkRecvStatus Receive_SERVER_COMMAND(Packet &p) override; + NetworkRecvStatus Receive_SERVER_CHAT(Packet &p) override; + NetworkRecvStatus Receive_SERVER_EXTERNAL_CHAT(Packet &p) override; + NetworkRecvStatus Receive_SERVER_QUIT(Packet &p) override; + NetworkRecvStatus Receive_SERVER_ERROR_QUIT(Packet &p) override; + NetworkRecvStatus Receive_SERVER_SHUTDOWN(Packet &p) override; + NetworkRecvStatus Receive_SERVER_NEWGAME(Packet &p) override; + NetworkRecvStatus Receive_SERVER_RCON(Packet &p) override; + NetworkRecvStatus Receive_SERVER_CHECK_NEWGRFS(Packet &p) override; + NetworkRecvStatus Receive_SERVER_MOVE(Packet &p) override; + NetworkRecvStatus Receive_SERVER_COMPANY_UPDATE(Packet &p) override; + NetworkRecvStatus Receive_SERVER_CONFIG_UPDATE(Packet &p) override; static NetworkRecvStatus SendNewGRFsOk(); static NetworkRecvStatus SendGetMap(); diff --git a/src/network/network_command.cpp b/src/network/network_command.cpp index ef3ca67c3e..7f7e9ad017 100644 --- a/src/network/network_command.cpp +++ b/src/network/network_command.cpp @@ -424,16 +424,16 @@ void NetworkDistributeCommands() * @param cp the struct to write the data to. * @return an error message. When nullptr there has been no error. */ -const char *NetworkGameSocketHandler::ReceiveCommand(Packet *p, CommandPacket *cp) +const char *NetworkGameSocketHandler::ReceiveCommand(Packet &p, CommandPacket *cp) { - cp->company = (CompanyID)p->Recv_uint8(); - cp->cmd = static_cast(p->Recv_uint16()); + cp->company = (CompanyID)p.Recv_uint8(); + cp->cmd = static_cast(p.Recv_uint16()); if (!IsValidCommand(cp->cmd)) return "invalid command"; if (GetCommandFlags(cp->cmd) & CMD_OFFLINE) return "single-player only command"; - cp->err_msg = p->Recv_uint16(); - cp->data = _cmd_dispatch[cp->cmd].Sanitize(p->Recv_buffer()); + cp->err_msg = p.Recv_uint16(); + cp->data = _cmd_dispatch[cp->cmd].Sanitize(p.Recv_buffer()); - byte callback = p->Recv_uint8(); + byte callback = p.Recv_uint8(); if (callback >= _callback_table.size() || _cmd_dispatch[cp->cmd].Unpack[callback] == nullptr) return "invalid callback"; cp->callback = _callback_table[callback]; @@ -445,19 +445,19 @@ const char *NetworkGameSocketHandler::ReceiveCommand(Packet *p, CommandPacket *c * @param p the packet to send it in. * @param cp the packet to actually send. */ -void NetworkGameSocketHandler::SendCommand(Packet *p, const CommandPacket *cp) +void NetworkGameSocketHandler::SendCommand(Packet &p, const CommandPacket *cp) { - p->Send_uint8(cp->company); - p->Send_uint16(cp->cmd); - p->Send_uint16(cp->err_msg); - p->Send_buffer(cp->data); + p.Send_uint8(cp->company); + p.Send_uint16(cp->cmd); + p.Send_uint16(cp->err_msg); + p.Send_buffer(cp->data); size_t callback = FindCallbackIndex(cp->callback); if (callback > UINT8_MAX || _cmd_dispatch[cp->cmd].Unpack[callback] == nullptr) { Debug(net, 0, "Unknown callback for command; no callback sent (command: {})", cp->cmd); callback = 0; // _callback_table[0] == nullptr } - p->Send_uint8 ((uint8_t)callback); + p.Send_uint8 ((uint8_t)callback); } /** Helper to process a single ClientID argument. */ diff --git a/src/network/network_content.cpp b/src/network/network_content.cpp index a6fd8ad7c4..20a73af1a4 100644 --- a/src/network/network_content.cpp +++ b/src/network/network_content.cpp @@ -49,34 +49,34 @@ static bool HasGRFConfig(const ContentInfo *ci, bool md5sum) */ typedef bool (*HasProc)(const ContentInfo *ci, bool md5sum); -bool ClientNetworkContentSocketHandler::Receive_SERVER_INFO(Packet *p) +bool ClientNetworkContentSocketHandler::Receive_SERVER_INFO(Packet &p) { ContentInfo *ci = new ContentInfo(); - ci->type = (ContentType)p->Recv_uint8(); - ci->id = (ContentID)p->Recv_uint32(); - ci->filesize = p->Recv_uint32(); + ci->type = (ContentType)p.Recv_uint8(); + ci->id = (ContentID)p.Recv_uint32(); + ci->filesize = p.Recv_uint32(); - ci->name = p->Recv_string(NETWORK_CONTENT_NAME_LENGTH); - ci->version = p->Recv_string(NETWORK_CONTENT_VERSION_LENGTH); - ci->url = p->Recv_string(NETWORK_CONTENT_URL_LENGTH); - ci->description = p->Recv_string(NETWORK_CONTENT_DESC_LENGTH, SVS_REPLACE_WITH_QUESTION_MARK | SVS_ALLOW_NEWLINE); + ci->name = p.Recv_string(NETWORK_CONTENT_NAME_LENGTH); + ci->version = p.Recv_string(NETWORK_CONTENT_VERSION_LENGTH); + ci->url = p.Recv_string(NETWORK_CONTENT_URL_LENGTH); + ci->description = p.Recv_string(NETWORK_CONTENT_DESC_LENGTH, SVS_REPLACE_WITH_QUESTION_MARK | SVS_ALLOW_NEWLINE); - ci->unique_id = p->Recv_uint32(); + ci->unique_id = p.Recv_uint32(); for (size_t j = 0; j < ci->md5sum.size(); j++) { - ci->md5sum[j] = p->Recv_uint8(); + ci->md5sum[j] = p.Recv_uint8(); } - uint dependency_count = p->Recv_uint8(); + uint dependency_count = p.Recv_uint8(); ci->dependencies.reserve(dependency_count); for (uint i = 0; i < dependency_count; i++) { - ContentID dependency_cid = (ContentID)p->Recv_uint32(); + ContentID dependency_cid = (ContentID)p.Recv_uint32(); ci->dependencies.push_back(dependency_cid); this->reverse_dependency_map.insert({ dependency_cid, ci->id }); } - uint tag_count = p->Recv_uint8(); + uint tag_count = p.Recv_uint8(); ci->tags.reserve(tag_count); - for (uint i = 0; i < tag_count; i++) ci->tags.push_back(p->Recv_string(NETWORK_CONTENT_TAG_LENGTH)); + for (uint i = 0; i < tag_count; i++) ci->tags.push_back(p.Recv_string(NETWORK_CONTENT_TAG_LENGTH)); if (!ci->IsValid()) { delete ci; @@ -477,16 +477,16 @@ static inline ssize_t TransferOutFWrite(FILE *file, const char *buffer, size_t a return fwrite(buffer, 1, amount, file); } -bool ClientNetworkContentSocketHandler::Receive_SERVER_CONTENT(Packet *p) +bool ClientNetworkContentSocketHandler::Receive_SERVER_CONTENT(Packet &p) { if (this->curFile == nullptr) { delete this->curInfo; /* When we haven't opened a file this must be our first packet with metadata. */ this->curInfo = new ContentInfo; - this->curInfo->type = (ContentType)p->Recv_uint8(); - this->curInfo->id = (ContentID)p->Recv_uint32(); - this->curInfo->filesize = p->Recv_uint32(); - this->curInfo->filename = p->Recv_string(NETWORK_CONTENT_FILENAME_LENGTH); + this->curInfo->type = (ContentType)p.Recv_uint8(); + this->curInfo->id = (ContentID)p.Recv_uint32(); + this->curInfo->filesize = p.Recv_uint32(); + this->curInfo->filename = p.Recv_string(NETWORK_CONTENT_FILENAME_LENGTH); if (!this->BeforeDownload()) { this->CloseConnection(); @@ -494,8 +494,8 @@ bool ClientNetworkContentSocketHandler::Receive_SERVER_CONTENT(Packet *p) } } else { /* We have a file opened, thus are downloading internal content */ - size_t toRead = p->RemainingBytesToTransfer(); - if (toRead != 0 && (size_t)p->TransferOut(TransferOutFWrite, this->curFile) != toRead) { + size_t toRead = p.RemainingBytesToTransfer(); + if (toRead != 0 && (size_t)p.TransferOut(TransferOutFWrite, this->curFile) != toRead) { CloseWindowById(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_CONTENT_DOWNLOAD); ShowErrorMessage(STR_CONTENT_ERROR_COULD_NOT_DOWNLOAD, STR_CONTENT_ERROR_COULD_NOT_DOWNLOAD_FILE_NOT_WRITABLE, WL_ERROR); this->CloseConnection(); diff --git a/src/network/network_content.h b/src/network/network_content.h index a5f75bcd84..1d4764feed 100644 --- a/src/network/network_content.h +++ b/src/network/network_content.h @@ -82,8 +82,8 @@ protected: friend class NetworkContentConnecter; - bool Receive_SERVER_INFO(Packet *p) override; - bool Receive_SERVER_CONTENT(Packet *p) override; + bool Receive_SERVER_INFO(Packet &p) override; + bool Receive_SERVER_CONTENT(Packet &p) override; ContentInfo *GetContent(ContentID cid) const; void DownloadContentInfo(ContentID cid); diff --git a/src/network/network_coordinator.cpp b/src/network/network_coordinator.cpp index 0e9606ff43..129b26f8fb 100644 --- a/src/network/network_coordinator.cpp +++ b/src/network/network_coordinator.cpp @@ -124,10 +124,10 @@ public: } }; -bool ClientNetworkCoordinatorSocketHandler::Receive_GC_ERROR(Packet *p) +bool ClientNetworkCoordinatorSocketHandler::Receive_GC_ERROR(Packet &p) { - NetworkCoordinatorErrorType error = (NetworkCoordinatorErrorType)p->Recv_uint8(); - std::string detail = p->Recv_string(NETWORK_ERROR_DETAIL_LENGTH); + NetworkCoordinatorErrorType error = (NetworkCoordinatorErrorType)p.Recv_uint8(); + std::string detail = p.Recv_string(NETWORK_ERROR_DETAIL_LENGTH); switch (error) { case NETWORK_COORDINATOR_ERROR_UNKNOWN: @@ -174,14 +174,14 @@ bool ClientNetworkCoordinatorSocketHandler::Receive_GC_ERROR(Packet *p) } } -bool ClientNetworkCoordinatorSocketHandler::Receive_GC_REGISTER_ACK(Packet *p) +bool ClientNetworkCoordinatorSocketHandler::Receive_GC_REGISTER_ACK(Packet &p) { /* Schedule sending an update. */ this->next_update = std::chrono::steady_clock::now(); - _settings_client.network.server_invite_code = p->Recv_string(NETWORK_INVITE_CODE_LENGTH); - _settings_client.network.server_invite_code_secret = p->Recv_string(NETWORK_INVITE_CODE_SECRET_LENGTH); - _network_server_connection_type = (ConnectionType)p->Recv_uint8(); + _settings_client.network.server_invite_code = p.Recv_string(NETWORK_INVITE_CODE_LENGTH); + _settings_client.network.server_invite_code_secret = p.Recv_string(NETWORK_INVITE_CODE_SECRET_LENGTH); + _network_server_connection_type = (ConnectionType)p.Recv_uint8(); if (_network_server_connection_type == CONNECTION_TYPE_ISOLATED) { ShowErrorMessage(STR_NETWORK_ERROR_COORDINATOR_ISOLATED, STR_NETWORK_ERROR_COORDINATOR_ISOLATED_DETAIL, WL_ERROR); @@ -230,9 +230,9 @@ bool ClientNetworkCoordinatorSocketHandler::Receive_GC_REGISTER_ACK(Packet *p) return true; } -bool ClientNetworkCoordinatorSocketHandler::Receive_GC_LISTING(Packet *p) +bool ClientNetworkCoordinatorSocketHandler::Receive_GC_LISTING(Packet &p) { - uint8_t servers = p->Recv_uint16(); + uint8_t servers = p.Recv_uint16(); /* End of list; we can now remove all expired items from the list. */ if (servers == 0) { @@ -241,11 +241,11 @@ bool ClientNetworkCoordinatorSocketHandler::Receive_GC_LISTING(Packet *p) } for (; servers > 0; servers--) { - std::string connection_string = p->Recv_string(NETWORK_HOSTNAME_PORT_LENGTH); + std::string connection_string = p.Recv_string(NETWORK_HOSTNAME_PORT_LENGTH); /* Read the NetworkGameInfo from the packet. */ NetworkGameInfo ngi = {}; - DeserializeNetworkGameInfo(*p, ngi, &this->newgrf_lookup_table); + DeserializeNetworkGameInfo(p, ngi, &this->newgrf_lookup_table); /* Now we know the connection string, we can add it to our list. */ NetworkGameList *item = NetworkGameListAddItem(connection_string); @@ -266,10 +266,10 @@ bool ClientNetworkCoordinatorSocketHandler::Receive_GC_LISTING(Packet *p) return true; } -bool ClientNetworkCoordinatorSocketHandler::Receive_GC_CONNECTING(Packet *p) +bool ClientNetworkCoordinatorSocketHandler::Receive_GC_CONNECTING(Packet &p) { - std::string token = p->Recv_string(NETWORK_TOKEN_LENGTH); - std::string invite_code = p->Recv_string(NETWORK_INVITE_CODE_LENGTH); + std::string token = p.Recv_string(NETWORK_TOKEN_LENGTH); + std::string invite_code = p.Recv_string(NETWORK_INVITE_CODE_LENGTH); /* Find the connecter based on the invite code. */ auto connecter_pre_it = this->connecter_pre.find(invite_code); @@ -285,20 +285,20 @@ bool ClientNetworkCoordinatorSocketHandler::Receive_GC_CONNECTING(Packet *p) return true; } -bool ClientNetworkCoordinatorSocketHandler::Receive_GC_CONNECT_FAILED(Packet *p) +bool ClientNetworkCoordinatorSocketHandler::Receive_GC_CONNECT_FAILED(Packet &p) { - std::string token = p->Recv_string(NETWORK_TOKEN_LENGTH); + std::string token = p.Recv_string(NETWORK_TOKEN_LENGTH); this->CloseToken(token); return true; } -bool ClientNetworkCoordinatorSocketHandler::Receive_GC_DIRECT_CONNECT(Packet *p) +bool ClientNetworkCoordinatorSocketHandler::Receive_GC_DIRECT_CONNECT(Packet &p) { - std::string token = p->Recv_string(NETWORK_TOKEN_LENGTH); - uint8_t tracking_number = p->Recv_uint8(); - std::string hostname = p->Recv_string(NETWORK_HOSTNAME_LENGTH); - uint16_t port = p->Recv_uint16(); + std::string token = p.Recv_string(NETWORK_TOKEN_LENGTH); + uint8_t tracking_number = p.Recv_uint8(); + std::string hostname = p.Recv_string(NETWORK_HOSTNAME_LENGTH); + uint16_t port = p.Recv_uint16(); /* Ensure all other pending connection attempts are killed. */ if (this->game_connecter != nullptr) { @@ -310,22 +310,22 @@ bool ClientNetworkCoordinatorSocketHandler::Receive_GC_DIRECT_CONNECT(Packet *p) return true; } -bool ClientNetworkCoordinatorSocketHandler::Receive_GC_STUN_REQUEST(Packet *p) +bool ClientNetworkCoordinatorSocketHandler::Receive_GC_STUN_REQUEST(Packet &p) { - std::string token = p->Recv_string(NETWORK_TOKEN_LENGTH); + std::string token = p.Recv_string(NETWORK_TOKEN_LENGTH); this->stun_handlers[token][AF_INET6] = ClientNetworkStunSocketHandler::Stun(token, AF_INET6); this->stun_handlers[token][AF_INET] = ClientNetworkStunSocketHandler::Stun(token, AF_INET); return true; } -bool ClientNetworkCoordinatorSocketHandler::Receive_GC_STUN_CONNECT(Packet *p) +bool ClientNetworkCoordinatorSocketHandler::Receive_GC_STUN_CONNECT(Packet &p) { - std::string token = p->Recv_string(NETWORK_TOKEN_LENGTH); - uint8_t tracking_number = p->Recv_uint8(); - uint8_t family = p->Recv_uint8(); - std::string host = p->Recv_string(NETWORK_HOSTNAME_PORT_LENGTH); - uint16_t port = p->Recv_uint16(); + std::string token = p.Recv_string(NETWORK_TOKEN_LENGTH); + uint8_t tracking_number = p.Recv_uint8(); + uint8_t family = p.Recv_uint8(); + std::string host = p.Recv_string(NETWORK_HOSTNAME_PORT_LENGTH); + uint16_t port = p.Recv_uint16(); /* Check if we know this token. */ auto stun_it = this->stun_handlers.find(token); @@ -353,24 +353,24 @@ bool ClientNetworkCoordinatorSocketHandler::Receive_GC_STUN_CONNECT(Packet *p) return true; } -bool ClientNetworkCoordinatorSocketHandler::Receive_GC_NEWGRF_LOOKUP(Packet *p) +bool ClientNetworkCoordinatorSocketHandler::Receive_GC_NEWGRF_LOOKUP(Packet &p) { - this->newgrf_lookup_table_cursor = p->Recv_uint32(); + this->newgrf_lookup_table_cursor = p.Recv_uint32(); - uint16_t newgrfs = p->Recv_uint16(); + uint16_t newgrfs = p.Recv_uint16(); for (; newgrfs> 0; newgrfs--) { - uint32_t index = p->Recv_uint32(); - DeserializeGRFIdentifierWithName(*p, this->newgrf_lookup_table[index]); + uint32_t index = p.Recv_uint32(); + DeserializeGRFIdentifierWithName(p, this->newgrf_lookup_table[index]); } return true; } -bool ClientNetworkCoordinatorSocketHandler::Receive_GC_TURN_CONNECT(Packet *p) +bool ClientNetworkCoordinatorSocketHandler::Receive_GC_TURN_CONNECT(Packet &p) { - std::string token = p->Recv_string(NETWORK_TOKEN_LENGTH); - uint8_t tracking_number = p->Recv_uint8(); - std::string ticket = p->Recv_string(NETWORK_TOKEN_LENGTH); - std::string connection_string = p->Recv_string(NETWORK_HOSTNAME_PORT_LENGTH); + std::string token = p.Recv_string(NETWORK_TOKEN_LENGTH); + uint8_t tracking_number = p.Recv_uint8(); + std::string ticket = p.Recv_string(NETWORK_TOKEN_LENGTH); + std::string connection_string = p.Recv_string(NETWORK_HOSTNAME_PORT_LENGTH); /* Ensure all other pending connection attempts are killed. */ if (this->game_connecter != nullptr) { diff --git a/src/network/network_coordinator.h b/src/network/network_coordinator.h index ccb74e4921..f8aa88e6b8 100644 --- a/src/network/network_coordinator.h +++ b/src/network/network_coordinator.h @@ -63,16 +63,16 @@ private: GameInfoNewGRFLookupTable newgrf_lookup_table; ///< Table to look up NewGRFs in the GC_LISTING packets. protected: - bool Receive_GC_ERROR(Packet *p) override; - bool Receive_GC_REGISTER_ACK(Packet *p) override; - bool Receive_GC_LISTING(Packet *p) override; - bool Receive_GC_CONNECTING(Packet *p) override; - bool Receive_GC_CONNECT_FAILED(Packet *p) override; - bool Receive_GC_DIRECT_CONNECT(Packet *p) override; - bool Receive_GC_STUN_REQUEST(Packet *p) override; - bool Receive_GC_STUN_CONNECT(Packet *p) override; - bool Receive_GC_NEWGRF_LOOKUP(Packet *p) override; - bool Receive_GC_TURN_CONNECT(Packet *p) override; + bool Receive_GC_ERROR(Packet &p) override; + bool Receive_GC_REGISTER_ACK(Packet &p) override; + bool Receive_GC_LISTING(Packet &p) override; + bool Receive_GC_CONNECTING(Packet &p) override; + bool Receive_GC_CONNECT_FAILED(Packet &p) override; + bool Receive_GC_DIRECT_CONNECT(Packet &p) override; + bool Receive_GC_STUN_REQUEST(Packet &p) override; + bool Receive_GC_STUN_CONNECT(Packet &p) override; + bool Receive_GC_NEWGRF_LOOKUP(Packet &p) override; + bool Receive_GC_TURN_CONNECT(Packet &p) override; public: /** The idle timeout; when to close the connection because it's idle. */ diff --git a/src/network/network_query.cpp b/src/network/network_query.cpp index 9a34aff71d..34cbd09289 100644 --- a/src/network/network_query.cpp +++ b/src/network/network_query.cpp @@ -87,7 +87,7 @@ NetworkRecvStatus QueryNetworkGameSocketHandler::SendGameInfo() return NETWORK_RECV_STATUS_OKAY; } -NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_FULL(Packet *) +NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_FULL(Packet &) { Debug(net, 9, "Query::Receive_SERVER_FULL()"); @@ -100,7 +100,7 @@ NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_FULL(Packet *) return NETWORK_RECV_STATUS_CLOSE_QUERY; } -NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_BANNED(Packet *) +NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_BANNED(Packet &) { Debug(net, 9, "Query::Receive_SERVER_BANNED()"); @@ -113,7 +113,7 @@ NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_BANNED(Packet *) return NETWORK_RECV_STATUS_CLOSE_QUERY; } -NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_GAME_INFO(Packet *p) +NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_GAME_INFO(Packet &p) { Debug(net, 9, "Query::Receive_SERVER_GAME_INFO()"); @@ -122,7 +122,7 @@ NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_GAME_INFO(Packet /* Clear any existing GRFConfig chain. */ ClearGRFConfigList(&item->info.grfconfig); /* Retrieve the NetworkGameInfo from the packet. */ - DeserializeNetworkGameInfo(*p, item->info); + DeserializeNetworkGameInfo(p, item->info); /* Check for compatability with the client. */ CheckGameCompatibility(item->info); /* Ensure we consider the server online. */ @@ -134,9 +134,9 @@ NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_GAME_INFO(Packet return NETWORK_RECV_STATUS_CLOSE_QUERY; } -NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_ERROR(Packet *p) +NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_ERROR(Packet &p) { - NetworkErrorCode error = (NetworkErrorCode)p->Recv_uint8(); + NetworkErrorCode error = (NetworkErrorCode)p.Recv_uint8(); Debug(net, 9, "Query::Receive_SERVER_ERROR(): error={}", error); diff --git a/src/network/network_query.h b/src/network/network_query.h index ab0f8cd1d2..0f7348838f 100644 --- a/src/network/network_query.h +++ b/src/network/network_query.h @@ -19,10 +19,10 @@ private: std::string connection_string; ///< Address we are connected to. protected: - NetworkRecvStatus Receive_SERVER_FULL(Packet *p) override; - NetworkRecvStatus Receive_SERVER_BANNED(Packet *p) override; - NetworkRecvStatus Receive_SERVER_ERROR(Packet *p) override; - NetworkRecvStatus Receive_SERVER_GAME_INFO(Packet *p) override; + NetworkRecvStatus Receive_SERVER_FULL(Packet &p) override; + NetworkRecvStatus Receive_SERVER_BANNED(Packet &p) override; + NetworkRecvStatus Receive_SERVER_ERROR(Packet &p) override; + NetworkRecvStatus Receive_SERVER_GAME_INFO(Packet &p) override; NetworkRecvStatus SendGameInfo(); diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp index 322966a9ea..88e4d209f2 100644 --- a/src/network/network_server.cpp +++ b/src/network/network_server.cpp @@ -662,7 +662,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendCommand(const CommandPacke auto p = std::make_unique(PACKET_SERVER_COMMAND); - this->NetworkGameSocketHandler::SendCommand(p.get(), cp); + this->NetworkGameSocketHandler::SendCommand(*p, cp); p->Send_uint32(cp->frame); p->Send_bool (cp->my_cmd); @@ -836,17 +836,16 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendConfigUpdate() /*********** * Receiving functions - * DEF_SERVER_RECEIVE_COMMAND has parameter: NetworkClientSocket *cs, Packet *p ************/ -NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_GAME_INFO(Packet *) +NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_GAME_INFO(Packet &) { Debug(net, 9, "client[{}] Receive_CLIENT_GAME_INFO()", this->client_id); return this->SendGameInfo(); } -NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_NEWGRFS_CHECKED(Packet *) +NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_NEWGRFS_CHECKED(Packet &) { if (this->status != STATUS_NEWGRFS_CHECK) { /* Illegal call, return error and ignore the packet */ @@ -858,7 +857,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_NEWGRFS_CHECKED return this->SendNeedGamePassword(); } -NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_JOIN(Packet *p) +NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_JOIN(Packet &p) { if (this->status != STATUS_INACTIVE) { /* Illegal call, return error and ignore the packet */ @@ -870,8 +869,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_JOIN(Packet *p) return this->SendError(NETWORK_ERROR_FULL); } - std::string client_revision = p->Recv_string(NETWORK_REVISION_LENGTH); - uint32_t newgrf_version = p->Recv_uint32(); + std::string client_revision = p.Recv_string(NETWORK_REVISION_LENGTH); + uint32_t newgrf_version = p.Recv_uint32(); Debug(net, 9, "client[{}] Receive_CLIENT_JOIN(): client_revision={}, newgrf_version={}", this->client_id, client_revision, newgrf_version); @@ -881,8 +880,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_JOIN(Packet *p) return this->SendError(NETWORK_ERROR_WRONG_REVISION); } - std::string client_name = p->Recv_string(NETWORK_CLIENT_NAME_LENGTH); - CompanyID playas = (Owner)p->Recv_uint8(); + std::string client_name = p.Recv_string(NETWORK_CLIENT_NAME_LENGTH); + CompanyID playas = (Owner)p.Recv_uint8(); if (this->HasClientQuit()) return NETWORK_RECV_STATUS_CLIENT_QUIT; @@ -936,7 +935,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_JOIN(Packet *p) return this->SendNewGRFCheck(); } -NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_GAME_PASSWORD(Packet *p) +NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_GAME_PASSWORD(Packet &p) { if (this->status != STATUS_AUTH_GAME) { return this->SendError(NETWORK_ERROR_NOT_EXPECTED); @@ -944,7 +943,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_GAME_PASSWORD(P Debug(net, 9, "client[{}] Receive_CLIENT_GAME_PASSWORD()", this->client_id); - std::string password = p->Recv_string(NETWORK_PASSWORD_LENGTH); + std::string password = p.Recv_string(NETWORK_PASSWORD_LENGTH); /* Check game password. Allow joining if we cleared the password meanwhile */ if (!_settings_client.network.server_password.empty() && @@ -956,7 +955,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_GAME_PASSWORD(P return this->SendNeedCompanyPassword(); } -NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_COMPANY_PASSWORD(Packet *p) +NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_COMPANY_PASSWORD(Packet &p) { if (this->status != STATUS_AUTH_COMPANY) { return this->SendError(NETWORK_ERROR_NOT_EXPECTED); @@ -964,7 +963,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_COMPANY_PASSWOR Debug(net, 9, "client[{}] Receive_CLIENT_COMPANY_PASSWORD()", this->client_id); - std::string password = p->Recv_string(NETWORK_PASSWORD_LENGTH); + std::string password = p.Recv_string(NETWORK_PASSWORD_LENGTH); /* Check company password. Allow joining if we cleared the password meanwhile. * Also, check the company is still valid - client could be moved to spectators @@ -979,7 +978,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_COMPANY_PASSWOR return this->SendWelcome(); } -NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_GETMAP(Packet *) +NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_GETMAP(Packet &) { /* The client was never joined.. so this is impossible, right? * Ignore the packet, give the client a warning, and close the connection */ @@ -1003,7 +1002,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_GETMAP(Packet * return this->SendMap(); } -NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_MAP_OK(Packet *) +NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_MAP_OK(Packet &) { /* Client has the map, now start syncing */ if (this->status == STATUS_DONE_MAP && !this->HasClientQuit()) { @@ -1053,7 +1052,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_MAP_OK(Packet * * The client has done a command and wants us to handle it * @param p the packet in which the command was sent */ -NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_COMMAND(Packet *p) +NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_COMMAND(Packet &p) { /* The client was never joined.. so this is impossible, right? * Ignore the packet, give the client a warning, and close the connection */ @@ -1120,11 +1119,11 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_COMMAND(Packet return NETWORK_RECV_STATUS_OKAY; } -NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_ERROR(Packet *p) +NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_ERROR(Packet &p) { /* This packets means a client noticed an error and is reporting this * to us. Display the error and report it to the other clients */ - NetworkErrorCode errorno = (NetworkErrorCode)p->Recv_uint8(); + NetworkErrorCode errorno = (NetworkErrorCode)p.Recv_uint8(); Debug(net, 9, "client[{}] Receive_CLIENT_ERROR(): errorno={}", this->client_id, errorno); @@ -1151,7 +1150,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_ERROR(Packet *p return this->CloseConnection(NETWORK_RECV_STATUS_CLIENT_QUIT); } -NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_QUIT(Packet *) +NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_QUIT(Packet &) { /* The client was never joined.. thank the client for the packet, but ignore it */ if (this->status < STATUS_DONE_MAP || this->HasClientQuit()) { @@ -1175,14 +1174,14 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_QUIT(Packet *) return this->CloseConnection(NETWORK_RECV_STATUS_CLIENT_QUIT); } -NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_ACK(Packet *p) +NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_ACK(Packet &p) { if (this->status < STATUS_AUTHORIZED) { /* Illegal call, return error and ignore the packet */ return this->SendError(NETWORK_ERROR_NOT_AUTHORIZED); } - uint32_t frame = p->Recv_uint32(); + uint32_t frame = p.Recv_uint32(); Debug(net, 9, "client[{}] Receive_CLIENT_ACK(): frame={}", this->client_id, frame); @@ -1201,7 +1200,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_ACK(Packet *p) } /* Get, and validate the token. */ - uint8_t token = p->Recv_uint8(); + uint8_t token = p.Recv_uint8(); if (token == this->last_token) { /* We differentiate between last_token_frame and last_frame so the lag * test uses the actual lag of the client instead of the lag for getting @@ -1360,21 +1359,21 @@ void NetworkServerSendExternalChat(const std::string &source, TextColour colour, NetworkTextMessage(NETWORK_ACTION_EXTERNAL_CHAT, colour, false, user, msg, 0, source); } -NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_CHAT(Packet *p) +NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_CHAT(Packet &p) { if (this->status < STATUS_PRE_ACTIVE) { /* Illegal call, return error and ignore the packet */ return this->SendError(NETWORK_ERROR_NOT_AUTHORIZED); } - NetworkAction action = (NetworkAction)p->Recv_uint8(); - DestType desttype = (DestType)p->Recv_uint8(); - int dest = p->Recv_uint32(); + NetworkAction action = (NetworkAction)p.Recv_uint8(); + DestType desttype = (DestType)p.Recv_uint8(); + int dest = p.Recv_uint32(); Debug(net, 9, "client[{}] Receive_CLIENT_CHAT(): action={}, desttype={}, dest={}", this->client_id, action, desttype, dest); - std::string msg = p->Recv_string(NETWORK_CHAT_LENGTH); - int64_t data = p->Recv_uint64(); + std::string msg = p.Recv_string(NETWORK_CHAT_LENGTH); + int64_t data = p.Recv_uint64(); NetworkClientInfo *ci = this->GetInfo(); switch (action) { @@ -1390,7 +1389,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_CHAT(Packet *p) return NETWORK_RECV_STATUS_OKAY; } -NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_SET_PASSWORD(Packet *p) +NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_SET_PASSWORD(Packet &p) { if (this->status != STATUS_ACTIVE) { /* Illegal call, return error and ignore the packet */ @@ -1399,14 +1398,14 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_SET_PASSWORD(Pa Debug(net, 9, "client[{}] Receive_CLIENT_SET_PASSWORD()", this->client_id); - std::string password = p->Recv_string(NETWORK_PASSWORD_LENGTH); + std::string password = p.Recv_string(NETWORK_PASSWORD_LENGTH); const NetworkClientInfo *ci = this->GetInfo(); NetworkServerSetCompanyPassword(ci->client_playas, password); return NETWORK_RECV_STATUS_OKAY; } -NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_SET_NAME(Packet *p) +NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_SET_NAME(Packet &p) { if (this->status != STATUS_ACTIVE) { /* Illegal call, return error and ignore the packet */ @@ -1417,7 +1416,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_SET_NAME(Packet NetworkClientInfo *ci; - std::string client_name = p->Recv_string(NETWORK_CLIENT_NAME_LENGTH); + std::string client_name = p.Recv_string(NETWORK_CLIENT_NAME_LENGTH); ci = this->GetInfo(); if (this->HasClientQuit()) return NETWORK_RECV_STATUS_CLIENT_QUIT; @@ -1440,7 +1439,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_SET_NAME(Packet return NETWORK_RECV_STATUS_OKAY; } -NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_RCON(Packet *p) +NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_RCON(Packet &p) { if (this->status != STATUS_ACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED); @@ -1448,8 +1447,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_RCON(Packet *p) Debug(net, 9, "client[{}] Receive_CLIENT_RCON()", this->client_id); - std::string password = p->Recv_string(NETWORK_PASSWORD_LENGTH); - std::string command = p->Recv_string(NETWORK_RCONCOMMAND_LENGTH); + std::string password = p.Recv_string(NETWORK_PASSWORD_LENGTH); + std::string command = p.Recv_string(NETWORK_RCONCOMMAND_LENGTH); if (_settings_client.network.rcon_password.compare(password) != 0) { Debug(net, 1, "[rcon] Wrong password from client-id {}", this->client_id); @@ -1464,11 +1463,11 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_RCON(Packet *p) return NETWORK_RECV_STATUS_OKAY; } -NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_MOVE(Packet *p) +NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_MOVE(Packet &p) { if (this->status != STATUS_ACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED); - CompanyID company_id = (Owner)p->Recv_uint8(); + CompanyID company_id = (Owner)p.Recv_uint8(); Debug(net, 9, "client[{}] Receive_CLIENT_MOVE(): company_id={}", this->client_id, company_id); @@ -1478,7 +1477,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_MOVE(Packet *p) /* Check if we require a password for this company */ if (company_id != COMPANY_SPECTATOR && !_network_company_states[company_id].password.empty()) { /* we need a password from the client - should be in this packet */ - std::string password = p->Recv_string(NETWORK_PASSWORD_LENGTH); + std::string password = p.Recv_string(NETWORK_PASSWORD_LENGTH); /* Incorrect password sent, return! */ if (_network_company_states[company_id].password.compare(password) != 0) { diff --git a/src/network/network_server.h b/src/network/network_server.h index 973b30157e..bbfbff09d3 100644 --- a/src/network/network_server.h +++ b/src/network/network_server.h @@ -23,22 +23,22 @@ extern NetworkClientSocketPool _networkclientsocket_pool; /** Class for handling the server side of the game connection. */ class ServerNetworkGameSocketHandler : public NetworkClientSocketPool::PoolItem<&_networkclientsocket_pool>, public NetworkGameSocketHandler, public TCPListenHandler { protected: - NetworkRecvStatus Receive_CLIENT_JOIN(Packet *p) override; - NetworkRecvStatus Receive_CLIENT_GAME_INFO(Packet *p) override; - NetworkRecvStatus Receive_CLIENT_GAME_PASSWORD(Packet *p) override; - NetworkRecvStatus Receive_CLIENT_COMPANY_PASSWORD(Packet *p) override; - NetworkRecvStatus Receive_CLIENT_GETMAP(Packet *p) override; - NetworkRecvStatus Receive_CLIENT_MAP_OK(Packet *p) override; - NetworkRecvStatus Receive_CLIENT_ACK(Packet *p) override; - NetworkRecvStatus Receive_CLIENT_COMMAND(Packet *p) override; - NetworkRecvStatus Receive_CLIENT_CHAT(Packet *p) override; - NetworkRecvStatus Receive_CLIENT_SET_PASSWORD(Packet *p) override; - NetworkRecvStatus Receive_CLIENT_SET_NAME(Packet *p) override; - NetworkRecvStatus Receive_CLIENT_QUIT(Packet *p) override; - NetworkRecvStatus Receive_CLIENT_ERROR(Packet *p) override; - NetworkRecvStatus Receive_CLIENT_RCON(Packet *p) override; - NetworkRecvStatus Receive_CLIENT_NEWGRFS_CHECKED(Packet *p) override; - NetworkRecvStatus Receive_CLIENT_MOVE(Packet *p) override; + NetworkRecvStatus Receive_CLIENT_JOIN(Packet &p) override; + NetworkRecvStatus Receive_CLIENT_GAME_INFO(Packet &p) override; + NetworkRecvStatus Receive_CLIENT_GAME_PASSWORD(Packet &p) override; + NetworkRecvStatus Receive_CLIENT_COMPANY_PASSWORD(Packet &p) override; + NetworkRecvStatus Receive_CLIENT_GETMAP(Packet &p) override; + NetworkRecvStatus Receive_CLIENT_MAP_OK(Packet &p) override; + NetworkRecvStatus Receive_CLIENT_ACK(Packet &p) override; + NetworkRecvStatus Receive_CLIENT_COMMAND(Packet &p) override; + NetworkRecvStatus Receive_CLIENT_CHAT(Packet &p) override; + NetworkRecvStatus Receive_CLIENT_SET_PASSWORD(Packet &p) override; + NetworkRecvStatus Receive_CLIENT_SET_NAME(Packet &p) override; + NetworkRecvStatus Receive_CLIENT_QUIT(Packet &p) override; + NetworkRecvStatus Receive_CLIENT_ERROR(Packet &p) override; + NetworkRecvStatus Receive_CLIENT_RCON(Packet &p) override; + NetworkRecvStatus Receive_CLIENT_NEWGRFS_CHECKED(Packet &p) override; + NetworkRecvStatus Receive_CLIENT_MOVE(Packet &p) override; NetworkRecvStatus SendGameInfo(); NetworkRecvStatus SendNewGRFCheck(); diff --git a/src/network/network_turn.cpp b/src/network/network_turn.cpp index 83b1afdd28..c3dfa75a0b 100644 --- a/src/network/network_turn.cpp +++ b/src/network/network_turn.cpp @@ -49,7 +49,7 @@ public: } }; -bool ClientNetworkTurnSocketHandler::Receive_TURN_ERROR(Packet *) +bool ClientNetworkTurnSocketHandler::Receive_TURN_ERROR(Packet &) { Debug(net, 9, "Receive_TURN_ERROR()"); @@ -58,11 +58,11 @@ bool ClientNetworkTurnSocketHandler::Receive_TURN_ERROR(Packet *) return false; } -bool ClientNetworkTurnSocketHandler::Receive_TURN_CONNECTED(Packet *p) +bool ClientNetworkTurnSocketHandler::Receive_TURN_CONNECTED(Packet &p) { Debug(net, 9, "Receive_TURN_CONNECTED()"); - std::string hostname = p->Recv_string(NETWORK_HOSTNAME_LENGTH); + std::string hostname = p.Recv_string(NETWORK_HOSTNAME_LENGTH); /* Act like we no longer have a socket, as we are handing it over to the * game handler. */ diff --git a/src/network/network_turn.h b/src/network/network_turn.h index 0b0ca8a851..961a961788 100644 --- a/src/network/network_turn.h +++ b/src/network/network_turn.h @@ -20,8 +20,8 @@ private: std::string connection_string; ///< The connection string of the TURN server we are connecting to. protected: - bool Receive_TURN_ERROR(Packet *p) override; - bool Receive_TURN_CONNECTED(Packet *p) override; + bool Receive_TURN_ERROR(Packet &p) override; + bool Receive_TURN_CONNECTED(Packet &p) override; public: std::shared_ptr connecter{}; ///< Connecter instance. From 6f77c2eaa22fb671930e84abe893eef2c55ecd25 Mon Sep 17 00:00:00 2001 From: Rubidium Date: Sun, 4 Feb 2024 12:19:22 +0100 Subject: [PATCH 09/25] Codechange: use size_t for the MTU limits and remove default parameter --- src/network/core/config.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/network/core/config.h b/src/network/core/config.h index 6beaf9504f..6449bcde3b 100644 --- a/src/network/core/config.h +++ b/src/network/core/config.h @@ -25,7 +25,7 @@ static const uint16_t NETWORK_CONTENT_SERVER_PORT = 3978; ///< The static const uint16_t NETWORK_DEFAULT_PORT = 3979; ///< The default port of the game server (TCP & UDP) static const uint16_t NETWORK_ADMIN_PORT = 3977; ///< The default port for admin network -static const uint16_t UDP_MTU = 1460; ///< Number of bytes we can pack in a single UDP packet +static const size_t UDP_MTU = 1460; ///< Number of bytes we can pack in a single UDP packet static const std::string NETWORK_SURVEY_DETAILS_LINK = "https://survey.openttd.org/participate"; ///< Link with more details & privacy statement of the survey. /* @@ -42,8 +42,8 @@ static const std::string NETWORK_SURVEY_DETAILS_LINK = "https://survey.openttd.o * Send_uint16(GB(size, 16, 14) | 0b10 << 14) * Send_uint16(GB(size, 0, 16)) */ -static const uint16_t TCP_MTU = 32767; ///< Number of bytes we can pack in a single TCP packet -static const uint16_t COMPAT_MTU = 1460; ///< Number of bytes we can pack in a single packet for backward compatibility +static const size_t TCP_MTU = 32767; ///< Number of bytes we can pack in a single TCP packet +static const size_t COMPAT_MTU = 1460; ///< Number of bytes we can pack in a single packet for backward compatibility static const byte NETWORK_GAME_ADMIN_VERSION = 3; ///< What version of the admin network do we use? static const byte NETWORK_GAME_INFO_VERSION = 7; ///< What version of game-info do we use? From 63708609fb3d98310d6c13ccb7dff05e1a3436f5 Mon Sep 17 00:00:00 2001 From: Rubidium Date: Sun, 4 Feb 2024 12:31:56 +0100 Subject: [PATCH 10/25] Codechange: define the size of the PacketType enumerations --- src/network/core/config.h | 6 +++--- src/network/core/tcp_admin.h | 2 +- src/network/core/tcp_content_type.h | 2 +- src/network/core/tcp_coordinator.h | 2 +- src/network/core/tcp_game.h | 2 +- src/network/core/tcp_stun.h | 2 +- src/network/core/tcp_turn.h | 2 +- src/network/core/udp.h | 2 +- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/network/core/config.h b/src/network/core/config.h index 6449bcde3b..df8991ad69 100644 --- a/src/network/core/config.h +++ b/src/network/core/config.h @@ -25,7 +25,7 @@ static const uint16_t NETWORK_CONTENT_SERVER_PORT = 3978; ///< The static const uint16_t NETWORK_DEFAULT_PORT = 3979; ///< The default port of the game server (TCP & UDP) static const uint16_t NETWORK_ADMIN_PORT = 3977; ///< The default port for admin network -static const size_t UDP_MTU = 1460; ///< Number of bytes we can pack in a single UDP packet +static const size_t UDP_MTU = 1460; ///< Number of bytes we can pack in a single UDP packet static const std::string NETWORK_SURVEY_DETAILS_LINK = "https://survey.openttd.org/participate"; ///< Link with more details & privacy statement of the survey. /* @@ -42,8 +42,8 @@ static const std::string NETWORK_SURVEY_DETAILS_LINK = "https://survey.openttd.o * Send_uint16(GB(size, 16, 14) | 0b10 << 14) * Send_uint16(GB(size, 0, 16)) */ -static const size_t TCP_MTU = 32767; ///< Number of bytes we can pack in a single TCP packet -static const size_t COMPAT_MTU = 1460; ///< Number of bytes we can pack in a single packet for backward compatibility +static const size_t TCP_MTU = 32767; ///< Number of bytes we can pack in a single TCP packet +static const size_t COMPAT_MTU = 1460; ///< Number of bytes we can pack in a single packet for backward compatibility static const byte NETWORK_GAME_ADMIN_VERSION = 3; ///< What version of the admin network do we use? static const byte NETWORK_GAME_INFO_VERSION = 7; ///< What version of game-info do we use? diff --git a/src/network/core/tcp_admin.h b/src/network/core/tcp_admin.h index 8dbec673aa..4320a06f66 100644 --- a/src/network/core/tcp_admin.h +++ b/src/network/core/tcp_admin.h @@ -21,7 +21,7 @@ * Enum with types of TCP packets specific to the admin network. * This protocol may only be extended to ensure stability. */ -enum PacketAdminType { +enum PacketAdminType : uint8_t { ADMIN_PACKET_ADMIN_JOIN, ///< The admin announces and authenticates itself to the server. ADMIN_PACKET_ADMIN_QUIT, ///< The admin tells the server that it is quitting. ADMIN_PACKET_ADMIN_UPDATE_FREQUENCY, ///< The admin tells the server the update frequency of a particular piece of information. diff --git a/src/network/core/tcp_content_type.h b/src/network/core/tcp_content_type.h index bc903bf234..23a0d65c4c 100644 --- a/src/network/core/tcp_content_type.h +++ b/src/network/core/tcp_content_type.h @@ -32,7 +32,7 @@ enum ContentType { }; /** Enum with all types of TCP content packets. The order MUST not be changed **/ -enum PacketContentType { +enum PacketContentType : uint8_t { PACKET_CONTENT_CLIENT_INFO_LIST, ///< Queries the content server for a list of info of a given content type PACKET_CONTENT_CLIENT_INFO_ID, ///< Queries the content server for information about a list of internal IDs PACKET_CONTENT_CLIENT_INFO_EXTID, ///< Queries the content server for information about a list of external IDs diff --git a/src/network/core/tcp_coordinator.h b/src/network/core/tcp_coordinator.h index 1155550744..9f00714891 100644 --- a/src/network/core/tcp_coordinator.h +++ b/src/network/core/tcp_coordinator.h @@ -25,7 +25,7 @@ * CLIENT -> packets from Client to Game Coordinator. * SERCLI -> packets from either the Server or Client to Game Coordinator. **/ -enum PacketCoordinatorType { +enum PacketCoordinatorType : uint8_t { PACKET_COORDINATOR_GC_ERROR, ///< Game Coordinator indicates there was an error. PACKET_COORDINATOR_SERVER_REGISTER, ///< Server registration. PACKET_COORDINATOR_GC_REGISTER_ACK, ///< Game Coordinator accepts the registration. diff --git a/src/network/core/tcp_game.h b/src/network/core/tcp_game.h index e5676dc21c..46b5a8aa69 100644 --- a/src/network/core/tcp_game.h +++ b/src/network/core/tcp_game.h @@ -22,7 +22,7 @@ * Enum with all types of TCP packets. * For the exact meaning, look at #NetworkGameSocketHandler. */ -enum PacketGameType { +enum PacketGameType : uint8_t { /* * These first four pair of packets (thus eight in * total) must remain in this order for backward diff --git a/src/network/core/tcp_stun.h b/src/network/core/tcp_stun.h index 72ebc470bd..0fce3b2a07 100644 --- a/src/network/core/tcp_stun.h +++ b/src/network/core/tcp_stun.h @@ -17,7 +17,7 @@ #include "packet.h" /** Enum with all types of TCP STUN packets. The order MUST not be changed. **/ -enum PacketStunType { +enum PacketStunType : uint8_t { PACKET_STUN_SERCLI_STUN, ///< Send a STUN request to the STUN server. PACKET_STUN_END, ///< Must ALWAYS be on the end of this list!! (period) }; diff --git a/src/network/core/tcp_turn.h b/src/network/core/tcp_turn.h index 5488a2b2d3..e9558b252e 100644 --- a/src/network/core/tcp_turn.h +++ b/src/network/core/tcp_turn.h @@ -18,7 +18,7 @@ #include "network_game_info.h" /** Enum with all types of TCP TURN packets. The order MUST not be changed. **/ -enum PacketTurnType { +enum PacketTurnType : uint8_t { PACKET_TURN_TURN_ERROR, ///< TURN server is unable to relay. PACKET_TURN_SERCLI_CONNECT, ///< Client or server is connecting to the TURN server. PACKET_TURN_TURN_CONNECTED, ///< TURN server indicates the socket is now being relayed. diff --git a/src/network/core/udp.h b/src/network/core/udp.h index f31850b7cb..fc5412b861 100644 --- a/src/network/core/udp.h +++ b/src/network/core/udp.h @@ -16,7 +16,7 @@ #include "packet.h" /** Enum with all types of UDP packets. The order MUST not be changed **/ -enum PacketUDPType { +enum PacketUDPType : uint8_t { PACKET_UDP_CLIENT_FIND_SERVER, ///< Queries a game server for game information PACKET_UDP_SERVER_RESPONSE, ///< Reply of the game server with game information PACKET_UDP_END, ///< Must ALWAYS be on the end of this list!! (period) From 09a12f230f4e299c97f8b70b58ef20730bdcbf12 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Mon, 5 Feb 2024 17:55:04 +0000 Subject: [PATCH 11/25] Fix: Signals were incorrectly shifted by 1 pixel when selected. (#12005) Most shifting when pressed was removed by 884b9e66. --- src/rail_gui.cpp | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/rail_gui.cpp b/src/rail_gui.cpp index 7f5586b1e1..202d1ad80c 100644 --- a/src/rail_gui.cpp +++ b/src/rail_gui.cpp @@ -1693,12 +1693,9 @@ private: /** * Draw dynamic a signal-sprite in a button in the signal GUI - * Draw the sprite +1px to the right and down if the button is lowered - * - * @param widget_index index of this widget in the window * @param image the sprite to draw */ - void DrawSignalSprite(const Rect &r, WidgetID widget_index, SpriteID image) const + void DrawSignalSprite(const Rect &r, SpriteID image) const { Point offset; Dimension sprite_size = GetSpriteSize(image, &offset); @@ -1707,9 +1704,7 @@ private: int y = ir.top - sig_sprite_bottom_offset + (ir.Height() + sig_sprite_size.height) / 2; // aligned to bottom - DrawSprite(image, PAL_NONE, - x + this->IsWidgetLowered(widget_index), - y + this->IsWidgetLowered(widget_index)); + DrawSprite(image, PAL_NONE, x, y); } /** Show or hide buttons for non-path signals in the signal GUI */ @@ -1786,7 +1781,7 @@ public: int var = SIG_SEMAPHORE - (widget - WID_BS_SEMAPHORE_NORM) / SIGTYPE_END; // SignalVariant order is reversed compared to the widgets. SpriteID sprite = GetRailTypeInfo(_cur_railtype)->gui_sprites.signals[type][var][this->IsWidgetLowered(widget)]; - this->DrawSignalSprite(r, widget, sprite); + this->DrawSignalSprite(r, sprite); } } From b3aa8a9c35a06a18e10003ac44906868884dff79 Mon Sep 17 00:00:00 2001 From: Rubidium Date: Sun, 4 Feb 2024 16:23:44 +0100 Subject: [PATCH 12/25] Codechange: use std::vector for the outgoing command "queues" --- src/network/network_command.cpp | 5 ++--- src/network/network_server.cpp | 7 ++----- src/network/network_server.h | 2 +- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/network/network_command.cpp b/src/network/network_command.cpp index 7f7e9ad017..7094627d1f 100644 --- a/src/network/network_command.cpp +++ b/src/network/network_command.cpp @@ -304,9 +304,8 @@ void NetworkSendCommand(Commands cmd, StringID err_message, CommandCallback *cal void NetworkSyncCommandQueue(NetworkClientSocket *cs) { for (CommandPacket *p = _local_execution_queue.Peek(); p != nullptr; p = p->next) { - CommandPacket c = *p; + CommandPacket &c = cs->outgoing_queue.emplace_back(*p); c.callback = nullptr; - cs->outgoing_queue.Append(&c); } } @@ -371,7 +370,7 @@ static void DistributeCommandPacket(CommandPacket &cp, const NetworkClientSocket * first place. This filters that out. */ cp.callback = (cs != owner) ? nullptr : callback; cp.my_cmd = (cs == owner); - cs->outgoing_queue.Append(&cp); + cs->outgoing_queue.push_back(cp); } } diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp index 88e4d209f2..7ef0173f72 100644 --- a/src/network/network_server.cpp +++ b/src/network/network_server.cpp @@ -1701,11 +1701,8 @@ void NetworkServerSetCompanyPassword(CompanyID company_id, const std::string &pa */ static void NetworkHandleCommandQueue(NetworkClientSocket *cs) { - CommandPacket *cp; - while ((cp = cs->outgoing_queue.Pop()) != nullptr) { - cs->SendCommand(cp); - delete cp; - } + for (auto &cp : cs->outgoing_queue) cs->SendCommand(&cp); + cs->outgoing_queue.clear(); } /** diff --git a/src/network/network_server.h b/src/network/network_server.h index bbfbff09d3..98ee948dbc 100644 --- a/src/network/network_server.h +++ b/src/network/network_server.h @@ -66,7 +66,7 @@ public: byte last_token; ///< The last random token we did send to verify the client is listening uint32_t last_token_frame; ///< The last frame we received the right token ClientStatus status; ///< Status of this client - CommandQueue outgoing_queue; ///< The command-queue awaiting delivery + std::vector outgoing_queue; ///< The command-queue awaiting delivery; conceptually more a bucket to gather commands in, after which the whole bucket is sent to the client. size_t receive_limit; ///< Amount of bytes that we can receive at this moment std::shared_ptr savegame; ///< Writer used to write the savegame. From cb588d8d3f005ce0703753c71563c5a523ec18a1 Mon Sep 17 00:00:00 2001 From: Rubidium Date: Sun, 4 Feb 2024 17:02:08 +0100 Subject: [PATCH 13/25] Codechange: use std::vector for the incoming command queue --- src/network/core/tcp_game.h | 24 ++----- src/network/network_client.cpp | 2 +- src/network/network_command.cpp | 115 ++++++++------------------------ src/network/network_internal.h | 4 +- src/network/network_server.cpp | 4 +- src/network/network_server.h | 2 +- 6 files changed, 37 insertions(+), 114 deletions(-) diff --git a/src/network/core/tcp_game.h b/src/network/core/tcp_game.h index 46b5a8aa69..99749001cf 100644 --- a/src/network/core/tcp_game.h +++ b/src/network/core/tcp_game.h @@ -131,24 +131,12 @@ enum PacketGameType : uint8_t { /** Packet that wraps a command */ struct CommandPacket; -/** A queue of CommandPackets. */ -class CommandQueue { - CommandPacket *first; ///< The first packet in the queue. - CommandPacket *last; ///< The last packet in the queue; only valid when first != nullptr. - uint count; ///< The number of items in the queue. - -public: - /** Initialise the command queue. */ - CommandQueue() : first(nullptr), last(nullptr), count(0) {} - /** Clear the command queue. */ - ~CommandQueue() { this->Free(); } - void Append(CommandPacket *p); - CommandPacket *Pop(bool ignore_paused = false); - CommandPacket *Peek(bool ignore_paused = false); - void Free(); - /** Get the number of items in the queue. */ - uint Count() const { return this->count; } -}; +/** + * A "queue" of CommandPackets. + * Not a std::queue because, when paused, some commands remain on the queue. + * In other words, you do not always pop the first element from this queue. + */ +using CommandQueue = std::vector; /** Base socket handler for all TCP sockets */ class NetworkGameSocketHandler : public NetworkTCPSocketHandler { diff --git a/src/network/network_client.cpp b/src/network/network_client.cpp index 083823431f..93096f874c 100644 --- a/src/network/network_client.cpp +++ b/src/network/network_client.cpp @@ -972,7 +972,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_COMMAND(Packet return NETWORK_RECV_STATUS_MALFORMED_PACKET; } - this->incoming_queue.Append(&cp); + this->incoming_queue.push_back(cp); return NETWORK_RECV_STATUS_OKAY; } diff --git a/src/network/network_command.cpp b/src/network/network_command.cpp index 7094627d1f..882bd31127 100644 --- a/src/network/network_command.cpp +++ b/src/network/network_command.cpp @@ -165,76 +165,6 @@ static constexpr auto _cmd_dispatch = MakeDispatchTable(std::make_integer_sequen # pragma GCC diagnostic pop #endif - -/** - * Append a CommandPacket at the end of the queue. - * @param p The packet to append to the queue. - * @note A new instance of the CommandPacket will be made. - */ -void CommandQueue::Append(CommandPacket *p) -{ - CommandPacket *add = new CommandPacket(); - *add = *p; - add->next = nullptr; - if (this->first == nullptr) { - this->first = add; - } else { - this->last->next = add; - } - this->last = add; - this->count++; -} - -/** - * Return the first item in the queue and remove it from the queue. - * @param ignore_paused Whether to ignore commands that may not be executed while paused. - * @return the first item in the queue. - */ -CommandPacket *CommandQueue::Pop(bool ignore_paused) -{ - CommandPacket **prev = &this->first; - CommandPacket *ret = this->first; - CommandPacket *prev_item = nullptr; - if (ignore_paused && _pause_mode != PM_UNPAUSED) { - while (ret != nullptr && !IsCommandAllowedWhilePaused(ret->cmd)) { - prev_item = ret; - prev = &ret->next; - ret = ret->next; - } - } - if (ret != nullptr) { - if (ret == this->last) this->last = prev_item; - *prev = ret->next; - this->count--; - } - return ret; -} - -/** - * Return the first item in the queue, but don't remove it. - * @param ignore_paused Whether to ignore commands that may not be executed while paused. - * @return the first item in the queue. - */ -CommandPacket *CommandQueue::Peek(bool ignore_paused) -{ - if (!ignore_paused || _pause_mode == PM_UNPAUSED) return this->first; - - for (CommandPacket *p = this->first; p != nullptr; p = p->next) { - if (IsCommandAllowedWhilePaused(p->cmd)) return p; - } - return nullptr; -} - -/** Free everything that is in the queue. */ -void CommandQueue::Free() -{ - CommandPacket *cp; - while ((cp = this->Pop()) != nullptr) { - delete cp; - } - assert(this->count == 0); -} - /** Local queue of packets waiting for handling. */ static CommandQueue _local_wait_queue; /** Local queue of packets waiting for execution. */ @@ -282,7 +212,7 @@ void NetworkSendCommand(Commands cmd, StringID err_message, CommandCallback *cal c.frame = _frame_counter_max + 1; c.my_cmd = true; - _local_wait_queue.Append(&c); + _local_wait_queue.push_back(c); return; } @@ -303,8 +233,8 @@ void NetworkSendCommand(Commands cmd, StringID err_message, CommandCallback *cal */ void NetworkSyncCommandQueue(NetworkClientSocket *cs) { - for (CommandPacket *p = _local_execution_queue.Peek(); p != nullptr; p = p->next) { - CommandPacket &c = cs->outgoing_queue.emplace_back(*p); + for (auto &p : _local_execution_queue) { + CommandPacket &c = cs->outgoing_queue.emplace_back(p); c.callback = nullptr; } } @@ -318,8 +248,8 @@ void NetworkExecuteLocalCommandQueue() CommandQueue &queue = (_network_server ? _local_execution_queue : ClientNetworkGameSocketHandler::my_client->incoming_queue); - CommandPacket *cp; - while ((cp = queue.Peek()) != nullptr) { + auto cp = queue.begin(); + for (; cp != queue.end(); cp++) { /* The queue is always in order, which means * that the first element will be executed first. */ if (_frame_counter < cp->frame) break; @@ -335,11 +265,9 @@ void NetworkExecuteLocalCommandQueue() size_t cb_index = FindCallbackIndex(cp->callback); assert(cb_index < _callback_tuple_size); assert(_cmd_dispatch[cp->cmd].Unpack[cb_index] != nullptr); - _cmd_dispatch[cp->cmd].Unpack[cb_index](cp); - - queue.Pop(); - delete cp; + _cmd_dispatch[cp->cmd].Unpack[cb_index](&*cp); } + queue.erase(queue.begin(), cp); /* Local company may have changed, so we should not restore the old value */ _current_company = _local_company; @@ -350,8 +278,8 @@ void NetworkExecuteLocalCommandQueue() */ void NetworkFreeLocalCommandQueue() { - _local_wait_queue.Free(); - _local_execution_queue.Free(); + _local_wait_queue.clear(); + _local_execution_queue.clear(); } /** @@ -376,7 +304,7 @@ static void DistributeCommandPacket(CommandPacket &cp, const NetworkClientSocket cp.callback = (nullptr != owner) ? nullptr : callback; cp.my_cmd = (nullptr == owner); - _local_execution_queue.Append(&cp); + _local_execution_queue.push_back(cp); } /** @@ -384,7 +312,7 @@ static void DistributeCommandPacket(CommandPacket &cp, const NetworkClientSocket * @param queue The queue of commands that has to be distributed. * @param owner The client that owns the commands, */ -static void DistributeQueue(CommandQueue *queue, const NetworkClientSocket *owner) +static void DistributeQueue(CommandQueue &queue, const NetworkClientSocket *owner) { #ifdef DEBUG_DUMP_COMMANDS /* When replaying we do not want this limitation. */ @@ -397,11 +325,20 @@ static void DistributeQueue(CommandQueue *queue, const NetworkClientSocket *owne } #endif - CommandPacket *cp; - while (--to_go >= 0 && (cp = queue->Pop(true)) != nullptr) { + /* Not technically the most performant way, but consider clients rarely click more than once per tick. */ + for (auto cp = queue.begin(); cp != queue.end(); /* removing some items */) { + /* Limit the number of commands per client per tick. */ + if (--to_go < 0) break; + + /* Do not distribute commands when paused and the command is not allowed while paused. */ + if (_pause_mode != PM_UNPAUSED && !IsCommandAllowedWhilePaused(cp->cmd)) { + ++cp; + continue; + } + DistributeCommandPacket(*cp, owner); - NetworkAdminCmdLogging(owner, cp); - delete cp; + NetworkAdminCmdLogging(owner, &*cp); + cp = queue.erase(cp); } } @@ -409,11 +346,11 @@ static void DistributeQueue(CommandQueue *queue, const NetworkClientSocket *owne void NetworkDistributeCommands() { /* First send the server's commands. */ - DistributeQueue(&_local_wait_queue, nullptr); + DistributeQueue(_local_wait_queue, nullptr); /* Then send the queues of the others. */ for (NetworkClientSocket *cs : NetworkClientSocket::Iterate()) { - DistributeQueue(&cs->incoming_queue, cs); + DistributeQueue(cs->incoming_queue, cs); } } diff --git a/src/network/network_internal.h b/src/network/network_internal.h index 395e12194f..66dea11be4 100644 --- a/src/network/network_internal.h +++ b/src/network/network_internal.h @@ -107,9 +107,7 @@ void UpdateNetworkGameWindow(); * Everything we need to know about a command to be able to execute it. */ struct CommandPacket { - /** Make sure the pointer is nullptr. */ - CommandPacket() : next(nullptr), company(INVALID_COMPANY), frame(0), my_cmd(false) {} - CommandPacket *next; ///< the next command packet (if in queue) + CommandPacket() : company(INVALID_COMPANY), frame(0), my_cmd(false) {} CompanyID company; ///< company that is executing the command uint32_t frame; ///< the frame in which this packet is executed bool my_cmd; ///< did the command originate from "me" diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp index 7ef0173f72..d8b20bc3aa 100644 --- a/src/network/network_server.cpp +++ b/src/network/network_server.cpp @@ -1060,7 +1060,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_COMMAND(Packet return this->SendError(NETWORK_ERROR_NOT_EXPECTED); } - if (this->incoming_queue.Count() >= _settings_client.network.max_commands_in_queue) { + if (this->incoming_queue.size() >= _settings_client.network.max_commands_in_queue) { return this->SendError(NETWORK_ERROR_TOO_MANY_COMMANDS); } @@ -1115,7 +1115,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_COMMAND(Packet if (GetCommandFlags(cp.cmd) & CMD_CLIENT_ID) NetworkReplaceCommandClientId(cp, this->client_id); - this->incoming_queue.Append(&cp); + this->incoming_queue.push_back(cp); return NETWORK_RECV_STATUS_OKAY; } diff --git a/src/network/network_server.h b/src/network/network_server.h index 98ee948dbc..cbe239f5b1 100644 --- a/src/network/network_server.h +++ b/src/network/network_server.h @@ -66,7 +66,7 @@ public: byte last_token; ///< The last random token we did send to verify the client is listening uint32_t last_token_frame; ///< The last frame we received the right token ClientStatus status; ///< Status of this client - std::vector outgoing_queue; ///< The command-queue awaiting delivery; conceptually more a bucket to gather commands in, after which the whole bucket is sent to the client. + CommandQueue outgoing_queue; ///< The command-queue awaiting delivery; conceptually more a bucket to gather commands in, after which the whole bucket is sent to the client. size_t receive_limit; ///< Amount of bytes that we can receive at this moment std::shared_ptr savegame; ///< Writer used to write the savegame. From 3534214dfc7d574e8f9af9b39056d3c4319e952f Mon Sep 17 00:00:00 2001 From: Rubidium Date: Sun, 4 Feb 2024 17:20:25 +0100 Subject: [PATCH 14/25] Codechange: use reference instead of pointer for CommandPacket --- src/network/core/tcp_game.h | 4 +-- src/network/network_admin.cpp | 12 ++++---- src/network/network_admin.h | 4 +-- src/network/network_client.cpp | 6 ++-- src/network/network_client.h | 2 +- src/network/network_command.cpp | 52 ++++++++++++++++----------------- src/network/network_server.cpp | 12 ++++---- src/network/network_server.h | 2 +- 8 files changed, 47 insertions(+), 47 deletions(-) diff --git a/src/network/core/tcp_game.h b/src/network/core/tcp_game.h index 99749001cf..ce031aa07b 100644 --- a/src/network/core/tcp_game.h +++ b/src/network/core/tcp_game.h @@ -530,8 +530,8 @@ public: NetworkRecvStatus ReceivePackets(); - const char *ReceiveCommand(Packet &p, CommandPacket *cp); - void SendCommand(Packet &p, const CommandPacket *cp); + const char *ReceiveCommand(Packet &p, CommandPacket &cp); + void SendCommand(Packet &p, const CommandPacket &cp); bool IsPendingDeletion() const { return this->is_pending_deletion; } diff --git a/src/network/network_admin.cpp b/src/network/network_admin.cpp index e16595f32a..a9633c4437 100644 --- a/src/network/network_admin.cpp +++ b/src/network/network_admin.cpp @@ -608,15 +608,15 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCmdNames() * @param client_id The client executing the command. * @param cp The command that would be executed. */ -NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCmdLogging(ClientID client_id, const CommandPacket *cp) +NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCmdLogging(ClientID client_id, const CommandPacket &cp) { auto p = std::make_unique(ADMIN_PACKET_SERVER_CMD_LOGGING); p->Send_uint32(client_id); - p->Send_uint8 (cp->company); - p->Send_uint16(cp->cmd); - p->Send_buffer(cp->data); - p->Send_uint32(cp->frame); + p->Send_uint8 (cp.company); + p->Send_uint16(cp.cmd); + p->Send_buffer(cp.data); + p->Send_uint32(cp.frame); this->SendPacket(std::move(p)); @@ -959,7 +959,7 @@ void NetworkAdminGameScript(const std::string_view json) * @param owner The owner of the CommandPacket (who sent us the CommandPacket). * @param cp The CommandPacket to be distributed. */ -void NetworkAdminCmdLogging(const NetworkClientSocket *owner, const CommandPacket *cp) +void NetworkAdminCmdLogging(const NetworkClientSocket *owner, const CommandPacket &cp) { ClientID client_id = owner == nullptr ? _network_own_client_id : owner->client_id; diff --git a/src/network/network_admin.h b/src/network/network_admin.h index 3873d66293..63c80545ce 100644 --- a/src/network/network_admin.h +++ b/src/network/network_admin.h @@ -67,7 +67,7 @@ public: NetworkRecvStatus SendConsole(const std::string_view origin, const std::string_view command); NetworkRecvStatus SendGameScript(const std::string_view json); NetworkRecvStatus SendCmdNames(); - NetworkRecvStatus SendCmdLogging(ClientID client_id, const CommandPacket *cp); + NetworkRecvStatus SendCmdLogging(ClientID client_id, const CommandPacket &cp); NetworkRecvStatus SendRconEnd(const std::string_view command); static void Send(); @@ -112,6 +112,6 @@ void NetworkAdminUpdate(AdminUpdateFrequency freq); void NetworkServerSendAdminRcon(AdminIndex admin_index, TextColour colour_code, const std::string_view string); void NetworkAdminConsole(const std::string_view origin, const std::string_view string); void NetworkAdminGameScript(const std::string_view json); -void NetworkAdminCmdLogging(const NetworkClientSocket *owner, const CommandPacket *cp); +void NetworkAdminCmdLogging(const NetworkClientSocket *owner, const CommandPacket &cp); #endif /* NETWORK_ADMIN_H */ diff --git a/src/network/network_client.cpp b/src/network/network_client.cpp index 93096f874c..334b3bc243 100644 --- a/src/network/network_client.cpp +++ b/src/network/network_client.cpp @@ -435,9 +435,9 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendAck() * Send a command to the server. * @param cp The command to send. */ -NetworkRecvStatus ClientNetworkGameSocketHandler::SendCommand(const CommandPacket *cp) +NetworkRecvStatus ClientNetworkGameSocketHandler::SendCommand(const CommandPacket &cp) { - Debug(net, 9, "Client::SendCommand(): cmd={}", cp->cmd); + Debug(net, 9, "Client::SendCommand(): cmd={}", cp.cmd); auto p = std::make_unique(PACKET_CLIENT_COMMAND); my_client->NetworkGameSocketHandler::SendCommand(*p, cp); @@ -961,7 +961,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_COMMAND(Packet if (this->status != STATUS_ACTIVE) return NETWORK_RECV_STATUS_MALFORMED_PACKET; CommandPacket cp; - const char *err = this->ReceiveCommand(p, &cp); + const char *err = this->ReceiveCommand(p, cp); cp.frame = p.Recv_uint32(); cp.my_cmd = p.Recv_bool(); diff --git a/src/network/network_client.h b/src/network/network_client.h index aede7359e8..d314ddc41a 100644 --- a/src/network/network_client.h +++ b/src/network/network_client.h @@ -80,7 +80,7 @@ public: void ClientError(NetworkRecvStatus res); static NetworkRecvStatus SendJoin(); - static NetworkRecvStatus SendCommand(const CommandPacket *cp); + static NetworkRecvStatus SendCommand(const CommandPacket &cp); static NetworkRecvStatus SendError(NetworkErrorCode errorno); static NetworkRecvStatus SendQuit(); static NetworkRecvStatus SendAck(); diff --git a/src/network/network_command.cpp b/src/network/network_command.cpp index 882bd31127..8512d37d20 100644 --- a/src/network/network_command.cpp +++ b/src/network/network_command.cpp @@ -122,9 +122,9 @@ struct CallbackArgsHelper /* Helpers to generate the command dispatch table from the command traits. */ template static CommandDataBuffer SanitizeCmdStrings(const CommandDataBuffer &data); -template static void UnpackNetworkCommand(const CommandPacket *cp); +template static void UnpackNetworkCommand(const CommandPacket &cp); template static void NetworkReplaceCommandClientId(CommandPacket &cp, ClientID client_id); -using UnpackNetworkCommandProc = void (*)(const CommandPacket *); +using UnpackNetworkCommandProc = void (*)(const CommandPacket &); using UnpackDispatchT = std::array; struct CommandDispatch { CommandDataBuffer(*Sanitize)(const CommandDataBuffer &); @@ -219,7 +219,7 @@ void NetworkSendCommand(Commands cmd, StringID err_message, CommandCallback *cal c.frame = 0; // The client can't tell which frame, so just make it 0 /* Clients send their command to the server and forget all about the packet */ - MyClient::SendCommand(&c); + MyClient::SendCommand(c); } /** @@ -265,7 +265,7 @@ void NetworkExecuteLocalCommandQueue() size_t cb_index = FindCallbackIndex(cp->callback); assert(cb_index < _callback_tuple_size); assert(_cmd_dispatch[cp->cmd].Unpack[cb_index] != nullptr); - _cmd_dispatch[cp->cmd].Unpack[cb_index](&*cp); + _cmd_dispatch[cp->cmd].Unpack[cb_index](*cp); } queue.erase(queue.begin(), cp); @@ -337,7 +337,7 @@ static void DistributeQueue(CommandQueue &queue, const NetworkClientSocket *owne } DistributeCommandPacket(*cp, owner); - NetworkAdminCmdLogging(owner, &*cp); + NetworkAdminCmdLogging(owner, *cp); cp = queue.erase(cp); } } @@ -360,19 +360,19 @@ void NetworkDistributeCommands() * @param cp the struct to write the data to. * @return an error message. When nullptr there has been no error. */ -const char *NetworkGameSocketHandler::ReceiveCommand(Packet &p, CommandPacket *cp) +const char *NetworkGameSocketHandler::ReceiveCommand(Packet &p, CommandPacket &cp) { - cp->company = (CompanyID)p.Recv_uint8(); - cp->cmd = static_cast(p.Recv_uint16()); - if (!IsValidCommand(cp->cmd)) return "invalid command"; - if (GetCommandFlags(cp->cmd) & CMD_OFFLINE) return "single-player only command"; - cp->err_msg = p.Recv_uint16(); - cp->data = _cmd_dispatch[cp->cmd].Sanitize(p.Recv_buffer()); + cp.company = (CompanyID)p.Recv_uint8(); + cp.cmd = static_cast(p.Recv_uint16()); + if (!IsValidCommand(cp.cmd)) return "invalid command"; + if (GetCommandFlags(cp.cmd) & CMD_OFFLINE) return "single-player only command"; + cp.err_msg = p.Recv_uint16(); + cp.data = _cmd_dispatch[cp.cmd].Sanitize(p.Recv_buffer()); byte callback = p.Recv_uint8(); - if (callback >= _callback_table.size() || _cmd_dispatch[cp->cmd].Unpack[callback] == nullptr) return "invalid callback"; + if (callback >= _callback_table.size() || _cmd_dispatch[cp.cmd].Unpack[callback] == nullptr) return "invalid callback"; - cp->callback = _callback_table[callback]; + cp.callback = _callback_table[callback]; return nullptr; } @@ -381,16 +381,16 @@ const char *NetworkGameSocketHandler::ReceiveCommand(Packet &p, CommandPacket *c * @param p the packet to send it in. * @param cp the packet to actually send. */ -void NetworkGameSocketHandler::SendCommand(Packet &p, const CommandPacket *cp) +void NetworkGameSocketHandler::SendCommand(Packet &p, const CommandPacket &cp) { - p.Send_uint8(cp->company); - p.Send_uint16(cp->cmd); - p.Send_uint16(cp->err_msg); - p.Send_buffer(cp->data); - - size_t callback = FindCallbackIndex(cp->callback); - if (callback > UINT8_MAX || _cmd_dispatch[cp->cmd].Unpack[callback] == nullptr) { - Debug(net, 0, "Unknown callback for command; no callback sent (command: {})", cp->cmd); + p.Send_uint8(cp.company); + p.Send_uint16(cp.cmd); + p.Send_uint16(cp.err_msg); + p.Send_buffer(cp.data); + + size_t callback = FindCallbackIndex(cp.callback); + if (callback > UINT8_MAX || _cmd_dispatch[cp.cmd].Unpack[callback] == nullptr) { + Debug(net, 0, "Unknown callback for command; no callback sent (command: {})", cp.cmd); callback = 0; // _callback_table[0] == nullptr } p.Send_uint8 ((uint8_t)callback); @@ -473,8 +473,8 @@ CommandDataBuffer SanitizeCmdStrings(const CommandDataBuffer &data) * @param cp Command packet to unpack. */ template -void UnpackNetworkCommand(const CommandPacket *cp) +void UnpackNetworkCommand(const CommandPacket &cp) { - auto args = EndianBufferReader::ToValue::Args>(cp->data); - Command::PostFromNet(cp->err_msg, std::get(_callback_tuple), cp->my_cmd, args); + auto args = EndianBufferReader::ToValue::Args>(cp.data); + Command::PostFromNet(cp.err_msg, std::get(_callback_tuple), cp.my_cmd, args); } diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp index d8b20bc3aa..a60ed66ed9 100644 --- a/src/network/network_server.cpp +++ b/src/network/network_server.cpp @@ -656,15 +656,15 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendSync() * Send a command to the client to execute. * @param cp The command to send. */ -NetworkRecvStatus ServerNetworkGameSocketHandler::SendCommand(const CommandPacket *cp) +NetworkRecvStatus ServerNetworkGameSocketHandler::SendCommand(const CommandPacket &cp) { - Debug(net, 9, "client[{}] SendCommand(): cmd={}", this->client_id, cp->cmd); + Debug(net, 9, "client[{}] SendCommand(): cmd={}", this->client_id, cp.cmd); auto p = std::make_unique(PACKET_SERVER_COMMAND); this->NetworkGameSocketHandler::SendCommand(*p, cp); - p->Send_uint32(cp->frame); - p->Send_bool (cp->my_cmd); + p->Send_uint32(cp.frame); + p->Send_bool (cp.my_cmd); this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; @@ -1067,7 +1067,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_COMMAND(Packet Debug(net, 9, "client[{}] Receive_CLIENT_COMMAND()", this->client_id); CommandPacket cp; - const char *err = this->ReceiveCommand(p, &cp); + const char *err = this->ReceiveCommand(p, cp); if (this->HasClientQuit()) return NETWORK_RECV_STATUS_CLIENT_QUIT; @@ -1701,7 +1701,7 @@ void NetworkServerSetCompanyPassword(CompanyID company_id, const std::string &pa */ static void NetworkHandleCommandQueue(NetworkClientSocket *cs) { - for (auto &cp : cs->outgoing_queue) cs->SendCommand(&cp); + for (auto &cp : cs->outgoing_queue) cs->SendCommand(cp); cs->outgoing_queue.clear(); } diff --git a/src/network/network_server.h b/src/network/network_server.h index cbe239f5b1..bbf9817248 100644 --- a/src/network/network_server.h +++ b/src/network/network_server.h @@ -97,7 +97,7 @@ public: NetworkRecvStatus SendJoin(ClientID client_id); NetworkRecvStatus SendFrame(); NetworkRecvStatus SendSync(); - NetworkRecvStatus SendCommand(const CommandPacket *cp); + NetworkRecvStatus SendCommand(const CommandPacket &cp); NetworkRecvStatus SendCompanyUpdate(); NetworkRecvStatus SendConfigUpdate(); From 05e23f8fc9469a1a0257d26e1cf56b46fed6bb2d Mon Sep 17 00:00:00 2001 From: translators Date: Mon, 5 Feb 2024 18:35:45 +0000 Subject: [PATCH 15/25] Update: Translations from eints english (au): 4 changes by krysclarke chinese (simplified): 21 changes by WenSimEHRP korean: 4 changes by CoconutKR finnish: 94 changes by hpiirai catalan: 20 changes by J0anJosep danish: 7 changes by bscargo latvian: 4 changes by lexuslatvia esperanto: 31 changes by JadedCtrl portuguese (brazilian): 283 changes by pasantoro polish: 75 changes by pAter-exe --- src/lang/brazilian_portuguese.txt | 564 +++++++++++++++--------------- src/lang/catalan.txt | 21 +- src/lang/danish.txt | 7 + src/lang/english_AU.txt | 4 + src/lang/esperanto.txt | 41 ++- src/lang/finnish.txt | 134 ++++--- src/lang/korean.txt | 4 + src/lang/latvian.txt | 4 + src/lang/polish.txt | 111 ++++-- src/lang/simplified_chinese.txt | 38 +- 10 files changed, 544 insertions(+), 384 deletions(-) diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index e191cb412e..f0421136d8 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -26,77 +26,77 @@ STR_JUST_NOTHING :Nada # Cargo related strings # Plural cargo name STR_CARGO_PLURAL_NOTHING : -STR_CARGO_PLURAL_PASSENGERS :{G=m}Passageiros -STR_CARGO_PLURAL_COAL :{G=m}Carvão -STR_CARGO_PLURAL_MAIL :{G=f}Correspondências -STR_CARGO_PLURAL_OIL :{G=m}Petróleo -STR_CARGO_PLURAL_LIVESTOCK :{G=m}Gado -STR_CARGO_PLURAL_GOODS :{G=m}Bens -STR_CARGO_PLURAL_GRAIN :{G=m}Cereais -STR_CARGO_PLURAL_WOOD :{G=f}Madeira -STR_CARGO_PLURAL_IRON_ORE :{G=m}Minério de Ferro -STR_CARGO_PLURAL_STEEL :{G=m}Aço -STR_CARGO_PLURAL_VALUABLES :{G=f}Objetos de Valor -STR_CARGO_PLURAL_COPPER_ORE :{G=m}Minério de Cobre -STR_CARGO_PLURAL_MAIZE :{G=m}Milho -STR_CARGO_PLURAL_FRUIT :{G=f}Fruta -STR_CARGO_PLURAL_DIAMONDS :{G=m}Diamantes -STR_CARGO_PLURAL_FOOD :{G=m}Alimento -STR_CARGO_PLURAL_PAPER :{G=m}Papel -STR_CARGO_PLURAL_GOLD :{G=m}Ouro -STR_CARGO_PLURAL_WATER :{G=f}Água -STR_CARGO_PLURAL_WHEAT :{G=m}Trigo -STR_CARGO_PLURAL_RUBBER :{G=f}Borracha -STR_CARGO_PLURAL_SUGAR :{G=m}Açúcar -STR_CARGO_PLURAL_TOYS :{G=m}Brinquedos -STR_CARGO_PLURAL_SWEETS :{G=m}Doces -STR_CARGO_PLURAL_COLA :{G=f}Cola -STR_CARGO_PLURAL_CANDYFLOSS :{G=m}Algodão Doce -STR_CARGO_PLURAL_BUBBLES :{G=f}Bolhas -STR_CARGO_PLURAL_TOFFEE :{G=m}Caramelo -STR_CARGO_PLURAL_BATTERIES :{G=f}Pilhas -STR_CARGO_PLURAL_PLASTIC :{G=m}Plástico -STR_CARGO_PLURAL_FIZZY_DRINKS :{G=m}Refrigerantes +STR_CARGO_PLURAL_PASSENGERS :Passageiros +STR_CARGO_PLURAL_COAL :Carvão +STR_CARGO_PLURAL_MAIL :Correspondência +STR_CARGO_PLURAL_OIL :Petróleo +STR_CARGO_PLURAL_LIVESTOCK :Gado +STR_CARGO_PLURAL_GOODS :Bens +STR_CARGO_PLURAL_GRAIN :Grãos +STR_CARGO_PLURAL_WOOD :Madeira +STR_CARGO_PLURAL_IRON_ORE :Minério de Ferro +STR_CARGO_PLURAL_STEEL :Aço +STR_CARGO_PLURAL_VALUABLES :Objetos de Valor +STR_CARGO_PLURAL_COPPER_ORE :Minério de Cobre +STR_CARGO_PLURAL_MAIZE :Milho +STR_CARGO_PLURAL_FRUIT :Fruta +STR_CARGO_PLURAL_DIAMONDS :Diamantes +STR_CARGO_PLURAL_FOOD :Alimentos +STR_CARGO_PLURAL_PAPER :Papel +STR_CARGO_PLURAL_GOLD :Ouro +STR_CARGO_PLURAL_WATER :Água +STR_CARGO_PLURAL_WHEAT :Trigo +STR_CARGO_PLURAL_RUBBER :Borracha +STR_CARGO_PLURAL_SUGAR :Açúcar +STR_CARGO_PLURAL_TOYS :Brinquedos +STR_CARGO_PLURAL_SWEETS :Doces +STR_CARGO_PLURAL_COLA :Bebida de cola +STR_CARGO_PLURAL_CANDYFLOSS :Algodão Doce +STR_CARGO_PLURAL_BUBBLES :Bolhas +STR_CARGO_PLURAL_TOFFEE :Caramelo +STR_CARGO_PLURAL_BATTERIES :Baterias +STR_CARGO_PLURAL_PLASTIC :Plástico +STR_CARGO_PLURAL_FIZZY_DRINKS :Refrigerantes # Singular cargo name STR_CARGO_SINGULAR_NOTHING : -STR_CARGO_SINGULAR_PASSENGER :{G=m}Passageiro -STR_CARGO_SINGULAR_COAL :{G=m}Carvão -STR_CARGO_SINGULAR_MAIL :{G=f}Correspondência -STR_CARGO_SINGULAR_OIL :{G=m}Petróleo -STR_CARGO_SINGULAR_LIVESTOCK :{G=m}Gado -STR_CARGO_SINGULAR_GOODS :{G=m}Bens -STR_CARGO_SINGULAR_GRAIN :{G=m}Cereais -STR_CARGO_SINGULAR_WOOD :{G=f}Madeira -STR_CARGO_SINGULAR_IRON_ORE :{G=m}Minério de Ferro -STR_CARGO_SINGULAR_STEEL :{G=m}Aço -STR_CARGO_SINGULAR_VALUABLES :{G=m}Objetos de Valor -STR_CARGO_SINGULAR_COPPER_ORE :{G=m}Minério de Cobre -STR_CARGO_SINGULAR_MAIZE :{G=m}Milho -STR_CARGO_SINGULAR_FRUIT :{G=f}Fruta -STR_CARGO_SINGULAR_DIAMOND :{G=m}Diamante -STR_CARGO_SINGULAR_FOOD :{G=f}Alimento -STR_CARGO_SINGULAR_PAPER :{G=m}Papel -STR_CARGO_SINGULAR_GOLD :{G=m}Ouro -STR_CARGO_SINGULAR_WATER :{G=f}Água -STR_CARGO_SINGULAR_WHEAT :{G=m}Trigo -STR_CARGO_SINGULAR_RUBBER :{G=f}Borracha -STR_CARGO_SINGULAR_SUGAR :{G=m}Açúcar -STR_CARGO_SINGULAR_TOY :{G=m}Brinquedo -STR_CARGO_SINGULAR_SWEETS :{G=m}Doce -STR_CARGO_SINGULAR_COLA :{G=m}Cola -STR_CARGO_SINGULAR_CANDYFLOSS :{G=m}Algodão doce -STR_CARGO_SINGULAR_BUBBLE :{G=f}Bolha -STR_CARGO_SINGULAR_TOFFEE :{G=m}Caramelo -STR_CARGO_SINGULAR_BATTERY :{G=f}Pilha -STR_CARGO_SINGULAR_PLASTIC :{G=m}Plástico -STR_CARGO_SINGULAR_FIZZY_DRINK :{G=m}Refrigerante +STR_CARGO_SINGULAR_PASSENGER :Passageiro +STR_CARGO_SINGULAR_COAL :Carvão +STR_CARGO_SINGULAR_MAIL :Correspondência +STR_CARGO_SINGULAR_OIL :Petróleo +STR_CARGO_SINGULAR_LIVESTOCK :Gado +STR_CARGO_SINGULAR_GOODS :Bens +STR_CARGO_SINGULAR_GRAIN :Grãos +STR_CARGO_SINGULAR_WOOD :Madeira +STR_CARGO_SINGULAR_IRON_ORE :Minério de Ferro +STR_CARGO_SINGULAR_STEEL :Aço +STR_CARGO_SINGULAR_VALUABLES :Objeto de Valor +STR_CARGO_SINGULAR_COPPER_ORE :Minério de Cobre +STR_CARGO_SINGULAR_MAIZE :Milho +STR_CARGO_SINGULAR_FRUIT :Fruta +STR_CARGO_SINGULAR_DIAMOND :Diamante +STR_CARGO_SINGULAR_FOOD :Alimento +STR_CARGO_SINGULAR_PAPER :Papel +STR_CARGO_SINGULAR_GOLD :Ouro +STR_CARGO_SINGULAR_WATER :Água +STR_CARGO_SINGULAR_WHEAT :Trigo +STR_CARGO_SINGULAR_RUBBER :Borracha +STR_CARGO_SINGULAR_SUGAR :Açúcar +STR_CARGO_SINGULAR_TOY :Brinquedo +STR_CARGO_SINGULAR_SWEETS :Doce +STR_CARGO_SINGULAR_COLA :Bebida de cola +STR_CARGO_SINGULAR_CANDYFLOSS :Algodão Doce +STR_CARGO_SINGULAR_BUBBLE :Bolha +STR_CARGO_SINGULAR_TOFFEE :Caramelo +STR_CARGO_SINGULAR_BATTERY :Bateria +STR_CARGO_SINGULAR_PLASTIC :Plástico +STR_CARGO_SINGULAR_FIZZY_DRINK :Refrigerante # Quantity of cargo STR_QUANTITY_NOTHING : STR_QUANTITY_PASSENGERS :{COMMA}{NBSP}passageiro{P "" s} STR_QUANTITY_COAL :{WEIGHT_LONG} de carvão -STR_QUANTITY_MAIL :{COMMA}{NBSP}bolsa{P "" s} de correspondência +STR_QUANTITY_MAIL :{COMMA}{NBSP}malote{P "" s} de correspondência STR_QUANTITY_OIL :{VOLUME_LONG} de petróleo STR_QUANTITY_LIVESTOCK :{COMMA}{NBSP}cabeça{P "" s} de gado STR_QUANTITY_GOODS :{COMMA}{NBSP}caixa{P "" s} de bens @@ -279,7 +279,7 @@ STR_TOOLTIP_SORT_CRITERIA :{BLACK}Selecion STR_TOOLTIP_FILTER_CRITERIA :{BLACK}Selecione critério para filtração STR_BUTTON_SORT_BY :{BLACK}Classificar por STR_BUTTON_CATCHMENT :{BLACK}Cobertura -STR_TOOLTIP_CATCHMENT :{BLACK}Alternar a visão da área de cobertura +STR_TOOLTIP_CATCHMENT :{BLACK}Ativar a exibição da área de cobertura STR_TOOLTIP_CLOSE_WINDOW :{BLACK}Fechar janela STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS :{BLACK}Título da janela - arraste isto para mover a janela @@ -288,7 +288,7 @@ STR_TOOLTIP_DEBUG :{BLACK}Mostrar STR_TOOLTIP_DEFSIZE :{BLACK}Redimensiona a janela ao tamanho padrão. Ctrl+Clique para salvar o tamanho atual como padrão STR_TOOLTIP_STICKY :{BLACK}Marcar esta janela como infechável pela tecla 'Fechar Todas as Janelas'. Ctrl+Clique torna essa opção padrão STR_TOOLTIP_RESIZE :{BLACK}Clique e arraste para redimensionar esta janela -STR_TOOLTIP_TOGGLE_LARGE_SMALL_WINDOW :{BLACK}Alternar entre janela de tamanho grande/pequena +STR_TOOLTIP_TOGGLE_LARGE_SMALL_WINDOW :{BLACK}Ativar janela de tamanho grande/pequena STR_TOOLTIP_VSCROLL_BAR_SCROLLS_LIST :{BLACK}Barra de rolagem - rola a lista acima/abaixo STR_TOOLTIP_HSCROLL_BAR_SCROLLS_LIST :{BLACK}Barra de rolagem - rola a lista para esquerda/direita STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC :{BLACK}Demolir edifícios etc. em um quadrado do terreno. Ctrl+Clique+Arrastar seleciona a área diagonalmente. Pressionar Shift mostra o custo estimado @@ -385,21 +385,21 @@ STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}Pausar j STR_TOOLBAR_TOOLTIP_FORWARD :{BLACK}Acelerar o jogo STR_TOOLBAR_TOOLTIP_OPTIONS :{BLACK}Opções e definições STR_TOOLBAR_TOOLTIP_SAVE_GAME_ABANDON_GAME :{BLACK}Salvar, carregar ou abandonar o jogo, sair do jogo -STR_TOOLBAR_TOOLTIP_DISPLAY_MAP :{BLACK}Exibir mapa, visualizador extra, fluxo de cargas ou lista de sinais +STR_TOOLBAR_TOOLTIP_DISPLAY_MAP :{BLACK}Abrir mapa, nova visualização, fluxo de cargas ou lista de sinais STR_TOOLBAR_TOOLTIP_DISPLAY_TOWN_DIRECTORY :{BLACK}Mostrar lista de localidades -STR_TOOLBAR_TOOLTIP_DISPLAY_SUBSIDIES :{BLACK}Exibir lista de subsídios -STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_STATIONS :{BLACK}Exibir lista de estações da companhia -STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_FINANCES :{BLACK}Mostrar informações financeiras da empresa -STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_GENERAL :{BLACK}Exibir informações gerais da empresa +STR_TOOLBAR_TOOLTIP_DISPLAY_SUBSIDIES :{BLACK}Abrir lista de subsídios +STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_STATIONS :{BLACK}Abrir lista de estações da empresa +STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_FINANCES :{BLACK}Abrir informações financeiras da empresa +STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_GENERAL :{BLACK}Abrir informações gerais da empresa STR_TOOLBAR_TOOLTIP_DISPLAY_STORY_BOOK :{BLACK}Mostrar livro de histórias STR_TOOLBAR_TOOLTIP_DISPLAY_GOALS_LIST :{BLACK}Mostrar lista de objetivos -STR_TOOLBAR_TOOLTIP_DISPLAY_GRAPHS :{BLACK}Exibir gráficos da empresa e taxas de pagamento de carga -STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE :{BLACK}Exibir tabela de classificação das empresas +STR_TOOLBAR_TOOLTIP_DISPLAY_GRAPHS :{BLACK}Abrir gráficos da empresa e taxas de pagamento de carga +STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE :{BLACK}Abrir tabela da liga da empresa STR_TOOLBAR_TOOLTIP_FUND_CONSTRUCTION_OF_NEW :{BLACK}Abrir o catálogo de indústria, a cadeia industrial ou financiar a construção de uma nova indústria -STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_TRAINS :{BLACK}Mostrar a lista de trens da companhia. Ctrl+Clique para mostrar ou ocultar os grupos, oposto da configuração escolhida -STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_ROAD_VEHICLES :{BLACK}Exibir lista de veículos rodoviários da empresa. Ctrl+Clique alterna abrir a lista de grupos/veículos -STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_SHIPS :{BLACK}Mostrar lista de navios da empresa. Ctrl+Clique alterna entre abrir a lista de grupos/veículos -STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_AIRCRAFT :{BLACK}Mostrar lista de aeronaves da empresa. Ctrl+Clique alterna entre abrir a lista de grupos/veículos +STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_TRAINS :{BLACK}Abrir a lista de trens da empresa. Ctrl+Clique para mostrar ou ocultar os grupos, oposto da configuração escolhida +STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_ROAD_VEHICLES :{BLACK}Abrir lista de veículos rodoviários da empresa. Ctrl+Clique para mostrar ou ocultar os grupos de veículos, oposto da configuração escolhida +STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_SHIPS :{BLACK}Abrir lista de embarcações da empresa. Ctrl+Clique para mostrar ou ocultar os grupos de veículos, oposto da configuração escolhida +STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_AIRCRAFT :{BLACK}Abrir lista de aeronaves da empresa. Ctrl+Clique para mostrar ou ocultar os grupos de veículos, oposto da configuração escolhida STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN :{BLACK}Ampliar a visão STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT :{BLACK}Reduzir a visão STR_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Construir linha ferroviária @@ -483,7 +483,7 @@ STR_GRAPH_MENU_OPERATING_PROFIT_GRAPH :Gráfico de luc STR_GRAPH_MENU_INCOME_GRAPH :Gráfico de renda STR_GRAPH_MENU_DELIVERED_CARGO_GRAPH :Gráfico de carga entregue STR_GRAPH_MENU_PERFORMANCE_HISTORY_GRAPH :Gráfico de histórico de desempenho -STR_GRAPH_MENU_COMPANY_VALUE_GRAPH :Gráfico de avaliação da empresa +STR_GRAPH_MENU_COMPANY_VALUE_GRAPH :Gráfico de valor da empresa STR_GRAPH_MENU_CARGO_PAYMENT_RATES :Taxa de pagamento de carga # Company league menu @@ -528,15 +528,15 @@ STR_NEWS_MENU_DELETE_ALL_MESSAGES :Apagar todas as # About menu STR_ABOUT_MENU_LAND_BLOCK_INFO :Informações do terreno STR_ABOUT_MENU_HELP :Ajuda & manuais -STR_ABOUT_MENU_TOGGLE_CONSOLE :Alternar console +STR_ABOUT_MENU_TOGGLE_CONSOLE :Mostrar console STR_ABOUT_MENU_AI_DEBUG :Depurar IA/Script do jogo STR_ABOUT_MENU_SCREENSHOT :Captura de tela -STR_ABOUT_MENU_SHOW_FRAMERATE :Exibir taxa de quadros +STR_ABOUT_MENU_SHOW_FRAMERATE :Mostrar taxa de quadros STR_ABOUT_MENU_ABOUT_OPENTTD :Sobre 'OpenTTD' STR_ABOUT_MENU_SPRITE_ALIGNER :Alinhador de "sprites" -STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Alternar caixas delimitadoras -STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS :Alterna a colorização dos blocos sujos -STR_ABOUT_MENU_TOGGLE_WIDGET_OUTLINES :Alterna o contorno do elemento +STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Mostrar caixas delimitadoras +STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS :Ativar a colorização dos blocos sujos +STR_ABOUT_MENU_TOGGLE_WIDGET_OUTLINES :Mostrar os contornos do elemento ###length 31 STR_DAY_NUMBER_1ST :1º @@ -601,7 +601,7 @@ STR_MONTH_DEC :Dezembro # Graph window STR_GRAPH_KEY_BUTTON :{BLACK}Chave -STR_GRAPH_KEY_TOOLTIP :{BLACK}Exibir chave aos gráficos +STR_GRAPH_KEY_TOOLTIP :{BLACK}Mostrar chave dos gráficos STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING} STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{}{NUM} STR_GRAPH_Y_LABEL :{TINY_FONT}{STRING} @@ -616,21 +616,21 @@ STR_GRAPH_COMPANY_VALUES_CAPTION :{WHITE}Gráfico STR_GRAPH_LAST_72_MINUTES_TIME_LABEL :{TINY_FONT}{BLACK}Últimos 72 minutos STR_GRAPH_CARGO_PAYMENT_RATES_CAPTION :{WHITE}Taxa de Pagamento de Carga -STR_GRAPH_CARGO_PAYMENT_RATES_DAYS :{TINY_FONT}{BLACK}Dias em deslocamento -STR_GRAPH_CARGO_PAYMENT_RATES_SECONDS :{TINY_FONT}{BLACK}Segundos em deslocamento +STR_GRAPH_CARGO_PAYMENT_RATES_DAYS :{TINY_FONT}{BLACK}Dias em trânsito +STR_GRAPH_CARGO_PAYMENT_RATES_SECONDS :{TINY_FONT}{BLACK}Segundos em trânsito STR_GRAPH_CARGO_PAYMENT_RATES_TITLE :{TINY_FONT}{BLACK}Pagamento por entregar 10 unidades (ou 10 000 litros) de carga numa distância de 20 quadrados STR_GRAPH_CARGO_ENABLE_ALL :{TINY_FONT}{BLACK}Habilitar tudo STR_GRAPH_CARGO_DISABLE_ALL :{TINY_FONT}{BLACK}Desabilitar tudo STR_GRAPH_CARGO_TOOLTIP_ENABLE_ALL :{BLACK}Exibir todas as cargas no gráfico de taxas de pagamento de cargas STR_GRAPH_CARGO_TOOLTIP_DISABLE_ALL :{BLACK}Não exibir cargas no gráfico de taxas de pagamento de cargas -STR_GRAPH_CARGO_PAYMENT_TOGGLE_CARGO :{BLACK}Alternar gráfico para o tipo de carga em ligado/desligado +STR_GRAPH_CARGO_PAYMENT_TOGGLE_CARGO :{BLACK}Mostrar/ocultar gráfico para o tipo de carga STR_GRAPH_CARGO_PAYMENT_CARGO :{TINY_FONT}{BLACK}{STRING} -STR_GRAPH_PERFORMANCE_DETAIL_TOOLTIP :{BLACK}Exibir avaliações de performance detalhadas +STR_GRAPH_PERFORMANCE_DETAIL_TOOLTIP :{BLACK}Mostrar avaliações detalhadas de desempneho # Graph key window STR_GRAPH_KEY_CAPTION :{WHITE}Chave para gráficos da empresa -STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Clique aqui para alternar a entrada da empresa no gráfico +STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Clique aqui para mostrar/ocultar empresa no gráfico # Company league window STR_COMPANY_LEAGUE_TABLE_CAPTION :{WHITE}Tabela da Liga das Empresas @@ -710,8 +710,8 @@ STR_MUSIC_TOOLTIP_SELECT_NEW_STYLE_MUSIC :{BLACK}Selecion STR_MUSIC_TOOLTIP_SELECT_EZY_STREET_STYLE :{BLACK}Selecionar programa 'Ezy Street' STR_MUSIC_TOOLTIP_SELECT_CUSTOM_1_USER_DEFINED :{BLACK}Selecionar programa 'Personalizado 1' (definido pelo usuário) STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Selecionar programa 'Personalizado 2' (definido pelo usuário) -STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Alternar programa misturado em ligado/desligado -STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Exibir janela de seleção de faixas de música +STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Ligar/Desligar reprodução aleatória +STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Mostrar janela de seleção de faixas de música # Playlist window STR_PLAYLIST_MUSIC_SELECTION_SETNAME :{WHITE}Programação Musical - '{STRING}' @@ -752,16 +752,16 @@ STR_SMALLMAP_TYPE_ROUTES :Rotas STR_SMALLMAP_TYPE_VEGETATION :Vegetação STR_SMALLMAP_TYPE_OWNERS :Proprietários -STR_SMALLMAP_TOOLTIP_SHOW_LAND_CONTOURS_ON_MAP :{BLACK}Exibir contornos do terreno no mapa -STR_SMALLMAP_TOOLTIP_SHOW_VEHICLES_ON_MAP :{BLACK}Exibir veículos no mapa -STR_SMALLMAP_TOOLTIP_SHOW_INDUSTRIES_ON_MAP :{BLACK}Exibir indústrias no mapa -STR_SMALLMAP_TOOLTIP_SHOW_LINK_STATS_ON_MAP :{BLACK}Exibir fluxo de carga no mapa -STR_SMALLMAP_TOOLTIP_SHOW_TRANSPORT_ROUTES_ON :{BLACK}Exibir rotas de transporte no mapa -STR_SMALLMAP_TOOLTIP_SHOW_VEGETATION_ON_MAP :{BLACK}Exibir vegetação no mapa -STR_SMALLMAP_TOOLTIP_SHOW_LAND_OWNERS_ON_MAP :{BLACK}Exibir proprietários de terrenos no mapa -STR_SMALLMAP_TOOLTIP_INDUSTRY_SELECTION :{BLACK}Clique em um tipo de indústria para alternar sua exibição. Ctrl+Clique desabilita todos os tipos exceto a selecionada. Ctrl+Clique nela novamente para habilitar todos os tipos de indústrias -STR_SMALLMAP_TOOLTIP_COMPANY_SELECTION :{BLACK}Clique em uma compania para alternar a exibição de suas propriedades. Ctrl+Clique desabilita todas as companias exceto a selecionada. Ctrl+Clique nela novamente para habilitar todas as companias -STR_SMALLMAP_TOOLTIP_CARGO_SELECTION :{BLACK}Clique numa carga para alternar a exibição de sua propriedade. Ctrl+Clique desativa todas as cargas exceto a selecionada. Ctrl+Clique novamente para exibir todas +STR_SMALLMAP_TOOLTIP_SHOW_LAND_CONTOURS_ON_MAP :{BLACK}Mostrar contornos do terreno no mapa +STR_SMALLMAP_TOOLTIP_SHOW_VEHICLES_ON_MAP :{BLACK}Mostrar veículos no mapa +STR_SMALLMAP_TOOLTIP_SHOW_INDUSTRIES_ON_MAP :{BLACK}Mostrar indústrias no mapa +STR_SMALLMAP_TOOLTIP_SHOW_LINK_STATS_ON_MAP :{BLACK}Mostrar fluxo de carga no mapa +STR_SMALLMAP_TOOLTIP_SHOW_TRANSPORT_ROUTES_ON :{BLACK}Mostrar rotas de transporte no mapa +STR_SMALLMAP_TOOLTIP_SHOW_VEGETATION_ON_MAP :{BLACK}Mostrar vegetação no mapa +STR_SMALLMAP_TOOLTIP_SHOW_LAND_OWNERS_ON_MAP :{BLACK}Mostrar proprietários do terreno no mapa +STR_SMALLMAP_TOOLTIP_INDUSTRY_SELECTION :{BLACK}Clique em um tipo de indústria para exibir/ocultar a indústria. Ctrl+Clique desabilita todos os tipos exceto a selecionada. Ctrl+Clique nela novamente para habilitar todos os tipos de indústrias +STR_SMALLMAP_TOOLTIP_COMPANY_SELECTION :{BLACK}Clique em uma empresa para exibir/ocultar as suas propriedades. Ctrl+Clique desabilita todas as companias exceto a selecionada. Ctrl+Clique nela novamente para habilitar todas as empresas +STR_SMALLMAP_TOOLTIP_CARGO_SELECTION :{BLACK}Clique em uma carga para exibir/ocultar as suas propriedades. Ctrl+Clique desativa todas as cargas, exceto a selecionada. Ctrl+Clique novamente para ativar todas as cargas STR_SMALLMAP_LEGENDA_ROADS :{TINY_FONT}{BLACK}Rodovias STR_SMALLMAP_LEGENDA_RAILROADS :{TINY_FONT}{BLACK}Ferrovias @@ -804,14 +804,14 @@ STR_SMALLMAP_ENABLE_ALL :{BLACK}Habilita STR_SMALLMAP_SHOW_HEIGHT :{BLACK}Mostrar altitude STR_SMALLMAP_TOOLTIP_DISABLE_ALL_INDUSTRIES :{BLACK}Não exibir indústrias no mapa STR_SMALLMAP_TOOLTIP_ENABLE_ALL_INDUSTRIES :{BLACK}Exibir todas as indústrias no mapa -STR_SMALLMAP_TOOLTIP_SHOW_HEIGHT :{BLACK}Alternar a exibição de mapa topográfico -STR_SMALLMAP_TOOLTIP_DISABLE_ALL_COMPANIES :{BLACK}Não exibir propriedade da empresa no mapa +STR_SMALLMAP_TOOLTIP_SHOW_HEIGHT :{BLACK}Ativar a exibição de mapa topográfico +STR_SMALLMAP_TOOLTIP_DISABLE_ALL_COMPANIES :{BLACK}Não exibir propriedades da empresa no mapa STR_SMALLMAP_TOOLTIP_ENABLE_ALL_COMPANIES :{BLACK}Exibir todas as propriedades da empresa no mapa -STR_SMALLMAP_TOOLTIP_DISABLE_ALL_CARGOS :{BLACK}Exibe nenhuma carga no mapa -STR_SMALLMAP_TOOLTIP_ENABLE_ALL_CARGOS :{BLACK}Exibe todas as cargas no mapa +STR_SMALLMAP_TOOLTIP_DISABLE_ALL_CARGOS :{BLACK}Não mostrar cargas no mapa +STR_SMALLMAP_TOOLTIP_ENABLE_ALL_CARGOS :{BLACK}Exibir todas as cargas no mapa # Status bar messages -STR_STATUSBAR_TOOLTIP_SHOW_LAST_NEWS :{BLACK}Exibir a última mensagem ou notícia +STR_STATUSBAR_TOOLTIP_SHOW_LAST_NEWS :{BLACK}Mostrar a última mensagem ou notícia STR_STATUSBAR_COMPANY_NAME :{SILVER}- - {COMPANY} - - STR_STATUSBAR_PAUSED :{YELLOW}* * PAUSADO * * STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * PAUSADO (aguardando atualização do gráfico de links) * * @@ -908,7 +908,7 @@ STR_NEWS_VEHICLE_UNPROFITABLE_YEAR :{WHITE}{VEHICLE STR_NEWS_VEHICLE_UNPROFITABLE_PERIOD :{WHITE}{VEHICLE}'s rendeu no último período {CURRENCY_LONG} STR_NEWS_AIRCRAFT_DEST_TOO_FAR :{WHITE}{VEHICLE} não pode chegar ao próximo destino porque está fora de alcance -STR_NEWS_ORDER_REFIT_FAILED :{WHITE}{VEHICLE} parou porque uma readaptação ordenada falhou +STR_NEWS_ORDER_REFIT_FAILED :{WHITE}{VEHICLE} parou porque uma ordem de adaptação falhou STR_NEWS_VEHICLE_AUTORENEW_FAILED :{WHITE}Autorenovação falhou para {VEHICLE}{}{STRING} STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE :{BIG_FONT}{BLACK}Nov{G o a} {STRING} já está disponível! @@ -1127,11 +1127,11 @@ STR_CURRENCY_SET_CUSTOM_CURRENCY_PREFIX_TOOLTIP :{BLACK}Definir STR_CURRENCY_SUFFIX :{LTBLUE}Sufixo: {ORANGE}{STRING} STR_CURRENCY_SET_CUSTOM_CURRENCY_SUFFIX_TOOLTIP :{BLACK}Definir a sequência de sufixo por a sua moeda -STR_CURRENCY_SWITCH_TO_EURO :{LTBLUE}Alternar para Euro: {ORANGE}{NUM} -STR_CURRENCY_SWITCH_TO_EURO_NEVER :{LTBLUE}Alternar para Euro: {ORANGE}nunca -STR_CURRENCY_SET_CUSTOM_CURRENCY_TO_EURO_TOOLTIP :{BLACK}Definir o ano para alternar para Euro -STR_CURRENCY_DECREASE_CUSTOM_CURRENCY_TO_EURO_TOOLTIP :{BLACK}Alternar para Euro anteriormente -STR_CURRENCY_INCREASE_CUSTOM_CURRENCY_TO_EURO_TOOLTIP :{BLACK}Alternar para euro posteriormente +STR_CURRENCY_SWITCH_TO_EURO :{LTBLUE}Mudar para Euro: {ORANGE}{NUM} +STR_CURRENCY_SWITCH_TO_EURO_NEVER :{LTBLUE}Mudar para Euro: {ORANGE}nunca +STR_CURRENCY_SET_CUSTOM_CURRENCY_TO_EURO_TOOLTIP :{BLACK}Definir o ano para mudar para Euro +STR_CURRENCY_DECREASE_CUSTOM_CURRENCY_TO_EURO_TOOLTIP :{BLACK}Mudar para Euro mais cedo +STR_CURRENCY_INCREASE_CUSTOM_CURRENCY_TO_EURO_TOOLTIP :{BLACK}Mudar para Euro mais tarde STR_CURRENCY_PREVIEW :{LTBLUE}Previsão: {ORANGE}{CURRENCY_LONG} STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 Libras (£) na sua moeda @@ -1222,8 +1222,8 @@ STR_CONFIG_SETTING_TYPE :{LTBLUE}Tipo de STR_CONFIG_SETTING_TYPE_CLIENT :Config. do cliente (não é guardado em savegames; afeta todos os jogos) STR_CONFIG_SETTING_TYPE_GAME_MENU :Config. do jogo (guardado no savegame; afeta apenas jogos novos) STR_CONFIG_SETTING_TYPE_GAME_INGAME :Config. do jogo (guardado no savegame; afeta apenas jogo atual) -STR_CONFIG_SETTING_TYPE_COMPANY_MENU :Config. da companhia (guardado no savegame; afeta apenas novos jogos) -STR_CONFIG_SETTING_TYPE_COMPANY_INGAME :Config. da companhia (guardado no savegame; afeta apenas a comp. atual) +STR_CONFIG_SETTING_TYPE_COMPANY_MENU :Configurações da empresa (guardado no savegame; afeta apenas novos jogos) +STR_CONFIG_SETTING_TYPE_COMPANY_INGAME :Configurações da empresa (guardado no savegame; afeta apenas a empresa atual) STR_CONFIG_SETTING_RESET_ALL_CONFIRMATION_DIALOG_CAPTION :{WHITE}Cuidado! STR_CONFIG_SETTING_RESET_ALL_CONFIRMATION_DIALOG_TEXT :{WHITE}Essa ação irá restaurar todas as configurações para os valores padrão.{}Tem certeza que deseja continuar? @@ -1241,8 +1241,8 @@ STR_CONFIG_SETTING_TYPE_DROPDOWN_ALL :Todos os tipos STR_CONFIG_SETTING_TYPE_DROPDOWN_CLIENT :Configs. do cliente (não é guardado no savegame; afeta todos os jogos) STR_CONFIG_SETTING_TYPE_DROPDOWN_GAME_MENU :Configs. do jogo (guardado no savegame; afeta apenas novos jogos) STR_CONFIG_SETTING_TYPE_DROPDOWN_GAME_INGAME :Configs. do jogo (guardado no savegame; afeta apenas o jogo atual) -STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_MENU :Configs. da companhia (guardado no savegame; afeta apenas novos jogos) -STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_INGAME :Configs. de companhia (guardado no savegame; afeta apenas a companhia atual) +STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_MENU :Configurações da empresa (guardado no savegame; afeta apenas novos jogos) +STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_INGAME :Configurações da empresa (guardado no savegame; afeta apenas a empresa atual) STR_CONFIG_SETTINGS_NONE :{G=m}{WHITE}- Nenhum - ###length 3 @@ -1315,7 +1315,7 @@ STR_CONFIG_SETTING_TRAIN_REVERSING :Desabilitar rev STR_CONFIG_SETTING_TRAIN_REVERSING_HELPTEXT :Se ativado, trens não irão mudar de direção em estações não terminais, mesmo se houver um caminho mais curto ao próximo destino ao trocar de direção STR_CONFIG_SETTING_DISASTERS :Desastres: {STRING} -STR_CONFIG_SETTING_DISASTERS_HELPTEXT :Alterna desastres que podem ocasionalmente bloquear ou destruir veículos ou infraestrutura +STR_CONFIG_SETTING_DISASTERS_HELPTEXT :Ativar desastres que podem, ocasionalmente, bloquear ou destruir veículos ou infraestrutura STR_CONFIG_SETTING_CITY_APPROVAL :Atitude da autoridade local: {STRING} STR_CONFIG_SETTING_CITY_APPROVAL_HELPTEXT :Escolhe como a poluição sonoroa e ambiental afeta a classificação na cidade e as ações futuras nessa cidade @@ -1398,8 +1398,8 @@ STR_CONFIG_SETTING_SIGNALSIDE_DRIVING_SIDE :Do lado que se STR_CONFIG_SETTING_SIGNALSIDE_RIGHT :Direita ###length 2 -STR_CONFIG_SETTING_SHOWFINANCES :Exibir janela das finanças no fim do ano: {STRING} -STR_CONFIG_SETTING_SHOWFINANCES_PERIOD :Exibir janela das finanças no fim do período: {STRING} +STR_CONFIG_SETTING_SHOWFINANCES :Mostrar janela das finanças no fim do ano: {STRING} +STR_CONFIG_SETTING_SHOWFINANCES_PERIOD :Mostrar janela das finanças no fim do período: {STRING} ###length 2 STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT :Se ativado, a janela de finanças é aberta ao final de cada ano para permitir uma inspeção fácil das economias da companhia @@ -1509,9 +1509,9 @@ STR_CONFIG_SETTING_MINUTES_PER_YEAR_VALUE :{NUM} STR_CONFIG_SETTING_MINUTES_PER_YEAR_FROZEN :0 (tempo do calendário congelado) STR_CONFIG_SETTING_TOWN_CARGO_SCALE :Escalar a produção de carga da localidade: {STRING} -STR_CONFIG_SETTING_TOWN_CARGO_SCALE_HELPTEXT :Escalar a produção de carga das localidades nesta percentagem. +STR_CONFIG_SETTING_TOWN_CARGO_SCALE_HELPTEXT :Escalar a produção de carga das localidades nessa porcentagem. STR_CONFIG_SETTING_INDUSTRY_CARGO_SCALE :Escalar a produção de carga da indústria: {STRING} -STR_CONFIG_SETTING_INDUSTRY_CARGO_SCALE_HELPTEXT :Escalar a produção de carga das indústrias nesta percentagem. +STR_CONFIG_SETTING_INDUSTRY_CARGO_SCALE_HELPTEXT :Escalar a produção de carga das indústrias nessa porcentagem. STR_CONFIG_SETTING_CARGO_SCALE_VALUE :{NUM}% STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Auto-renovação de veículos quando ficam velhos: {STRING} @@ -1529,13 +1529,13 @@ STR_CONFIG_SETTING_AUTORENEW_MONEY_HELPTEXT :Quantia mínima STR_CONFIG_SETTING_ERRMSG_DURATION :Duração da mensagem de erro: {STRING} STR_CONFIG_SETTING_ERRMSG_DURATION_HELPTEXT :Define quanto tempo as janelas de erro (vermelhas) ficam abertas antes de fecharem automaticamente. Erros críticos devem ser fechados manualmente. -STR_CONFIG_SETTING_HOVER_DELAY :Exibir dicas: {STRING} +STR_CONFIG_SETTING_HOVER_DELAY :Mostrar dicas: {STRING} STR_CONFIG_SETTING_HOVER_DELAY_HELPTEXT :Intervalo antes das dicas de ferramentas aparecerem ao deixar o mouse sobre algum botão na interface. Em contrapartida, as dicas são mostradas ao se clicar com o botão direito se esse valor for definido para 0. STR_CONFIG_SETTING_HOVER_DELAY_VALUE :Aguardar {COMMA} milisegundo{P "" s} ###setting-zero-is-special STR_CONFIG_SETTING_HOVER_DELAY_DISABLED :Botão direito -STR_CONFIG_SETTING_POPULATION_IN_LABEL :Exibir população da cidade na janela da cidade: {STRING} +STR_CONFIG_SETTING_POPULATION_IN_LABEL :Mostrar população da localidade na identificação da localidade: {STRING} STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT :Exibe a população das cidades nos nomes, no mapa STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :Espessura das linhas nos gráficos: {STRING} @@ -1652,7 +1652,7 @@ STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Controla como a STR_CONFIG_SETTING_MEASURE_TOOLTIP :Exibe distâncias quando usar ferramentas de construção: {STRING} STR_CONFIG_SETTING_MEASURE_TOOLTIP_HELPTEXT :Exibe distâncias e diferenças de altitude quando clicando e arrastando enquanto constrói -STR_CONFIG_SETTING_LIVERIES :Exibir cores avançadas: {STRING} +STR_CONFIG_SETTING_LIVERIES :Mostrar pinturas específicas do tipo de veículo: {STRING} STR_CONFIG_SETTING_LIVERIES_HELPTEXT :Contra o uso de cores de veículos dependentes do tipo (ao invés de cores específicas à companhia) ###length 3 STR_CONFIG_SETTING_LIVERIES_NONE :Nenhum @@ -1660,7 +1660,7 @@ STR_CONFIG_SETTING_LIVERIES_OWN :Minha empresa STR_CONFIG_SETTING_LIVERIES_ALL :Todas as empresas STR_CONFIG_SETTING_PREFER_TEAMCHAT :Falar em time com : {STRING} -STR_CONFIG_SETTING_PREFER_TEAMCHAT_HELPTEXT :Alterna a ativação da conversa entre público e só-companhia entre e +STR_CONFIG_SETTING_PREFER_TEAMCHAT_HELPTEXT :Trocar o mapeamento entre o chat interno da empresa e o chat público para e respectivamente STR_CONFIG_SETTING_SCROLLWHEEL_MULTIPLIER :Velocidade do scrollwheel do mapa: {STRING} STR_CONFIG_SETTING_SCROLLWHEEL_MULTIPLIER_HELPTEXT :Controla a sensitividade do rolamento com a roda do mouser @@ -1725,15 +1725,15 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Ativa o uso da STR_CONFIG_SETTING_LOADING_INDICATORS :Usar indicadores de carga: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Seleciona se os indicadores de carga são exibidos sobre os veículos (des)carregando -STR_CONFIG_SETTING_TIMETABLE_MODE :Unidades de tempo para as ordens: {STRING} -STR_CONFIG_SETTING_TIMETABLE_MODE_HELPTEXT :Selecionar as unidades de tempo usadas nas ordens dos veículos +STR_CONFIG_SETTING_TIMETABLE_MODE :Unidades de tempo para horários: {STRING} +STR_CONFIG_SETTING_TIMETABLE_MODE_HELPTEXT :Selecionar as unidades de tempo usadas nos horários dos veículos ###length 3 STR_CONFIG_SETTING_TIMETABLE_MODE_DAYS :Dias STR_CONFIG_SETTING_TIMETABLE_MODE_SECONDS :Segundos STR_CONFIG_SETTING_TIMETABLE_MODE_TICKS :Tiques -STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Mostrar chegada e saída nos planos de horário: {STRING} -STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Exibe tempos de chegada e partida anticipados nos planos de horário +STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Mostrar chegada e partida nos horários: {STRING} +STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Exibir tempos de chegada e partida anticipados nos horários STR_CONFIG_SETTING_QUICKGOTO :Criar rapidamente ordens para um veículo: {STRING} STR_CONFIG_SETTING_QUICKGOTO_HELPTEXT :Pre-seleciona a opção 'ir para' ao abrir a janelas de ordens @@ -1745,7 +1745,7 @@ STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_FIRST :Primeiro dispon STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_LAST :Último disponível STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_MOST_USED :Mais utilizado -STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION :Exibir vias reservadas para trilhos: {STRING} +STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION :Mostrar trajetos reservados para trilhos: {STRING} STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION_HELPTEXT :Escurece as vias reservadas para ajudar a lidar com problemas de trens não funcionando em blocos baseados em destinos STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS :Manter a barra de construção aberta: {STRING} @@ -1764,7 +1764,7 @@ STR_CONFIG_SETTING_SOUND_TICKER :Notícias: {STR STR_CONFIG_SETTING_SOUND_TICKER_HELPTEXT :Toca um som para mensagens resumidas STR_CONFIG_SETTING_SOUND_NEWS :Jornal: {STRING} -STR_CONFIG_SETTING_SOUND_NEWS_HELPTEXT :Toca efeito sonoro ao exibir jornais +STR_CONFIG_SETTING_SOUND_NEWS_HELPTEXT :Reproduzir efeito sonoro ao exibir jornais ###length 2 STR_CONFIG_SETTING_SOUND_NEW_YEAR :Fim de ano: {STRING} @@ -1862,7 +1862,7 @@ STR_CONFIG_SETTING_NEWS_ACCIDENT_OTHER :Acidentes de ve STR_CONFIG_SETTING_NEWS_ACCIDENT_OTHER_HELPTEXT :Mostrar um jornal sobre os acidentes de veículos dos competidores STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION :Informações da empresa: {STRING} -STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION_HELPTEXT :Exibe um jornal quando uma companhia é aberta, ou quando estão próximas da bancarrota +STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION_HELPTEXT :Exibir um jornal quando uma nova empresa é criada, ou quando empresas estão à beira da falência STR_CONFIG_SETTING_NEWS_INDUSTRY_OPEN :Abertura de indústrias: {STRING} STR_CONFIG_SETTING_NEWS_INDUSTRY_OPEN_HELPTEXT :Exibe um jornal quando indústrias abrem @@ -1874,7 +1874,7 @@ STR_CONFIG_SETTING_NEWS_ECONOMY_CHANGES :Mudanças econ STR_CONFIG_SETTING_NEWS_ECONOMY_CHANGES_HELPTEXT :Exibe um jornal referente a mudanças globais na economia STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_COMPANY :Mudanças na produção das indústrias servidas pela empresa: {STRING} -STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_COMPANY_HELPTEXT :Exibe um jornal quando a produção de indústrias muda, que são atendidas pela companhia +STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_COMPANY_HELPTEXT :Exibir um jornal quando o nível de produção das indústrias que são atendidas pela empresa mudarem STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_OTHER :Mudanças na produção de indústrias servida pelo(s) concorrente(es): {STRING} STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_OTHER_HELPTEXT :Exibe um jornal quando a produção de indústrias muda, que são atendidas pelos competidores @@ -2038,7 +2038,7 @@ STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME_HELPTEXT :Tempo gasto par STR_CONFIG_SETTING_DISTRIBUTION_PAX :Modo de distribuição para passageiros: {STRING} STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT :"Simétrico" significa que aproximadamente o mesmo número de passageiros irá de uma estação A para uma estação B como de B para A. "Assimétrico" significa que um número arbitrário de passageiros pode ir em qualquer direção. "Manual" significa que não haverá distribuição automática para os passageiros. -STR_CONFIG_SETTING_DISTRIBUTION_MAIL :Modo de distribuição para correios: {STRING} +STR_CONFIG_SETTING_DISTRIBUTION_MAIL :Modo de distribuição para correspondências: {STRING} STR_CONFIG_SETTING_DISTRIBUTION_MAIL_HELPTEXT :"Simétrico" significa que aproximadamente a mesma quantidade de correspondência será enviada de uma estação A para uma estação B como de B para A. "Assimétrica" significa que quantidades arbitrárias de correspondência podem ser enviadas em qualquer direção. "Manual" significa que nenhuma distribuição automática ocorrerá por correio. STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED :Modo de distribuição para classe BLINDADOS de carga: {STRING} STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT :A classe de carga BLINDADA contém objetos de valor em clima temperado, diamantes em clima subtropical ou ouro em clima subártico. NewGRFs podem mudar isso. "Simétrica" significa que aproximadamente a mesma quantidade dessa carga será enviada de uma estação A para uma estação B como de B para A. "Assimétrica" significa que quantidades arbitrárias dessa carga podem ser enviadas em qualquer direção. "Manual" significa que não haverá distribuição automática para aquela carga. Recomenda-se definir isso como assimétrico ou manual ao jogar subártico ou subtropical, pois os bancos só recebem carga nesses climas. Para temperado, você também pode escolher simétrico, pois os bancos enviarão objetos de valor de volta ao banco de origem. @@ -2058,7 +2058,7 @@ STR_CONFIG_SETTING_DEMAND_SIZE :Quantidade de c STR_CONFIG_SETTING_DEMAND_SIZE_HELPTEXT :Definir isso para menos de 100% faz com que a distribuição simétrica comporte-se mais como a assimétrica. Menos carga será devolvida forçosamente se uma certa quantidade for mandada a uma estação. Se você definir a 0%, a distribuição se comportará exatamente como a assimétrica. STR_CONFIG_SETTING_SHORT_PATH_SATURATION :Saturação de caminhos curtos antes de usar caminhos de alta capacidade: {STRING} -STR_CONFIG_SETTING_SHORT_PATH_SATURATION_HELPTEXT :Frequentemente há múltiplos caminhos entre duas estações. Cargodist irá saturar o caminho mais curto primeiro, depois usar o segundo caminho mais curto até saturá-lo, e assim por diante. Saturação é determinada pela estimação da capacidade de do uso planejado. Ao saturar todos os caminhos, se ainda houver demanda, irá sobrecarregar todos os caminhos, com preferência aos de maior capacidade. No entanto, na maior parte do tempo o algorítimo não irá estimar a capacidade corretamente. Essa configuração permite você definir até que porcentagem um caminho mais curto deverá ser saturado na primeira passada antes do algorítimo proceder ao próxido. Defina-o para menos de 100% para evitar estações sobrecarregadas no caso de capacidade superestimada. +STR_CONFIG_SETTING_SHORT_PATH_SATURATION_HELPTEXT :Frequentemente há múltiplos trajetos entre duas estações. Cargodist irá saturar o trajeto mais curto primeiro, depois usar o segundo trajeto mais curto até saturá-lo, e assim por diante. A saturação é determinada por uma estimativa da capacidade e do uso planejado. Ao saturar todos os trajetos, se ainda houver demanda não atendida, irá sobrecarregar todos os trajetos, com preferência pelos de maior capacidade. Entretanto, na maioria das vezes o algoritimo não irá estimar corretamente a capacidade. Essa configuração permite definir até que porcentagem um trajeto mais curto deverá ser saturado na primeira passada antes do algoritimo selecionar o próximo trajeto mais longo. Defina-o para menos de 100% para evitar estações sobrecarregadas no caso de capacidade superestimada. STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY :Unidades de velocidade (terrestre): {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_NAUTICAL :Unidades de velocidade (náutica): {STRING} @@ -2113,7 +2113,7 @@ STR_CONFIG_SETTING_INTERFACE_GENERAL :Geral STR_CONFIG_SETTING_INTERFACE_VIEWPORTS :Janelas de visualização STR_CONFIG_SETTING_INTERFACE_CONSTRUCTION :Construção STR_CONFIG_SETTING_ADVISORS :Notícias / Conselheiros -STR_CONFIG_SETTING_COMPANY :Companhia +STR_CONFIG_SETTING_COMPANY :Empresa STR_CONFIG_SETTING_ACCOUNTING :Contabilidade STR_CONFIG_SETTING_VEHICLES :Veículos STR_CONFIG_SETTING_VEHICLES_PHYSICS :Física @@ -2204,7 +2204,7 @@ STR_INTRO_TOOLTIP_SUB_ARCTIC_LANDSCAPE :{BLACK}Selecion STR_INTRO_TOOLTIP_SUB_TROPICAL_LANDSCAPE :{BLACK}Selecionar cenário do estilo 'subtropical' STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE :{BLACK}Selecionar cenário do estilo 'toyland' -STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Exibir opções de jogo +STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Abrir opções de jogo STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Mostrar tabela de classificações STR_INTRO_TOOLTIP_HELP :{BLACK}Obter acesso à documentação e recursos online STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Mostrar configurações @@ -2244,7 +2244,7 @@ STR_HELP_WINDOW_COMMUNITY :{BLACK}Comunida # Cheat window STR_CHEATS :{WHITE}Opções da sandbox STR_CHEAT_MONEY :{LTBLUE}Aumentar dinheiro em {CURRENCY_LONG} -STR_CHEAT_CHANGE_COMPANY :{LTBLUE}Jogando pela Co.: {ORANGE}{COMMA} +STR_CHEAT_CHANGE_COMPANY :{LTBLUE}Jogando como empresa: {ORANGE}{COMMA} STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}Escavadeira mágica (destrói indústrias, objetos estáticos): {ORANGE}{STRING} STR_CHEAT_CROSSINGTUNNELS :{LTBLUE}Os túneis poderão cruzar-se: {ORANGE}{STRING} STR_CHEAT_NO_JETCRASH :{LTBLUE}Aeronaves a jato não irão se acidentar (frequentemente) em aeroportos pequenos: {ORANGE} {STRING} @@ -2258,15 +2258,15 @@ STR_CHEAT_STATION_RATING :{LTBLUE}Fixar a # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - Esquema de cores -STR_LIVERY_GENERAL_TOOLTIP :{BLACK}Exibir esquemas de cor gerais +STR_LIVERY_GENERAL_TOOLTIP :{BLACK}Mostrar esquemas de cores gerais STR_LIVERY_TRAIN_TOOLTIP :{BLACK}Exibe esquemas de cor de trens -STR_LIVERY_ROAD_VEHICLE_TOOLTIP :{BLACK}Exibir os esquemas de cor de automóveis -STR_LIVERY_SHIP_TOOLTIP :{BLACK}Exibir esquemas de cor de embarcação -STR_LIVERY_AIRCRAFT_TOOLTIP :{BLACK}Exibir esquemas de cor de aviões -STR_LIVERY_TRAIN_GROUP_TOOLTIP :{BLACK}Exibir cores de grupos de trens -STR_LIVERY_ROAD_VEHICLE_GROUP_TOOLTIP :{BLACK}Exibir cores dos grupos de veículos -STR_LIVERY_SHIP_GROUP_TOOLTIP :{BLACK}Exibir cores de grupos de embarcações -STR_LIVERY_AIRCRAFT_GROUP_TOOLTIP :{BLACK}Exibir cores dos grupos de aeronaves +STR_LIVERY_ROAD_VEHICLE_TOOLTIP :{BLACK}Mostrar esquemas de cores de veículos rodoviários +STR_LIVERY_SHIP_TOOLTIP :{BLACK}Mostrar esquemas de cores de embarcações +STR_LIVERY_AIRCRAFT_TOOLTIP :{BLACK}Mostrar esquemas de cores de aeronaves +STR_LIVERY_TRAIN_GROUP_TOOLTIP :{BLACK}Mostrar cores dos grupos de trens +STR_LIVERY_ROAD_VEHICLE_GROUP_TOOLTIP :{BLACK}Mostrar cores dos grupos de veículos rodoviários +STR_LIVERY_SHIP_GROUP_TOOLTIP :{BLACK}Mostrar cores dos grupos de embarcações +STR_LIVERY_AIRCRAFT_GROUP_TOOLTIP :{BLACK}Mostrar cores dos grupos de aeronaves STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}Escolha a cor principal para o esquema selecionado. Ctrl+Clique define essa cor para todos os esquemas STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}Escolha a cor secundária para o esquema selecionado. Ctrl+Clique aplica essa cor para todos os esquemas STR_LIVERY_PANEL_TOOLTIP :{BLACK}Selecionar um esquema de cores para mudar, ou múltiplos esquemas com CTRL+clique. Marque a opção para utilizar o esquema @@ -2376,7 +2376,7 @@ STR_NETWORK_SERVER_LIST_CLIENTS_CAPTION :{BLACK}Clientes STR_NETWORK_SERVER_LIST_CLIENTS_CAPTION_TOOLTIP :{BLACK}Clientes ligados / max. clientes{}Empresas ligados / max, empresas STR_NETWORK_SERVER_LIST_MAP_SIZE_SHORT :{BLACK}{COMMA}x{COMMA} STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION :{BLACK}Tamanho do mapa -STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION_TOOLTIP :{BLACK}Tamanho do mapa do jogo{}Clique para exibir por área +STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION_TOOLTIP :{BLACK}Tamanho do mapa do jogo{}Clique para ordenar por área STR_NETWORK_SERVER_LIST_DATE_CAPTION :{BLACK}Data STR_NETWORK_SERVER_LIST_DATE_CAPTION_TOOLTIP :{BLACK}Data atual STR_NETWORK_SERVER_LIST_PLAY_TIME_SHORT :{BLACK}{NUM}h {NUM}min @@ -2543,7 +2543,7 @@ STR_COMPANY_PASSWORD_MAKE_DEFAULT_TOOLTIP :{BLACK}Usar est # Network company info join/password STR_COMPANY_VIEW_JOIN :{BLACK}Entrar -STR_COMPANY_VIEW_JOIN_TOOLTIP :{BLACK}Entrar e jogar como essa companhia +STR_COMPANY_VIEW_JOIN_TOOLTIP :{BLACK}Entrar e jogar como essa empresa STR_COMPANY_VIEW_PASSWORD :{BLACK}Senha STR_COMPANY_VIEW_PASSWORD_TOOLTIP :{BLACK}Protege a sua empresa com uma senha para prevenir a entrada de usuários não autorizados STR_COMPANY_VIEW_SET_PASSWORD :{BLACK}Definir senha para empresa @@ -2602,7 +2602,7 @@ STR_NETWORK_ERROR_CLIENT_NOT_EXPECTED :um pacote invá STR_NETWORK_ERROR_CLIENT_WRONG_REVISION :versão incorreta STR_NETWORK_ERROR_CLIENT_NAME_IN_USE :nome já está em uso STR_NETWORK_ERROR_CLIENT_WRONG_PASSWORD :senha incorreta -STR_NETWORK_ERROR_CLIENT_COMPANY_MISMATCH :wrong company-id in DoCommand (ERRO) +STR_NETWORK_ERROR_CLIENT_COMPANY_MISMATCH :empresa errada em DoCommand STR_NETWORK_ERROR_CLIENT_KICKED :expulso pelo servidor STR_NETWORK_ERROR_CLIENT_CHEATER :estava tentando trapacear STR_NETWORK_ERROR_CLIENT_SERVER_FULL :servidor cheio @@ -2729,15 +2729,15 @@ STR_MISSING_GRAPHICS_ERROR_QUIT :{BLACK}Sair do # Transparency settings window STR_TRANSPARENCY_CAPTION :{WHITE}Opções de Transparência -STR_TRANSPARENT_SIGNS_TOOLTIP :{BLACK}Alternar transparência para sinais de estação. Ctrl+Clique para travar -STR_TRANSPARENT_TREES_TOOLTIP :{BLACK}Alternar transparência para árvores. Ctrl+Clique para travar -STR_TRANSPARENT_HOUSES_TOOLTIP :{BLACK}Alternar transparência para casas. Ctrl+Clique para travar -STR_TRANSPARENT_INDUSTRIES_TOOLTIP :{BLACK}Alternar transparência para indústrias. Ctrl+Clique para travar -STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Alternar transparência para construções como estações, depósitos, pontos de controle. Ctrl+Clique para travar -STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Alternar transparência para pontes. Ctrl+Clique para travar -STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Alternar transparência para estruturas como faróis e antenas. Ctrl+Clique para travar -STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Alternar transparência para catenária. Ctrl+Clique para travar -STR_TRANSPARENT_TEXT_TOOLTIP :{BLACK}Alternar transparência do texto de carregamento e custo/receita. Ctrl+Clique para travar. +STR_TRANSPARENT_SIGNS_TOOLTIP :{BLACK}Ativar transparência dos sinais. Ctrl+Clique para travar +STR_TRANSPARENT_TREES_TOOLTIP :{BLACK}Ativar transparência das árvores. Ctrl+Clique para travar +STR_TRANSPARENT_HOUSES_TOOLTIP :{BLACK}Ativar transparência das casas. Ctrl+Clique para travar +STR_TRANSPARENT_INDUSTRIES_TOOLTIP :{BLACK}Ativar transparência das indústrias. Ctrl+Clique para travar +STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Ativar transparência das construções como estações, depósitos e pontos de controle. Ctrl+Clique para travar +STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Ativar transparência das pontes. Ctrl+Clique para travar +STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Ativar transparência para estruturas como faróis e antenas. Ctrl+Clique para travar +STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Ativar transparência para catenária. Ctrl+Clique para travar +STR_TRANSPARENT_TEXT_TOOLTIP :{BLACK}Ativar transparência do texto de carregamento e custo/receita. Ctrl+Clique para travar STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Definir objetivos como invisíveis ao invés de transparentes. # Linkgraph legend window @@ -2793,7 +2793,7 @@ STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Construi STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Construir sinal na ferrovia. Ctrl+Clique para construir o sinal com estilo diferente{}Clique+Arraste para preencher a seção selecionada da ferrovia com os sinais no espaçamento escolhido. Ctrl+Clique+Arraste para colocar sinais até a próxima junção, estação ou sinal. Pressionar Shift mostra o custo estimado STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Construir ponte ferroviária. Presionar Shift mostra o custo estimado STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Construir túnel ferroviário. Pressionar Shift mostra o custo estimado -STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Alternar entre construir/remover linha férrea, sinais, pontos de controle e estações. Pressionar Ctrl+Clique remove os trilhos de pontos de controle e das estações +STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Ativar construir/remover linha férrea, sinais, pontos de controle e estações. Ctrl+Clique remove os trilhos de pontos de controle e das estações STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL :{BLACK}Converter/Atualizar tipo de trilho. Pressione Shift para somente mostrar o custo estimado STR_RAIL_NAME_RAILROAD :Ferrovia @@ -2831,7 +2831,7 @@ STR_STATION_CLASS_WAYP_WAYPOINT :Ponto de contro # Signal window STR_BUILD_SIGNAL_CAPTION :{WHITE}Seleção de Sinais -STR_BUILD_SIGNAL_TOGGLE_ADVANCED_SIGNAL_TOOLTIP :{BLACK}Alterna mostrar os tipos de sinais avançados +STR_BUILD_SIGNAL_TOGGLE_ADVANCED_SIGNAL_TOOLTIP :{BLACK}Ativar a exibição dos tipos de sinais avançados STR_BUILD_SIGNAL_SEMAPHORE_NORM_TOOLTIP :{BLACK}Sinal de bloco (semáforo){}Este é o tipo mais básico de sinal, permitindo que apenas um trem fique em um bloco de linha ao mesmo tempo STR_BUILD_SIGNAL_SEMAPHORE_ENTRY_TOOLTIP :{BLACK}Sinal de Entrada (semáforo){}Fica verde enquanto houver um ou mais sinais de saída verdes na atual seção de trilhos. Caso contrário, fica vermelho STR_BUILD_SIGNAL_SEMAPHORE_EXIT_TOOLTIP :{BLACK}Sinal de saída (semáforo){}Funciona da mesma forma que o sinal de bloco, mas é necessário para ativar a cor correta nos pré-sinais de entrada e combinado. @@ -2885,8 +2885,8 @@ STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}Construi STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_BRIDGE :{BLACK}Construir ponte para bondes. Pressionar Shift mostra o custo estimado STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL :{BLACK}Construir túnel rodoviário. Pressionar Shift mostra o custo estimado STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL :{BLACK}Construir túnel para bondes. Pressionar Shift mostra o custo estimado -STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_ROAD :{BLACK}Alternar entre construir/remover estradas -STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}Alternar entre construir/remover linhas de bonde +STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_ROAD :{BLACK}Ativar construir/remover estradas +STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}Ativar construir/remover linhas de bonde STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_ROAD :{BLACK}Converter/Atualizar o tipo de estrada. Pressione Shift para mostrar somente o custo estimado STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM :{BLACK}Converter/Atualizar o tipo de bonde. Pressionar Shift mostra o custo estimado @@ -2906,8 +2906,8 @@ STR_STATION_BUILD_TRUCK_ORIENTATION :{WHITE}Orienta STR_STATION_BUILD_TRUCK_ORIENTATION_TOOLTIP :{BLACK}Selecionar a orientação da estação de caminhões STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION :{WHITE}Orientação da Estação de Bonde Passageiros STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION_TOOLTIP :{BLACK}Selecionar orientação da estação de bonde -STR_STATION_BUILD_CARGO_TRAM_ORIENTATION :{WHITE}Orientação da Estação de Bonde de Carga -STR_STATION_BUILD_CARGO_TRAM_ORIENTATION_TOOLTIP :{BLACK}Selecionar orientação da estação de bonde +STR_STATION_BUILD_CARGO_TRAM_ORIENTATION :{WHITE}Orientação da Estação de Bondes +STR_STATION_BUILD_CARGO_TRAM_ORIENTATION_TOOLTIP :{BLACK}Selecionar orientação da estação de bondes # Waterways toolbar (last two for SE only) STR_WATERWAYS_TOOLBAR_CAPTION :{WHITE}Construção de Hidrovias @@ -2995,7 +2995,7 @@ STR_TERRAFORM_TOOLTIP_DECREASE_SIZE_OF_LAND_AREA :{BLACK}Diminui STR_TERRAFORM_TOOLTIP_GENERATE_RANDOM_LAND :{BLACK}Gera terreno aleatório STR_TERRAFORM_SE_NEW_WORLD :{BLACK}Criar novo cenário STR_TERRAFORM_RESET_LANDSCAPE :{BLACK}Limpar terreno -STR_TERRAFORM_RESET_LANDSCAPE_TOOLTIP :{BLACK}Remove todas as propriedades da empresa do mapa +STR_TERRAFORM_RESET_LANDSCAPE_TOOLTIP :{BLACK}Remover todas as propriedades das empresas do mapa STR_QUERY_RESET_LANDSCAPE_CAPTION :{WHITE}Limpar Terreno STR_RESET_LANDSCAPE_CONFIRMATION_TEXT :{WHITE}Tem certeza que quer remover todas as propriedades da empresa? @@ -3054,14 +3054,14 @@ STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_QUERY :{YELLOW}Você t STR_INDUSTRY_CARGOES_INDUSTRY_CAPTION :{WHITE}Cadeia da Indústria - {STRING} STR_INDUSTRY_CARGOES_CARGO_CAPTION :{WHITE}Cadeia de Carga - {STRING} STR_INDUSTRY_CARGOES_PRODUCERS :{WHITE}Indústrias produtoras -STR_INDUSTRY_CARGOES_CUSTOMERS :{WHITE}Indústrias aceptoras +STR_INDUSTRY_CARGOES_CUSTOMERS :{WHITE}Indústrias que aceitam STR_INDUSTRY_CARGOES_HOUSES :{WHITE}Casas STR_INDUSTRY_CARGOES_INDUSTRY_TOOLTIP :{BLACK}Clique na indústria para ver seus fornecedores e clientes STR_INDUSTRY_CARGOES_CARGO_TOOLTIP :{BLACK}{STRING}{}Clique na carga para ver seus fornecedores e clientes STR_INDUSTRY_DISPLAY_CHAIN :{BLACK}Cadeia da Indústria STR_INDUSTRY_DISPLAY_CHAIN_TOOLTIP :{BLACK}Exibe indústrias que suprem e aceitam carga -STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP :{BLACK}Exiba também no minimapa -STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP_TOOLTIP :{BLACK}Selecione as indústrias exibidas no minimapa também +STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP :{BLACK}Ligar ao minimapa +STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP_TOOLTIP :{BLACK}Também selecionar as indústrias exibidas no minimapa STR_INDUSTRY_CARGOES_SELECT_CARGO :{BLACK}Selecionar carga STR_INDUSTRY_CARGOES_SELECT_CARGO_TOOLTIP :{BLACK}Selecionar a carga que você deseja exibir STR_INDUSTRY_CARGOES_SELECT_INDUSTRY :{BLACK}Selecionar a indústria @@ -3268,8 +3268,8 @@ STR_SAVELOAD_DELETE_TOOLTIP :{BLACK}Remover STR_SAVELOAD_SAVE_BUTTON :{BLACK}Salvar STR_SAVELOAD_SAVE_TOOLTIP :{BLACK}Salvar o jogo atual, usando o nome escolhido STR_SAVELOAD_LOAD_BUTTON :{BLACK}Carregar -STR_SAVELOAD_LOAD_TOOLTIP :{BLACK}Carrega o jogo selecionado -STR_SAVELOAD_LOAD_HEIGHTMAP_TOOLTIP :{BLACK}Carrega o mapa topográfico selecionado +STR_SAVELOAD_LOAD_TOOLTIP :{BLACK}Carregar o jogo selecionado +STR_SAVELOAD_LOAD_HEIGHTMAP_TOOLTIP :{BLACK}Carregar o mapa topográfico selecionado STR_SAVELOAD_DETAIL_CAPTION :{BLACK}Detalhes do Jogo STR_SAVELOAD_DETAIL_NOT_AVAILABLE :{BLACK}Nenhuma informação disponível STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA}: {WHITE}{STRING} @@ -3280,7 +3280,7 @@ STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Tem cer STR_SAVELOAD_DIRECTORY :{STRING} (Diretório) STR_SAVELOAD_PARENT_DIRECTORY :{STRING} (Diretório raiz) -STR_SAVELOAD_OSKTITLE :{BLACK}Coloque o nome para o jogo salvo +STR_SAVELOAD_OSKTITLE :{BLACK}Digitar um nome para o jogo gravado # World generation STR_MAPGEN_WORLD_GENERATION_CAPTION :{WHITE}Geração de mundo @@ -3427,9 +3427,9 @@ STR_NEWGRF_SETTINGS_UPGRADE_TOOLTIP :{BLACK}Atualiza STR_NEWGRF_SETTINGS_FILE_TOOLTIP :{BLACK}Uma lista dos NewGRF instalados. STR_NEWGRF_SETTINGS_SET_PARAMETERS :{BLACK}Definir parâmetros -STR_NEWGRF_SETTINGS_SHOW_PARAMETERS :{BLACK}Exibir parâmetros -STR_NEWGRF_SETTINGS_TOGGLE_PALETTE :{BLACK}Alterna paleta -STR_NEWGRF_SETTINGS_TOGGLE_PALETTE_TOOLTIP :{BLACK}Alterna a paleta do NewGRF selecionado.{}Faça isso quando os gráficos deste ficarem rosa durante o jogo +STR_NEWGRF_SETTINGS_SHOW_PARAMETERS :{BLACK}Mostrar parâmetros +STR_NEWGRF_SETTINGS_TOGGLE_PALETTE :{BLACK}Mostrar paleta +STR_NEWGRF_SETTINGS_TOGGLE_PALETTE_TOOLTIP :{BLACK}Ativar a paleta do NewGRF selecionado.{}Faça isso quando os gráficos deste ficarem rosa durante o jogo STR_NEWGRF_SETTINGS_APPLY_CHANGES :{BLACK}Aplicar alterações STR_NEWGRF_SETTINGS_FIND_MISSING_CONTENT_BUTTON :{BLACK}Procurar o conteúdo on-line @@ -3568,7 +3568,7 @@ STR_NEWGRF_BROKEN_CAPACITY :{WHITE}A capaci STR_BROKEN_VEHICLE_LENGTH :{WHITE}Trem '{VEHICLE}' de '{COMPANY}' tem um tamanho inválido. Provavelmente causado por um NewGRF. O jogo pode travar ou sair de sincronia STR_NEWGRF_BUGGY :{WHITE}O NewGRF '{0:STRING}' retorna informação incorreta -STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}Informação de carga/readaptação para '{1:ENGINE}' difere da lista de aquisição após a construção. Isso pode causar a autorenovação/-substituição à falhar a readaptação corretamente. +STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}A informação de carga/adaptação para '{1:ENGINE}' difere da lista de aquisição depois da construção. Isto poderá causar problemas ao adaptar quando for renovado/substituído automaticamente STR_NEWGRF_BUGGY_ENDLESS_PRODUCTION_CALLBACK :{WHITE}'{1:STRING}' causou um loop infinito no callback da produção STR_NEWGRF_BUGGY_UNKNOWN_CALLBACK_RESULT :{WHITE}Retorno {1:HEX} retornou um resultado desconhecido/inválido {2:HEX} STR_NEWGRF_BUGGY_INVALID_CARGO_PRODUCTION_CALLBACK :{WHITE}'{1:STRING}' retornou tipo de carga inválido no retorno de chamada de produção em {2:HEX} @@ -3614,9 +3614,9 @@ STR_TOWN_POPULATION :{BLACK}Populaç STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN} STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (Cidade) STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}População: {ORANGE}{COMMA}{BLACK} Casas: {ORANGE}{COMMA} -STR_TOWN_VIEW_CARGO_LAST_MONTH_MAX :{BLACK}{CARGO_LIST} últ. mês: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA} +STR_TOWN_VIEW_CARGO_LAST_MONTH_MAX :{BLACK}{CARGO_LIST} último mês: {ORANGE}{COMMA}{BLACK} máx: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_LAST_MINUTE_MAX :{BLACK}{CARGO_LIST} último minuto: {ORANGE}{COMMA}{BLACK} máx: {ORANGE}{COMMA} -STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Carga necessária para prover o crescimento: +STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Carga necessária para o crescimento da localidade: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} necessário(a) STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} necessário no inverno STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_DELIVERED_GENERAL :{ORANGE}{STRING}{GREEN} entregues @@ -3674,16 +3674,16 @@ STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{Y # Goal window STR_GOALS_CAPTION :{WHITE}{COMPANY} Objetivos STR_GOALS_SPECTATOR_CAPTION :{WHITE}Objetivos globais -STR_GOALS_SPECTATOR :Objetivos Globais +STR_GOALS_SPECTATOR :Metas Globais STR_GOALS_GLOBAL_BUTTON :{BLACK}Globais -STR_GOALS_GLOBAL_BUTTON_HELPTEXT :{BLACK}Mostra objetivos globais +STR_GOALS_GLOBAL_BUTTON_HELPTEXT :{BLACK}Mostrar as metas globais STR_GOALS_COMPANY_BUTTON :{BLACK}Empresa -STR_GOALS_COMPANY_BUTTON_HELPTEXT :{BLACK}Mostra objetivos da empresa +STR_GOALS_COMPANY_BUTTON_HELPTEXT :{BLACK}Mostrar as metas da empresa STR_GOALS_TEXT :{ORANGE}{STRING} STR_GOALS_NONE :{G=m}{ORANGE}- Nenhum - STR_GOALS_PROGRESS :{ORANGE}{STRING} STR_GOALS_PROGRESS_COMPLETE :{GREEN}{STRING} -STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Clique no objetivo para centrar a vista principal na indústria/localidade/quadrado. Ctrl+Clique abre uma nova vista na localização da indústria/localidade/quadrado +STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Clique no objetivo para centrar a vista principal na indústria/localidade/quadrado. Ctrl+Clique abre uma nova visualização na localização da indústria/localidade/quadrado # Goal question window STR_GOAL_QUESTION_CAPTION_QUESTION :{BLACK}Pergunta @@ -3755,14 +3755,14 @@ STR_STATION_VIEW_WAITING_CARGO :{WHITE}{CARGO_L STR_STATION_VIEW_RESERVED :{YELLOW}({CARGO_SHORT} reservado para carregamento) STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Aceita -STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Exibir lista de carga aceita +STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Mostrar lista de carga aceita STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Aceita: {WHITE}{CARGO_LIST} -STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Essa estação tem direitos de transporte exclusivos nessa cidade. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Essa estação tem direitos exclusivos de transporte nessa cidade. STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} adquiriu direitos exclusivos de transporte nessa cidade. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Avaliações -STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Exibir avaliações da estação +STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Mostrar avaliações da estação STR_STATION_VIEW_SUPPLY_RATINGS_TITLE_MONTH :{BLACK}Suprimento por mês e classificação local: STR_STATION_VIEW_SUPPLY_RATINGS_TITLE_MINUTE :{BLACK}Suprimento por minuto e classificação local: STR_STATION_VIEW_CARGO_SUPPLY_RATING :{WHITE}{STRING}: {YELLOW}{COMMA} / {STRING} ({COMMA}%) @@ -3803,10 +3803,10 @@ STR_CARGO_RATING_OUTSTANDING :Proeminente STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Centrar visualização na localização da estação. Ctrl+Clique abre uma nova visualização na localização da estação STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Alterar o nome da estação -STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Exibir todos os trens que possuem esta estação nas ordens de serviço -STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Exibir todos os automóveis que possuem esta estação nas ordens de serviço -STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Exibir todas as aeronaves que possuem esta estação nas ordens de serviço -STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Exibir todas as embarcações que possuem esta estação nas ordens de serviço +STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Mostrar todos os trens que têm esta estação na sua programação +STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Mostrar todos os veículos rodoviários que têm esta estação na sua programação +STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Mostrar todas as aeronaves que têm esta estação na sua programação +STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Exibir todas as embarcações que têm esta estação na sua programação STR_STATION_VIEW_RENAME_STATION_CAPTION :Renomear estação/área de carga @@ -3874,10 +3874,10 @@ STR_COMPANY_VIEW_PRESIDENT_MANAGER_TITLE :{WHITE}{PRESIDE STR_COMPANY_VIEW_INAUGURATED_TITLE :{GOLD}Inaugurado: {WHITE}{NUM} STR_COMPANY_VIEW_COLOUR_SCHEME_TITLE :{GOLD}Cores: STR_COMPANY_VIEW_VEHICLES_TITLE :{GOLD}Veículos: -STR_COMPANY_VIEW_TRAINS :{WHITE}{COMMA} tre{P m ns} +STR_COMPANY_VIEW_TRAINS :{WHITE}{COMMA} trem{P "" s} STR_COMPANY_VIEW_ROAD_VEHICLES :{WHITE}{COMMA} automóve{P l is} STR_COMPANY_VIEW_AIRCRAFT :{WHITE}{COMMA} aeronave{P "" s} -STR_COMPANY_VIEW_SHIPS :{WHITE}{COMMA} embarcaç{P ão ões} +STR_COMPANY_VIEW_SHIPS :{WHITE}{COMMA} navio{P "" s} STR_COMPANY_VIEW_VEHICLES_NONE :{WHITE}Nenhum STR_COMPANY_VIEW_COMPANY_VALUE :{GOLD}Valor da empresa: {WHITE}{CURRENCY_LONG} STR_COMPANY_VIEW_INFRASTRUCTURE :{GOLD}Infraestrutura: @@ -3891,7 +3891,7 @@ STR_COMPANY_VIEW_INFRASTRUCTURE_NONE :{WHITE}Nenhum STR_COMPANY_VIEW_BUILD_HQ_BUTTON :{BLACK}Construir sede STR_COMPANY_VIEW_BUILD_HQ_TOOLTIP :{BLACK}Construir sede da companhia STR_COMPANY_VIEW_VIEW_HQ_BUTTON :{BLACK}Ver sede -STR_COMPANY_VIEW_VIEW_HQ_TOOLTIP :{BLACK}Ver sede da companhia +STR_COMPANY_VIEW_VIEW_HQ_TOOLTIP :{BLACK}Ver sede da empresa STR_COMPANY_VIEW_RELOCATE_HQ :{BLACK}Mover sede STR_COMPANY_VIEW_RELOCATE_COMPANY_HEADQUARTERS :{BLACK}Reconstruir sede da empresa em outro local por 1% do valor da empresa. Shift+Clique mostra o preço estimado sem reconstruir a sede STR_COMPANY_VIEW_INFRASTRUCTURE_BUTTON :{BLACK}Detalhes @@ -4061,7 +4061,7 @@ STR_BUY_VEHICLE_SHIP_CAPTION :Novas Embarcaç STR_BUY_VEHICLE_AIRCRAFT_CAPTION :Nova Aeronave STR_PURCHASE_INFO_COST_WEIGHT :{BLACK}Preço: {GOLD}{CURRENCY_LONG}{BLACK} Peso: {GOLD}{WEIGHT_SHORT} -STR_PURCHASE_INFO_COST_REFIT_WEIGHT :{BLACK}Custo: {GOLD}{CURRENCY_LONG}{BLACK} (Custo de Troca: {GOLD}{CURRENCY_LONG}{BLACK}) Peso: {GOLD}{WEIGHT_SHORT} +STR_PURCHASE_INFO_COST_REFIT_WEIGHT :{BLACK}Custo: {GOLD}{CURRENCY_LONG}{BLACK} (Custo de Adaptação: {GOLD}{CURRENCY_LONG}{BLACK}) Peso: {GOLD}{WEIGHT_SHORT} STR_PURCHASE_INFO_SPEED_POWER :{BLACK}Velocidade: {GOLD}{VELOCITY}{BLACK} Potência: {GOLD}{POWER} STR_PURCHASE_INFO_SPEED :{BLACK}Velocidade: {GOLD}{VELOCITY} STR_PURCHASE_INFO_SPEED_OCEAN :{BLACK}Velocidade em oceanos: {GOLD}{VELOCITY} @@ -4073,10 +4073,10 @@ STR_PURCHASE_INFO_REFITTABLE :(adaptável) STR_PURCHASE_INFO_DESIGNED_LIFE :{BLACK}Desenvolvida: {GOLD}{NUM}{BLACK} Vida: {GOLD}{COMMA} ano{P "" s} STR_PURCHASE_INFO_RELIABILITY :{BLACK}Confiabilidade Máx.: {GOLD}{COMMA}% STR_PURCHASE_INFO_COST :{BLACK}Preço: {GOLD}{CURRENCY_LONG} -STR_PURCHASE_INFO_COST_REFIT :{BLACK}Custo: {GOLD}{CURRENCY_LONG}{BLACK} (Custo para Reequipar: {GOLD}{CURRENCY_LONG}{BLACK}) +STR_PURCHASE_INFO_COST_REFIT :{BLACK}Custo: {GOLD}{CURRENCY_LONG}{BLACK} (Custo de Adaptação: {GOLD}{CURRENCY_LONG}{BLACK}) STR_PURCHASE_INFO_WEIGHT_CWEIGHT :{BLACK}Peso: {GOLD}{WEIGHT_SHORT} ({WEIGHT_SHORT}) STR_PURCHASE_INFO_COST_SPEED :{BLACK}Preço: {GOLD}{CURRENCY_LONG}{BLACK} Velocidade: {GOLD}{VELOCITY} -STR_PURCHASE_INFO_COST_REFIT_SPEED :{BLACK}Custo: {GOLD}{CURRENCY_LONG}{BLACK} (Custo de Troca: {GOLD}{CURRENCY_LONG}{BLACK}) Velocidade: {GOLD}{VELOCITY} +STR_PURCHASE_INFO_COST_REFIT_SPEED :{BLACK}Custo: {GOLD}{CURRENCY_LONG}{BLACK} (Custo de Adaptação: {GOLD}{CURRENCY_LONG}{BLACK}) Velocidade: {GOLD}{VELOCITY} STR_PURCHASE_INFO_AIRCRAFT_CAPACITY :{BLACK}Capacidade: {GOLD}{CARGO_LONG}, {CARGO_LONG} STR_PURCHASE_INFO_PWAGPOWER_PWAGWEIGHT :{BLACK}Vagões energizados: {GOLD}+{POWER}{BLACK} Peso: {GOLD}+{WEIGHT_SHORT} STR_PURCHASE_INFO_REFITTABLE_TO :{BLACK}Adaptável para: {GOLD}{STRING} @@ -4106,9 +4106,9 @@ STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_BUTTON :{BLACK}Comprar STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_BUTTON :{BLACK}Comprar Aeronave ###length VEHICLE_TYPES -STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Comprar e reequipar veículo -STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Comprar e Reequipar Veículo -STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Comprar e Repor Navio +STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Comprar e adaptar veículo +STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Comprar e Adaptar Veículo +STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Comprar e Adaptar Embarcação STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Comprar e Adaptar Aeronaves ###length VEHICLE_TYPES @@ -4118,10 +4118,10 @@ STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_TOOLTIP :{BLACK}Comprar STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_TOOLTIP :{BLACK}Comprar aeronave selecionada. Pressionar Shift mostra o custo estimado ###length VEHICLE_TYPES -STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Compra e modifica o trem selecionado. Pressionar Shift mostra o custo estimado -STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Comprar e converter o veículo rodoviário selecionado. Pressionar Shift mostra o custo estimado -STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Comprar e converter a embarcação selecionada. Pressionar Shift mostra o custo estimado -STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Comprar e converter a aeronave selecionada. Pressionar Shift mostra o custo estimado +STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Comprar e adaptar o veículo ferroviário selecionado. Pressionar Shift mostra o custo estimado +STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Comprar e adaptar o veículo rodoviário selecionado. Pressionar Shift mostra o custo estimado +STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Comprar e adaptar a embarcação selecionada. Pressionar Shift mostra o custo estimado +STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Comprar e adaptar a aeronave selecionada. Pressionar Shift mostra o custo estimado ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_RENAME_BUTTON :{BLACK}Renomear @@ -4145,13 +4145,13 @@ STR_BUY_VEHICLE_AIRCRAFT_HIDE_TOGGLE_BUTTON :{BLACK}Ocultar STR_BUY_VEHICLE_TRAIN_SHOW_TOGGLE_BUTTON :{BLACK}Exibir STR_BUY_VEHICLE_ROAD_VEHICLE_SHOW_TOGGLE_BUTTON :{BLACK}Exibir STR_BUY_VEHICLE_SHIP_SHOW_TOGGLE_BUTTON :{BLACK}Exibir -STR_BUY_VEHICLE_AIRCRAFT_SHOW_TOGGLE_BUTTON :{BLACK}Exibir +STR_BUY_VEHICLE_AIRCRAFT_SHOW_TOGGLE_BUTTON :{BLACK}Mostrar ###length VEHICLE_TYPES -STR_BUY_VEHICLE_TRAIN_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}Alterna a exibição do tipo de trem -STR_BUY_VEHICLE_ROAD_VEHICLE_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}Alterna a exibição do tipo de automóvel -STR_BUY_VEHICLE_SHIP_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}Alterna a exibição do tipo de navio -STR_BUY_VEHICLE_AIRCRAFT_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}Alterna a exibição do tipo de aeronave +STR_BUY_VEHICLE_TRAIN_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}Ativa ocultar/exibir o tipo de veículo ferroviário +STR_BUY_VEHICLE_ROAD_VEHICLE_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}Ativa ocultar/exibir o tipo de veículo rodoviário +STR_BUY_VEHICLE_SHIP_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}Ativa ocultar/exibir o tipo de embarcação +STR_BUY_VEHICLE_AIRCRAFT_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}Ativa ocultar/exibir o tipo de aeronave ###length VEHICLE_TYPES STR_QUERY_RENAME_TRAIN_TYPE_CAPTION :{WHITE}Renomear tipo de veículo ferroviário @@ -4300,7 +4300,7 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} quando STR_REPLACE_VEHICLES_STOP :{BLACK}Parar Substituição STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Pressione para parar a subsituição do tipo de motor que selecionou à esquerda -STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Alterna entre janelas de substituir locomotivas e substituir vagões +STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Alternar entre a janela de substituição de locomotivas e a de substituição de vagões STR_REPLACE_ENGINES :Motores STR_REPLACE_WAGONS :Vagões STR_REPLACE_ALL_RAILTYPE :Todos os veículos ferroviários @@ -4352,15 +4352,15 @@ STR_VEHICLE_VIEW_ORDER_LOCATION_TOOLTIP :{BLACK}Centrar ###length VEHICLE_TYPES STR_VEHICLE_VIEW_TRAIN_REFIT_TOOLTIP :{BLACK}Adaptar trem para um tipo de carga diferente -STR_VEHICLE_VIEW_ROAD_VEHICLE_REFIT_TOOLTIP :{BLACK}Adaptar automóvel para carregar tipo de carga diferente +STR_VEHICLE_VIEW_ROAD_VEHICLE_REFIT_TOOLTIP :{BLACK}Adaptar veículo rodoviário para transportar um tipo de carga diferente STR_VEHICLE_VIEW_SHIP_REFIT_TOOLTIP :{BLACK}Adaptar a embarcação para transportar uma carga diferente STR_VEHICLE_VIEW_AIRCRAFT_REFIT_TOOLTIP :{BLACK}Adaptar aeronave para transportar uma carga diferente ###length VEHICLE_TYPES -STR_VEHICLE_VIEW_TRAIN_ORDERS_TOOLTIP :{BLACK}Exibe ordens do trem. Ctrl+Clique para exibir o plano de horário -STR_VEHICLE_VIEW_ROAD_VEHICLE_ORDERS_TOOLTIP :{BLACK}Exibe ordens do veículo. Ctrl+Clique para exibir o plano de horário -STR_VEHICLE_VIEW_SHIP_ORDERS_TOOLTIP :{BLACK}Exibe ordens da embarcação. Ctrl+Clique para exibir o plano de horário -STR_VEHICLE_VIEW_AIRCRAFT_ORDERS_TOOLTIP :{BLACK}Exibe ordens da aeronave. Ctrl+Clique para exibir o plano de horário +STR_VEHICLE_VIEW_TRAIN_ORDERS_TOOLTIP :{BLACK}Mostrar ordens do trem. Ctrl+Clique para mostrar a tabela de horários do trem +STR_VEHICLE_VIEW_ROAD_VEHICLE_ORDERS_TOOLTIP :{BLACK}Mostrar ordens do veículo. Ctrl+Clique para mostrar a tabela de horários do veículo +STR_VEHICLE_VIEW_SHIP_ORDERS_TOOLTIP :{BLACK}Mostrar ordens da embarcação. Ctrl+Clique para mostrar a tabela de horários da embarcação +STR_VEHICLE_VIEW_AIRCRAFT_ORDERS_TOOLTIP :{BLACK}Mostrar ordens da aeronave. Ctrl+Clique para mostrar o plano de horários da aeronave ###length VEHICLE_TYPES STR_VEHICLE_VIEW_TRAIN_SHOW_DETAILS_TOOLTIP :{BLACK}Exibe detalhes do trem @@ -4478,30 +4478,30 @@ STR_VEHICLE_DETAILS_CARGO_FROM :{LTBLUE}{CARGO_ STR_VEHICLE_DETAILS_CARGO_FROM_MULT :{LTBLUE}{CARGO_LONG} de {STATION} (x{NUM}) STR_VEHICLE_DETAIL_TAB_CARGO :{BLACK}Carga -STR_VEHICLE_DETAILS_TRAIN_CARGO_TOOLTIP :{BLACK}Exibir detalhes da carga transportada +STR_VEHICLE_DETAILS_TRAIN_CARGO_TOOLTIP :{BLACK}Mostrar detalhes da carga transportada STR_VEHICLE_DETAIL_TAB_INFORMATION :{BLACK}Informação -STR_VEHICLE_DETAILS_TRAIN_INFORMATION_TOOLTIP :{BLACK}Exibir detalhes dos veículos +STR_VEHICLE_DETAILS_TRAIN_INFORMATION_TOOLTIP :{BLACK}Mostrar detalhes dos veículos ferroviários STR_VEHICLE_DETAIL_TAB_CAPACITIES :{BLACK}Capacidades -STR_VEHICLE_DETAILS_TRAIN_CAPACITIES_TOOLTIP :{BLACK}Exibir capacidades de cada veículo +STR_VEHICLE_DETAILS_TRAIN_CAPACITIES_TOOLTIP :{BLACK}Mostar capacidade de cada veículo STR_VEHICLE_DETAIL_TAB_TOTAL_CARGO :{BLACK}Carga Total -STR_VEHICLE_DETAILS_TRAIN_TOTAL_CARGO_TOOLTIP :{BLACK}Exibir capacidade total do trem, dividir por tipo de carga +STR_VEHICLE_DETAILS_TRAIN_TOTAL_CARGO_TOOLTIP :{BLACK}Mostrar capacidade total do trem, separada por tipo de carga STR_VEHICLE_DETAILS_TRAIN_ARTICULATED_RV_CAPACITY :{BLACK}Capacidade: {LTBLUE} # Vehicle refit STR_REFIT_CAPTION :{WHITE}{VEHICLE} (Adaptar) -STR_REFIT_TITLE :{GOLD}Selecionar tipo de carga: +STR_REFIT_TITLE :{GOLD}Selecionar tipo de carga para transportar: STR_REFIT_NEW_CAPACITY_COST_OF_REFIT :{BLACK}Nova capacidade: {GOLD}{CARGO_LONG}{}{BLACK}Custo da adaptação: {RED}{CURRENCY_LONG} STR_REFIT_NEW_CAPACITY_INCOME_FROM_REFIT :{BLACK}Nova capacidade: {GOLD}{CARGO_LONG}{}{BLACK}Lucro vindo da adaptação: {GREEN}{CURRENCY_LONG} STR_REFIT_NEW_CAPACITY_COST_OF_AIRCRAFT_REFIT :{BLACK}Nova capacidade: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Custo da adaptação: {RED}{CURRENCY_LONG} STR_REFIT_NEW_CAPACITY_INCOME_FROM_AIRCRAFT_REFIT :{BLACK}Nova capacidade: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Lucro da adaptação: {GREEN}{CURRENCY_LONG} -STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Selecione os veículos para modificar. Clique+Arrastar para selecionar vários veículos. Clique em espaço vazio para selecionar todo o veículo. Ctrl+Clique para selecionar um veículo e a sequência restante +STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Selecione os veículos para adaptar. Clique+Arraste para selecionar vários veículos. Clique em um espaço vazio para selecionar todo o veículo. Ctrl+Clique para selecionar um veículo e a sequência restante ###length VEHICLE_TYPES -STR_REFIT_TRAIN_LIST_TOOLTIP :{BLACK}Selecionar tipo de carga para o trem -STR_REFIT_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Selecionar tipo de carga para o automóvel -STR_REFIT_SHIP_LIST_TOOLTIP :{BLACK}Selecionar tipo de carga para a embarcação -STR_REFIT_AIRCRAFT_LIST_TOOLTIP :{BLACK}Selecionar tipo de carga para a aeronave +STR_REFIT_TRAIN_LIST_TOOLTIP :{BLACK}Selecionar tipo de carga para o trem transportar +STR_REFIT_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Selecionar tipo de carga para o veículo rodoviário transportar +STR_REFIT_SHIP_LIST_TOOLTIP :{BLACK}Selecionar tipo de carga para a embarcação transportar +STR_REFIT_AIRCRAFT_LIST_TOOLTIP :{BLACK}Selecionar tipo de carga para a aeronave transportar ###length VEHICLE_TYPES STR_REFIT_TRAIN_REFIT_BUTTON :{BLACK}Adaptar trem @@ -4510,15 +4510,15 @@ STR_REFIT_SHIP_REFIT_BUTTON :{BLACK}Adaptar STR_REFIT_AIRCRAFT_REFIT_BUTTON :{BLACK}Adaptar aeronave ###length VEHICLE_TYPES -STR_REFIT_TRAIN_REFIT_TOOLTIP :{BLACK}Adapta trem para transportar a carga selecionada +STR_REFIT_TRAIN_REFIT_TOOLTIP :{BLACK}Adaptar trem para transportar a carga selecionada STR_REFIT_ROAD_VEHICLE_REFIT_TOOLTIP :{BLACK}Adaptar automóvel para carregar o tipo de carga selecionado STR_REFIT_SHIP_REFIT_TOOLTIP :{BLACK}Adaptar embarcação para transportar a carga selecionada STR_REFIT_AIRCRAFT_REFIT_TOOLTIP :{BLACK}Adaptar aeronave para transportar a carga selecionada # Order view STR_ORDERS_CAPTION :{WHITE}{VEHICLE} (Ordens) -STR_ORDERS_TIMETABLE_VIEW :{BLACK}Plano de horário -STR_ORDERS_TIMETABLE_VIEW_TOOLTIP :{BLACK}Exibe o plano de horário +STR_ORDERS_TIMETABLE_VIEW :{BLACK}Horário +STR_ORDERS_TIMETABLE_VIEW_TOOLTIP :{BLACK}Mudar para a visão de horários STR_ORDERS_LIST_TOOLTIP :{BLACK}Lista de ordens - clique em uma ordem para selecionar. Ctrl+Clique mostra o destino da ordem STR_ORDER_INDEX :{COMMA}:{NBSP} @@ -4535,10 +4535,10 @@ STR_ORDER_GO_VIA :Vá via STR_ORDER_GO_NON_STOP_VIA :Ir sem parar via STR_ORDER_TOOLTIP_NON_STOP :{BLACK}Altera a instrução de paradas da ordem selecionada -STR_ORDER_TOGGLE_FULL_LOAD :{BLACK}Carregar qualquer carga +STR_ORDER_TOGGLE_FULL_LOAD :{BLACK}Carregar completamente com qualquer carga STR_ORDER_DROP_LOAD_IF_POSSIBLE :Carregar se disponível -STR_ORDER_DROP_FULL_LOAD_ALL :Carregar tudo -STR_ORDER_DROP_FULL_LOAD_ANY :Carregar completamente qualquer carga +STR_ORDER_DROP_FULL_LOAD_ALL :Carregar completamente com todas as cargas +STR_ORDER_DROP_FULL_LOAD_ANY :Carregar completamente com qualquer carga STR_ORDER_DROP_NO_LOADING :Não carregar STR_ORDER_TOOLTIP_FULL_LOAD :{BLACK}Altera a instrução de carregamento da ordem selecionada @@ -4551,10 +4551,10 @@ STR_ORDER_TOOLTIP_UNLOAD :{BLACK}Altera a STR_ORDER_REFIT :{BLACK}Adaptar STR_ORDER_REFIT_TOOLTIP :{BLACK}Selecionar a adaptação na ordem atual. CTRL + Clique para remover a instrução -STR_ORDER_REFIT_AUTO :{BLACK}Reformar na estação -STR_ORDER_REFIT_AUTO_TOOLTIP :{BLACK}Selecione o tipo de carga para o qual reformar nessa ordem. Ctrl+clique para remover a ordem de reforma. Reforma apenas será feita se o veículo permitir +STR_ORDER_REFIT_AUTO :{BLACK}Adaptar na estação +STR_ORDER_REFIT_AUTO_TOOLTIP :{BLACK}Selecione o tipo de mercadoria para o qual adaptar nesta ordem. Ctrl+Clique para remover ordem de adaptação. Adaptação em estações será realizada somente se o veículo aceitar STR_ORDER_DROP_REFIT_AUTO :Carga fixa -STR_ORDER_DROP_REFIT_AUTO_ANY :Cargas disponíveis +STR_ORDER_DROP_REFIT_AUTO_ANY :Carga disponível STR_ORDER_DROP_GO_ALWAYS_DEPOT :Ir sempre STR_ORDER_DROP_SERVICE_DEPOT :Manutenção, se necessária @@ -4563,6 +4563,10 @@ STR_ORDER_DROP_UNBUNCH :Desagrupar # Depot action tooltips, one per vehicle type ###length VEHICLE_TYPES +STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP :{BLACK}Selecionar qual ação executar nesse depósito +STR_ORDER_ROAD_DEPOT_ACTION_TOOLTIP :{BLACK}Selecionar qual ação executar nesse depósito +STR_ORDER_SHIP_DEPOT_ACTION_TOOLTIP :{BLACK}Selecionar qual ação executar nesse depósito +STR_ORDER_HANGAR_ACTION_TOOLTIP :{BLACK}Selecionar qual ação executar nesse hangar ###next-name-looks-similar STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Dados do veículo no qual se basear para pular ordem @@ -4608,7 +4612,7 @@ STR_ORDER_CONDITIONAL :Pulo de ordem c STR_ORDER_SHARE :Compartilhar ordens STR_ORDERS_GO_TO_TOOLTIP :{BLACK}Insirir uma nova ordem antes da ordem selecionada ou adicionar ao final da lista. Ctrl+Clique em uma estação para "carregar totalmente qualquer carga", em um ponto de controle para "sem parar" ou em um depósito para "manutenção". Clique em outro veículo para copiar suas ordens ou Ctrl+Clique compartilha as ordens. Uma ordem de depósito desativa a manutenção automática do veículo -STR_ORDERS_VEH_WITH_SHARED_ORDERS_LIST_TOOLTIP :{BLACK}Exibir todos os veículos com a mesma rota +STR_ORDERS_VEH_WITH_SHARED_ORDERS_LIST_TOOLTIP :{BLACK}Mostrar todos os veículos que compartilham essa programação # String parts to build the order string STR_ORDER_GO_TO_WAYPOINT :Ir via {WAYPOINT} @@ -4640,7 +4644,7 @@ STR_ORDER_GO_TO_STATION_CAN_T_USE_STATION :{PUSH_COLOUR}{R STR_ORDER_IMPLICIT :(Implícito) STR_ORDER_FULL_LOAD :(Carregar completamente) -STR_ORDER_FULL_LOAD_ANY :(Carregar completamente qualquer carga) +STR_ORDER_FULL_LOAD_ANY :(Carregar completamente com qualquer carga) STR_ORDER_NO_LOAD :(Não carregar) STR_ORDER_UNLOAD :(Descarregar e tomar carga) STR_ORDER_UNLOAD_FULL_LOAD :(Descarregar e esperar carregamento completo) @@ -4648,27 +4652,27 @@ STR_ORDER_UNLOAD_FULL_LOAD_ANY :(Descarregar e STR_ORDER_UNLOAD_NO_LOAD :(Descarregar e sair vazio) STR_ORDER_TRANSFER :(Transferir e tomar carga) STR_ORDER_TRANSFER_FULL_LOAD :(Transferir e esperar por carregamento completo) -STR_ORDER_TRANSFER_FULL_LOAD_ANY :(Transferir e esperar por qualquer carregamento completo) +STR_ORDER_TRANSFER_FULL_LOAD_ANY :(Transferir e aguardar por qualquer carregamento completo) STR_ORDER_TRANSFER_NO_LOAD :(Transferir e sair vazio) STR_ORDER_NO_UNLOAD :(Não descarregar e tomar carga) STR_ORDER_NO_UNLOAD_FULL_LOAD :(Não descarregar e esperar carregamento completo) STR_ORDER_NO_UNLOAD_FULL_LOAD_ANY :(Não descarregar e esperar por qualquer carregamento completo) STR_ORDER_NO_UNLOAD_NO_LOAD :(Não descarregar e não carregar) -STR_ORDER_AUTO_REFIT :(Reformar para {STRING}) -STR_ORDER_FULL_LOAD_REFIT :(Carga completa com reforma para {STRING}) -STR_ORDER_FULL_LOAD_ANY_REFIT :(Qualquer carga completa com reforma para {STRING}) -STR_ORDER_UNLOAD_REFIT :(Descarregar e carregar com reforma para {STRING}) -STR_ORDER_UNLOAD_FULL_LOAD_REFIT :(Descarregar e aguardar carga completa com reforma para {STRING}) -STR_ORDER_UNLOAD_FULL_LOAD_ANY_REFIT :(Descarregar e aguardar qualquer carga completa com reforma para {STRING}) -STR_ORDER_TRANSFER_REFIT :(Transferir e carregar com reforma para {STRING}) -STR_ORDER_TRANSFER_FULL_LOAD_REFIT :(Transferir e aguardar carga completa com reforma para {STRING}) -STR_ORDER_TRANSFER_FULL_LOAD_ANY_REFIT :(Transferir e aguardar por qualquer carga completa com reforma para {STRING}) -STR_ORDER_NO_UNLOAD_REFIT :(Não descarregar e carregar com reforma para {STRING}) -STR_ORDER_NO_UNLOAD_FULL_LOAD_REFIT :(Não descarregar e aguardar carga completa com reforma para {STRING}) -STR_ORDER_NO_UNLOAD_FULL_LOAD_ANY_REFIT :(Não descarregar e aguardar por qualquer carga completa com reforma para {STRING}) - -STR_ORDER_AUTO_REFIT_ANY :cargas disponíveis +STR_ORDER_AUTO_REFIT :(Adaptar para {STRING}) +STR_ORDER_FULL_LOAD_REFIT :(Carregar completamente com adaptação para {STRING}) +STR_ORDER_FULL_LOAD_ANY_REFIT :(Carregar completamente com qualquer carga com adaptação para {STRING}) +STR_ORDER_UNLOAD_REFIT :(Descarregar e carregar com adaptação para {STRING}) +STR_ORDER_UNLOAD_FULL_LOAD_REFIT :(Descarregar e aguardar por carregamento completo com adaptação para {STRING}) +STR_ORDER_UNLOAD_FULL_LOAD_ANY_REFIT :(Descarregar e aguardar por qualquer carregamento completo com adaptação para {STRING}) +STR_ORDER_TRANSFER_REFIT :(Transferir e carregar com adaptação para {STRING}) +STR_ORDER_TRANSFER_FULL_LOAD_REFIT :(Transferir e aguardar por carregamento completo com adaptação para {STRING}) +STR_ORDER_TRANSFER_FULL_LOAD_ANY_REFIT :(Transferir e aguardar por qualquer carregamento completo com adaptação para {STRING}) +STR_ORDER_NO_UNLOAD_REFIT :(Não descarregar e carregar com adaptação para {STRING}) +STR_ORDER_NO_UNLOAD_FULL_LOAD_REFIT :(Não descarregar e aguardar por caregamento completo com adaptação para {STRING}) +STR_ORDER_NO_UNLOAD_FULL_LOAD_ANY_REFIT :(Não descarregar e aguardar por qualquer carregamento completo com adaptação para {STRING}) + +STR_ORDER_AUTO_REFIT_ANY :carga disponível ###length 3 STR_ORDER_STOP_LOCATION_NEAR_END :[quase no fim] @@ -4686,9 +4690,9 @@ STR_INVALID_ORDER :{RED} (Ordem In # Time table window STR_TIMETABLE_TITLE :{WHITE}{VEHICLE} (Horário) STR_TIMETABLE_ORDER_VIEW :{BLACK}Ordens -STR_TIMETABLE_ORDER_VIEW_TOOLTIP :{BLACK}Alternar para visão de ordens +STR_TIMETABLE_ORDER_VIEW_TOOLTIP :{BLACK}Mudar para visualização de ordens -STR_TIMETABLE_TOOLTIP :{BLACK}Horário - clique sobre uma ordem para destaca-la +STR_TIMETABLE_TOOLTIP :{BLACK}Horário - clique em uma ordem para selecioná-la STR_TIMETABLE_NO_TRAVEL :Não viajar STR_TIMETABLE_NOT_TIMETABLEABLE :Viagem (automático; com horário marcado pela próxima ordem manual) @@ -4711,34 +4715,34 @@ STR_TIMETABLE_STATUS_LATE :{BLACK}Este ve STR_TIMETABLE_STATUS_EARLY :{BLACK}Este veículo está atualmente circulando {STRING} adiantado STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Este horário ainda não começou STR_TIMETABLE_STATUS_START_AT_DATE :{BLACK}Essa ordem irá iniciar às {STRING} -STR_TIMETABLE_STATUS_START_IN_SECONDS :{BLACK}Essa ordem irá iniciar em {COMMA} segundos +STR_TIMETABLE_STATUS_START_IN_SECONDS :{BLACK}Este horário irá iniciar em {COMMA} segundos -STR_TIMETABLE_START :{BLACK}Iniciar Ordem -STR_TIMETABLE_START_TOOLTIP :{BLACK}Selecionar quando essa ordem inicia. Ctrl+Clique distribui igualmente a partida de todos os veículos que compartilham essa ordem com base em sua ordem relativa, se a ordem for totalmente programada +STR_TIMETABLE_START :{BLACK}Iniciar Horário +STR_TIMETABLE_START_TOOLTIP :{BLACK}Selecione quando esse horário começa. Ctrl+Clique distribui igualmente a partida de todos os veículos que compartilham essa ordem com base em sua ordem relativa, se a ordem for totalmente programada -STR_TIMETABLE_START_SECONDS_QUERY :Segundos até a ordem iniciar +STR_TIMETABLE_START_SECONDS_QUERY :Segundos até o horário iniciar -STR_TIMETABLE_CHANGE_TIME :{BLACK}Mudar horário +STR_TIMETABLE_CHANGE_TIME :{BLACK}Mudar Tempo STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Mudar a duração do tempo que a ordem em destaque deve durar. Ctrl+Clique define o tempo para todas as ordens -STR_TIMETABLE_CLEAR_TIME :{BLACK}Limpar Horário -STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Limpar a duração do tempo da ordem selecionada. Ctrl+Clique limpa o tempo para todas as ordens +STR_TIMETABLE_CLEAR_TIME :{BLACK}Apagar Tempo +STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Limpar a duração do tempo da ordem selecionada. Ctrl+Clique limpa o tempo de todas as ordens -STR_TIMETABLE_CHANGE_SPEED :{BLACK}Alterar Limite de Vel. -STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Altera a velocidade máxima de viagem para a ordem selecionada. Ctrl+Clique define a velocidade para todas as ordens +STR_TIMETABLE_CHANGE_SPEED :{BLACK}Alterar limite de velocidade +STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Alterar a velocidade máxima de viagem da ordem selecionada. Ctrl+Clique define a velocidade para todas as ordens -STR_TIMETABLE_CLEAR_SPEED :{BLACK}Limpa Limite de Vel. -STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Limpar a velocidade máxima de viagem da ordem em destaque. Ctrl+Clique limpa as velocidades para todas as ordens +STR_TIMETABLE_CLEAR_SPEED :{BLACK}Remover limite de velocidade +STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Limpar a velocidade máxima de viagem da ordem selecionada. Ctrl+Clique limpa as velocidades para todas as ordens -STR_TIMETABLE_RESET_LATENESS :{BLACK}Restabelecer Contador de Atraso -STR_TIMETABLE_RESET_LATENESS_TOOLTIP :{BLACK}Limpar o contador de atrasos, para que o veículo fique no horário. Ctrl+Clique para reiniciar todo o grupo para que o veículo mais recente esteja no horário e todos os outros estejam antecipados +STR_TIMETABLE_RESET_LATENESS :{BLACK}Reiniciar o Contador de Atraso +STR_TIMETABLE_RESET_LATENESS_TOOLTIP :{BLACK}Reiniciar o contador de atrasos, assim o veículo ficará no horário. Ctrl+Clique para reiniciar todo o grupo, de modo que o último veículo ficará pontual e todos os outros estarão antecipados -STR_TIMETABLE_AUTOFILL :{BLACK}Autopreencher +STR_TIMETABLE_AUTOFILL :{BLACK}Auto preencher STR_TIMETABLE_AUTOFILL_TOOLTIP :{BLACK}Preencher o horário automaticamente com os valores da próxima viagem. Ctrl+Clique para tentar manter os tempos de espera STR_TIMETABLE_EXPECTED :{BLACK}Esperado STR_TIMETABLE_SCHEDULED :{BLACK}Agendado -STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Trocar entre esperado e agendado +STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Alternar entre esperado e agendado STR_TIMETABLE_ARRIVAL_DATE :A: {COLOUR}{DATE_TINY} STR_TIMETABLE_DEPARTURE_DATE :D: {COLOUR}{DATE_TINY} @@ -4768,7 +4772,7 @@ STR_AI_DEBUG_BREAK_ON_LABEL :{BLACK}Falha em STR_AI_DEBUG_BREAK_STR_OSKTITLE :{BLACK}Parar em STR_AI_DEBUG_BREAK_STR_TOOLTIP :{BLACK}Quando uma mensagem do registo da IA corresponder a esta sequência, o jogo é pausado STR_AI_DEBUG_MATCH_CASE :{BLACK}Caso de igualdade -STR_AI_DEBUG_MATCH_CASE_TOOLTIP :{BLACK}Alternar o caso de igualdade quando comparar as mensagens de resgisto da IA com a sequência de pausa +STR_AI_DEBUG_MATCH_CASE_TOOLTIP :{BLACK}Ativar a verificação de letras maiúsculas/minúsculas quando comparar as mensagens de resgistro da IA com a sequência de parada STR_AI_DEBUG_CONTINUE :{BLACK}Continuar STR_AI_DEBUG_CONTINUE_TOOLTIP :{BLACK}Sair da pausa e continuar a IA STR_AI_DEBUG_SELECT_AI_TOOLTIP :{BLACK}Ver saída de depuração desta IA @@ -5115,7 +5119,7 @@ STR_ERROR_TRAIN_TOO_LONG_AFTER_REPLACEMENT :{WHITE}{VEHICLE STR_ERROR_AUTOREPLACE_NOTHING_TO_DO :{WHITE}Regras de autosubstituição/renovação não estão ativadas STR_ERROR_AUTOREPLACE_MONEY_LIMIT :(limite de dinheiro) STR_ERROR_AUTOREPLACE_INCOMPATIBLE_CARGO :{WHITE}Novo veículo não pode transportar {STRING} -STR_ERROR_AUTOREPLACE_INCOMPATIBLE_REFIT :{WHITE}Novo veículo não pode ser reequipado na ordem {NUM} +STR_ERROR_AUTOREPLACE_INCOMPATIBLE_REFIT :{WHITE}Veículo novo não pode ser adaptado na ordem {NUM} # Rail construction errors STR_ERROR_IMPOSSIBLE_TRACK_COMBINATION :{WHITE}Impossível combinação de linhas @@ -5320,10 +5324,10 @@ STR_ERROR_NO_BUOY :{WHITE}Não há # Timetable related errors STR_ERROR_CAN_T_TIMETABLE_VEHICLE :{WHITE}Impossível programar veículo... -STR_ERROR_TIMETABLE_ONLY_WAIT_AT_STATIONS :{WHITE}Veículos só podem aguardar em estações -STR_ERROR_TIMETABLE_NOT_STOPPING_HERE :{WHITE}Esse veículo não pára nesta estação +STR_ERROR_TIMETABLE_ONLY_WAIT_AT_STATIONS :{WHITE}Veículos podem esperar apenas em estações. +STR_ERROR_TIMETABLE_NOT_STOPPING_HERE :{WHITE}Este veículo não para nesta estação STR_ERROR_TIMETABLE_INCOMPLETE :{WHITE}... horário incompleto -STR_ERROR_TIMETABLE_NOT_STARTED :{WHITE}... o plano de horário ainda não começou +STR_ERROR_TIMETABLE_NOT_STARTED :{WHITE}... o horário ainda não começou # Sign related errors STR_ERROR_TOO_MANY_SIGNS :{WHITE}... existem placas demais @@ -5370,7 +5374,7 @@ STR_TOWN_BUILDING_NAME_OLD_HOUSES_1 :Casas velhas STR_TOWN_BUILDING_NAME_COTTAGES_1 :Casas de campo STR_TOWN_BUILDING_NAME_HOUSES_1 :Casas STR_TOWN_BUILDING_NAME_FLATS_1 :Apartamentos -STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_2 :Prédio de escritórios alto +STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_2 :Edifício alto de escritórios STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_2 :Lojas e escritórios STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_3 :Lojas e escritórios STR_TOWN_BUILDING_NAME_THEATER_1 :Teatro @@ -5498,7 +5502,7 @@ STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_SH_40_ELECTRIC :SH '40' (Elétr STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_T_I_M_ELECTRIC :'T.I.M.' (Elétrico) STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_ASIASTAR_ELECTRIC :'AsiaStar' (Elétrico) STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_PASSENGER_CAR :Vagão de Passageiros -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_MAIL_VAN :Vagão de Correspondências +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_MAIL_VAN :Vagão de Correio STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_COAL_CAR :Vagão de Carvão STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_OIL_TANKER :Tanque de Petróleo STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_LIVESTOCK_VAN :Vagão de Gado @@ -5528,7 +5532,7 @@ STR_VEHICLE_NAME_TRAIN_ENGINE_MONORAIL_X2001_ELECTRIC :'X2001' (Elétr STR_VEHICLE_NAME_TRAIN_ENGINE_MONORAIL_MILLENNIUM_Z1_ELECTRIC :'Millennium Z1' (Elétrico) STR_VEHICLE_NAME_TRAIN_ENGINE_MONORAIL_WIZZOWOW_Z99 :Wizzowow Z99 STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_PASSENGER_CAR :Vagão de Passageiros -STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_MAIL_VAN :Vagão de Cartas +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_MAIL_VAN :Vagão de Correio STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_COAL_CAR :Vagão de Carvão STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_OIL_TANKER :Tanque de Petróleo STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_LIVESTOCK_VAN :Vagão de Gado @@ -5560,7 +5564,7 @@ STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_LEV3_PEGASUS_ELECTRIC :Lev3 'Pegasus' STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_LEV4_CHIMAERA_ELECTRIC :Lev4 'Chimaera' (Elétrico) STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_WIZZOWOW_ROCKETEER :Wizzowow Rocketeer STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_PASSENGER_CAR :Vagão de Passageiros -STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_MAIL_VAN :Vagão de Cartas +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_MAIL_VAN :Vagão de Correio STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_COAL_CAR :Vagão de Carvão STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_OIL_TANKER :Tanque de Petróleo STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_LIVESTOCK_VAN :Vagão de Gado @@ -5598,12 +5602,12 @@ STR_VEHICLE_NAME_ROAD_VEHICLE_PLODDYPHUT_MKIII_BUS :Ônibus Ploddyp STR_VEHICLE_NAME_ROAD_VEHICLE_BALOGH_COAL_TRUCK :Caminhão de Carvão Balogh STR_VEHICLE_NAME_ROAD_VEHICLE_UHL_COAL_TRUCK :Caminhão de Carvão Uhl STR_VEHICLE_NAME_ROAD_VEHICLE_DW_COAL_TRUCK :Caminhão de Carvão DW -STR_VEHICLE_NAME_ROAD_VEHICLE_MPS_MAIL_TRUCK :Caminhão de Cartas MPS -STR_VEHICLE_NAME_ROAD_VEHICLE_REYNARD_MAIL_TRUCK :Caminhão de Cartas Reynard -STR_VEHICLE_NAME_ROAD_VEHICLE_PERRY_MAIL_TRUCK :Caminhão de Cartas Perry -STR_VEHICLE_NAME_ROAD_VEHICLE_MIGHTYMOVER_MAIL_TRUCK :Caminhão de Cartas MightyMover -STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_MAIL_TRUCK :Caminhão de Cartas Powernaught -STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_MAIL_TRUCK :Caminhão de Cartas Wizzowow +STR_VEHICLE_NAME_ROAD_VEHICLE_MPS_MAIL_TRUCK :Caminhão de Correio MPS +STR_VEHICLE_NAME_ROAD_VEHICLE_REYNARD_MAIL_TRUCK :Caminhão de Correio Reynard +STR_VEHICLE_NAME_ROAD_VEHICLE_PERRY_MAIL_TRUCK :Caminhão de Correio Perry +STR_VEHICLE_NAME_ROAD_VEHICLE_MIGHTYMOVER_MAIL_TRUCK :Caminhão de Correio MightyMover +STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_MAIL_TRUCK :Caminhão de Correio Powernaught +STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_MAIL_TRUCK :Caminhão de Correio Wizzowow STR_VEHICLE_NAME_ROAD_VEHICLE_WITCOMBE_OIL_TANKER :Tanque de Petróleo Witcombe STR_VEHICLE_NAME_ROAD_VEHICLE_FOSTER_OIL_TANKER :Tanque de Petróleo Foster STR_VEHICLE_NAME_ROAD_VEHICLE_PERRY_OIL_TANKER :Tanque de Petróleo Perry @@ -5740,7 +5744,7 @@ STR_FORMAT_DATE_SHORT :{STRING} {NUM} STR_FORMAT_DATE_LONG :{STRING} {STRING} {NUM} STR_FORMAT_DATE_ISO :{2:NUM}-{1:ZEROFILL_NUM}-{0:ZEROFILL_NUM} -STR_FORMAT_COMPANY_NUM :(Companhia {COMMA}) +STR_FORMAT_COMPANY_NUM :(Empresa {COMMA}) STR_FORMAT_GROUP_NAME :Agrupar {COMMA} STR_FORMAT_GROUP_VEHICLE_NAME :{GROUP} #{COMMA} STR_FORMAT_INDUSTRY_NAME :{1:STRING} de {0:TOWN} diff --git a/src/lang/catalan.txt b/src/lang/catalan.txt index f29bf615ee..65ead37825 100644 --- a/src/lang/catalan.txt +++ b/src/lang/catalan.txt @@ -668,6 +668,8 @@ STR_PERFORMANCE_DETAIL_TOTAL :{BLACK}Total: ###next-name-looks-similar STR_PERFORMANCE_DETAIL_STATIONS_TOOLTIP :{BLACK}Nombre d'estacions visitades recentment per algun vehicle. Estacions, parades d'autobús, aeroports, etc. es compten per separat, fins i tot si pertanyen a la mateixa estació. +STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP_YEARS :{BLACK}El benefici del vehicle que pitjors ingressos ha tingut (només es tenen en compte els vehicles amb més de dos anys de servei). +STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP_PERIODS :{BLACK}El benefici del vehicle que pitjors ingressos ha tingut (només es tenen en compte els vehicles amb més de dos períodes de servei). STR_PERFORMANCE_DETAIL_MIN_INCOME_TOOLTIP :{BLACK}Quantitat de diners guanyats durant el trimestre amb el mínim benefici dels darrers 12 trimestres STR_PERFORMANCE_DETAIL_MAX_INCOME_TOOLTIP :{BLACK}Quantitat de diners guanyats durant el trimestre amb el màxim benefici dels darrers 12 trimestres STR_PERFORMANCE_DETAIL_DELIVERED_TOOLTIP :{BLACK}Unitats de càrrega entregades en els darrers quatre trimestres @@ -925,7 +927,10 @@ STR_NEWS_SERVICE_SUBSIDY_AWARDED_DOUBLE :{BIG_FONT}{BLAC STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIG_FONT}{BLACK}Subvenció concedida a {STRING}{}{}El transport de {STRING} de {STRING} fins a {STRING} ingressarà el triple de la tarifa habitual durant {UNITS_YEARS_OR_MINUTES} STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLACK}Subvenció concedida a {STRING}{}{}El transport de {STRING} de {STRING} fins a {STRING} ingressarà el quàdruple de la tarifa habitual durant {UNITS_YEARS_OR_MINUTES} +STR_NEWS_ROAD_REBUILDING_MONTHS :{BIG_FONT}{BLACK}Trànsit caòtic a {TOWN}!{}{}El programa de millora de carrers pagat per {STRING} provoca 6 mesos de misèria als motoristes! +STR_NEWS_ROAD_REBUILDING_MINUTES :{BIG_FONT}{BLACK}Trànsit caòtic a {TOWN}!{}{}El programa de millora de carrers pagat per {STRING} provoca 6 minuts de misèria als motoristes! STR_NEWS_EXCLUSIVE_RIGHTS_TITLE :{BIG_FONT}{BLACK}Monopoli de transports +STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION_MONTHS :{BIG_FONT}{BLACK}Les autoritats locals de {TOWN} signen un contracte amb {STRING} per a obtenir 12 mesos de drets de transport exclusius! # Extra view window STR_EXTRA_VIEWPORT_TITLE :{WHITE}Vista {COMMA} @@ -1416,7 +1421,8 @@ STR_CONFIG_SETTING_AUTOSCROLL_EVERY_VIEWPORT :Qualsevol vista STR_CONFIG_SETTING_BRIBE :Permet subornar les autoritats locals: {STRING} ###length 2 -STR_CONFIG_SETTING_BRIBE_HELPTEXT :Permet a les companyies intentar subornar l'autoritat local. Si el suborn és detectat per un inspector, la companyia no podrà actuar a la població durant sis mesos. +STR_CONFIG_SETTING_BRIBE_HELPTEXT :Permet que les companyies subornin l'autoritat local. Si algun inspector ho detecta, la companyia no podrà actuar a la població durant sis mesos. +STR_CONFIG_SETTING_BRIBE_HELPTEXT_MINUTES :Permet que les companyies subornin l'autoritat local. Si algun inspector ho detecta, la companyia no podrà actuar a la població durant sis minuts. STR_CONFIG_SETTING_ALLOW_EXCLUSIVE :Permet comprar els drets del transport en exclusiva: {STRING} ###length 2 @@ -2367,6 +2373,7 @@ STR_NETWORK_SERVER_LIST_DATE_CAPTION :{BLACK}Data STR_NETWORK_SERVER_LIST_DATE_CAPTION_TOOLTIP :{BLACK}Data actual STR_NETWORK_SERVER_LIST_PLAY_TIME_SHORT :{BLACK}{NUM}{NBSP}h{NBSP}{NUM}{NBSP}m STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION :{BLACK}Temps de joc +STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION_TOOLTIP :{BLACK}Temps de joc{}sense contar pauses STR_NETWORK_SERVER_LIST_INFO_ICONS_TOOLTIP :{BLACK}Idioma, versió de servidor, etc. STR_NETWORK_SERVER_LIST_CLICK_GAME_TO_SELECT :{BLACK}Clica en una partida de la llista per triar-la @@ -3646,6 +3653,7 @@ STR_LOCAL_AUTHORITY_ACTION_BRIBE :Suborna les aut STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{PUSH_COLOUR}{YELLOW}Inicia una petita campanya de publicitat, per atraure més passatgers i càrregues als teus serveis de transport.{}Proporciona una millora temporal dels ratis de les estacions dins d'un radi petit al voltant del centre de la població.{}{POP_COLOUR}Cost: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{PUSH_COLOUR}{YELLOW}Inicia una mitjana campanya de publicitat, per atraure més passatgers i càrregues als teus serveis de transport.{}Proporciona una millora temporal dels ratis de les estacions dins un radi mitjà al voltant del centre de la població.{}{PUSH_COLOUR}Cost: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{PUSH_COLOUR}{YELLOW}Inicia una gran campanya de publicitat, per atraure més passatgers i càrregues als teus serveis de transport.{}Proporciona una millora temporal dels ratis de les estacions dins d'un radi gran al voltant del centre de la població.{}{POP_COLOUR}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION_MONTHS :{PUSH_COLOUR}{YELLOW}Finança la reconstrucció de la xarxa de carreteres urbanes.{}Provoca molèsties considerables al trànsit de vehicles per carretera durant 6 mesos.{}{POP_COLOUR}Cost: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}Construeix una estàtua en honor a la teva companyia.{}Proporciona una millora permanent dels ratis d'estació de la població.{}{POP_COLOUR}Cost: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}Finança la construcció de nous edificis comercials a la població.{}Proporciona una millora temporal del creixement d'aquesta població.{}{POP_COLOUR}Cost: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Suborna les autoritats locals per a incrementar el vostre rati i cancel·lar els drets exclusius de transport del competidor, amb el risc de sancions greus si us pesquen.{}{POP_COLOUR}Cost:{NBSP}{CURRENCY_LONG} @@ -4356,6 +4364,7 @@ STR_VEHICLE_VIEW_AIRCRAFT_STATUS_START_STOP_TOOLTIP :{BLACK}Acció a # Messages in the start stop button in the vehicle view STR_VEHICLE_STATUS_LOADING_UNLOADING :{LTBLUE}Carregant / Descarregant STR_VEHICLE_STATUS_LEAVING :{LTBLUE}Sortint +STR_VEHICLE_STATUS_WAITING_UNBUNCHING :{LTBLUE}S'espera per a separar STR_VEHICLE_STATUS_CRASHED :{RED}Vehicle sinistrat! STR_VEHICLE_STATUS_BROKEN_DOWN :{RED}Avariat STR_VEHICLE_STATUS_STOPPED :{RED}Parat @@ -4369,6 +4378,7 @@ STR_VEHICLE_STATUS_NO_ORDERS_VEL :{LTBLUE}Sense o STR_VEHICLE_STATUS_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}Cap a {WAYPOINT}, a {VELOCITY} STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL :{ORANGE}Cap a {DEPOT}, {VELOCITY} STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL :{LTBLUE}Revisió a {DEPOT}, {VELOCITY} +STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_UNBUNCH_VEL :{LTBLUE}Separa i revisa a {DEPOT}, {VELOCITY} STR_VEHICLE_STATUS_CANNOT_REACH_STATION_VEL :{LTBLUE}No pot arribar a {STATION}, {VELOCITY} STR_VEHICLE_STATUS_CANNOT_REACH_WAYPOINT_VEL :{LTBLUE}No pot arribar a {WAYPOINT}, {VELOCITY} @@ -4423,6 +4433,11 @@ STR_VEHICLE_DETAILS_SERVICING_INTERVAL_MINUTES :{BLACK}Interval STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT :{BLACK}Interval de les revisions: {LTBLUE}{COMMA}{NBSP}%{BLACK} {STRING} STR_VEHICLE_DETAILS_LAST_SERVICE_DATE :Última revisió: {LTBLUE}{DATE_LONG} STR_VEHICLE_DETAILS_LAST_SERVICE_MINUTES_AGO :Última revisió: fa {LTBLUE}{NUM} minut{P "" s} +STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_DAYS :{BLACK}Augmenta l'interval de servei 10 dies. Amb Ctrl+Clic, s'augmenta l'interval només 5 dies. +STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_PERCENT :{BLACK}Augmenta l'interval de servei un 10{NBSP}%. Amb Ctrl+Clic, s'augmenta només un 5{NBSP}%. +STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_DAYS :{BLACK}Redueix l'interval de servei 10 dies. Amb Ctrl+Clic, es redueix l'interval només 5 dies. +STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES :{BLACK}Redueix l'interval de servei 5 minuts. Amb Ctrl+Clic, es redueix l'interval només 1 minut. +STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_PERCENT :{BLACK}Redueix l'interval de servei un 10{NBSP}%. Amb Ctrl+Clic, es redueix l'interval només un 5{NBSP}%. STR_SERVICE_INTERVAL_DROPDOWN_TOOLTIP :{BLACK}Canvia el tipus d'interval de les revisions STR_VEHICLE_DETAILS_DEFAULT :{G=Masculin}Predeterminat @@ -4534,6 +4549,9 @@ STR_ORDER_DROP_UNBUNCH :Separa # Depot action tooltips, one per vehicle type ###length VEHICLE_TYPES +STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP :{BLACK}Trieu l'acció que cal fer en aquest dipòsit. +STR_ORDER_ROAD_DEPOT_ACTION_TOOLTIP :{BLACK}Trieu l'acció que cal fer en aquesta cotxera. +STR_ORDER_HANGAR_ACTION_TOOLTIP :{BLACK}Trieu l'acció que cal fer en aquest hangar. ###next-name-looks-similar STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Dades del vehicle on basar el salt a @@ -5077,6 +5095,7 @@ STR_ERROR_DEPOT_WRONG_DEPOT_TYPE :Tipus de cotxer # Depot unbunching related errors STR_ERROR_UNBUNCHING_ONLY_ONE_ALLOWED :{WHITE}... només pot tenir una ordre de separar. STR_ERROR_UNBUNCHING_NO_FULL_LOAD :{WHITE}... no es poden fer servir ordres de càrrega completa quan el vehicle té una ordre de separació. +STR_ERROR_UNBUNCHING_NO_UNBUNCHING_FULL_LOAD :{WHITE}... no es pot separar un vehicle amb una ordre de càrrega completa. STR_ERROR_UNBUNCHING_NO_CONDITIONAL :{WHITE}... no pot fer servir ordres condicionals quan un vehicle té una ordre de separació. STR_ERROR_UNBUNCHING_NO_UNBUNCHING_CONDITIONAL :{WHITE}... no es pot separar un vehicle que té ordres condicionals. diff --git a/src/lang/danish.txt b/src/lang/danish.txt index f7824807ab..e633aca2f6 100644 --- a/src/lang/danish.txt +++ b/src/lang/danish.txt @@ -329,6 +329,7 @@ STR_SORT_BY_TRANSPORTED :Transporteret STR_SORT_BY_NUMBER :Nummer STR_SORT_BY_PROFIT_LAST_YEAR :Afkast sidste år STR_SORT_BY_PROFIT_THIS_YEAR :Afkast i år +STR_SORT_BY_PROFIT_THIS_PERIOD :Profit denne periode STR_SORT_BY_AGE :Alder STR_SORT_BY_RELIABILITY :Pålidelighed STR_SORT_BY_TOTAL_CAPACITY_PER_CARGOTYPE :Total kapacitet for hver lasttype @@ -651,7 +652,9 @@ STR_PERFORMANCE_DETAIL_LOAN :{BLACK}Lån: STR_PERFORMANCE_DETAIL_TOTAL :{BLACK}I alt: ###next-name-looks-similar +STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP_YEARS :{BLACK}Antal køretøjer, der gav overskud sidste år. Dette omfatter vejkøretøjer, tog, skibe og fly STR_PERFORMANCE_DETAIL_STATIONS_TOOLTIP :{BLACK}Antal nyligt servicerede stationer. Togstationer, busstoppesteder, lufthavne og så videre tælles separat, selv om de tilhører den samme station +STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP_YEARS :{BLACK}Fortjenesten af køretøjet med den laveste indkomst (kun køretøjer ældre end to år tages i betragtning) STR_PERFORMANCE_DETAIL_MIN_INCOME_TOOLTIP :{BLACK}Indkomst i kvartallet med det laveste afkast i de sidste 12 kvartaler STR_PERFORMANCE_DETAIL_MAX_INCOME_TOOLTIP :{BLACK}Indkomst i kvartallet med det højeste afkast i de sidste 12 kvartaler STR_PERFORMANCE_DETAIL_DELIVERED_TOOLTIP :{BLACK}Antal enheder fragtet i de sidste 4 kvartaler @@ -2315,6 +2318,7 @@ STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION :{BLACK}Kortstø STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION_TOOLTIP :{BLACK}Kortstørrelse for spillet{}Klik for at sortere efter område STR_NETWORK_SERVER_LIST_DATE_CAPTION :{BLACK}Dato STR_NETWORK_SERVER_LIST_DATE_CAPTION_TOOLTIP :{BLACK}Aktuel dato +STR_NETWORK_SERVER_LIST_PLAY_TIME_SHORT :{BLACK}{NUM}h {NUM}m STR_NETWORK_SERVER_LIST_INFO_ICONS_TOOLTIP :{BLACK}Sprog, server version, osv. STR_NETWORK_SERVER_LIST_CLICK_GAME_TO_SELECT :{BLACK}Klik på et spil fra listen for at vælge det @@ -2686,6 +2690,7 @@ STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLA # Linkgraph tooltip STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION :{}{CARGO_LONG} transporteres tilbage ({COMMA}% of capacity) +STR_LINKGRAPH_STATS_TOOLTIP_TIME_EXTENSION :{}Gennemsnitlig rejsetid: {UNITS_DAYS_OR_SECONDS} # Base for station construction window(s) STR_STATION_BUILD_COVERAGE_AREA_TITLE :{BLACK}Vis dækningsområde @@ -4165,6 +4170,7 @@ STR_ENGINE_PREVIEW_AIRCRAFT :fly STR_ENGINE_PREVIEW_SHIP :skib STR_ENGINE_PREVIEW_TEXT3 :{BLACK}{STRING}{}{5:STRING}{}{STRING} +STR_ENGINE_PREVIEW_COST_WEIGHT :Pris: {CURRENCY_LONG} Vægt: {WEIGHT_SHORT} # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Udskift {STRING} - {STRING} @@ -4334,6 +4340,7 @@ STR_VEHICLE_DETAILS_LAST_SERVICE_MINUTES_AGO :Last service: { STR_SERVICE_INTERVAL_DROPDOWN_TOOLTIP :{BLACK}Ændre serviceintervallets type STR_VEHICLE_DETAILS_DEFAULT :Standard +STR_VEHICLE_DETAILS_MINUTES :Minutter STR_VEHICLE_DETAILS_PERCENT :Procent ###length VEHICLE_TYPES diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt index cec6f3b07b..fbf1abdbe5 100644 --- a/src/lang/english_AU.txt +++ b/src/lang/english_AU.txt @@ -4562,6 +4562,10 @@ STR_ORDER_DROP_UNBUNCH :Unbunch # Depot action tooltips, one per vehicle type ###length VEHICLE_TYPES +STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP :{BLACK}Select the action to take at this depot +STR_ORDER_ROAD_DEPOT_ACTION_TOOLTIP :{BLACK}Select the action to take at this depot +STR_ORDER_SHIP_DEPOT_ACTION_TOOLTIP :{BLACK}Select the action to take at this depot +STR_ORDER_HANGAR_ACTION_TOOLTIP :{BLACK}Select the action to take at this hangar ###next-name-looks-similar STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Vehicle data to base jumping on diff --git a/src/lang/esperanto.txt b/src/lang/esperanto.txt index c146b1e2dd..c36d00e84f 100644 --- a/src/lang/esperanto.txt +++ b/src/lang/esperanto.txt @@ -320,8 +320,13 @@ STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m # Time units used in string control characters +STR_UNITS_DAYS :{COMMA}{NBSP}tago{P "" j} +STR_UNITS_SECONDS :{COMMA}{NBSP}sekundo{P "" j} +STR_UNITS_MONTHS :{NUM}{NBSP}monato{P "" j} +STR_UNITS_MINUTES :{NUM}{NBSP}minuto{P "" j} +STR_UNITS_YEARS :{NUM}{NBSP}jaro{P "" j} # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filtroteksto: @@ -430,7 +435,7 @@ STR_GOTO_ORDER_VIEW :{BLACK}Itinero ###length 31 STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}Paŭzigu la ludon STR_TOOLBAR_TOOLTIP_FORWARD :{BLACK}Rapide pluirigu la ludon -STR_TOOLBAR_TOOLTIP_OPTIONS :{BLACK}Opcioj kaj agordoj +STR_TOOLBAR_TOOLTIP_OPTIONS :{BLACK}Agordoj STR_TOOLBAR_TOOLTIP_SAVE_GAME_ABANDON_GAME :{BLACK}Konservu ludon, foriru ludo, forlasi STR_TOOLBAR_TOOLTIP_DISPLAY_MAP :{BLACK}Montru mapon, ekstran vidujon, fluon de ŝarĝoj aŭ liston de ŝildoj STR_TOOLBAR_TOOLTIP_DISPLAY_TOWN_DIRECTORY :{BLACK}Montru urbaron @@ -489,7 +494,7 @@ STR_SCENEDIT_FILE_MENU_QUIT :Forlasi # Settings menu ###length 16 -STR_SETTINGS_MENU_GAME_OPTIONS :Ludaj opcioj +STR_SETTINGS_MENU_GAME_OPTIONS :Ludaj agordoj STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Agordoj STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS :Ludoskriptaj agordoj STR_SETTINGS_MENU_NEWGRF_SETTINGS :Agordoj de NewGRF @@ -506,7 +511,7 @@ STR_SETTINGS_MENU_TRANSPARENT_SIGNS :Travideblaj sig # File menu STR_FILE_MENU_SAVE_GAME :Konservu ludon -STR_FILE_MENU_LOAD_GAME :Ŝarĝu ludon +STR_FILE_MENU_LOAD_GAME :Enlegi ludon STR_FILE_MENU_QUIT_GAME :Foriru de la ludo STR_FILE_MENU_EXIT :Fermu @@ -947,7 +952,12 @@ STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE :{BLACK}Nova {ST STR_NEWS_OFFER_OF_SUBSIDY_EXPIRED :{BIG_FONT}{BLACK}Subvencia oferto ne plu validas:{}{}Transportado de {STRING} de {STRING} al {STRING} ne estos subvenciata. STR_NEWS_SUBSIDY_WITHDRAWN_SERVICE :{BIG_FONT}{BLACK}Subvencio retiriĝis:{}{}Servo de {STRING} de {STRING} al {STRING} ne plu estas subvenciata. +STR_NEWS_SERVICE_SUBSIDY_OFFERED :{BIG_FONT}{BLACK}Subvencia proponiĝas:{}{}Unua {STRING} de {STRING} al {STRING} ricevos {UNITS_YEARS_OR_MINUTES} subvencion de la lokaj estroj! ###length 4 +STR_NEWS_SERVICE_SUBSIDY_AWARDED_HALF :{BIG_FONT}{BLACK}Subvencion gajnis {STRING}!{}{}{STRING} de {STRING} al {STRING} pagiĝos kun aldono je 50% dum la sekvontaj {UNITS_YEARS_OR_MINUTES}! +STR_NEWS_SERVICE_SUBSIDY_AWARDED_DOUBLE :{BIG_FONT}{BLACK}Subvencion gajnis {STRING}!{}{}{STRING} de {STRING} al {STRING} pagiĝos duoble dum la sekvontaj {UNITS_YEARS_OR_MINUTES}! +STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIG_FONT}{BLACK}Subvencion gajnis {STRING}!{}{}{STRING} de {STRING} al {STRING} pagiĝos trioble dum la sekvontaj {UNITS_YEARS_OR_MINUTES}! +STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLACK}Suvencion gajnis {STRING}!{}{}{STRING} de {STRING} al {STRING} pagiĝos kvaroble dum la sekvontaj {UNITS_YEARS_OR_MINUTES}! STR_NEWS_EXCLUSIVE_RIGHTS_TITLE :{BIG_FONT}{BLACK}Transporta monopolo! @@ -959,7 +969,7 @@ STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Gluu de STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Gluu la lokon de ĉi tiu vidujo al la ĉefvido # Game options window -STR_GAME_OPTIONS_CAPTION :{WHITE}Ludaj Opcioj +STR_GAME_OPTIONS_CAPTION :{WHITE}Ludaj agordoj STR_GAME_OPTIONS_TAB_GENERAL :Ĝenerale STR_GAME_OPTIONS_TAB_GENERAL_TT :{BLACK}Elektu ĝeneralajn agordojn @@ -1287,6 +1297,7 @@ STR_CONFIG_SETTING_SUBSIDY_DURATION :Daŭro de subve ###length 2 STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT :Indiku por kiom da jaroj validas subvencio +STR_CONFIG_SETTING_SUBSIDY_DURATION_VALUE :{UNITS_YEARS_OR_PERIODS}n ###setting-zero-is-special STR_CONFIG_SETTING_SUBSIDY_DURATION_DISABLED :Neniuj subvencioj @@ -1464,6 +1475,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :Veturiloj nenia STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Se tiu ĉi agordo estas aktiva, ĉiuj modeloj de veturiloj restos aĉeteblaj por ĉiam post ekhaveblo ###length 2 +STR_CONFIG_SETTING_TIMEKEEPING_UNITS_CALENDAR :Kalendaro ###setting-zero-is-special @@ -2078,14 +2090,14 @@ STR_VIDEO_DRIVER_ERROR_NO_HARDWARE_ACCELERATION :{WHITE}... ne t # Intro window STR_INTRO_CAPTION :{WHITE}OpenTTD {REV} -STR_INTRO_NEW_GAME :{BLACK}Nova Ludo +STR_INTRO_NEW_GAME :{BLACK}Novan ludon STR_INTRO_LOAD_GAME :{BLACK}Ŝarĝu ludon -STR_INTRO_PLAY_SCENARIO :{BLACK}Ludu Scenaron -STR_INTRO_PLAY_HEIGHTMAP :{BLACK}Ludu Altecmapon +STR_INTRO_PLAY_SCENARIO :{BLACK}Ludi scenaron +STR_INTRO_PLAY_HEIGHTMAP :{BLACK}Ludi altecmapon STR_INTRO_SCENARIO_EDITOR :{BLACK}Scenarkreilo STR_INTRO_MULTIPLAYER :{BLACK}Pluraj Ludantoj -STR_INTRO_GAME_OPTIONS :{BLACK}Ludaj Opcioj +STR_INTRO_GAME_OPTIONS :{BLACK}Ludaj agordoj STR_INTRO_HIGHSCORE :{BLACK}Altpoentara tabelo STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Agordoj STR_INTRO_NEWGRF_SETTINGS :{BLACK}Agordoj de NewGRF @@ -2106,7 +2118,7 @@ STR_INTRO_TOOLTIP_SUB_ARCTIC_LANDSCAPE :{BLACK}Elektu ' STR_INTRO_TOOLTIP_SUB_TROPICAL_LANDSCAPE :{BLACK}Elektu 'sub-tropikan' landstilon STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE :{BLACK}Elektu 'ludlandan' landstilon -STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Montru ludajn opciojn +STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Montri ludajn agordojn STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Montru altpoentara tabelo STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Montru agordojn STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Montri NewGRF-agordojn @@ -2394,7 +2406,7 @@ STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}Jes, ĉi STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}Jes, ne demandu denove STR_NETWORK_ASK_SURVEY_CAPTION :Partopreni aŭtomatan sondadon? -STR_NETWORK_ASK_SURVEY_TEXT :Ĉu vi volas partopreni la aŭtomatan sondadon?{}OpenTTD sendos sondaĵon post foriro el ludo.{}Vi povas ŝanĝi tion ĉi iam ajn sub "Ludaj Opcioj". +STR_NETWORK_ASK_SURVEY_TEXT :Ĉu vi volas partopreni la aŭtomatan sondadon?{}OpenTTD sendos sondaĵon post foriro el ludo.{}Vi povas ŝanĝi tion ĉi iam ajn sub "Ludaj agordoj". STR_NETWORK_ASK_SURVEY_PREVIEW :Antaŭmontru sondaĵrezulton STR_NETWORK_ASK_SURVEY_LINK :Pri sondado kaj privateco STR_NETWORK_ASK_SURVEY_NO :Ne @@ -2614,6 +2626,7 @@ STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLA # Linkgraph tooltip STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION :{}{CARGO_LONG} transportenda reen ({COMMA}% de la kapacito) +STR_LINKGRAPH_STATS_TOOLTIP_TIME_EXTENSION :{}Meznombra veturtempo: {UNITS_DAYS_OR_SECONDS} # Base for station construction window(s) STR_STATION_BUILD_COVERAGE_AREA_TITLE :{BLACK}Ŝarĝregiona marko @@ -3428,6 +3441,8 @@ STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_DELIVERED_GENERAL :{ORANGE}{STRING}{GREEN} liverita STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED :{ORANGE}{CARGO_TINY} / {CARGO_LONG}{RED} (ankoraŭ bezonata) STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_DELIVERED :{ORANGE}{CARGO_TINY} / {CARGO_LONG}{GREEN} (liverita) +STR_TOWN_VIEW_TOWN_GROWS_EVERY :{BLACK}La urbo kreskas ĉiun {ORANGE}{UNITS_DAYS_OR_SECONDS} +STR_TOWN_VIEW_TOWN_GROWS_EVERY_FUNDED :{BLACK}La urbo kreskas ĉiun {ORANGE}{UNITS_DAYS_OR_SECONDS} (pagata) STR_TOWN_VIEW_TOWN_GROW_STOPPED :{BLACK}La urbo {RED}ne{BLACK} kreskas STR_TOWN_VIEW_NOISE_IN_TOWN :{BLACK}Urba brulimo: {ORANGE}{COMMA}{BLACK} maks: {ORANGE}{COMMA} STR_TOWN_VIEW_CENTER_TOOLTIP :{BLACK}Centri ĉefvidon ĉe la urbo. Stir+Klak por malfermi novan vidujon ĉe la urba loko. @@ -3504,8 +3519,10 @@ STR_GOAL_QUESTION_BUTTON_CLOSE :Fermu # Subsidies window STR_SUBSIDIES_CAPTION :{WHITE}Subvencioj STR_SUBSIDIES_OFFERED_TITLE :{BLACK}Subvencioj haveblas por jenaj servoj: +STR_SUBSIDIES_OFFERED_FROM_TO :{ORANGE}{STRING} de {STRING} al {STRING}{YELLOW} ({STRING}) STR_SUBSIDIES_NONE :{ORANGE}- Neniu - STR_SUBSIDIES_SUBSIDISED_TITLE :{BLACK}Servoj subvenciataj: +STR_SUBSIDIES_SUBSIDISED_FROM_TO :{ORANGE}{STRING} de {STRING} al {STRING}{YELLOW} ({COMPANY}{YELLOW}, {STRING}) STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Klaku servon por centri vidpunkto ĉe la industrio/urbo. Ctrl+Klak por malfermi novan vidujon ĉe la loko # Story book window @@ -4184,6 +4201,8 @@ STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Enhaveco STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Transigaj Kreditoj: {LTBLUE}{CURRENCY_LONG} +STR_VEHICLE_DETAILS_SERVICING_INTERVAL_DAYS :{BLACK}Prizorga intertempo: {LTBLUE}{COMMA}{NBSP}tagoj{BLACK} {STRING} +STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT :{BLACK}Prizorga intertempo: {LTBLUE}{COMMA}%{BLACK} {STRING} STR_SERVICE_INTERVAL_DROPDOWN_TOOLTIP :{BLACK}Ŝanĝi la tipo de servon intervalon STR_VEHICLE_DETAILS_DEFAULT :Defaŭlto @@ -4252,6 +4271,7 @@ STR_ORDERS_TIMETABLE_VIEW_TOOLTIP :{BLACK}Montri h STR_ORDERS_LIST_TOOLTIP :{BLACK}Ordonlisto - klaku ordonon por elekti. Ctrl+Klak rulumas al la celstacio STR_ORDER_INDEX :{COMMA}:{NBSP} +STR_ORDER_TEXT :{STRING} {STRING} {STRING} {STRING} STR_ORDERS_END_OF_ORDERS :- - Fino de Ordonoj - - STR_ORDERS_END_OF_SHARED_ORDERS :- - Fino de Kunhavitaj Ordonoj - - @@ -4549,6 +4569,7 @@ STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Ludoskripto STR_AI_SETTINGS_CLOSE :{BLACK}Fermi STR_AI_SETTINGS_RESET :{BLACK}Reŝargo STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} +STR_AI_SETTINGS_SETTING_DEVIATION :{STRING}: {ORANGE}[{STRING}, {STRING}] # Textfile window diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index 0db5f41e0f..191650dc5a 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -366,6 +366,7 @@ STR_SORT_BY_TOTAL_PROFIT_LAST_PERIOD :Kokonaistuotto STR_SORT_BY_TOTAL_PROFIT_THIS_YEAR :Kokonaistuotto tänä vuonna STR_SORT_BY_TOTAL_PROFIT_THIS_PERIOD :Kokonaistuotto tällä jaksolla STR_SORT_BY_AVERAGE_PROFIT_LAST_YEAR :Keskimääräinen tuotto viime vuonna +STR_SORT_BY_AVERAGE_PROFIT_LAST_PERIOD :Keskimääräinen tuotto viime jaksolla STR_SORT_BY_AVERAGE_PROFIT_THIS_YEAR :Keskimääräinen tuotto tänä vuonna STR_SORT_BY_AVERAGE_PROFIT_THIS_PERIOD :Keskimääräinen tuotto tällä jaksolla @@ -394,19 +395,19 @@ STR_TOOLBAR_TOOLTIP_DISPLAY_GOALS_LIST :{BLACK}Näytä STR_TOOLBAR_TOOLTIP_DISPLAY_GRAPHS :{BLACK}Näytä yhtiökuvaajat ja rahtitaksat STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE :{BLACK}Näytä yhtiökilpataulukko STR_TOOLBAR_TOOLTIP_FUND_CONSTRUCTION_OF_NEW :{BLACK}Tutki teollisuuslaitoksia tai rahoita uuden teollisuuden rakentamista -STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_TRAINS :{BLACK}Näytä luettelo yhtiön junista. Ctrl+napsautus näyttää luettelon ilman ryhmäluetteloa. -STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_ROAD_VEHICLES :{BLACK}Näytä luettelo yhtiön ajoneuvoista. Ctrl+napsautus näyttää luettelon ilman ryhmäluetteloa. +STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_TRAINS :{BLACK}Avaa luettelo yhtiön junista. Ctrl+napsautus näyttää tai piilottaa kulkuneuvoryhmät päinvastoin kuin valitussa asetuksessa. +STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_ROAD_VEHICLES :{BLACK}Avaa luettelo yhtiön ajoneuvoista. Ctrl+napsautus näyttää tai piilottaa ajoneuvoryhmät päinvastoin kuin valitussa asetuksessa STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_SHIPS :{BLACK}Näytä luettelo yhtiön laivoista. Ctrl+napsautus näyttää luettelon ilman ryhmäluetteloa. STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_AIRCRAFT :{BLACK}Näytä luettelo yhtiön ilma-aluksista. Ctrl+napsautus näyttää luettelon ilman ryhmäluetteloa. STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN :{BLACK}Lähennä näkymää STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT :{BLACK}Loitonna näkymää STR_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Rakenna rautateitä -STR_TOOLBAR_TOOLTIP_BUILD_ROADS :{BLACK}Rakenna teitä -STR_TOOLBAR_TOOLTIP_BUILD_TRAMWAYS :{BLACK}Rakenna raitioteitä -STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS :{BLACK}Rakenna satamia +STR_TOOLBAR_TOOLTIP_BUILD_ROADS :{BLACK}Tieinfrastruktuurin rakentaminen +STR_TOOLBAR_TOOLTIP_BUILD_TRAMWAYS :{BLACK}Raitiotieinfrastruktuurin rakentaminen +STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS :{BLACK}Vesiväyläinfrastruktuurin rakentaminen STR_TOOLBAR_TOOLTIP_BUILD_AIRPORTS :{BLACK}Rakenna lentokenttiä STR_TOOLBAR_TOOLTIP_LANDSCAPING :{BLACK}Avaa maastonmuokkaustyökalupalkki maan kohottamiseen/madaltamiseen, puiden istuttamiseen, jne. -STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW :{BLACK}Näytä ääni- ja musiikkiasetukset +STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW :{BLACK}Avaa ääni- ja musiikkiasetukset STR_TOOLBAR_TOOLTIP_SHOW_LAST_MESSAGE_NEWS :{BLACK}Näytä viimeisin viesti/uutisraportti, näytä viestihistoria tai poista kaikki viestit STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION :{BLACK}Maa-aluetiedot, kuvakaappaus, tietoja OpenTTD:stä, kehittäjätyökalut STR_TOOLBAR_TOOLTIP_SWITCH_TOOLBAR :{BLACK}Vaihda työkalupalkkeja @@ -418,12 +419,12 @@ STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR :{YELLOW}Skenaar STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_BACKWARD :{BLACK}Siirrä aloituspäivää vuodella taaksepäin STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_FORWARD :{BLACK}Siirrä aloituspäivää vuodella eteenpäin STR_SCENEDIT_TOOLBAR_TOOLTIP_SET_DATE :{BLACK}Aseta aloitusvuosi napsauttamalla -STR_SCENEDIT_TOOLBAR_TOOLTIP_DISPLAY_MAP_TOWN_DIRECTORY :{BLACK}Näytä kartta, kuntahakemisto +STR_SCENEDIT_TOOLBAR_TOOLTIP_DISPLAY_MAP_TOWN_DIRECTORY :{BLACK}Avaa kartta, lisänäkymä, kylttiluettelo tahi kunta- tai teollisuushakemisto STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION :{BLACK}Maaston luonti -STR_SCENEDIT_TOOLBAR_TOWN_GENERATION :{BLACK}Kuntien luonti +STR_SCENEDIT_TOOLBAR_TOWN_GENERATION :{BLACK}Kuntien rakentaminen tai luominen STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION :{BLACK}Teollisuuden luonti -STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Tienrakennus -STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}Raitiotien rakentaminen +STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Tieinfrastruktuurin rakentaminen +STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}Raitiotieinfrastruktuurin rakentaminen STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Istuta puita. Ctrl valitsee alueen vinottain. Shift vaihtaa istutustilan ja kustannusarvion välillä STR_SCENEDIT_TOOLBAR_PLACE_SIGN :{BLACK}Sijoita kyltti STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Sijoita objekti. Ctrl valitsee alueen vinottain. Shift vaihtaa rakennustilan ja kustannusarvion välillä @@ -633,6 +634,7 @@ STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Napsauta # Company league window STR_COMPANY_LEAGUE_TABLE_CAPTION :{WHITE}Yhtiökilpataulukko STR_COMPANY_LEAGUE_COMPANY_NAME :{ORANGE}{COMPANY} {BLACK}{COMPANY_NUM} ”{STRING}” +STR_COMPANY_LEAGUE_COMPANY_RANK :{YELLOW}{NUM}. STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ENGINEER :Veturinkuljettaja STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRAFFIC_MANAGER :Liikennepäällikkö STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRANSPORT_COORDINATOR :Kuljetusjohtaja @@ -664,6 +666,7 @@ STR_PERFORMANCE_DETAIL_LOAN :{BLACK}Laina: STR_PERFORMANCE_DETAIL_TOTAL :{BLACK}Yhteensä: ###next-name-looks-similar +STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP_YEARS :{BLACK}Viime vuonna voittoa tuottaneiden kulkuneuvojen lukumäärä. Tähän sisältyvät ajoneuvot, junat, laivat ja lentokoneet STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP_PERIODS :{BLACK}Viime jaksolla voittoa tuottaneiden kulkuneuvojen lukumäärä. Tähän sisältyvät ajoneuvot, junat, laivat ja lentokoneet STR_PERFORMANCE_DETAIL_STATIONS_TOOLTIP :{BLACK}Asemien osien määrä. Kaikki osat asemista (esim. rautatieasema, bussipysäkki, lentokenttä) lasketaan, vaikka ne olisivat yhdistettynä yhdeksi asemaksi STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP_YEARS :{BLACK}Vähiten tuottaneen kulkuneuvon tuotto (huomioon otetaan vain yli kahden vuoden ikäiset kulkuneuvot) @@ -901,6 +904,7 @@ STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD_AND :{WHITE}{VEHICLE STR_NEWS_TRAIN_IS_STUCK :{WHITE}{VEHICLE} ei löydä reittiä päämäärään STR_NEWS_VEHICLE_IS_LOST :{WHITE}{VEHICLE} on eksynyt STR_NEWS_VEHICLE_UNPROFITABLE_YEAR :{WHITE}Kulkuneuvon {VEHICLE} tuotto viime vuonna oli {CURRENCY_LONG} +STR_NEWS_VEHICLE_UNPROFITABLE_PERIOD :{WHITE}Kulkuneuvon {VEHICLE} tuotto viime jaksolla oli {CURRENCY_LONG} STR_NEWS_AIRCRAFT_DEST_TOO_FAR :{WHITE}{VEHICLE} ei pääse seuraavaan määränpäähän koska se on toimintasäteen ulkopuolella STR_NEWS_ORDER_REFIT_FAILED :{WHITE}Korvauksen epäonnistuminen pysäytti kulkuneuvon {VEHICLE} @@ -917,11 +921,17 @@ STR_NEWS_STATION_NOW_ACCEPTS_CARGO_LIST :{WHITE}{STATION STR_NEWS_OFFER_OF_SUBSIDY_EXPIRED :{BIG_FONT}{BLACK}Tukitarjous päättynyt:{}{}{STRING} välillä {STRING} – {STRING} ei enää tulla tukemaan STR_NEWS_SUBSIDY_WITHDRAWN_SERVICE :{BIG_FONT}{BLACK}Tuki vedetty pois:{}{}{STRING} välillä {STRING}-{STRING} ei enää tueta +STR_NEWS_SERVICE_SUBSIDY_OFFERED :{BIG_FONT}{BLACK}Tuki tarjolla:{}{}Paikallisviranomaiset tukevat ensimmäistä {STRING} välillä {STRING} – {STRING} {UNITS_YEARS_OR_MINUTES}! ###length 4 +STR_NEWS_SERVICE_SUBSIDY_AWARDED_HALF :{BIG_FONT}{BLACK}{STRING} sai tuen!{}{}{STRING} välillä {STRING} – {STRING} tuottaa puolitoistakertaisesti seuraavat {UNITS_YEARS_OR_MINUTES}! +STR_NEWS_SERVICE_SUBSIDY_AWARDED_DOUBLE :{BIG_FONT}{BLACK}{STRING} sai tuen!{}{}{STRING} välillä {STRING} – {STRING} tuottaa kaksinkertaisesti seuraavat {UNITS_YEARS_OR_MINUTES}! +STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIG_FONT}{BLACK}{STRING} sai tuen!{}{}{STRING} välillä {STRING} – {STRING} tuottaa kolminkertaisesti seuraavat {UNITS_YEARS_OR_MINUTES}! +STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLACK}{STRING} sai tuen!{}{}{STRING} välillä {STRING} – {STRING} tuottaa nelinkertaisesti seuraavat {UNITS_YEARS_OR_MINUTES}! STR_NEWS_ROAD_REBUILDING_MONTHS :{BIG_FONT}{BLACK}Liikennekaaos paikkakunnalla {TOWN}!{}{}Yhtiön {STRING} rahoittama tienrakennusohjelma tuo autoilijoille 6 kuukautta kärsimystä! STR_NEWS_ROAD_REBUILDING_MINUTES :{BIG_FONT}{BLACK}Liikennekaaos paikkakunnalla {TOWN}!{}{}Yhtiön {STRING} rahoittama tienrakennusohjelma tuo autoilijoille 6 minuuttia kärsimystä! STR_NEWS_EXCLUSIVE_RIGHTS_TITLE :{BIG_FONT}{BLACK}Kuljetusmonopoli! +STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION_MONTHS :{BIG_FONT}{BLACK}Kunnan {TOWN} viranomaiset ovat sopineet yhtiön {STRING} kanssa 12 kuukauden kuljetusyksinoikeudesta! STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION_MINUTES :{BIG_FONT}{BLACK}Kunnan {TOWN} viranomaiset ovat sopineet yhtiön {STRING} kanssa 12 minuutin kuljetusyksinoikeudesta! # Extra view window @@ -1261,6 +1271,8 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :oikealla STR_CONFIG_SETTING_SECONDS_VALUE :{COMMA}{NBSP}sekunti{P 0 "" a} +STR_CONFIG_SETTING_INFINITE_MONEY :Loputon raha: {STRING} +STR_CONFIG_SETTING_INFINITE_MONEY_HELPTEXT :Salli rajaton rahankäyttö ja estä yritysten konkurssit STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Suurin mahdollinen laina alussa: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Suurin mahdollinen yhtiön ottama laina (ottamatta huomioon inflaatiota) @@ -1288,6 +1300,7 @@ STR_CONFIG_SETTING_SUBSIDY_DURATION :Tuen kesto: {ST STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT :Aseta myönnettävän tuen kesto vuosina STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT_PERIODS :Aseta myönnettävän tuen kesto jaksoina +STR_CONFIG_SETTING_SUBSIDY_DURATION_VALUE :{UNITS_YEARS_OR_PERIODS} ###setting-zero-is-special STR_CONFIG_SETTING_SUBSIDY_DURATION_DISABLED :Ei tukia @@ -1389,6 +1402,7 @@ STR_CONFIG_SETTING_SHOWFINANCES_PERIOD :Näytä talousi ###length 2 STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT :Mikäli käytössä, talousikkuna näytetään jokaisen vuoden lopussa yhtiön taloudellisen tilanteen seurannan helpottamiseksi +STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT_PERIOD :Mikäli käytössä, talousikkuna näytetään jokaisen jakson lopussa yhtiön taloudellisen tilanteen seurannan helpottamiseksi STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :Uudet käskyt ovat oletusarvoisesti ilman välipysähdyksiä: {STRING} STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :Normaalisti kulkuneuvo pysähtyy jokaisella läpikulkemallaan asemalla. Mikäli tämä asetus on käytössä kulkuneuvot eivät pysähdy ajaessaan asemien läpi. Huomioi, että tämä asetus määrittää oletusarvoisen toiminnon uusille kulkuneuvoille. Asetusta voidaan muuttaa erikseen kunkin kulkuneuvon kohdalla @@ -1415,7 +1429,8 @@ STR_CONFIG_SETTING_BRIBE_HELPTEXT_MINUTES :Salli yhtiöide STR_CONFIG_SETTING_ALLOW_EXCLUSIVE :Salli kuljetusyksinoikeuksien ostaminen: {STRING} ###length 2 -STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :Jos yhtiö ostaa kuljetusyksinoikeudet kuntaan, vastustajien matkustaja- ja rahtiasemat eivät vastaanota rahtia seuraavan vuoden ajan +STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :Jos yhtiö ostaa kuljetusyksinoikeudet kuntaan, vastustajien matkustaja- ja rahtiasemat eivät ota vastaan rahtia kahteentoista kuukauteen +STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT_MINUTES :Jos yhtiö ostaa kuljetusyksinoikeudet kuntaan, vastustajien matkustaja- ja rahtiasemat eivät ota vastaan rahtia kahteentoista minuuttiin STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS :Salli rakennusten rahoittaminen: {STRING} STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS_HELPTEXT :Sallii yhtiöiden rahoittaa uusien talojen rakentamista kunnissa @@ -1424,7 +1439,7 @@ STR_CONFIG_SETTING_ALLOW_FUND_ROAD :Salli paikallis STR_CONFIG_SETTING_ALLOW_FUND_ROAD_HELPTEXT :Salli yritysten antaa kunnille rahaa tiestön peruskorjaukseen tiestöön perustuvien palvelujen sabotoimiseksi kunnassa STR_CONFIG_SETTING_ALLOW_GIVE_MONEY :Salli rahan lähettäminen muille yhtiöille: {STRING} -STR_CONFIG_SETTING_ALLOW_GIVE_MONEY_HELPTEXT :Sallii rahan siirtämisen yhtiöiden välillä moninpelitilassa +STR_CONFIG_SETTING_ALLOW_GIVE_MONEY_HELPTEXT :Salli rahan siirtäminen yhtiöiden välillä moninpelitilassa STR_CONFIG_SETTING_FREIGHT_TRAINS :Rahdin painokerroin raskaiden junien simulointia varten: {STRING} STR_CONFIG_SETTING_FREIGHT_TRAINS_HELPTEXT :Määritä rahdin kuljettamisen vaikutus junissa. Korkeammat arvot tekevät rahdin kuljettamisesta raskaampaa junille, erityisesti mäissä @@ -1488,9 +1503,15 @@ STR_CONFIG_SETTING_TIMEKEEPING_UNITS_WALLCLOCK :Seinäkello STR_CONFIG_SETTING_MINUTES_PER_YEAR :Minuuttia vuodessa: {STRING} STR_CONFIG_SETTING_MINUTES_PER_YEAR_HELPTEXT :Valitse minuuttien määrä kalenterivuodessa. Oletusarvo on 12 minuuttia. Aseta arvoksi 0, jos et halua kalenteriajan muuttuvan. Tämä asetus ei vaikuta pelin taloussimulaatioon, ja se on valittavissa vain seinäkelloaikaa käytettäessä. +STR_CONFIG_SETTING_MINUTES_PER_YEAR_VALUE :{NUM} ###setting-zero-is-special STR_CONFIG_SETTING_MINUTES_PER_YEAR_FROZEN :0 (kalenteriaika jäädytetty) +STR_CONFIG_SETTING_TOWN_CARGO_SCALE :Skaalaa taajamarahdin tuotantoa: {STRING} +STR_CONFIG_SETTING_TOWN_CARGO_SCALE_HELPTEXT :Skaalaa kuntien tuottaman rahdin määrää tällä prosenttiluvulla. +STR_CONFIG_SETTING_INDUSTRY_CARGO_SCALE :Skaalaa teollisuusrahdin tuotantoa: {STRING} +STR_CONFIG_SETTING_INDUSTRY_CARGO_SCALE_HELPTEXT :Skaalaa tuotantolaitosten tuottaman rahdin määrää tällä prosenttiluvulla. +STR_CONFIG_SETTING_CARGO_SCALE_VALUE :{NUM}{NBSP}% STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Uudista kulkuneuvo automaattisesti, kun se vanhenee: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Mikäli käytössä, lähellä käyttöikänsä loppua oleva kulkuneuvo korvataan automaattisesti @@ -1903,7 +1924,7 @@ STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :Opastimien väl STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_HELPTEXT :Määrittää etäisyyden opastimien välillä seuraavaan esteeseen saakka (opastin, risteys) opastimia vedettäessä STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_VALUE :{COMMA} ruutu{P 0 "" a} STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE :Pidä opastimien etäisyys vakiona vedettäessä: {STRING} -STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Valitse käyttäytyminen vedettäessä opastimia Ctrl-näppäin pohjassa. Mikäli pois käytöstä, opastimia rakennetaan siltojen ja tunnelien ympärille pitkien opastimista vapaiden alueiden välttämiseksi. Mikäli käytössä, opastimia rakennetaan n ruudun välein, tehden vierekkäisten ratojen opastimien kohdistamisesta helpompaa +STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Valitse opastimien sijoittelun käyttäytyminen opastimia vedettäessä. Mikäli poissa käytöstä, opastimia sijoitetaan tunneleiden ja siltojen ympärille pitkien opastimettomien osuuksien välttämiseksi. Mikäli käytössä, opastimet sijoitetaan n ruudun välein, mikä helpottaa opastimien kohdistamista rinnakkaisilla raiteilla STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :Rakenna ensisijaisesti siipiopastimia ennen vuotta: {STRING} STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Valitse vuosi jonka jälkeen käytetään valo-opastimia. Ennen tätä vuotta käytetään siipiopastimia (joilla on sama toiminnallisuus mutta eri ulkonäkö) @@ -1911,6 +1932,7 @@ STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Valitse vuosi j STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES :Vaihda opastintyyppien välillä: {STRING} STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :Valitse, mitkä opastintyypit ovat käytössä painettaessa Ctrl-näppäintä opastimia rakennettaessa ###length 2 +STR_CONFIG_SETTING_CYCLE_SIGNAL_GROUP :Vain nykyinen ryhmä STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :Näytä kaikki STR_CONFIG_SETTING_SIGNAL_GUI_MODE :Näytä opastintyypit: {STRING} @@ -2182,13 +2204,13 @@ STR_INTRO_TOOLTIP_SUB_TROPICAL_LANDSCAPE :{BLACK}Valitse STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE :{BLACK}Valitse lelumaan maastotyyppi STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Näytä pelin valinnat -STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Näytä pistetaulukko +STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Avaa pistetaulukko STR_INTRO_TOOLTIP_HELP :{BLACK}Tutustu dokumentaatioon ja online-resursseihin STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Näytä asetukset STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Näytä NewGRF-asetukset STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Tarkista uutta ja päivitettyä sisältöä ladattavaksi STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}Näytä tekoälyasetukset -STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}Näytä peliskriptiasetukset +STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}Avaa peliskriptiasetukset STR_INTRO_TOOLTIP_QUIT :{BLACK}Lopeta OpenTTD STR_INTRO_BASESET :{BLACK}Valitusta perusgrafiikkapaketista puuttuu {NUM} sprite{P "" ä}. Tarkista, onko sille päivityksiä. @@ -2356,6 +2378,8 @@ STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION :{BLACK}Kartan k STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION_TOOLTIP :{BLACK}Kartan koko{}Valitse lajitellaksesi koon mukaan STR_NETWORK_SERVER_LIST_DATE_CAPTION :{BLACK}Päiväys STR_NETWORK_SERVER_LIST_DATE_CAPTION_TOOLTIP :{BLACK}Nykyinen päivämäärä +STR_NETWORK_SERVER_LIST_PLAY_TIME_SHORT :{BLACK}{NUM}h {NUM}min +STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION :{BLACK}Peliaika STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION_TOOLTIP :{BLACK}Peliaika, kun peli{}ei ollut pysäytettynä STR_NETWORK_SERVER_LIST_INFO_ICONS_TOOLTIP :{BLACK}Kieli, palvelimen versio, jne. @@ -2731,6 +2755,7 @@ STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLA STR_LINKGRAPH_STATS_TOOLTIP_MONTH :{BLACK}{CARGO_LONG} kuukaudessa kuljetettavana asemalta {STATION} asemalle {STATION} ({COMMA}{NBSP}% kapasiteetista){STRING} STR_LINKGRAPH_STATS_TOOLTIP_MINUTE :{BLACK}{CARGO_LONG} minuutissa kuljetettavana asemalta {STATION} asemalle {STATION} ({COMMA}{NBSP}% kapasiteetista){STRING} STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION :{}{CARGO_LONG} kuljetettavana takaisin ({COMMA}{NBSP}% kapasiteetista) +STR_LINKGRAPH_STATS_TOOLTIP_TIME_EXTENSION :{}Keskimääräinen matka-aika: {UNITS_DAYS_OR_SECONDS} # Base for station construction window(s) STR_STATION_BUILD_COVERAGE_AREA_TITLE :{BLACK}Vaikutusalueen korostus @@ -2759,16 +2784,16 @@ STR_RAIL_TOOLBAR_ELRAIL_CONSTRUCTION_CAPTION :Sähköradan ra STR_RAIL_TOOLBAR_MONORAIL_CONSTRUCTION_CAPTION :Yksiraiteisen rakentaminen STR_RAIL_TOOLBAR_MAGLEV_CONSTRUCTION_CAPTION :Maglevin rakentaminen -STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Rakenna rautateitä. Ctrl vaihtaa rakennus-/poistotilan välillä. Shift vaihtaa rakennustilan ja kustannusarvion välillä +STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Rakenna rautatietä. Ctrl+napsautus poistaa rautatietä. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Rakenna rautatietä automaattisesti valittuun suuntaan. Ctrl vaihtaa rakennus-/poistotilan välillä. Shift vaihtaa rakennustilan ja kustannusarvion välillä -STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Rakenna veturitalli (junien ostamista ja huoltoa varten). Shift vaihtaa rakennustilan ja kustannusarvion välillä +STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Rakenna junavarikko (junien ostamista ja huoltoa varten). Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Rakenna reittipiste rautatielle. Ctrl mahdollistaa reittipisteiden yhdistämisen. Shift vaihtaa rakennustilan ja kustannusarvion välillä -STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Rakenna rautatieasema. Ctrl liittää asemat. Shift vaihtaa rakennustilan ja kustannusarvion välillä -STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Rakenna opastin rautatielle. Ctrl+napsautus rakentaa vaihtoehtoista opastintyyliä{}Ctrl+veto täyttää valitun rataosuuden opastimilla määrätyin välein. Ctrl+napsautus+veto täyttää seuraavaan risteykseen, asemaan tai opastimeen asti. Paina lisäksi Shiftiä nähdäksesi vain kustannusarvion +STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Rakenna rautatieasema. Ctrl+napsautus valitsee toisen aseman, johon haluat tämän liitettävän. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion +STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Rakenna opastin rautatielle. Ctrl+napsautus rakentaa vaihtoehtoista opastintyyliä{}Ctrl+veto täyttää valitun rataosuuden opastimilla määrätyin välein. Ctrl+napsautus+veto täyttää seuraavaan risteykseen, asemaan tai opastimeen asti. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Rakenna rautatiesilta. Shift vaihtaa rakennustilan ja kustannusarvion välillä -STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Rakenna rautatietunneli. Shift vaihtaa rakennustilan ja kustannusarvion välillä -STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Rautatien, opastimien, reittipisteiden ja asemien rakentaminen/poisto päälle/pois. Pidä pohjassa Ctrl-näppäintä poistaaksesi myös aseman tai reittipisteen alla olevat raiteet -STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL :{BLACK}Muunna/päivitä raidetyyppi. Shift vaihtaa muuntotilan ja kustannusarvion välillä +STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Rakenna rautatietunneli. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion +STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Rautatien, opastimien, reittipisteiden ja asemien rakentaminen/poisto päälle/pois. Ctrl+napsautus poistaa myös reittipisteiden ja asemien raiteet +STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL :{BLACK}Muunna/päivitä raidetyyppi. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion STR_RAIL_NAME_RAILROAD :Rautatie STR_RAIL_NAME_ELRAIL :Sähköistetty rautatie @@ -2857,7 +2882,7 @@ STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION :{BLACK}Rakenna STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_ONE_WAY_ROAD :{BLACK}Ota yksisuuntaiset tiet käyttöön/pois käytöstä STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}Rakenna maantiesilta. Shift vaihtaa rakennustilan ja kustannusarvion välillä STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_BRIDGE :{BLACK}Rakenna raitiotiesilta. Shift vaihtaa rakennustilan ja kustannusarvion välillä -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL :{BLACK}Rakenna maantietunneli. Shift vaihtaa rakennustilan ja kustannusarvion välillä +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL :{BLACK}Rakenna maantietunneli. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL :{BLACK}Rakenna raitiotietunneli. Shift vaihtaa rakennustilan ja kustannusarvion välillä STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_ROAD :{BLACK}Tien rakentaminen/siirtäminen päälle/pois STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}Vaihda raitiotien rakentamisen ja purkamisen välillä @@ -2886,12 +2911,12 @@ STR_STATION_BUILD_CARGO_TRAM_ORIENTATION_TOOLTIP :{BLACK}Valitse # Waterways toolbar (last two for SE only) STR_WATERWAYS_TOOLBAR_CAPTION :{WHITE}Vesireittien rakentaminen STR_WATERWAYS_TOOLBAR_CAPTION_SE :{WHITE}Vesireitit -STR_WATERWAYS_TOOLBAR_BUILD_CANALS_TOOLTIP :{BLACK}Rakenna kanavia. Shift vaihtaa rakennustilan ja kustannusarvion välillä +STR_WATERWAYS_TOOLBAR_BUILD_CANALS_TOOLTIP :{BLACK}Rakenna kanavia. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion STR_WATERWAYS_TOOLBAR_BUILD_LOCKS_TOOLTIP :{BLACK}Rakenna sulku. Shift vaihtaa rakennustilan ja kustannusarvion välillä -STR_WATERWAYS_TOOLBAR_BUILD_DEPOT_TOOLTIP :{BLACK}Rakenna telakka (laivojen ostamista ja huoltamista varten). Shift vaihtaa rakennustilan ja kustannusarvion välillä -STR_WATERWAYS_TOOLBAR_BUILD_DOCK_TOOLTIP :{BLACK}Rakenna satama. Ctrl liittää asemat. Shift vaihtaa rakennustilan ja kustannusarvion välillä -STR_WATERWAYS_TOOLBAR_BUOY_TOOLTIP :{BLACK}Sijoita poiju, jota voi käyttää reittipisteenä. Shift vaihtaa rakennustilan ja kustannusarvion välillä -STR_WATERWAYS_TOOLBAR_BUILD_AQUEDUCT_TOOLTIP :{BLACK}Rakenna akvedukti. Shift vaihtaa rakennustilan ja kustannusarvion välillä +STR_WATERWAYS_TOOLBAR_BUILD_DEPOT_TOOLTIP :{BLACK}Rakenna telakka (laivojen ostamista ja huoltamista varten). Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion +STR_WATERWAYS_TOOLBAR_BUILD_DOCK_TOOLTIP :{BLACK}Rakenna satamalaituri. Ctrl+napsautus valitsee toisen aseman, johon haluat tämän liitettävän. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion. +STR_WATERWAYS_TOOLBAR_BUOY_TOOLTIP :{BLACK}Sijoita poiju, jota voi käyttää reittipisteenä. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion +STR_WATERWAYS_TOOLBAR_BUILD_AQUEDUCT_TOOLTIP :{BLACK}Rakenna akvedukti. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion STR_WATERWAYS_TOOLBAR_CREATE_LAKE_TOOLTIP :{BLACK}Rakenna kanava. Merenpinnan tasolla Ctrl+napsautus täyttää alueen merivedellä kanavan rakentamisen sijaan. STR_WATERWAYS_TOOLBAR_CREATE_RIVER_TOOLTIP :{BLACK}Sijoita jokia. Ctrl valitsee alueen vinottain. @@ -2931,10 +2956,10 @@ STR_STATION_BUILD_NOISE :{BLACK}Aiheutet # Landscaping toolbar STR_LANDSCAPING_TOOLBAR :{WHITE}Maastonmuokkaus -STR_LANDSCAPING_TOOLTIP_LOWER_A_CORNER_OF_LAND :{BLACK}Laske ruudun kulmaa. Vetäminen laskee ensimmäistä valittua kulmaa ja tasoittaa valitun alueen kulman korkeudelle. Ctrl valitsee alueen vinottain. Shift vaihtaa muokkaustilan ja kustannusarvion välillä -STR_LANDSCAPING_TOOLTIP_RAISE_A_CORNER_OF_LAND :{BLACK}Nosta ruudun kulmaa. Vetäminen nostaa ensimmäistä valittua kulmaa ja tasoittaa valitun alueen kulman korkeudelle. Ctrl valitsee alueen vinottain. Shift vaihtaa muokkaustilan ja kustannusarvion välillä +STR_LANDSCAPING_TOOLTIP_LOWER_A_CORNER_OF_LAND :{BLACK}Laske maaruudun kulmaa. Napsautus+veto laskee ensimmäisenä valittua kulmaa ja tasaa valitun alueen tämän kulman uudelle korkeudelle. Ctrl+napsautus+veto valitsee alueen vinottain. Paina lisäksi vaihtonäppäintä näyttääksesi vain kustannusarvion +STR_LANDSCAPING_TOOLTIP_RAISE_A_CORNER_OF_LAND :{BLACK}Nosta maaruudun kulmaa. Napsautus+veto nostaa ensimmäisenä valittua kulmaa ja tasaa valitun alueen tämän kulman uudelle korkeudelle. Ctrl+napsautus+veto valitsee alueen vinottain. Paina lisäksi vaihtonäppäintä näyttääksesi vain kustannusarvion STR_LANDSCAPING_LEVEL_LAND_TOOLTIP :{BLACK}Tasoita maata ensimmäisen valitun kulman korkeudelle. Ctrl valitsee alueen vinottain. Shift vaihtaa muokkaustilan ja kustannusarvion välillä -STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Osta maata tulevaa käyttöä varten. Ctrl valitsee alueen vinottain. Shift vaihtaa ostotilan ja kustannusarvion välillä +STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Osta maata tulevaa käyttöä varten. Ctrl+napsautus+veto valitsee alueen vinottain. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion # Object construction window STR_OBJECT_BUILD_CAPTION :{WHITE}Objektin valinta @@ -3570,7 +3595,7 @@ STR_SIGN_LIST_MATCH_CASE_TOOLTIP :{BLACK}Kytke ki # Sign window STR_EDIT_SIGN_CAPTION :{WHITE}Muokkaa kyltin tekstiä -STR_EDIT_SIGN_LOCATION_TOOLTIP :{BLACK}Keskitä päänäkymä kyltin sijaintiin. Ctrl+napsautus avaa uuden näkymäikkunan kyltin sijaintiin. +STR_EDIT_SIGN_LOCATION_TOOLTIP :{BLACK}Keskitä päänäkymä kyltin sijaintiin. Ctrl+napsautus avaa uuden näkymäikkunan kyltin sijaintiin STR_EDIT_SIGN_NEXT_SIGN_TOOLTIP :{BLACK}Siirry seuraavaan kylttiin STR_EDIT_SIGN_PREVIOUS_SIGN_TOOLTIP :{BLACK}Siirry edelliseen kylttiin @@ -3596,6 +3621,8 @@ STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_DELIVERED_GENERAL :{ORANGE}{STRING}{GREEN} kuljetettu STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED :{ORANGE}{CARGO_TINY} / {CARGO_LONG}{RED} (tarvitaan lisää) STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_DELIVERED :{ORANGE}{CARGO_TINY} / {CARGO_LONG}{GREEN} (kuljetettu) +STR_TOWN_VIEW_TOWN_GROWS_EVERY :{BLACK}Kunta kasvaa {ORANGE}{UNITS_DAYS_OR_SECONDS} välein +STR_TOWN_VIEW_TOWN_GROWS_EVERY_FUNDED :{BLACK}Kunta kasvaa {ORANGE}{UNITS_DAYS_OR_SECONDS} välein (rahoitettu) STR_TOWN_VIEW_TOWN_GROW_STOPPED :{BLACK}Kunta {RED}ei{BLACK} kasva STR_TOWN_VIEW_NOISE_IN_TOWN :{BLACK}Meluraja kunnassa: {ORANGE}{COMMA}{BLACK} maks.: {ORANGE}{COMMA} STR_TOWN_VIEW_CENTER_TOOLTIP :{BLACK}Keskitä päänäkymä kunnan sijaintiin. Ctrl+napsautus avaa uuden näkymäikkunan kunnan sijaintiin. @@ -3639,7 +3666,8 @@ STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION_MONTHS :{PUSH_COLOUR}{Y STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION_MINUTES :{PUSH_COLOUR}{YELLOW}Rahoita taajamien tieverkon peruskorjausta.{}Aiheuttaa huomattavia häiriöitä tieliikenteelle jopa 6 minuutin ajan.{}{POP_COLOUR}Kustannus: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}Rakenna patsas yhtiösi kunniaksi.{}Parantaa asemien arvioita pysyvästi tässä kunnassa.{}{POP_COLOUR}Kustannus: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}Rahoita uusien rakennusten rakentamista kunnassa.{}Tämä kiihdyttää tämän kunnan kasvua tilapäisesti.{}{POP_COLOUR}Kustannus: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT_MONTHS :{PUSH_COLOUR}{YELLOW}Osta kuljetusyksinoikeus kuntaan 12 kuukaudeksi.{}Kunnan viranomaiset eivät salli matkustajien ja rahdin käyttävän kilpailijoittesi asemia. Kilpailijan onnistunut lahjonta purkaa tämän sopimuksen.{}{POP_COLOUR}Kustannus: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT_MONTHS :{PUSH_COLOUR}{YELLOW}Osta kuljetusyksinoikeus kuntaan 12 kuukaudeksi.{}Kunnan viranomaiset eivät salli matkustajien ja rahdin käyttävän kilpailijoittesi asemia. Sopimus purkautuu, jos kilpailija onnistuu lahjomaan viranomaiset.{}{POP_COLOUR}Kustannus: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT_MINUTES :{PUSH_COLOUR}{YELLOW}Osta kuljetusyksinoikeus kuntaan 12 minuutiksi.{}Kunnan viranomaiset eivät salli matkustajien ja rahdin käyttävän kilpailijoittesi asemia. Sopimus purkautuu, jos kilpailija onnistuu lahjomaan viranomaiset.{}{POP_COLOUR}Kustannus: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Lahjo viranomaisia parantaaksesi arviotasi ja keskeyttääksesi kilpailijan kuljetusyksinoikeuden; rangaistus voi kuitenkin olla ankara, jos jäät kiinni.{}{POP_COLOUR}Kustannus: {CURRENCY_LONG} # Goal window @@ -3686,11 +3714,14 @@ STR_GOAL_QUESTION_BUTTON_CLOSE :Sulje # Subsidies window STR_SUBSIDIES_CAPTION :{WHITE}Tuet STR_SUBSIDIES_OFFERED_TITLE :{BLACK}Tarjotut tuet: +STR_SUBSIDIES_OFFERED_FROM_TO :{ORANGE}{STRING} välille {STRING} – {STRING}{YELLOW} ({STRING}) STR_SUBSIDIES_NONE :{ORANGE}- Ei mitään - STR_SUBSIDIES_SUBSIDISED_TITLE :{BLACK}Käytetyt tuet: STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Napsauta kuljetusyhteyttä keskittääksesi päänäkymän laitokseen/kuntaan. Ctrl+napsautus avaa uuden näkymäikkunan laitoksen/kunnan sijaintiin. STR_SUBSIDIES_OFFERED_EXPIRY_DATE :viimeistään {DATE_SHORT} +STR_SUBSIDIES_OFFERED_EXPIRY_TIME :jäljellä {UNITS_MONTHS_OR_MINUTES} STR_SUBSIDIES_SUBSIDISED_EXPIRY_DATE :{DATE_SHORT} asti +STR_SUBSIDIES_SUBSIDISED_EXPIRY_TIME :{UNITS_MONTHS_OR_MINUTES} jäljellä # Story book window STR_STORY_BOOK_CAPTION :{WHITE}{COMPANY}: historia @@ -3958,6 +3989,7 @@ STR_VEHICLE_LIST_REPLACE_VEHICLES :Korvaa kulkuneu STR_VEHICLE_LIST_SEND_FOR_SERVICING :Lähetä huoltoon STR_VEHICLE_LIST_CREATE_GROUP :Luo ryhmä STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Tuotto tänä vuonna: {CURRENCY_LONG} (viime vuonna: {CURRENCY_LONG}) +STR_VEHICLE_LIST_PROFIT_THIS_PERIOD_LAST_PERIOD :{TINY_FONT}{BLACK}Tuotto tällä jaksolla: {CURRENCY_LONG} (viime jaksolla: {CURRENCY_LONG}) STR_VEHICLE_LIST_CARGO :[{CARGO_LIST}] STR_VEHICLE_LIST_NAME_AND_CARGO :{STRING} {STRING} @@ -4063,7 +4095,7 @@ STR_CARGO_TYPE_FILTER_NONE :Ei mikään STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Raideliikennevälineiden valintaluettelo. Napsauta kulkuneuvoa saadaksesi lisää tietoa. Ctrl+napsautus näyttää tai piilottaa kulkuneuvon tyypin. STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Ajoneuvojen valintaluettelo. Napsauta ajoneuvoa saadaksesi lisää tietoja. Ctrl+napsautus näyttää tai piilottaa ajoneuvon tyypin. STR_BUY_VEHICLE_SHIP_LIST_TOOLTIP :{BLACK}Laivojen valintaluettelo. Napsauta laivaa saadaksesi lisää tietoja. Ctrl+napsautus näyttää tai piilottaa laivan tyypin. -STR_BUY_VEHICLE_AIRCRAFT_LIST_TOOLTIP :{BLACK}Ilma-alusten valintaluettelo. Napsauta ilma-alusta saadaksesi lisää tietoja. Ctrl+napsautus näyttää tai piilottaa ilma-aluksen tyypin. +STR_BUY_VEHICLE_AIRCRAFT_LIST_TOOLTIP :{BLACK}Ilma-alusten valintaluettelo. Napsauta ilma-alusta saadaksesi lisää tietoja. Ctrl+napsautus näyttää tai piilottaa tämän ilma-alustyypin ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_BUTTON :{BLACK}Osta yksikkö @@ -4080,12 +4112,12 @@ STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Osta ja ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_TOOLTIP :{BLACK}Osta valittu raideliikenneväline. Vaihto+napsautus näyttää kustannusarvion ostamatta. STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_TOOLTIP :{BLACK}Osta valittu ajoneuvo. Vaihto+napsautus näyttää kustannusarvion ostamatta. -STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_TOOLTIP :{BLACK}Osta valittu laiva. Vaihto+napsautus näyttää kustannusarvion ostamatta. +STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_TOOLTIP :{BLACK}Osta valittu laiva. Paina lisäksi vaihtonäppäintä näyttääksesi vain kustannusarvion STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_TOOLTIP :{BLACK}Osta valittu ilma-alus. Vaihto+napsautus näyttää kustannusarvion ostamatta. ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Osta ja sovita valittu raideliikenneväline. Vaihto+napsautus näyttää kustannusarvion ostamatta. -STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Osta ja sovita valittu ajoneuvo. Vaihto+napsautus näyttää kustannusarvion ostamatta. +STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Osta ja sovita valittu ajoneuvo. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Osta ja sovita valittu laiva. Vaihto+napsautus näyttää kustannusarvion ostamatta. STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Osta ja sovita valittu ilma-alus. Vaihto+napsautus näyttää kustannusarvion ostamatta. @@ -4187,7 +4219,7 @@ STR_DEPOT_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW :{BLACK}Tämä o ###length VEHICLE_TYPES STR_DEPOT_TRAIN_LOCATION_TOOLTIP :{BLACK}Keskitä päänäkymä veturitallin sijaintiin. Ctrl+napsautus avaa uuden näkymäikkunan veturitallin sijaintiin. STR_DEPOT_ROAD_VEHICLE_LOCATION_TOOLTIP :{BLACK}Keskitä päänäkymä ajoneuvovarikon sijaintiin. Ctrl+napsautus avaa uuden näkymäikkunan varikon sijaintiin. -STR_DEPOT_SHIP_LOCATION_TOOLTIP :{BLACK}Keskitä päänäkymä telakan sijaintiin. Ctrl+napsautus avaa uuden näkymäikkunan telakan sijaintiin. +STR_DEPOT_SHIP_LOCATION_TOOLTIP :{BLACK}Keskitä päänäkymä telakan sijaintiin. Ctrl+napsautus avaa uuden näkymäikkunan telakan sijaintiin STR_DEPOT_AIRCRAFT_LOCATION_TOOLTIP :{BLACK}Keskitä päänäkymä lentokonehallin sijaintiin. Ctrl+napsautus avaa uuden näkymäikkunan lentokonehallin sijaintiin. ###length VEHICLE_TYPES @@ -4229,6 +4261,8 @@ STR_ENGINE_PREVIEW_SHIP :laiva STR_ENGINE_PREVIEW_TEXT3 :{BLACK}{STRING}{}{5:STRING}{}{STRING} STR_ENGINE_PREVIEW_TEXT4 :{BLACK}{STRING}{}{STRING}{}{STRING}{}{STRING} STR_ENGINE_PREVIEW_COST_WEIGHT :Hinta: {CURRENCY_LONG} Paino: {WEIGHT_SHORT} +STR_ENGINE_PREVIEW_COST_MAX_SPEED :Hinta: {CURRENCY_LONG} Huippunopeus: {VELOCITY} +STR_ENGINE_PREVIEW_SPEED_POWER :Nopeus: {VELOCITY} Teho: {POWER} STR_ENGINE_PREVIEW_SPEED_POWER_MAX_TE :Nopeus: {VELOCITY} Teho: {POWER} Maksimivetovoima: {FORCE} STR_ENGINE_PREVIEW_TYPE :Ilma-aluksen tyyppi: {STRING} STR_ENGINE_PREVIEW_TYPE_RANGE :Ilma-alustyyppi: {STRING} Toimintasäde: {COMMA} ruutua @@ -4354,6 +4388,7 @@ STR_VEHICLE_STATUS_NO_ORDERS_VEL :{LTBLUE}Ei pys STR_VEHICLE_STATUS_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}Kohde: {WAYPOINT}, {VELOCITY} STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL :{ORANGE}Suuntana {DEPOT}, {VELOCITY} STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL :{LTBLUE}Huolto kohteessa {DEPOT}, {VELOCITY} +STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_UNBUNCH_VEL :{LTBLUE}Sumanpurku ja huolto kohteessa{DEPOT}, {VELOCITY} STR_VEHICLE_STATUS_CANNOT_REACH_STATION_VEL :{LTBLUE}{STATION} ei saavutettavissa, {VELOCITY} STR_VEHICLE_STATUS_CANNOT_REACH_WAYPOINT_VEL :{LTBLUE}{WAYPOINT} ei saavutettavissa, {VELOCITY} @@ -4380,7 +4415,7 @@ STR_VEHICLE_DETAILS_AIRCRAFT_RENAME :{BLACK}Nimeä i STR_VEHICLE_INFO_AGE :{COMMA} vuo{P si tta} ({COMMA}) STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} vuo{P si tta} ({COMMA}) -STR_VEHICLE_INFO_AGE_RUNNING_COST_YR :{BLACK}Ikä: {LTBLUE}{STRING}{BLACK} Käyttökustannukset: {LTBLUE}{CURRENCY_LONG}/v +STR_VEHICLE_INFO_AGE_RUNNING_COST_YR :{BLACK}Ikä: {LTBLUE}{STRING}{BLACK} Käyttökustannukset: {LTBLUE}{CURRENCY_LONG}/vuosi STR_VEHICLE_INFO_AGE_RUNNING_COST_PERIOD :{BLACK}Ikä: {LTBLUE}{STRING}{BLACK} Käyttökustannukset: {LTBLUE}{CURRENCY_LONG}/jakso STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Huippunopeus: {LTBLUE}{VELOCITY} @@ -4403,9 +4438,12 @@ STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Kapasite STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Siirron arvo: {LTBLUE}{CURRENCY_LONG} +STR_VEHICLE_DETAILS_SERVICING_INTERVAL_DAYS :{BLACK}Huoltoväli: {LTBLUE}{COMMA}{NBSP}vrk{BLACK} {STRING} STR_VEHICLE_DETAILS_SERVICING_INTERVAL_MINUTES :{BLACK}Huoltoväli: {LTBLUE}{COMMA}{NBSP}minuuttia{BLACK} {STRING} +STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT :{BLACK}Huoltoväli: {LTBLUE}{COMMA}{NBSP}%{BLACK} {STRING} STR_VEHICLE_DETAILS_LAST_SERVICE_DATE :Viimeksi huollettu: {LTBLUE}{DATE_LONG} STR_VEHICLE_DETAILS_LAST_SERVICE_MINUTES_AGO :Viimeksi huollettu: {LTBLUE}{NUM} minuuttia sitten +STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_DAYS :{BLACK}Pidennä huoltoväliä 10 vuorokaudella. Ctrl+napsautus pidentää väliä 5 vuorokaudella STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES :{BLACK}Pidennä huoltoväliä 5 minuutilla. Ctrl+napsautus pidentää väliä 1 minuutilla STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_PERCENT :{BLACK}Pidennä huoltoväliä 10 prosentilla. Ctrl+napsautus pidentää väliä 5 prosentilla STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_DAYS :{BLACK}Lyhennä huoltoväliä 10 vuorokaudella. Ctrl+napsautus lyhentää väliä 5 vuorokaudella @@ -4517,9 +4555,14 @@ STR_ORDER_DROP_REFIT_AUTO_ANY :Saatavilla olev STR_ORDER_DROP_GO_ALWAYS_DEPOT :Mene aina STR_ORDER_DROP_SERVICE_DEPOT :Huolto, jos tarpeen STR_ORDER_DROP_HALT_DEPOT :Pysähdy +STR_ORDER_DROP_UNBUNCH :Pura sumaa # Depot action tooltips, one per vehicle type ###length VEHICLE_TYPES +STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP :{BLACK}Valitse tällä varikolla tehtävä toimenpide +STR_ORDER_ROAD_DEPOT_ACTION_TOOLTIP :{BLACK}Valitse tällä varikolla tehtävä toimenpide +STR_ORDER_SHIP_DEPOT_ACTION_TOOLTIP :{BLACK}Valitse tällä telakalla tehtävä toimenpide +STR_ORDER_HANGAR_ACTION_TOOLTIP :{BLACK}Valitse tässä lentokonehallissa tehtävä toimenpide ###next-name-looks-similar STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Kulkuneuvon tiedot, joiden perusteella hypätään @@ -4550,7 +4593,7 @@ STR_ORDER_CONDITIONAL_VALUE_TOOLTIP :{BLACK}Arvo, jo STR_ORDER_CONDITIONAL_VALUE_CAPT :{WHITE}Syötä arvo, johon verrataan STR_ORDERS_SKIP_BUTTON :{BLACK}Ohita -STR_ORDERS_SKIP_TOOLTIP :{BLACK}Ohita nykyinen käsky ja aloita seuraava. Ctrl+napsautus hyppää valittuun käskyyn. +STR_ORDERS_SKIP_TOOLTIP :{BLACK}Ohita nykyinen käsky ja aloita seuraava. Ctrl+napsautus hyppää valittuun käskyyn STR_ORDERS_DELETE_BUTTON :{BLACK}Poista STR_ORDERS_DELETE_TOOLTIP :{BLACK}Poista korostettu käsky @@ -4589,13 +4632,14 @@ STR_ORDER_REFIT_ORDER :(Sovita {STRING STR_ORDER_REFIT_STOP_ORDER :(Sovita rahtityypille {STRING} ja pysähdy) STR_ORDER_STOP_ORDER :(Pysähdy) +STR_ORDER_WAIT_TO_UNBUNCH :(odota suman purkamiseksi) STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING} STR_ORDER_GO_TO_STATION_CAN_T_USE_STATION :{PUSH_COLOUR}{RED}(Asema ei käytettävissä){POP_COLOUR} {STRING} {STATION} {STRING} STR_ORDER_IMPLICIT :(Ehdoton) -STR_ORDER_FULL_LOAD :(Täysi lastaus) +STR_ORDER_FULL_LOAD :(Lastaa täyteen) STR_ORDER_FULL_LOAD_ANY :(Lastaa täyteen mitä tahansa rahtia) STR_ORDER_NO_LOAD :(Ei lastausta) STR_ORDER_UNLOAD :(Pura lasti ja lastaa uusi rahti) @@ -4792,6 +4836,8 @@ STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Peliskripti STR_AI_SETTINGS_CLOSE :{BLACK}Sulje STR_AI_SETTINGS_RESET :{BLACK}Palauta STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} +STR_AI_SETTINGS_SETTING_DEVIATION :{STRING}: {ORANGE}[{STRING}, {STRING}] +STR_AI_SETTINGS_JUST_DEVIATION :[{STRING}, {STRING}] # Textfile window @@ -5058,6 +5104,11 @@ STR_ERROR_UNABLE_TO_FIND_LOCAL_DEPOT :{WHITE}Paikalli STR_ERROR_DEPOT_WRONG_DEPOT_TYPE :Väärä varikkotyyppi # Depot unbunching related errors +STR_ERROR_UNBUNCHING_ONLY_ONE_ALLOWED :{WHITE}… vain yksi sumanpurkukäsky mahdollinen +STR_ERROR_UNBUNCHING_NO_FULL_LOAD :{WHITE}… kulkuneuvon sumanpurkukäsky estää täyteenlastaamiskäskyjen käytön +STR_ERROR_UNBUNCHING_NO_UNBUNCHING_FULL_LOAD :{WHITE}… sumaa ei voida purkaa kulkuneuvolla, jolla on täyteenlastaamiskäsky +STR_ERROR_UNBUNCHING_NO_CONDITIONAL :{WHITE}… kulkuneuvon sumanpurkukäsky estää ehdollisten käskyjen käytön +STR_ERROR_UNBUNCHING_NO_UNBUNCHING_CONDITIONAL :{WHITE}… sumaa ei voida purkaa kulkuneuvolla, jolla on ehdollinen käsky # Autoreplace related errors STR_ERROR_TRAIN_TOO_LONG_AFTER_REPLACEMENT :{WHITE}{VEHICLE} on liian pitkä korvaamisen jälkeen @@ -5752,6 +5803,9 @@ STR_TOWN_NAME :{TOWN} STR_VEHICLE_NAME :{VEHICLE} STR_WAYPOINT_NAME :{WAYPOINT} +STR_CURRENCY_SHORT_KILO :{NBSP}000 +STR_CURRENCY_SHORT_MEGA :{NBSP}milj. +STR_CURRENCY_SHORT_GIGA :{NBSP}mrd. STR_CURRENCY_SHORT_TERA :{NBSP} t STR_JUST_CARGO :{CARGO_LONG} diff --git a/src/lang/korean.txt b/src/lang/korean.txt index 484ae43435..58abe9c7cd 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -4563,6 +4563,10 @@ STR_ORDER_DROP_UNBUNCH :배차 간격 # Depot action tooltips, one per vehicle type ###length VEHICLE_TYPES +STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP :{BLACK}차량기지에서 수행할 작업을 선택합니다 +STR_ORDER_ROAD_DEPOT_ACTION_TOOLTIP :{BLACK}차고지에서 수행할 작업을 선택합니다. +STR_ORDER_SHIP_DEPOT_ACTION_TOOLTIP :{BLACK}정박소에서 수행할 작업을 선택합니다 +STR_ORDER_HANGAR_ACTION_TOOLTIP :{BLACK}격납고에서 수행할 작업을 선택합니다. ###next-name-looks-similar STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}경로를 건너뛰기 위한 비교 조건을 선택합니다 diff --git a/src/lang/latvian.txt b/src/lang/latvian.txt index bb745130ad..6f106fbebf 100644 --- a/src/lang/latvian.txt +++ b/src/lang/latvian.txt @@ -4573,6 +4573,10 @@ STR_ORDER_DROP_UNBUNCH :Atdalīt # Depot action tooltips, one per vehicle type ###length VEHICLE_TYPES +STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP :{BLACK}Atlasiet darbību, kas jāveic šajā depo +STR_ORDER_ROAD_DEPOT_ACTION_TOOLTIP :{BLACK}Atlasiet darbību, kas jāveic šajā depo +STR_ORDER_SHIP_DEPOT_ACTION_TOOLTIP :{BLACK}Atlasiet darbību, kas jāveic šajā depo +STR_ORDER_HANGAR_ACTION_TOOLTIP :{BLACK}Atlasiet darbību, kas jāveic šajā angārā ###next-name-looks-similar STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Vehicle data to base jumping on diff --git a/src/lang/polish.txt b/src/lang/polish.txt index 9ee41984b6..93eaaf3736 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -786,12 +786,12 @@ STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR :{YELLOW}Edytor STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_BACKWARD :{BLACK}Zmień datę początkową do tyłu o 1 rok STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_FORWARD :{BLACK}Zmień datę początkową do przodu o 1 rok STR_SCENEDIT_TOOLBAR_TOOLTIP_SET_DATE :{BLACK}Kliknij aby wpisać datę początkową -STR_SCENEDIT_TOOLBAR_TOOLTIP_DISPLAY_MAP_TOWN_DIRECTORY :{BLACK}Wyświetl mapę, listę miast -STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION :{BLACK}Tworzenie krajobrazu -STR_SCENEDIT_TOOLBAR_TOWN_GENERATION :{BLACK}Tworzenie miast -STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION :{BLACK}Tworzenie przedsiębiorstw -STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Konstrukcja dróg -STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}Konstrukcja torów tramwajowych +STR_SCENEDIT_TOOLBAR_TOOLTIP_DISPLAY_MAP_TOWN_DIRECTORY :{BLACK}Otwórz mapę, dodatkowy podgląd, listę napisów, miast lub spis przedsiębiorstw +STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION :{BLACK}Otwórz menu kształtowania krajobrazu lub wygeneruj nowy świat +STR_SCENEDIT_TOOLBAR_TOWN_GENERATION :{BLACK}Budowanie oraz generowanie miast +STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION :{BLACK}Budowanie lub generowanie przedsiębiorstw +STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Budowa infrastruktury drogowej +STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}Budowanie infrastruktury tramwajowej STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Posadź drzewa. Ctrl zaznacza teren po przekątnej. Shift przełącza pomiędzy trybem sadzenia a szacowaniem jego kosztów STR_SCENEDIT_TOOLBAR_PLACE_SIGN :{BLACK}Umieść napis STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Umieść obiekt. Ctrl zaznacza obszar po przekątnej. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów @@ -813,6 +813,7 @@ STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Ustawienia STR_SETTINGS_MENU_AI_SETTINGS :Ustawienia SI STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS :Ustawienia Game Script STR_SETTINGS_MENU_NEWGRF_SETTINGS :Ustawienia NewGRF +STR_SETTINGS_MENU_SANDBOX_OPTIONS :Opcje swobodnej rozgrywki STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Opcje przeźroczystości STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Wyświetlanie nazw miast STR_SETTINGS_MENU_STATION_NAMES_DISPLAYED :Wyświetlanie nazw stacji @@ -997,6 +998,7 @@ STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Kliknij # Company league window STR_COMPANY_LEAGUE_TABLE_CAPTION :{WHITE}Ranking firm STR_COMPANY_LEAGUE_COMPANY_NAME :{ORANGE}{COMPANY} {BLACK}{COMPANY_NUM} „{STRING}” +STR_COMPANY_LEAGUE_COMPANY_RANK :{YELLOW}{NUM}. STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ENGINEER :Inżynier STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRAFFIC_MANAGER :Administrator Ruchu STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRANSPORT_COORDINATOR :Koordynator Transportu @@ -1177,6 +1179,7 @@ STR_STATUSBAR_AUTOSAVE :{RED}AUTOZAPIS STR_STATUSBAR_SAVING_GAME :{RED}* * ZAPISYWANIE GRY * * STR_STATUSBAR_SPECTATOR :{WHITE}(obserwator) +STR_STATUSBAR_INFINITE_MONEY :{WHITE}(nieskończone pieniądze) # News message history STR_MESSAGE_HISTORY :{WHITE}Poprzednie wiadomości @@ -1277,7 +1280,12 @@ STR_NEWS_STATION_NOW_ACCEPTS_CARGO_LIST :{WHITE}{STATION STR_NEWS_OFFER_OF_SUBSIDY_EXPIRED :{BIG_FONT}{BLACK}Dotacja wygasła:{}{}{STRING} z {STRING} do {STRING} nie będzie już dotowane STR_NEWS_SUBSIDY_WITHDRAWN_SERVICE :{BIG_FONT}{BLACK}Koniec dotacji:{}{}Przewóz {STRING.d} z {STRING} do {STRING} nie jest już dotowany +STR_NEWS_SERVICE_SUBSIDY_OFFERED :{BIG_FONT}{BLACK}Oferta usługi dotowanej:{}{}Pierwszy przewóz {STRING.d} z {STRING} do {STRING} będzie dotowany przez następn{P 3 y e ych} {UNITS_YEARS_OR_MINUTES} przez lokalne władze! ###length 4 +STR_NEWS_SERVICE_SUBSIDY_AWARDED_HALF :{BIG_FONT}{BLACK}Przyznano dotację dla {STRING}!{}{}Przewóz {STRING.d} z {STRING} do {STRING} będzie opłacany o 50% więcej przez następn{P 4 y e ych} {UNITS_YEARS_OR_MINUTES}! +STR_NEWS_SERVICE_SUBSIDY_AWARDED_DOUBLE :{BIG_FONT}{BLACK}Przyznano dotację dla {STRING}!{}{}Przewóz {STRING.d} z {STRING} do {STRING} będzie opłacany podwójnie przez następn{P 4 y e ych} {UNITS_YEARS_OR_MINUTES}! +STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIG_FONT}{BLACK}Przyznano dotację dla {STRING}!{}{}Przewóz {STRING.d} z {STRING} do {STRING} będzie opłacany potrójnie przez następn{P 4 y e ych} {UNITS_YEARS_OR_MINUTES}! +STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLACK}Przyznano dotację dla {STRING}!{}{}Przewóz {STRING.d} z {STRING} do {STRING} będzie opłacany poczwórnie przez następn{P 4 y e ych} {UNITS_YEARS_OR_MINUTES}! STR_NEWS_EXCLUSIVE_RIGHTS_TITLE :{BIG_FONT}{BLACK}Monopol transportowy! @@ -1297,6 +1305,8 @@ STR_GAME_OPTIONS_TAB_GRAPHICS :Grafika STR_GAME_OPTIONS_TAB_GRAPHICS_TT :{BLACK}Wybierz opcje grafiki STR_GAME_OPTIONS_TAB_SOUND :Dźwięk STR_GAME_OPTIONS_TAB_SOUND_TT :{BLACK}Wybierz opcje dźwięku i muzyki +STR_GAME_OPTIONS_TAB_SOCIAL :Społeczność +STR_GAME_OPTIONS_TAB_SOCIAL_TT :{BLACK}Wybierz ustawienia integracji sieci społecznościowych STR_GAME_OPTIONS_VOLUME :Głośność STR_GAME_OPTIONS_SFX_VOLUME :Efekty dźwiękowe @@ -1391,7 +1401,7 @@ STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Zaznacz STR_GAME_OPTIONS_VIDEO_DRIVER_INFO :{BLACK}Bieżący sterownik: {STRING} STR_GAME_OPTIONS_GUI_SCALE_FRAME :{BLACK}Rozmiar interfejsu -STR_GAME_OPTIONS_GUI_SCALE_TOOLTIP :{BLACK}Przeciągnij suwak, aby ustawić rozmiar interfejsu. Przytrzymaj Ctrl, aby uzyskać płynną regulację +STR_GAME_OPTIONS_GUI_SCALE_TOOLTIP :{BLACK}Przeciągnij suwak, aby ustawić rozmiar interfejsu. Ctrl+przeciągnij, aby uzyskać płynną regulację STR_GAME_OPTIONS_GUI_SCALE_AUTO :{BLACK}Wykryj rozmiar automatycznie STR_GAME_OPTIONS_GUI_SCALE_AUTO_TOOLTIP :{BLACK}Zaznacz to pole, aby rozmiar interfejsu był wykrywany automatycznie @@ -1436,8 +1446,19 @@ STR_GAME_OPTIONS_BASE_MUSIC :{BLACK}Podstawo STR_GAME_OPTIONS_BASE_MUSIC_TOOLTIP :{BLACK}Wybierz podstawowy zestaw muzyki do użycia STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP :{BLACK}Dodatkowe informacje o muzyce podstawowej +STR_GAME_OPTIONS_SOCIAL_PLUGINS_NONE :{LTBLUE}(brak zainstalowanych wtyczek do integracji z platformami społecznościowymi) +STR_GAME_OPTIONS_SOCIAL_PLUGIN_TITLE :{BLACK}{STRING} ({STRING}) +STR_GAME_OPTIONS_SOCIAL_PLUGIN_PLATFORM :{BLACK}Platforma: +STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE :{BLACK}Stan wtyczki: +STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_RUNNING :{GREEN}Uruchomiona +STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_FAILED :{RED}Inicjalizacja nie powiodła się +STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_PLATFORM_NOT_RUNNING :{ORANGE}{STRING} nie uruchomiona +STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_UNLOADED :{RED}Niezaładowana +STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_DUPLICATE :{RED}Zdublowana wtyczka +STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_UNSUPPORTED_API :{RED}Wersja nieobsługiwana +STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_INVALID_SIGNATURE :{RED}Nieprawidłowa sygnatura STR_BASESET_STATUS :{STRING} {RED}({NUM} brakując{P y e ych}/uszkodzon{P y e ych} plik{P "" i ów}) @@ -1605,6 +1626,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :z prawej strony STR_CONFIG_SETTING_SECONDS_VALUE :{COMMA}{NBSP}sekund{P 0 ę y ""} +STR_CONFIG_SETTING_INFINITE_MONEY :Nieskończona ilość pieniędzy: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Maksymalna wysokość początkowej pożyczki: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Maksymalna wysokość pożyczki, jaką firma może zaciągnąć (bez uwzględnienia inflacji) @@ -1631,6 +1653,7 @@ STR_CONFIG_SETTING_SUBSIDY_DURATION :Czas trwania do ###length 2 STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT :Określ liczbę lat, na które przyznawana jest dotacja +STR_CONFIG_SETTING_SUBSIDY_DURATION_VALUE :{UNITS_YEARS_OR_PERIODS} ###setting-zero-is-special STR_CONFIG_SETTING_SUBSIDY_DURATION_DISABLED :Brak dotacji @@ -1638,7 +1661,7 @@ STR_CONFIG_SETTING_CONSTRUCTION_COSTS :Koszty konstruk STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT :Ustaw poziom kosztów konstrukcji i kupna STR_CONFIG_SETTING_RECESSIONS :Kryzys: {STRING} -STR_CONFIG_SETTING_RECESSIONS_HELPTEXT :Jeśli włączone, kryzys może wystąpić co kilka lat. Podczas kryzysu produkcja jest znacznie niższa (powraca do poprzedniego poziomu, kiedy kryzys się kończy) +STR_CONFIG_SETTING_RECESSIONS_HELPTEXT :Jeśli włączone, kryzys może występować okresowo. Podczas kryzysu produkcja jest znacznie niższa (powraca do poprzedniego poziomu, kiedy kryzys się kończy) STR_CONFIG_SETTING_TRAIN_REVERSING :Nie pozwalaj pociągom zawracać na stacjach: {STRING} STR_CONFIG_SETTING_TRAIN_REVERSING_HELPTEXT :Jeśli włączone, pociągi nie będą zawracać na stacjach dwu-wjazdowych, nawet jeśli droga do następnego celu jest krótsza po zawróceniu @@ -1692,7 +1715,7 @@ STR_CONFIG_SETTING_FORBID_90_DEG :Zabroń pociąg STR_CONFIG_SETTING_FORBID_90_DEG_HELPTEXT :90-stopniowy zakręt występuje wtedy, gdy bezpośrednio po poziomym odcinku toru występuje odcinek pionowy (lub na odwrót), zmuszając pociąg do ostrzejszego skrętu (zamiast normalnego, 45-stopniowego skrętu w innych kombinacjach torów) STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS :Pozwól na łączenie stacji nie sąsiadujących bezpośrednio: {STRING} -STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS_HELPTEXT :Pozwalaj na dodawanie części stacji nie stykających się ze sobą. Naciśnij Ctrl przed postawieniem nowej części +STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS_HELPTEXT :Pozwala na dołączanie części stacji nie stykających się ze sobą, wciskając Ctrl+klik przy stawianiu nowej części STR_CONFIG_SETTING_INFLATION :Inflacja: {STRING} STR_CONFIG_SETTING_INFLATION_HELPTEXT :Włącz lub wyłącz inflację (sytuacja ekonomiczna, w związku z którą koszty rosną nieco szybciej niż zapłaty) @@ -1756,7 +1779,7 @@ STR_CONFIG_SETTING_BRIBE_HELPTEXT :Pozwalaj firmom STR_CONFIG_SETTING_ALLOW_EXCLUSIVE :Pozwól na kupno wyłączności transportowej: {STRING} ###length 2 -STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :Kiedy firma wykupuje wyłączność na transport w mieście, to przystanki i stacje przeciwników (pasażerskie i towarowe) nie otrzymają żadnego ładunku przez cały rok +STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :Kiedy firma wykupuje wyłączność na transport w mieście, to przystanki i stacje przeciwników (pasażerskie i towarowe) nie otrzymują żadnego ładunku przez dwanaście miesięcy STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS :Pozwól na fundowanie budynków: {STRING} STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS_HELPTEXT :Pozwalaj firmom na sponsorowanie budowy nowych budynków w miastach @@ -1814,7 +1837,7 @@ STR_CONFIG_SETTING_ORDER_REVIEW_ON :Wszystkich poja STR_CONFIG_SETTING_WARN_INCOME_LESS :Powiadom, jeśli pojazd przynosi straty: {STRING} ###length 2 -STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT :Kiedy włączone, otrzymasz wiadomość o tym, że pojazd nie przyniósł żadnych zysków w całym roku kalendarzowym +STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT :Kiedy włączone, wiadomość zostanie wyświetlona, gdy pojazd nie osiągnie zysku w ciągu roku STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :Pojazdy nigdy nie są wycofywane: {STRING} STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Kiedy włączone, wszystkie modele pojazdów pozostają dostępne na zawsze od daty ich wprowadzenia @@ -1824,6 +1847,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Kiedy włączon ###setting-zero-is-special +STR_CONFIG_SETTING_CARGO_SCALE_VALUE :{NUM}% STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Autoodnawianie pojazdów gdy stają się stare: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Kiedy włączone, pojazd zbliżający się do końca swojej żywotności zostaje automatycznie zastąpiony, gdy warunki jego odnowienia są spełnione @@ -2142,7 +2166,7 @@ STR_CONFIG_SETTING_SERVINT_AIRCRAFT :Domyślny inter STR_CONFIG_SETTING_SERVINT_AIRCRAFT_HELPTEXT :Ustaw domyślny okres serwisowania dla nowych maszyn latających, jeśli takowy nie istnieje dla określonego pojazdu STR_CONFIG_SETTING_SERVINT_SHIPS :Domyślny interwał serwisowania statków: {STRING} STR_CONFIG_SETTING_SERVINT_SHIPS_HELPTEXT :Ustaw domyślny okres serwisowania dla nowych statków, jeśli takowy nie istnieje dla określonego pojazdu -STR_CONFIG_SETTING_SERVINT_VALUE :{COMMA}{NBSP}d{P zień ni ni}/% +STR_CONFIG_SETTING_SERVINT_VALUE :{COMMA}{NBSP}D{P zień ni ni}/Minut{P a y ""}/% ###setting-zero-is-special STR_CONFIG_SETTING_SERVINT_DISABLED :Wyłączone @@ -2234,7 +2258,7 @@ STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :Podczas przeci STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_HELPTEXT :Ustaw dystans, na jakim semafory będą budowane przy torach aż do następnej przeszkody (semafor, zwrotnica), przy przeciąganiu STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_VALUE :{COMMA} p{P ole ola ól} STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE :Zachowaj stały odstęp między semaforami przy przeciąganiu: {STRING} -STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Wybierz sposób budowania semaforów przy przeciąganiu z wciśniętym Ctrl. Kiedy wyłączone, semafory są stawiane przy tunelach lub mostach, by nie zostawiać długich odcinków bez sygnałów. Kiedy włączone, semafory są stawiane co X pól, sprawiając, że stawianie semaforów na rownoległych torach jest łatwiejsze +STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Wybierz sposób rozmieszczania sygnalizacji podczas przeciągania. Kiedy wyłączone, sygnały są stawiane przy tunelach lub mostach, by nie zostawiać długich odcinków bez sygnałów. Kiedy włączone, sygnały są umieszczane co X pól, sprawiając że stawianie sygnalizacji na równoległych torach jest łatwiejsze STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :Automatycznie buduj semafory przed: {STRING} STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Ustaw rok, w którym semafory świetlne będą używane. Przed tym rokiem w użyciu będą semafory kształtowe (które mają te same właściwości, tylko inny wygląd) @@ -2510,14 +2534,14 @@ STR_INTRO_TOOLTIP_SUB_ARCTIC_LANDSCAPE :{BLACK}Wybierz STR_INTRO_TOOLTIP_SUB_TROPICAL_LANDSCAPE :{BLACK}Wybierz krajobraz „tropikalny” STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE :{BLACK}Wybierz krajobraz „zabawkowy” -STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Wyświetl opcje gry -STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Wyświetl tabelę wyników +STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Otwórz opcje gry +STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Otwórz tabelę wyników STR_INTRO_TOOLTIP_HELP :{BLACK}Uzyskaj dostęp do dokumentacji i zasobów online -STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Wyświetl ustawienia gry -STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Wyświetl ustawienia NewGRF +STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Otwórz ustawienia gry +STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Otwórz ustawienia NewGRF STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Poszukaj nowych lub zaktualizowanych dodatków do pobrania -STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}Wyświetl ustawienia SI -STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}Wyświetl ustawienia Game Script +STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}Otwórz ustawienia SI +STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}Otwórz ustawienia Game Script STR_INTRO_TOOLTIP_QUIT :{BLACK}Wyjdź z „OpenTTD” STR_INTRO_BASESET :{BLACK}Aktualnie używany podstawowy zestaw graficzny nie posiada {NUM} wymagan{P ego ych ych} sprite{P 'u 'ów 'ów}. Proszę poszukać aktualizacji dla zestawu podstawowego. @@ -2548,7 +2572,7 @@ STR_HELP_WINDOW_BUGTRACKER :{BLACK}Zgłoś STR_HELP_WINDOW_COMMUNITY :{BLACK}Społeczność # Cheat window -STR_CHEATS :{WHITE}Oszustwa +STR_CHEATS :{WHITE}Opcje Swobodnej Rozgrywki STR_CHEAT_MONEY :{LTBLUE}Zwiększ ilość pieniędzy o {CURRENCY_LONG} STR_CHEAT_CHANGE_COMPANY :{LTBLUE}Grasz jako firma: {ORANGE}{COMMA} STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}Magiczny buldożer (usuwanie przedsiębiorstw, nieprzesuwalnych obiektów): {ORANGE}{STRING} @@ -2685,6 +2709,9 @@ STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION :{BLACK}Rozmiar STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION_TOOLTIP :{BLACK}Rozmiar mapy{}Kliknij, by sortować wg powierzchni STR_NETWORK_SERVER_LIST_DATE_CAPTION :{BLACK}Data STR_NETWORK_SERVER_LIST_DATE_CAPTION_TOOLTIP :{BLACK}Bieżąca data +STR_NETWORK_SERVER_LIST_PLAY_TIME_SHORT :{BLACK}{NUM}h {NUM}min +STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION :{BLACK}Czas gry +STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION_TOOLTIP :{BLACK}Czas rozgrywki,{}gdy gra nie była wstrzymana STR_NETWORK_SERVER_LIST_INFO_ICONS_TOOLTIP :{BLACK}Język, wersja serwera, itp. STR_NETWORK_SERVER_LIST_CLICK_GAME_TO_SELECT :{BLACK}Kliknij na grze z listy by ją wybrać @@ -2700,6 +2727,7 @@ STR_NETWORK_SERVER_LIST_SERVER_ADDRESS :{SILVER}Adres s STR_NETWORK_SERVER_LIST_INVITE_CODE :{SILVER}Kod zaproszenia: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_START_DATE :{SILVER}Data uruchomienia: {WHITE}{DATE_SHORT} STR_NETWORK_SERVER_LIST_CURRENT_DATE :{SILVER}Aktualna data: {WHITE}{DATE_SHORT} +STR_NETWORK_SERVER_LIST_PLAY_TIME :{SILVER}Czas gry: {WHITE}{NUM}h {NUM}min STR_NETWORK_SERVER_LIST_GAMESCRIPT :{SILVER}Game Script: {WHITE}{STRING} (v{NUM}) STR_NETWORK_SERVER_LIST_PASSWORD :{SILVER}Chronione hasłem! STR_NETWORK_SERVER_LIST_SERVER_OFFLINE :{SILVER}SERWER WYŁĄCZONY @@ -3056,6 +3084,7 @@ STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLA # Linkgraph tooltip STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION :{}{CARGO_LONG} do przetransportowania z powrotem ({COMMA}% przepustowości) +STR_LINKGRAPH_STATS_TOOLTIP_TIME_EXTENSION :{}Średni czas podróży: {UNITS_DAYS_OR_SECONDS} # Base for station construction window(s) STR_STATION_BUILD_COVERAGE_AREA_TITLE :{BLACK}Podświetlaj zasięg @@ -3090,7 +3119,7 @@ STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Zbuduj s STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Zbuduj sygnały na torach. Ctrl przełącza semafory/sygnały świetlne{}Przeciąganie buduje sygnały wzdłuż prostej linii torów, z Ctrl buduje sygnały aż do najbliższego skrzyżowania lub sygnału{}Ctrl+klik przełącza wyświetlanie okna wyboru sygnałów. Shift przełącza pomiędzy budowaniem a szacowaniem jego kosztów STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Zbuduj most kolejowy. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Zbuduj tunel kolejowy. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów -STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Przełącz buduj/usuń dla torów kolejowych, sygnałów, posterunków i stacji. Przetrzymanie Ctrl usuwa także tory kolejowe z posterunków i stacji +STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Przełącz budowanie/usuwanie torów kolejowych, sygnałów, posterunków i stacji. Ctrl+klik usuwa także tory kolejowe z posterunków i stacji STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL :{BLACK}Zamiana typu torów. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów STR_RAIL_NAME_RAILROAD :Kolej @@ -3141,7 +3170,7 @@ STR_BUILD_SIGNAL_ELECTRIC_EXIT_TOOLTIP :{BLACK}Sygnaliz STR_BUILD_SIGNAL_ELECTRIC_COMBO_TOOLTIP :{BLACK}Sygnalizator złożony (elektryczny){}Sygnalizator złożony działa jako sygnał wejściowy i wyjściowy. Umożliwia to budowę wielkich „drzew” presygnalizatorów STR_BUILD_SIGNAL_ELECTRIC_PBS_TOOLTIP :{BLACK}Sygnalizator trasy (elektryczny){}Sygnalizator trasy umożliwiający wejście więcej niż jednemu pociagowi do bloku sygnalizatorów, o ile pociąg może zarezerwować trasę do bezpiecznego punktu zatrzymania. Zwykłe sygnalizatory trasy mogą być mijane w przeciwnym kierunku STR_BUILD_SIGNAL_ELECTRIC_PBS_OWAY_TOOLTIP :{BLACK}Jednokierunkowy sygnalizator trasy (elektryczny){}Sygnalizator trasy umożliwiający wejście więcej niż jednemu pociagowi do bloku sygnalizatorów, o ile pociąg może zarezerwować trasę do bezpiecznego punktu zatrzymania. Sygnalizatory jednokierunkowe nie mogą być mijane w przeciwnym kierunku -STR_BUILD_SIGNAL_CONVERT_TOOLTIP :{BLACK}Zamiana sygnałów{}Jeżeli włączone, kliknięcie na istniejący sygnał spowoduje zamianę go na wybrany typ i wariant. Ctrl+klik przełącza istniejący wariant. Shift+klik pokazuje szacowany koszt zamiany +STR_BUILD_SIGNAL_CONVERT_TOOLTIP :{BLACK}Zamiana sygnałów{}Kliknij na istniejący sygnał, aby zamienić go na wybrany typ i wariant. Ctrl+klik przełącza istniejący wariant. Shift+klik pokazuje szacowany koszt zamiany STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_TOOLTIP :{BLACK}Odległość między sygnałami przy przeciąganiu STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_DECREASE_TOOLTIP :{BLACK}Zmniejsz odległość między sygnałami przy przeciąganiu STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_INCREASE_TOOLTIP :{BLACK}Zwiększ odległość między sygnałami przy przeciąganiu @@ -3215,8 +3244,8 @@ STR_WATERWAYS_TOOLBAR_BUILD_DEPOT_TOOLTIP :{BLACK}Wybuduj STR_WATERWAYS_TOOLBAR_BUILD_DOCK_TOOLTIP :{BLACK}Zbuduj port. Ctrl umożliwia łączenie stacji. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów STR_WATERWAYS_TOOLBAR_BUOY_TOOLTIP :{BLACK}Ustaw boję, która może być użyta jako punkt orientacyjny. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów STR_WATERWAYS_TOOLBAR_BUILD_AQUEDUCT_TOOLTIP :{BLACK}Zbuduj akwedukt. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów -STR_WATERWAYS_TOOLBAR_CREATE_LAKE_TOOLTIP :{BLACK}Stwórz akwen wodny.{}Tworzy kanał, chyba że przytrzymany jest CTRL na poziomie morza, wtedy pobliski teren zostanie zatopiony -STR_WATERWAYS_TOOLBAR_CREATE_RIVER_TOOLTIP :{BLACK}Umieszczanie rzek. Ctrl zaznacza obszar po przekątnej. +STR_WATERWAYS_TOOLBAR_CREATE_LAKE_TOOLTIP :{BLACK}Zbuduj kanał. Ctrl+klik na poziomie morza spowoduje zatopienie terenu +STR_WATERWAYS_TOOLBAR_CREATE_RIVER_TOOLTIP :{BLACK}Umieszczanie rzek. Ctrl+klik zaznacza obszar po przekątnej # Ship depot construction window STR_DEPOT_BUILD_SHIP_CAPTION :{WHITE}Ukierunkowanie stoczni @@ -3261,7 +3290,7 @@ STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Zakup te # Object construction window STR_OBJECT_BUILD_CAPTION :{WHITE}Wybór obiektu -STR_OBJECT_BUILD_TOOLTIP :{BLACK}Wybierz obiekt do budowy. Ctrl zaznacza obszar po przekątnej. Shift przełącza pomiędzy trybem budowy a szacowaniem jej kosztów +STR_OBJECT_BUILD_TOOLTIP :{BLACK}Wybierz obiekt do budowy. Ctrl+klik+przeciągnięcie zaznacza obszar po przekątnej. Dodatkowo wciśnięcie Shift wyświetli jedynie szacunkowy koszt STR_OBJECT_BUILD_CLASS_TOOLTIP :{BLACK}Wybierz rodzaj obiektu do budowy STR_OBJECT_BUILD_PREVIEW_TOOLTIP :{BLACK}Podgląd obiektu STR_OBJECT_BUILD_SIZE :{BLACK}Rozmiar: {GOLD}{NUM} x {NUM} pól @@ -3613,11 +3642,11 @@ STR_MAPGEN_VARIETY :{BLACK}Różnor STR_MAPGEN_GENERATE :{WHITE}Stwórz STR_MAPGEN_GENERATE_TOOLTIP :{BLACK}Stwórz świat i graj w OpenTTD! STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}Ustawienia NewGRF -STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Wyświetl ustawienia NewGRF +STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Otwórz ustawienia NewGRF STR_MAPGEN_AI_SETTINGS :{BLACK}Ustawienia SI -STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}Wyświetl ustawienia SI +STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}Otwórz ustawienia SI STR_MAPGEN_GS_SETTINGS :{BLACK}Ustawienia Game Script -STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}Wyświetl ustawienia Game Script +STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}Otwórz ustawienia Game Script ###length 21 STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Angielskie (Oryginalne) @@ -3918,6 +3947,8 @@ STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_DELIVERED_GENERAL :{G=f}{ORANGE}{STRING}{GREEN} dostarczona STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED :{G=m}{ORANGE}{CARGO_TINY} / {CARGO_LONG}{RED} (wciąż wymagany) STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_DELIVERED :{G=m}{ORANGE}{CARGO_TINY} / {CARGO_LONG}{GREEN} (dostarczony) +STR_TOWN_VIEW_TOWN_GROWS_EVERY :{BLACK}Miasto rośnie co {ORANGE}{UNITS_DAYS_OR_SECONDS} +STR_TOWN_VIEW_TOWN_GROWS_EVERY_FUNDED :{BLACK}Miasto rośnie co {ORANGE}{UNITS_DAYS_OR_SECONDS} (ufundowane) STR_TOWN_VIEW_TOWN_GROW_STOPPED :{BLACK}Miasto {RED}nie{BLACK} rośnie STR_TOWN_VIEW_NOISE_IN_TOWN :{BLACK}Limit hałasu w mieście: {ORANGE}{COMMA}{BLACK} maksymalnie: {ORANGE}{COMMA} STR_TOWN_VIEW_CENTER_TOOLTIP :{BLACK}Wyśrodkuj widok główny na lokalizacji miasta. Ctrl+klik otwiera nowy podgląd na jego lokalizację @@ -3973,7 +4004,7 @@ STR_GOALS_TEXT :{ORANGE}{STRING STR_GOALS_NONE :{ORANGE}- Brak - STR_GOALS_PROGRESS :{ORANGE}{STRING} STR_GOALS_PROGRESS_COMPLETE :{GREEN}{STRING} -STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Kliknij na celu by wyśrodkować widok na przedsiębiorstwie/mieście/polu. Ctrl+klik otwiera nowe okno podglądu +STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Kliknij na celu, aby wyśrodkować widok na przedsiębiorstwie/mieście/polu. Ctrl+klik otwiera nowe okno podglądu # Goal question window STR_GOAL_QUESTION_CAPTION_QUESTION :Pytanie @@ -4109,6 +4140,8 @@ STR_EDIT_WAYPOINT_NAME :{WHITE}Edytuj n # Finances window STR_FINANCES_CAPTION :{WHITE}Finanse {COMPANY} {BLACK}{COMPANY_NUM} STR_FINANCES_YEAR :{WHITE}{NUM} +STR_FINANCES_YEAR_CAPTION :{WHITE}Rok +STR_FINANCES_PERIOD_CAPTION :{WHITE}Okres ###length 3 STR_FINANCES_REVENUE_TITLE :{WHITE}Przychody @@ -4210,6 +4243,8 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Kanały STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Stacje: STR_COMPANY_INFRASTRUCTURE_VIEW_STATIONS :{WHITE}Pola stacji STR_COMPANY_INFRASTRUCTURE_VIEW_AIRPORTS :{WHITE}Lotniska +STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL_YEAR :{WHITE}{CURRENCY_LONG}/rok +STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL_PERIOD :{WHITE}{CURRENCY_LONG}/okres # Industry directory STR_INDUSTRY_DIRECTORY_CAPTION :{WHITE}Przedsiębiorstwa @@ -4368,10 +4403,10 @@ STR_CARGO_TYPE_FILTER_FREIGHT :Fracht STR_CARGO_TYPE_FILTER_NONE :Żaden ###length VEHICLE_TYPES -STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Lista wyboru pociągów - kliknij na pojazd, aby uzyskać informacje. Ctrl+klik przełącza ukrywanie typu pojazdu -STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Lista wyboru pojazdów drogowych - kliknij na pojazd, aby uzyskać więcej informacji. Ctrl+klik przełącza ukrywanie typu pojazdu -STR_BUY_VEHICLE_SHIP_LIST_TOOLTIP :{BLACK}Lista wyboru statków - kliknij na statek, aby uzyskać informacje. Ctrl+klik przełącza ukrywanie typu statku -STR_BUY_VEHICLE_AIRCRAFT_LIST_TOOLTIP :{BLACK}Lista wyboru samolotów - kliknij na samolocie, aby uzyskać informacje. Ctrl+klik przełącza ukrywanie typu samolotu +STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Lista wyboru pociągów. Kliknij na pojazd, aby uzyskać informacje. Ctrl+klik przełącza wyświetlanie/ukrywanie typu pojazdu +STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Lista wyboru pojazdów drogowych. Kliknij na pojazd, aby uzyskać informacje. Ctrl+klik przełącza wyświetlanie/ukrywanie typu pojazdu +STR_BUY_VEHICLE_SHIP_LIST_TOOLTIP :{BLACK}Lista wyboru statków. Kliknij na statek, aby uzyskać informacje. Ctrl+klik przełącza wyświetlanie/ukrywanie typu statku +STR_BUY_VEHICLE_AIRCRAFT_LIST_TOOLTIP :{BLACK}Lista wyboru samolotów. Kliknij na samolot, aby uzyskać informacje. Ctrl+klik przełącza wyświetlanie/ukrywanie typu samolotu ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_BUTTON :{BLACK}Kup tabor kolejowy @@ -4445,7 +4480,7 @@ STR_DEPOT_VEHICLE_TOOLTIP_CHAIN :{BLACK}{NUM} po STR_DEPOT_VEHICLE_TOOLTIP_CARGO :{}{CARGO_LONG} ({CARGO_SHORT}) ###length VEHICLE_TYPES -STR_DEPOT_TRAIN_LIST_TOOLTIP :{BLACK}Pociągi - przeciągnij pojazd/wagon przytrzymując lewy klawisz myszy, aby go dodać/usunąć ze składu pociągu, kliknij na pociągu prawym aby uzyskać informacje. Przytrzymanie Ctrl dla podanych akcji stosuje zmiany do całego składu pociągu +STR_DEPOT_TRAIN_LIST_TOOLTIP :{BLACK}Pociągi - przeciągnij pojazd/wagon lewym przyciskiem myszy, aby go dodać/usunąć ze składu pociągu; kliknij prawym, aby uzyskać o nim informacje. Ctrl+klik wykona te funkcje dla ciągu wagonów aż do ostatniego STR_DEPOT_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Pojazdy - prawy klik na pojeździe pozwala uzyskać więcej informacji STR_DEPOT_SHIP_LIST_TOOLTIP :{BLACK}Statki - prawy klik pozwala uzyskać informacje o statku STR_DEPOT_AIRCRAFT_LIST_TOOLTIP :{BLACK}Samolot - prawy klik na samolocie pozwala uzyskać informacje @@ -4540,6 +4575,7 @@ STR_ENGINE_PREVIEW_AIRCRAFT.b :samolot STR_ENGINE_PREVIEW_SHIP :{G=m}statek STR_ENGINE_PREVIEW_SHIP.b :statek +STR_ENGINE_PREVIEW_CAPACITY :Ładowność: {CARGO_LONG} # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Zastąp {STRING} - {STRING} @@ -4747,7 +4783,7 @@ STR_REFIT_NEW_CAPACITY_COST_OF_REFIT :{BLACK}Nowa ła STR_REFIT_NEW_CAPACITY_INCOME_FROM_REFIT :{BLACK}Nowa ładowność: {GOLD}{CARGO_LONG}{}{BLACK}Przychód z przebudowy: {GREEN}{CURRENCY_LONG} STR_REFIT_NEW_CAPACITY_COST_OF_AIRCRAFT_REFIT :{BLACK}Nowa ładowność: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Koszt przebudowy: {RED}{CURRENCY_LONG} STR_REFIT_NEW_CAPACITY_INCOME_FROM_AIRCRAFT_REFIT :{BLACK}Nowa ładowność: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Przychód z przebudowy: {GREEN}{CURRENCY_LONG} -STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Wybierz pojazdy do przebudowania. Przeciągając myszkę można wybierać więcej pojazdów. Klikając na puste pole zaznaczysz cały pojazd. Ctrl+klik zaznaczy pojazd i dołączony skład +STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Wybierz pojazdy/wagony do przebudowania. Klik+przeciągnięcie zaznacza wiele pojazdów/wagonów. Kliknięcie na puste pole zaznacza cały pojazd. Ctrl+klik zaznacza pojazd/wagon i następne aż do ostatniego ###length VEHICLE_TYPES STR_REFIT_TRAIN_LIST_TOOLTIP :{BLACK}Wybierz jaki ładunek ma przewozić pociąg @@ -4774,6 +4810,7 @@ STR_ORDERS_TIMETABLE_VIEW_TOOLTIP :{BLACK}Otwórz STR_ORDERS_LIST_TOOLTIP :{BLACK}Lista poleceń - kliknij na poleceniu, aby zaznaczyć. Ctrl+klik przenosi do stacji docelowej STR_ORDER_INDEX :{COMMA}:{NBSP} +STR_ORDER_TEXT :{STRING} {STRING} {STRING} {STRING} STR_ORDERS_END_OF_ORDERS :- - Koniec poleceń - - STR_ORDERS_END_OF_SHARED_ORDERS :- - Koniec współdzielonych poleceń - - @@ -4856,7 +4893,7 @@ STR_ORDER_GO_TO_NEAREST_DEPOT :Idź do najbli STR_ORDER_GO_TO_NEAREST_HANGAR :Leć do najbliższego hangaru STR_ORDER_CONDITIONAL :Warunkowy skok poleceń STR_ORDER_SHARE :Współdzielenie poleceń -STR_ORDERS_GO_TO_TOOLTIP :{BLACK}Dodaj nowe polecenie na końcu listy lub przed zaznaczonym poleceniem. Ctrl ustawi polecenie stacji na „pełny załadunek któregoś z towarów”, posterunku na „bez zatrzymywania się”, a zajezdni na „serwisuj”. Kliknięcie innego pojazdu kopiuje jego polecenia. „Współdzielenie poleceń” lub Ctrl+klik pozwala na współdzielenie z nim poleceń. Polecenie zajezdni wyłącza automatyczne serwisowanie tego pojazdu +STR_ORDERS_GO_TO_TOOLTIP :{BLACK}Dodaj nowe polecenie na końcu listy lub przed zaznaczonym poleceniem. Ctrl+klik ustawia polecenie stacji na „pełny załadunek któregoś z towarów”, posterunku na „bez zatrzymywania się”, a zajezdni na „serwisuj”. Kliknięcie innego pojazdu kopiuje jego polecenia, a Ctrl+klik pozwala na współdzielenie z nim poleceń. Polecenie do zajezdni wyłącza automatyczne serwisowanie tego pojazdu STR_ORDERS_VEH_WITH_SHARED_ORDERS_LIST_TOOLTIP :{BLACK}Pokaż wszystkie pojazdy współdzielące te polecenia @@ -5085,6 +5122,8 @@ STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Game Script STR_AI_SETTINGS_CLOSE :{BLACK}Zamknij STR_AI_SETTINGS_RESET :{BLACK}Resetuj STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} +STR_AI_SETTINGS_SETTING_DEVIATION :{STRING}: {ORANGE}[{STRING}, {STRING}] +STR_AI_SETTINGS_JUST_DEVIATION :[{STRING}, {STRING}] # Textfile window diff --git a/src/lang/simplified_chinese.txt b/src/lang/simplified_chinese.txt index dde82b7bdc..5d1326d7e2 100644 --- a/src/lang/simplified_chinese.txt +++ b/src/lang/simplified_chinese.txt @@ -1429,8 +1429,8 @@ STR_CONFIG_SETTING_BRIBE_HELPTEXT_MINUTES :允许公司尝 STR_CONFIG_SETTING_ALLOW_EXCLUSIVE :允许买断经营权: {STRING} ###length 2 -STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :如果一家公司购买了城市独家经营权,其它公司的站台将在一年之内不再产生乘客或者货物。 -STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT_MINUTES :如果一家公司购买了城市独家经营权,其它公司的站台将在 12 分钟之内不再产生乘客或者货物。 +STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :如果一家公司购买了一座城镇的独家经营权,其他公司在此城镇的车站在十二个月之内将不会收到任何货物与乘客。 +STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT_MINUTES :如果一家公司购买了一座城镇的独家经营权,其他公司在此城镇的车站在 12 分钟之内将不会收到任何货物与乘客。 STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS :允许资助城镇建设: {STRING} STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS_HELPTEXT :“打开”时,允许公司提供资助新建房屋 @@ -2209,7 +2209,7 @@ STR_INTRO_TOOLTIP_HELP :{BLACK}获取 STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}显示设置 STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}显示 NewGRF 设定 STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}连接服务器并查找扩展包 -STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}显示AI设置 +STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}显示 AI 设置 STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}显示游戏脚本设置 STR_INTRO_TOOLTIP_QUIT :{BLACK}退出 'OpenTTD' @@ -2661,9 +2661,9 @@ STR_CONTENT_SELECT_UPDATES_CAPTION_TOOLTIP :{BLACK}更新 STR_CONTENT_UNSELECT_ALL_CAPTION :{BLACK}取消全选 STR_CONTENT_UNSELECT_ALL_CAPTION_TOOLTIP :{BLACK}取消全部选择 STR_CONTENT_SEARCH_EXTERNAL :{BLACK}在外部网站搜索 -STR_CONTENT_SEARCH_EXTERNAL_TOOLTIP :{BLACK}在与OpenTTD没有联系的网站搜寻没有纳入OpenTTD內容服务的內容 +STR_CONTENT_SEARCH_EXTERNAL_TOOLTIP :{BLACK}在与 OpenTTD 没有联系的网站搜寻没有纳入 OpenTTD 內容服务的內容 STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER_CAPTION :{WHITE}正在离开游戏! -STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER :{WHITE}在外部网站下载內容的规则及条款可能跟OpenTTD引用的规则及条款不同。{}您需要参照有关网站以取得在OpenTTD安装有关內容的资讯。{}您要継续吗? +STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER :{WHITE}在外部网站下载內容的规则及条款可能跟 OpenTTD 引用的规则及条款不同。{}您需要参照有关网站以取得在 OpenTTD 安装有关內容的资讯。{}您要継续吗? STR_CONTENT_FILTER_TITLE :{BLACK}标签/名称过滤器 STR_CONTENT_OPEN_URL :{BLACK}主页 STR_CONTENT_OPEN_URL_TOOLTIP :{BLACK}打开该扩展包主页 @@ -2843,7 +2843,7 @@ STR_BUILD_SIGNAL_ELECTRIC_EXIT_TOOLTIP :{BLACK}出口 STR_BUILD_SIGNAL_ELECTRIC_COMBO_TOOLTIP :{BLACK}复合信号(电子){}复合信号灯是入口和出口信号灯的组合,这样允许建立大型“树状”预警信号灯系统 STR_BUILD_SIGNAL_ELECTRIC_PBS_TOOLTIP :{BLACK}路径信号灯(电子){}路径信号灯为列车预留一条到安全停车位的路径,而其它路径仍然可以使用,从而允许一列以上的列车同时进入一个信号区间 STR_BUILD_SIGNAL_ELECTRIC_PBS_OWAY_TOOLTIP :{BLACK}单向路径信号灯(电子){}路径信号灯为列车预留一条到安全停车位的路径,而其它路径仍然可以使用,从而允许一列以上的列车同时进入一个信号区间 -STR_BUILD_SIGNAL_CONVERT_TOOLTIP :{BLACK}信号转换工具{}按下此按钮,可以将已存在的信号转化为选择的信号类型,按下Ctrl键单击,可以在电子信号和悬臂信号之间转换。按住Shift键单击显示预估成本。 +STR_BUILD_SIGNAL_CONVERT_TOOLTIP :{BLACK}信号转换{}使用此工具时可以将现有的信号机转换成选择的信号种类及风格。按住 键单击以仅在灯式/悬臂式之间切换。按住 键单击以显示预计费用。 STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_TOOLTIP :{BLACK}拖拽布置信号灯的间隔距离 STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_DECREASE_TOOLTIP :{BLACK}减少拖拽布置信号的间隔距离 STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_INCREASE_TOOLTIP :{BLACK}增加拖拽布置信号灯的间隔距离 @@ -2877,7 +2877,7 @@ STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}建设 STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}建造电车车库(可以购买与维护车辆) STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}建设公共汽车站。按住 Ctrl 键允许合并站台 STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}建设客运电车站。按住 Ctrl 键允许合并站台 -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}建设汽车货场。按住 Ctrl 键允许合并站台 +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}建设汽车货场。按住 键点击以合并站台,按住 键以显示预计费用。 STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION :{BLACK}建设货运电车站。按住 键单击以合并站台。按住 键以显示预计费用。 STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_ONE_WAY_ROAD :{BLACK}选择是否建设单行道 STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}建设公路桥梁 @@ -2963,7 +2963,7 @@ STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}购买 # Object construction window STR_OBJECT_BUILD_CAPTION :{WHITE}物体选单 -STR_OBJECT_BUILD_TOOLTIP :{BLACK}选择建设项目.。按住Ctrl可沿对角线选择区域。按住Shift键建设可以显示建设费用 +STR_OBJECT_BUILD_TOOLTIP :{BLACK}选择要建设的物体。按住 键以沿对角线建设,按住 键操作以显示预计成本。 STR_OBJECT_BUILD_CLASS_TOOLTIP :{BLACK}选择要建造的物件类型 STR_OBJECT_BUILD_PREVIEW_TOOLTIP :{BLACK}物件预览 STR_OBJECT_BUILD_SIZE :{BLACK}大小: {GOLD}{NUM} x {NUM} 瓦 @@ -3313,11 +3313,11 @@ STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}河流 STR_MAPGEN_SMOOTHNESS :{BLACK}平滑程度: STR_MAPGEN_VARIETY :{BLACK}多样地形: STR_MAPGEN_GENERATE :{WHITE}生成 -STR_MAPGEN_GENERATE_TOOLTIP :{BLACK}创建世界并开始游玩OpenTTD! +STR_MAPGEN_GENERATE_TOOLTIP :{BLACK}创建世界并开始游玩 OpenTTD! STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}NewGRF设置 STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}显示 NewGRF 设置 STR_MAPGEN_AI_SETTINGS :{BLACK}AI 设置 -STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}显示AI设置 +STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}显示 AI 设置 STR_MAPGEN_GS_SETTINGS :{BLACK}游戏脚本设置 STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}显示游戏脚本设置 @@ -4340,8 +4340,8 @@ STR_VEHICLE_VIEW_AIRCRAFT_SEND_TO_DEPOT_TOOLTIP :{BLACK}命令 ###length VEHICLE_TYPES STR_VEHICLE_VIEW_CLONE_TRAIN_INFO :{BLACK}复制这列火车。按住 Ctrl 键单击可以同时共享调度计划,按住 Shift 键单击可以显示所需资金 -STR_VEHICLE_VIEW_CLONE_ROAD_VEHICLE_INFO :{BLACK}复制这辆汽车。按住 Ctrl 键单击可以同时共享调度计划,按住 Shift 键单击可以显示所需资金 -STR_VEHICLE_VIEW_CLONE_SHIP_INFO :{BLACK}复制这条船只。按住 Ctrl 键单击可以同时共享调度计划,按住 Shift 键单击可以显示所需资金 +STR_VEHICLE_VIEW_CLONE_ROAD_VEHICLE_INFO :{BLACK}复制这辆汽车。按住 键单击以共享调度计划,按住 键单击以显示预计费用。 +STR_VEHICLE_VIEW_CLONE_SHIP_INFO :{BLACK}复制这条船只。按住 键单击以共享调度计划,按住 键单击以显示所需资金。 STR_VEHICLE_VIEW_CLONE_AIRCRAFT_INFO :{BLACK}复制这架飞机。按住 Ctrl 键单击可以同时共享调度计划,按住 Shift 键单击可以显示所需资金 STR_VEHICLE_VIEW_TRAIN_IGNORE_SIGNAL_TOOLTIP :{BLACK}命令列车强行通过信号 @@ -4532,21 +4532,21 @@ STR_ORDER_GO_TO :前往 STR_ORDER_GO_NON_STOP_TO :不停车前往 STR_ORDER_GO_VIA :经由 STR_ORDER_GO_NON_STOP_VIA :经由(不停车) -STR_ORDER_TOOLTIP_NON_STOP :{BLACK}改变当前选中车站停车时的执行动作 +STR_ORDER_TOOLTIP_NON_STOP :{BLACK}修改当前指令在车站的停靠措施 STR_ORDER_TOGGLE_FULL_LOAD :{BLACK}装满任意货物 STR_ORDER_DROP_LOAD_IF_POSSIBLE :若有的话就装载 STR_ORDER_DROP_FULL_LOAD_ALL :装满所有货物 STR_ORDER_DROP_FULL_LOAD_ANY :装满任意货物 STR_ORDER_DROP_NO_LOADING :不装载 -STR_ORDER_TOOLTIP_FULL_LOAD :{BLACK}改变当前选中车站装载时的执行动作 +STR_ORDER_TOOLTIP_FULL_LOAD :{BLACK}修改当前指令在车站的装载措施 STR_ORDER_TOGGLE_UNLOAD :{BLACK}卸载全部 STR_ORDER_DROP_UNLOAD_IF_ACCEPTED :若接受的话就卸载 STR_ORDER_DROP_UNLOAD :卸载全部 STR_ORDER_DROP_TRANSFER :联运 STR_ORDER_DROP_NO_UNLOADING :不卸载 -STR_ORDER_TOOLTIP_UNLOAD :{BLACK}改变当前选中车站卸载时的执行动作 +STR_ORDER_TOOLTIP_UNLOAD :{BLACK}修改当前指令在车站的卸载措施 STR_ORDER_REFIT :{BLACK}改装 STR_ORDER_REFIT_TOOLTIP :{BLACK}选择要在调度计划中改装的货物类型{}CTRL+单击 可以去掉改装计划 @@ -4562,6 +4562,10 @@ STR_ORDER_DROP_UNBUNCH :班次均匀 # Depot action tooltips, one per vehicle type ###length VEHICLE_TYPES +STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP :{BLACK}选择在此车库采取的措施 +STR_ORDER_ROAD_DEPOT_ACTION_TOOLTIP :{BLACK}选择在此车库采取的措施 +STR_ORDER_SHIP_DEPOT_ACTION_TOOLTIP :{BLACK}选择在此船坞采取的措施 +STR_ORDER_HANGAR_ACTION_TOOLTIP :{BLACK}选择在此机库采取的措施 ###next-name-looks-similar STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}跳过所需的车辆数据值 @@ -4854,9 +4858,9 @@ STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP :查看此项目 STR_TEXTFILE_VIEW_LICENCE :{BLACK}版权信息 STR_TEXTFILE_VIEW_LICENCE_TOOLTIP :查看此项目的许可证 ###length 5 -STR_TEXTFILE_README_CAPTION :{WHITE}{STRING} {STRING} 的说明 +STR_TEXTFILE_README_CAPTION :{WHITE}{STRING} {STRING} {WHITE}的说明 STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}{STRING} {STRING} 的更新日志 -STR_TEXTFILE_LICENCE_CAPTION :{WHITE}{STRING} {STRING} 的版权信息 +STR_TEXTFILE_LICENCE_CAPTION :{WHITE}{STRING} {STRING} {WHITE}的版权信息 STR_TEXTFILE_SURVEY_RESULT_CAPTION :{WHITE}预览调查结果 STR_TEXTFILE_GAME_MANUAL_CAPTION :{WHITE}OpenTTD 文档 '{STRING}' From b2b4cceb495f6924c659aedeb518fe121d0f4f26 Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Mon, 5 Feb 2024 18:09:29 -0500 Subject: [PATCH 16/25] Fix #11997: Adjust economy date by 1920 when loading TTD/TTO savegames (#12007) --- src/saveload/afterload.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index 30542dd8e0..df998c9050 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -1436,6 +1436,8 @@ bool AfterLoadGame() if (IsSavegameVersionBefore(SLV_31)) { TimerGameCalendar::date += CalendarTime::DAYS_TILL_ORIGINAL_BASE_YEAR; TimerGameCalendar::year += CalendarTime::ORIGINAL_BASE_YEAR; + TimerGameEconomy::date += EconomyTime::DAYS_TILL_ORIGINAL_BASE_YEAR; + TimerGameEconomy::year += EconomyTime::ORIGINAL_BASE_YEAR; for (Station *st : Station::Iterate()) st->build_date += CalendarTime::DAYS_TILL_ORIGINAL_BASE_YEAR; for (Waypoint *wp : Waypoint::Iterate()) wp->build_date += CalendarTime::DAYS_TILL_ORIGINAL_BASE_YEAR; From 5c630e10b7e2260b2a4601452ae4d40bc28f43fa Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Mon, 5 Feb 2024 23:11:32 +0000 Subject: [PATCH 17/25] Fix 2fd90960: Missing default vehicles and industry acceptance/production. (#12000) * Fix 2fd90960: Missing default vehicles and industry acceptance/production. Some default definitions are used across multiple climate types and relied on climate-independent cargo slot even though they specified a climate-dependent cargo type. Add MixedCargoType that indirectly allows multiple labels to be specified for these. --- src/cargo_type.h | 7 ++++++ src/engine_type.h | 2 +- src/industrytype.h | 6 ++--- src/newgrf.cpp | 46 +++++++++++++++++++++++++++++++++----- src/table/build_industry.h | 44 ++++++++++++++++++------------------ src/table/engines.h | 24 ++++++++++---------- 6 files changed, 85 insertions(+), 44 deletions(-) diff --git a/src/cargo_type.h b/src/cargo_type.h index 5a50a0002d..e3eca4772f 100644 --- a/src/cargo_type.h +++ b/src/cargo_type.h @@ -79,6 +79,13 @@ static const CargoID CARGO_NO_REFIT = 0xFE; ///< Do not refit cargo of a vehicle static const CargoID INVALID_CARGO = UINT8_MAX; +/** Mixed cargo types for definitions with cargo that can vary depending on climate. */ +enum MixedCargoType { + MCT_LIVESTOCK_FRUIT, ///< Cargo can be livestock or fruit. + MCT_GRAIN_WHEAT_MAIZE, ///< Cargo can be grain, wheat or maize. + MCT_VALUABLES_GOLD_DIAMONDS, ///< Cargo can be valuables, gold or diamonds. +}; + /** * Special cargo filter criteria. * These are used by user interface code only and must not be assigned to any entity. Not all values are valid for every UI filter. diff --git a/src/engine_type.h b/src/engine_type.h index daaad1a7f8..be4416ef7b 100644 --- a/src/engine_type.h +++ b/src/engine_type.h @@ -149,7 +149,7 @@ struct EngineInfo { byte load_amount; byte climates; ///< Climates supported by the engine. CargoID cargo_type; - CargoLabel cargo_label; + std::variant cargo_label; CargoTypes refit_mask; byte refit_cost; byte misc_flags; ///< Miscellaneous flags. @see EngineMiscFlags diff --git a/src/industrytype.h b/src/industrytype.h index b71b7d29b3..e1fbd881e8 100644 --- a/src/industrytype.h +++ b/src/industrytype.h @@ -110,7 +110,7 @@ struct IndustrySpec { IndustryType conflicting[3]; ///< Industries this industry cannot be close to byte check_proc; ///< Index to a procedure to check for conflicting circumstances CargoID produced_cargo[INDUSTRY_NUM_OUTPUTS]; - CargoLabel produced_cargo_label[INDUSTRY_NUM_OUTPUTS]; + std::variant produced_cargo_label[INDUSTRY_NUM_OUTPUTS]; byte production_rate[INDUSTRY_NUM_OUTPUTS]; /** * minimum amount of cargo transported to the stations. @@ -118,7 +118,7 @@ struct IndustrySpec { */ byte minimal_cargo; CargoID accepts_cargo[INDUSTRY_NUM_INPUTS]; ///< 16 accepted cargoes. - CargoLabel accepts_cargo_label[INDUSTRY_NUM_INPUTS]; + std::variant accepts_cargo_label[INDUSTRY_NUM_INPUTS]; uint16_t input_cargo_multiplier[INDUSTRY_NUM_INPUTS][INDUSTRY_NUM_OUTPUTS]; ///< Input cargo multipliers (multiply amount of incoming cargo for the produced cargoes) IndustryLifeType life_type; ///< This is also known as Industry production flag, in newgrf specs byte climate_availability; ///< Bitmask, giving landscape enums as bit position @@ -155,7 +155,7 @@ struct IndustrySpec { */ struct IndustryTileSpec { std::array accepts_cargo; ///< Cargo accepted by this tile - std::array accepts_cargo_label; + std::array, INDUSTRY_NUM_INPUTS> accepts_cargo_label; std::array acceptance; ///< Level of acceptance per cargo type (signed, may be negative!) Slope slopes_refused; ///< slope pattern on which this tile cannot be built byte anim_production; ///< Animation frame to start when goods are produced diff --git a/src/newgrf.cpp b/src/newgrf.cpp index e3bd89a372..b8c6ec0a75 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -8962,6 +8962,38 @@ GRFFile::~GRFFile() delete[] this->language_map; } +/** + * Find first cargo label that exists and is active from a list of cargo labels. + * @param labels List of cargo labels. + * @returns First cargo label in list that exists, or CT_INVALID if none exist. + */ +static CargoLabel GetActiveCargoLabel(const std::initializer_list &labels) +{ + for (const CargoLabel &label : labels) { + CargoID cid = GetCargoIDByLabel(label); + if (cid != INVALID_CARGO) return label; + } + return CT_INVALID; +} + +/** + * Get active cargo label from either a cargo label or climate-dependent mixed cargo type. + * @param label Cargo label or climate-dependent mixed cargo type. + * @returns Active cargo label, or CT_INVALID if cargo label is not active. + */ +static CargoLabel GetActiveCargoLabel(const std::variant &label) +{ + if (std::holds_alternative(label)) return std::get(label); + if (std::holds_alternative(label)) { + switch (std::get(label)) { + case MCT_LIVESTOCK_FRUIT: return GetActiveCargoLabel({CT_LIVESTOCK, CT_FRUIT}); + case MCT_GRAIN_WHEAT_MAIZE: return GetActiveCargoLabel({CT_GRAIN, CT_WHEAT, CT_MAIZE}); + case MCT_VALUABLES_GOLD_DIAMONDS: return GetActiveCargoLabel({CT_VALUABLES, CT_GOLD, CT_DIAMONDS}); + default: NOT_REACHED(); + } + } + NOT_REACHED(); +} /** * Precalculate refit masks from cargo classes for all vehicles. @@ -8980,7 +9012,7 @@ static void CalculateRefitMasks() /* Apply default cargo translation map if cargo type hasn't been set, either explicitly or by aircraft cargo handling. */ if (!IsValidCargoID(e->info.cargo_type)) { - e->info.cargo_type = GetCargoIDByLabel(e->info.cargo_label); + e->info.cargo_type = GetCargoIDByLabel(GetActiveCargoLabel(e->info.cargo_label)); } /* If the NewGRF did not set any cargo properties, we apply default values. */ @@ -9017,7 +9049,8 @@ static void CalculateRefitMasks() _gted[engine].cargo_allowed = CC_PASSENGERS | CC_MAIL | CC_ARMOURED | CC_EXPRESS; _gted[engine].cargo_disallowed = CC_LIQUID; } else if (e->type == VEH_SHIP) { - switch (ei->cargo_label.base()) { + CargoLabel label = GetActiveCargoLabel(ei->cargo_label); + switch (label.base()) { case CT_PASSENGERS.base(): /* Ferries */ _gted[engine].cargo_allowed = CC_PASSENGERS; @@ -9048,9 +9081,10 @@ static void CalculateRefitMasks() _gted[engine].cargo_disallowed = 0; } else { /* Train wagons and road vehicles are classified by their default cargo type */ + CargoLabel label = GetActiveCargoLabel(ei->cargo_label); for (const auto &drm : _default_refit_masks) { if (!HasBit(drm.climate, _settings_game.game_creation.landscape)) continue; - if (drm.cargo_label != ei->cargo_label) continue; + if (drm.cargo_label != label) continue; _gted[engine].cargo_allowed = drm.cargo_allowed; _gted[engine].cargo_disallowed = drm.cargo_disallowed; @@ -9446,17 +9480,17 @@ static void FinaliseIndustriesArray() /* Apply default cargo translation map for unset cargo slots */ for (uint i = 0; i < lengthof(indsp.produced_cargo); ++i) { - if (!IsValidCargoID(indsp.produced_cargo[i])) indsp.produced_cargo[i] = GetCargoIDByLabel(indsp.produced_cargo_label[i]); + if (!IsValidCargoID(indsp.produced_cargo[i])) indsp.produced_cargo[i] = GetCargoIDByLabel(GetActiveCargoLabel(indsp.produced_cargo_label[i])); } for (uint i = 0; i < lengthof(indsp.accepts_cargo); ++i) { - if (!IsValidCargoID(indsp.accepts_cargo[i])) indsp.accepts_cargo[i] = GetCargoIDByLabel(indsp.accepts_cargo_label[i]); + if (!IsValidCargoID(indsp.accepts_cargo[i])) indsp.accepts_cargo[i] = GetCargoIDByLabel(GetActiveCargoLabel(indsp.accepts_cargo_label[i])); } } for (auto &indtsp : _industry_tile_specs) { /* Apply default cargo translation map for unset cargo slots */ for (uint i = 0; i < lengthof(indtsp.accepts_cargo); ++i) { - if (!IsValidCargoID(indtsp.accepts_cargo[i])) indtsp.accepts_cargo[i] = GetCargoIDByLabel(indtsp.accepts_cargo_label[i]); + if (!IsValidCargoID(indtsp.accepts_cargo[i])) indtsp.accepts_cargo[i] = GetCargoIDByLabel(GetActiveCargoLabel(indtsp.accepts_cargo_label[i])); } } } diff --git a/src/table/build_industry.h b/src/table/build_industry.h index f8683e8b09..72abeb5db0 100644 --- a/src/table/build_industry.h +++ b/src/table/build_industry.h @@ -1211,7 +1211,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { 208, 0xFFFFFFFF, 2, 0, 0, 0, 5, 0, 0, 0, 174, IT_FARM, IT_STEEL_MILL, IT_INVALID, CHECK_NOTHING, CT_GOODS, 0, CT_INVALID, 0, 5, - CT_LIVESTOCK, 256, CT_GRAIN, 256, CT_STEEL, 256, + MCT_LIVESTOCK_FRUIT, 256, MCT_GRAIN_WHEAT_MAIZE, 256, CT_STEEL, 256, INDUSTRYLIFE_PROCESSING, 1 << LT_TEMPERATE, INDUSTRYBEH_CHOPPER_ATTACKS, STR_INDUSTRY_NAME_FACTORY, STR_NEWS_INDUSTRY_CONSTRUCTION, @@ -1240,7 +1240,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { MI(_tile_table_farm, 3, _farm_sounds, 250, 0xD9999999, 2, 4, 0, 0, 9, 9, 0, 0, 48, IT_FACTORY, IT_FOOD_PROCESS, IT_INVALID, CHECK_FARM, - CT_GRAIN, 10, CT_LIVESTOCK, 10, 5, + MCT_GRAIN_WHEAT_MAIZE, 10, MCT_LIVESTOCK_FRUIT, 10, 5, CT_INVALID, 256, CT_INVALID, 256, CT_INVALID, 256, INDUSTRYLIFE_ORGANIC, 1 << LT_TEMPERATE | 1 << LT_ARCTIC, INDUSTRYBEH_PLANT_FIELDS | INDUSTRYBEH_PLANT_ON_BUILT, @@ -1270,8 +1270,8 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { MI(_tile_table_bank, 0, nullptr, 255, 0xA6666666, 7, 0, 0, 0, 0, 0, 0, 0, 15, IT_BANK_TEMP, IT_INVALID, IT_INVALID, CHECK_NOTHING, - CT_VALUABLES, 6, CT_INVALID, 0, 5, - CT_VALUABLES, 0, CT_INVALID, 0, CT_INVALID, 0, + MCT_VALUABLES_GOLD_DIAMONDS, 6, CT_INVALID, 0, 5, + MCT_VALUABLES_GOLD_DIAMONDS, 0, CT_INVALID, 0, CT_INVALID, 0, INDUSTRYLIFE_BLACK_HOLE, 1 << LT_TEMPERATE, INDUSTRYBEH_TOWN1200_MORE, STR_INDUSTRY_NAME_BANK, STR_NEWS_INDUSTRY_CONSTRUCTION, @@ -1281,7 +1281,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { 206, 0xFFFFFFFF, 0, 2, 2, 0, 0, 3, 4, 0, 55, IT_FRUIT_PLANTATION, IT_FARM, IT_FARM_2, CHECK_NOTHING, CT_FOOD, 0, CT_INVALID, 0, 5, - CT_FRUIT, 256, CT_MAIZE, 256, CT_INVALID, 256, + MCT_LIVESTOCK_FRUIT, 256, MCT_GRAIN_WHEAT_MAIZE, 256, CT_INVALID, 256, INDUSTRYLIFE_PROCESSING, 1 << LT_ARCTIC | 1 << LT_TROPIC, INDUSTRYBEH_NONE, STR_INDUSTRY_NAME_FOOD_PROCESSING_PLANT, STR_NEWS_INDUSTRY_CONSTRUCTION, @@ -1300,7 +1300,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { MI(_tile_table_gold_mine, 0, nullptr, 208, 0x99999999, 0, 3, 0, 0, 0, 4, 0, 0, 194, IT_BANK_TROPIC_ARCTIC, IT_INVALID, IT_INVALID, CHECK_NOTHING, - CT_GOLD, 7, CT_INVALID, 0, 5, + MCT_VALUABLES_GOLD_DIAMONDS, 7, CT_INVALID, 0, 5, CT_INVALID, 256, CT_INVALID, 256, CT_INVALID, 256, INDUSTRYLIFE_EXTRACTIVE, 1 << LT_ARCTIC, INDUSTRYBEH_NONE, @@ -1311,7 +1311,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { 151, 0xA6666666, 0, 3, 3, 0, 0, 6, 5, 0, 15, IT_GOLD_MINE, IT_DIAMOND_MINE, IT_INVALID, CHECK_NOTHING, CT_INVALID, 0, CT_INVALID, 0, 5, - CT_GOLD, 256, CT_INVALID, 256, CT_INVALID, 256, + MCT_VALUABLES_GOLD_DIAMONDS, 256, CT_INVALID, 256, CT_INVALID, 256, INDUSTRYLIFE_BLACK_HOLE, 1 << LT_ARCTIC | 1 << LT_TROPIC, INDUSTRYBEH_ONLY_INTOWN, STR_INDUSTRY_NAME_BANK_TROPIC_ARCTIC, STR_NEWS_INDUSTRY_CONSTRUCTION, @@ -1320,7 +1320,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { MI(_tile_table_diamond_mine, 0, nullptr, 213, 0x99999999, 0, 0, 3, 0, 0, 0, 4, 0, 184, IT_BANK_TROPIC_ARCTIC, IT_INVALID, IT_INVALID, CHECK_NOTHING, - CT_DIAMONDS, 7, CT_INVALID, 0, 5, + MCT_VALUABLES_GOLD_DIAMONDS, 7, CT_INVALID, 0, 5, CT_INVALID, 256, CT_INVALID, 256, CT_INVALID, 256, INDUSTRYLIFE_EXTRACTIVE, 1 << LT_TROPIC, INDUSTRYBEH_NONE, @@ -1340,7 +1340,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { MI(_tile_table_fruit_plantation, 0, nullptr, 225, 0xBFFFFFFF, 0, 0, 2, 0, 0, 0, 4, 0, 86, IT_FOOD_PROCESS, IT_INVALID, IT_INVALID, CHECK_PLANTATION, - CT_FRUIT, 10, CT_INVALID, 0, 15, + MCT_LIVESTOCK_FRUIT, 10, CT_INVALID, 0, 15, CT_INVALID, 256, CT_INVALID, 256, CT_INVALID, 256, INDUSTRYLIFE_ORGANIC, 1 << LT_TROPIC, INDUSTRYBEH_NONE, @@ -1390,7 +1390,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { MI(_tile_table_farm2, 0, nullptr, 250, 0xD9999999, 0, 0, 1, 0, 0, 0, 2, 0, 48, IT_FOOD_PROCESS, IT_INVALID, IT_INVALID, CHECK_PLANTATION, - CT_MAIZE, 11, CT_INVALID, 0, 5, + MCT_GRAIN_WHEAT_MAIZE, 11, CT_INVALID, 0, 5, CT_INVALID, 256, CT_INVALID, 256, CT_INVALID, 256, INDUSTRYLIFE_ORGANIC, 1 << LT_TROPIC, INDUSTRYBEH_PLANT_FIELDS | INDUSTRYBEH_PLANT_ON_BUILT, @@ -1594,10 +1594,10 @@ static const IndustryTileSpec _origin_industry_tile_specs[NEW_INDUSTRYTILEOFFSET MT(0, CT_INVALID, 0, CT_INVALID, 0, CT_INVALID, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false), /* Factory temperate */ - MT(8, CT_GRAIN, 8, CT_LIVESTOCK, 8, CT_STEEL, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false), - MT(8, CT_GRAIN, 8, CT_LIVESTOCK, 8, CT_STEEL, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false), - MT(8, CT_GRAIN, 8, CT_LIVESTOCK, 8, CT_STEEL, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false), - MT(8, CT_GRAIN, 8, CT_LIVESTOCK, 8, CT_STEEL, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false), + MT(8, MCT_GRAIN_WHEAT_MAIZE, 8, MCT_LIVESTOCK_FRUIT, 8, CT_STEEL, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false), + MT(8, MCT_GRAIN_WHEAT_MAIZE, 8, MCT_LIVESTOCK_FRUIT, 8, CT_STEEL, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false), + MT(8, MCT_GRAIN_WHEAT_MAIZE, 8, MCT_LIVESTOCK_FRUIT, 8, CT_STEEL, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false), + MT(8, MCT_GRAIN_WHEAT_MAIZE, 8, MCT_LIVESTOCK_FRUIT, 8, CT_STEEL, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false), /* Printing works */ MT(0, CT_INVALID, 8, CT_PAPER, 0, CT_INVALID, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false), @@ -1621,14 +1621,14 @@ static const IndustryTileSpec _origin_industry_tile_specs[NEW_INDUSTRYTILEOFFSET MT(1, CT_PASSENGERS, 8, CT_IRON_ORE, 0, CT_INVALID, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false), /* Bank temperate*/ - MT(1, CT_PASSENGERS, 8, CT_VALUABLES, 0, CT_INVALID, SLOPE_E, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false), - MT(1, CT_PASSENGERS, 8, CT_VALUABLES, 0, CT_INVALID, SLOPE_S, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false), + MT(1, CT_PASSENGERS, 8, MCT_VALUABLES_GOLD_DIAMONDS, 0, CT_INVALID, SLOPE_E, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false), + MT(1, CT_PASSENGERS, 8, MCT_VALUABLES_GOLD_DIAMONDS, 0, CT_INVALID, SLOPE_S, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false), /* Food processing plant, tropic and arctic. CT_MAIZE or CT_WHEAT, CT_LIVESTOCK or CT_FRUIT*/ - MT(8, CT_MAIZE, 8, CT_LIVESTOCK, 0, CT_INVALID, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false), - MT(8, CT_MAIZE, 8, CT_LIVESTOCK, 0, CT_INVALID, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false), - MT(8, CT_MAIZE, 8, CT_LIVESTOCK, 0, CT_INVALID, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false), - MT(8, CT_MAIZE, 8, CT_LIVESTOCK, 0, CT_INVALID, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false), + MT(8, MCT_GRAIN_WHEAT_MAIZE, 8, MCT_LIVESTOCK_FRUIT, 0, CT_INVALID, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false), + MT(8, MCT_GRAIN_WHEAT_MAIZE, 8, MCT_LIVESTOCK_FRUIT, 0, CT_INVALID, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false), + MT(8, MCT_GRAIN_WHEAT_MAIZE, 8, MCT_LIVESTOCK_FRUIT, 0, CT_INVALID, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false), + MT(8, MCT_GRAIN_WHEAT_MAIZE, 8, MCT_LIVESTOCK_FRUIT, 0, CT_INVALID, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false), /* Paper mill */ MT(0, CT_INVALID, 8, CT_WOOD, 0, CT_INVALID, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false), @@ -1660,8 +1660,8 @@ static const IndustryTileSpec _origin_industry_tile_specs[NEW_INDUSTRYTILEOFFSET MT(0, CT_INVALID, 0, CT_INVALID, 0, CT_INVALID, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, true), /* Bank Sub Arctic */ - MT(0, CT_INVALID, 8, CT_GOLD, 0, CT_INVALID, SLOPE_E, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false), - MT(0, CT_INVALID, 8, CT_GOLD, 0, CT_INVALID, SLOPE_S, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false), + MT(0, CT_INVALID, 8, MCT_VALUABLES_GOLD_DIAMONDS, 0, CT_INVALID, SLOPE_E, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false), + MT(0, CT_INVALID, 8, MCT_VALUABLES_GOLD_DIAMONDS, 0, CT_INVALID, SLOPE_S, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false), /* Diamond mine */ MT(0, CT_INVALID, 0, CT_INVALID, 0, CT_INVALID, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false), diff --git a/src/table/engines.h b/src/table/engines.h index 9bf442fe11..e1f42c1c1e 100644 --- a/src/table/engines.h +++ b/src/table/engines.h @@ -135,11 +135,11 @@ static const EngineInfo _orig_engine_info[] = { MW( 1827, 20, 20, 50, CT_OIL , T|A|S ), // 30 Oil Tanker MW( 1827, 20, 20, 50, CT_LIVESTOCK , T|A ), // 31 Livestock Van MW( 1827, 20, 20, 50, CT_GOODS , T|A|S ), // 32 Goods Van - MW( 1827, 20, 20, 50, CT_GRAIN , T|A|S ), // 33 Grain Hopper + MW( 1827, 20, 20, 50, MCT_GRAIN_WHEAT_MAIZE, T|A|S ), // 33 Grain Hopper MW( 1827, 20, 20, 50, CT_WOOD , T|A|S ), // 34 Wood Truck MW( 1827, 20, 20, 50, CT_IRON_ORE , T ), // 35 Iron Ore Hopper MW( 1827, 20, 20, 50, CT_STEEL , T ), // 36 Steel Truck - MW( 1827, 20, 20, 50, CT_VALUABLES , T|A|S ), // 37 Armoured Van + MW( 1827, 20, 20, 50, MCT_VALUABLES_GOLD_DIAMONDS, T|A|S ), // 37 Armoured Van MW( 1827, 20, 20, 50, CT_FOOD , A|S ), // 38 Food Van MW( 1827, 20, 20, 50, CT_PAPER , A ), // 39 Paper Truck MW( 1827, 20, 20, 50, CT_COPPER_ORE , S ), // 40 Copper Ore Hopper @@ -165,11 +165,11 @@ static const EngineInfo _orig_engine_info[] = { MW( 1827, 20, 20, 50, CT_OIL , T|A|S ), // 60 Oil Tanker MW( 1827, 20, 20, 50, CT_LIVESTOCK , T|A ), // 61 Livestock Van MW( 1827, 20, 20, 50, CT_GOODS , T|A|S ), // 62 Goods Van - MW( 1827, 20, 20, 50, CT_GRAIN , T|A|S ), // 63 Grain Hopper + MW( 1827, 20, 20, 50, MCT_GRAIN_WHEAT_MAIZE, T|A|S ), // 63 Grain Hopper MW( 1827, 20, 20, 50, CT_WOOD , T|A|S ), // 64 Wood Truck MW( 1827, 20, 20, 50, CT_IRON_ORE , T ), // 65 Iron Ore Hopper MW( 1827, 20, 20, 50, CT_STEEL , T ), // 66 Steel Truck - MW( 1827, 20, 20, 50, CT_VALUABLES , T|A|S ), // 67 Armoured Van + MW( 1827, 20, 20, 50, MCT_VALUABLES_GOLD_DIAMONDS, T|A|S ), // 67 Armoured Van MW( 1827, 20, 20, 50, CT_FOOD , A|S ), // 68 Food Van MW( 1827, 20, 20, 50, CT_PAPER , A ), // 69 Paper Truck MW( 1827, 20, 20, 50, CT_COPPER_ORE , S ), // 70 Copper Ore Hopper @@ -197,11 +197,11 @@ static const EngineInfo _orig_engine_info[] = { MW( 1827, 20, 20, 50, CT_OIL , T|A|S ), // 92 Oil Tanker MW( 1827, 20, 20, 50, CT_LIVESTOCK , T|A ), // 93 Livestock Van MW( 1827, 20, 20, 50, CT_GOODS , T|A|S ), // 94 Goods Van - MW( 1827, 20, 20, 50, CT_GRAIN , T|A|S ), // 95 Grain Hopper + MW( 1827, 20, 20, 50, MCT_GRAIN_WHEAT_MAIZE, T|A|S ), // 95 Grain Hopper MW( 1827, 20, 20, 50, CT_WOOD , T|A|S ), // 96 Wood Truck MW( 1827, 20, 20, 50, CT_IRON_ORE , T ), // 97 Iron Ore Hopper MW( 1827, 20, 20, 50, CT_STEEL , T ), // 98 Steel Truck - MW( 1827, 20, 20, 50, CT_VALUABLES , T|A|S ), // 99 Armoured Van + MW( 1827, 20, 20, 50, MCT_VALUABLES_GOLD_DIAMONDS, T|A|S ), // 99 Armoured Van MW( 1827, 20, 20, 50, CT_FOOD , A|S ), // 100 Food Van MW( 1827, 20, 20, 50, CT_PAPER , A ), // 101 Paper Truck MW( 1827, 20, 20, 50, CT_COPPER_ORE , S ), // 102 Copper Ore Hopper @@ -243,9 +243,9 @@ static const EngineInfo _orig_engine_info[] = { MR( 5479, 20, 15, 55, CT_GOODS , T|A|S ), // 138 Balogh Goods Truck MR( 19724, 20, 15, 55, CT_GOODS , T|A|S ), // 139 Craighead Goods Truck MR( 31047, 20, 15, 85, CT_GOODS , T|A|S ), // 140 Goss Goods Truck - MR( 5479, 20, 15, 55, CT_GRAIN , T|A|S ), // 141 Hereford Grain Truck - MR( 21185, 20, 15, 55, CT_GRAIN , T|A|S ), // 142 Thomas Grain Truck - MR( 32873, 20, 15, 85, CT_GRAIN , T|A|S ), // 143 Goss Grain Truck + MR( 5479, 20, 15, 55, MCT_GRAIN_WHEAT_MAIZE, T|A|S ), // 141 Hereford Grain Truck + MR( 21185, 20, 15, 55, MCT_GRAIN_WHEAT_MAIZE, T|A|S ), // 142 Thomas Grain Truck + MR( 32873, 20, 15, 85, MCT_GRAIN_WHEAT_MAIZE, T|A|S ), // 143 Goss Grain Truck MR( 5479, 20, 15, 55, CT_WOOD , T|A|S ), // 144 Witcombe Wood Truck MR( 19724, 20, 15, 55, CT_WOOD , T|A|S ), // 145 Foster Wood Truck MR( 35430, 20, 15, 85, CT_WOOD , T|A|S ), // 146 Moreland Wood Truck @@ -255,9 +255,9 @@ static const EngineInfo _orig_engine_info[] = { MR( 5479, 20, 15, 55, CT_STEEL , T ), // 150 Balogh Steel Truck MR( 21185, 20, 15, 55, CT_STEEL , T ), // 151 Uhl Steel Truck MR( 31777, 20, 15, 85, CT_STEEL , T ), // 152 Kelling Steel Truck - MR( 5479, 20, 15, 55, CT_VALUABLES , T|A|S ), // 153 Balogh Armoured Truck - MR( 22281, 20, 15, 55, CT_VALUABLES , T|A|S ), // 154 Uhl Armoured Truck - MR( 33603, 20, 15, 85, CT_VALUABLES , T|A|S ), // 155 Foster Armoured Truck + MR( 5479, 20, 15, 55, MCT_VALUABLES_GOLD_DIAMONDS, T|A|S ), // 153 Balogh Armoured Truck + MR( 22281, 20, 15, 55, MCT_VALUABLES_GOLD_DIAMONDS, T|A|S ), // 154 Uhl Armoured Truck + MR( 33603, 20, 15, 85, MCT_VALUABLES_GOLD_DIAMONDS, T|A|S ), // 155 Foster Armoured Truck MR( 5479, 20, 15, 55, CT_FOOD , A|S ), // 156 Foster Food Van MR( 18628, 20, 15, 55, CT_FOOD , A|S ), // 157 Perry Food Van MR( 30681, 20, 15, 85, CT_FOOD , A|S ), // 158 Chippy Food Van From ae30ad7802f70fe06710780c26d53d2a5bc054dc Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Mon, 5 Feb 2024 23:12:56 +0000 Subject: [PATCH 18/25] Fix #12001: Use correct valid cargo check for old-style NewGRF town house 3rd cargo set up. (#12006) --- src/newgrf.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/newgrf.cpp b/src/newgrf.cpp index b8c6ec0a75..ffc16c067a 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -2431,7 +2431,7 @@ static ChangeInfoResult TownHouseChangeInfo(uint hid, int numinfo, int prop, Byt * in the temperate climate. */ CargoID cid = housespec->accepts_cargo[2]; if (!IsValidCargoID(cid)) cid = GetCargoIDByLabel(housespec->accepts_cargo_label[2]); - if (!IsValidCargoID(cid) || !CargoSpec::Get(cid)->IsValid()) { + if (!IsValidCargoID(cid)) { housespec->cargo_acceptance[2] = 0; } } @@ -2471,7 +2471,7 @@ static ChangeInfoResult TownHouseChangeInfo(uint hid, int numinfo, int prop, Byt ((_settings_game.game_creation.landscape == LT_TOYLAND) ? GetCargoIDByLabel(CT_FIZZY_DRINKS) : GetCargoIDByLabel(CT_FOOD)); /* Make sure the cargo type is valid in this climate. */ - if (!CargoSpec::Get(cid)->IsValid()) goods = 0; + if (!IsValidCargoID(cid)) goods = 0; housespec->accepts_cargo[2] = cid; housespec->accepts_cargo_label[2] = CT_INVALID; From e2d36f626ba7092736b31269597e7cd71094d5bf Mon Sep 17 00:00:00 2001 From: dP Date: Tue, 6 Feb 2024 04:44:21 +0530 Subject: [PATCH 19/25] Fix: Focus hotkey in road/tram stop building window (#12008) --- src/road_gui.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/road_gui.cpp b/src/road_gui.cpp index adb88f33e6..51e25b5bb7 100644 --- a/src/road_gui.cpp +++ b/src/road_gui.cpp @@ -1582,7 +1582,11 @@ public: this->InvalidateData(); }}; - static inline HotkeyList hotkeys{"buildroadstop", { + static inline HotkeyList road_hotkeys{"buildroadstop", { + Hotkey('F', "focus_filter_box", BROSHK_FOCUS_FILTER_BOX), + }}; + + static inline HotkeyList tram_hotkeys{"buildtramstop", { Hotkey('F', "focus_filter_box", BROSHK_FOCUS_FILTER_BOX), }}; }; @@ -1684,7 +1688,8 @@ static WindowDesc _road_station_picker_desc(__FILE__, __LINE__, WDP_AUTO, "build_station_road", 0, 0, WC_BUS_STATION, WC_BUILD_TOOLBAR, WDF_CONSTRUCTION, - std::begin(_nested_road_station_picker_widgets), std::end(_nested_road_station_picker_widgets) + std::begin(_nested_road_station_picker_widgets), std::end(_nested_road_station_picker_widgets), + &BuildRoadStationWindow::road_hotkeys ); /** Widget definition of the build tram station window */ @@ -1761,7 +1766,8 @@ static WindowDesc _tram_station_picker_desc(__FILE__, __LINE__, WDP_AUTO, "build_station_tram", 0, 0, WC_BUS_STATION, WC_BUILD_TOOLBAR, WDF_CONSTRUCTION, - std::begin(_nested_tram_station_picker_widgets), std::end(_nested_tram_station_picker_widgets) + std::begin(_nested_tram_station_picker_widgets), std::end(_nested_tram_station_picker_widgets), + &BuildRoadStationWindow::tram_hotkeys ); static void ShowRVStationPicker(Window *parent, RoadStopType rs) From e9ea837311b0c6247bee384f8118c573ee59cfc5 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Tue, 6 Feb 2024 12:53:23 +0000 Subject: [PATCH 20/25] Fix #12012: Crash when opening orders of another company. (#12013) Orders window changes tooltip depending on vehicle type but did check if widget exists. --- src/order_gui.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/order_gui.cpp b/src/order_gui.cpp index fc889d3fe0..c23472ed74 100644 --- a/src/order_gui.cpp +++ b/src/order_gui.cpp @@ -785,7 +785,9 @@ public: this->CreateNestedTree(); this->vscroll = this->GetScrollbar(WID_O_SCROLLBAR); - this->GetWidget(WID_O_DEPOT_ACTION)->tool_tip = STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP + v->type; + if (NWidgetCore *nwid = this->GetWidget(WID_O_DEPOT_ACTION); nwid != nullptr) { + nwid->tool_tip = STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP + v->type; + } this->FinishInitNested(v->index); this->selected_order = -1; From 02cdd5ba8bad031b4431562ff67497a7d27e0b65 Mon Sep 17 00:00:00 2001 From: translators Date: Tue, 6 Feb 2024 18:35:32 +0000 Subject: [PATCH 21/25] Update: Translations from eints spanish (mexican): 7 changes by Skinazo english (us): 4 changes by 2TallTyler czech: 37 changes by justidan4 chinese (simplified): 1 change by WenSimEHRP finnish: 50 changes by Finjet-cyber, 22 changes by hpiirai spanish: 13 changes by MontyMontana french: 4 changes by ottdfevr portuguese (brazilian): 141 changes by pasantoro polish: 68 changes by pAter-exe --- src/lang/brazilian_portuguese.txt | 282 +++++++++++++++--------------- src/lang/czech.txt | 37 ++++ src/lang/english_US.txt | 4 + src/lang/finnish.txt | 141 +++++++-------- src/lang/french.txt | 4 + src/lang/polish.txt | 83 +++++++-- src/lang/simplified_chinese.txt | 2 +- src/lang/spanish.txt | 26 +-- src/lang/spanish_MX.txt | 7 + 9 files changed, 347 insertions(+), 239 deletions(-) diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index f0421136d8..bc4e90b0ec 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -54,7 +54,7 @@ STR_CARGO_PLURAL_COLA :Bebida de cola STR_CARGO_PLURAL_CANDYFLOSS :Algodão Doce STR_CARGO_PLURAL_BUBBLES :Bolhas STR_CARGO_PLURAL_TOFFEE :Caramelo -STR_CARGO_PLURAL_BATTERIES :Baterias +STR_CARGO_PLURAL_BATTERIES :Pilhas STR_CARGO_PLURAL_PLASTIC :Plástico STR_CARGO_PLURAL_FIZZY_DRINKS :Refrigerantes @@ -104,21 +104,21 @@ STR_QUANTITY_GRAIN :{WEIGHT_LONG} d STR_QUANTITY_WOOD :{WEIGHT_LONG} de madeira STR_QUANTITY_IRON_ORE :{WEIGHT_LONG} de minério de ferro STR_QUANTITY_STEEL :{WEIGHT_LONG} de aço -STR_QUANTITY_VALUABLES :{COMMA}{NBSP}bolsa{P "" s} de objetos de valor +STR_QUANTITY_VALUABLES :{COMMA}{NBSP}pacote{P "" s} de objetos de valor STR_QUANTITY_COPPER_ORE :{WEIGHT_LONG} de minério de cobre STR_QUANTITY_MAIZE :{WEIGHT_LONG} de milho STR_QUANTITY_FRUIT :{WEIGHT_LONG} de fruta -STR_QUANTITY_DIAMONDS :{COMMA}{NBSP}bolsa{P "" s} de diamantes +STR_QUANTITY_DIAMONDS :{COMMA}{NBSP}saco{P "" s} de diamantes STR_QUANTITY_FOOD :{WEIGHT_LONG} de alimentos STR_QUANTITY_PAPER :{WEIGHT_LONG} de papel -STR_QUANTITY_GOLD :{COMMA}{NBSP}bolsa{P "" s} de ouro +STR_QUANTITY_GOLD :{COMMA}{NBSP}saco{P "" s} de ouro STR_QUANTITY_WATER :{VOLUME_LONG} de água STR_QUANTITY_WHEAT :{WEIGHT_LONG} de trigo STR_QUANTITY_RUBBER :{VOLUME_LONG} de borracha STR_QUANTITY_SUGAR :{WEIGHT_LONG} de açúcar STR_QUANTITY_TOYS :{COMMA}{NBSP}brinquedo{P "" s} -STR_QUANTITY_SWEETS :{COMMA}{NBSP}pacote{P "" s} de doces -STR_QUANTITY_COLA :{VOLUME_LONG} de cola +STR_QUANTITY_SWEETS :{COMMA}{NBSP}saco{P "" s} de doces +STR_QUANTITY_COLA :{VOLUME_LONG} de bebida de cola STR_QUANTITY_CANDYFLOSS :{WEIGHT_LONG} de algodão doce STR_QUANTITY_BUBBLES :{COMMA} bolha{P "" s} STR_QUANTITY_TOFFEE :{WEIGHT_LONG} de caramelo @@ -165,7 +165,7 @@ STR_ABBREV_ALL :TUDO # 'Mode' of transport for cargoes STR_PASSENGERS :{COMMA}{NBSP}passageiro{P "" s} -STR_BAGS :{COMMA}{NBSP}sacola{P "" s} +STR_BAGS :{COMMA}{NBSP}saco{P "" s} STR_TONS :{COMMA}{NBSP}tonelada{P "" s} STR_LITERS :{COMMA}{NBSP}litro{P "" s} STR_ITEMS :{COMMA}{NBSP}ite{P m ns} @@ -487,7 +487,7 @@ STR_GRAPH_MENU_COMPANY_VALUE_GRAPH :Gráfico de val STR_GRAPH_MENU_CARGO_PAYMENT_RATES :Taxa de pagamento de carga # Company league menu -STR_GRAPH_MENU_COMPANY_LEAGUE_TABLE :Tabela da liga de empresa +STR_GRAPH_MENU_COMPANY_LEAGUE_TABLE :Tabela de categoria das empresas STR_GRAPH_MENU_DETAILED_PERFORMANCE_RATING :Avaliação detalhada de performance STR_GRAPH_MENU_HIGHSCORE :Tabela de Pontuações @@ -610,7 +610,7 @@ STR_GRAPH_Y_LABEL_NUMBER :{TINY_FONT}{COM STR_GRAPH_OPERATING_PROFIT_CAPTION :{WHITE}Gráfico de Lucro Operacional STR_GRAPH_INCOME_CAPTION :{WHITE}Gráfico de Renda STR_GRAPH_CARGO_DELIVERED_CAPTION :{WHITE}Unidades de carga entregues -STR_GRAPH_COMPANY_PERFORMANCE_RATINGS_CAPTION :{WHITE}Avaliações de desempenho da empresa (avaliação máxima=1000) +STR_GRAPH_COMPANY_PERFORMANCE_RATINGS_CAPTION :{WHITE}Classificações do desempenho da empresa (máximo=1000) STR_GRAPH_COMPANY_VALUES_CAPTION :{WHITE}Gráfico de Valor da Empresa STR_GRAPH_LAST_72_MINUTES_TIME_LABEL :{TINY_FONT}{BLACK}Últimos 72 minutos @@ -633,7 +633,7 @@ STR_GRAPH_KEY_CAPTION :{WHITE}Chave pa STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Clique aqui para mostrar/ocultar empresa no gráfico # Company league window -STR_COMPANY_LEAGUE_TABLE_CAPTION :{WHITE}Tabela da Liga das Empresas +STR_COMPANY_LEAGUE_TABLE_CAPTION :{WHITE}Tabela de Categoria das Empresas STR_COMPANY_LEAGUE_COMPANY_NAME :{ORANGE}{COMPANY} {BLACK}{COMPANY_NUM} '{STRING}' STR_COMPANY_LEAGUE_COMPANY_RANK :{YELLOW}#{NUM} STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ENGINEER :Engenheiro @@ -1015,7 +1015,7 @@ STR_GAME_OPTIONS_CURRENCY_MYR :Ringgit Malaio STR_GAME_OPTIONS_CURRENCY_LVL :Lats da Letônia STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Salvar automaticamente -STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Selecionar o intervalo entre jogos salvos automaticos +STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Selecionar o intervalo entre jogos salvos automaticamente # Autosave dropdown ###length 5 @@ -1229,7 +1229,7 @@ STR_CONFIG_SETTING_RESET_ALL_CONFIRMATION_DIALOG_TEXT :{WHITE}Essa aç STR_CONFIG_SETTING_RESTRICT_CATEGORY :{BLACK}Categoria: STR_CONFIG_SETTING_RESTRICT_TYPE :{BLACK}Tipo: -STR_CONFIG_SETTING_RESTRICT_DROPDOWN_HELPTEXT :{BLACK}Restringe a lista abaixo a mostrar apenas filtros pré-definidos +STR_CONFIG_SETTING_RESTRICT_DROPDOWN_HELPTEXT :{BLACK}Restringe a lista abaixo usando filtros pré-definidos STR_CONFIG_SETTING_RESTRICT_BASIC :Básico (apenas configs. importantes) STR_CONFIG_SETTING_RESTRICT_ADVANCED :Avançado (maior parte das configs.) STR_CONFIG_SETTING_RESTRICT_ALL :Expert (mostra todas as configs. inclusive as estranhas) @@ -1244,7 +1244,7 @@ STR_CONFIG_SETTING_TYPE_DROPDOWN_GAME_INGAME :Configs. do jog STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_MENU :Configurações da empresa (guardado no savegame; afeta apenas novos jogos) STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_INGAME :Configurações da empresa (guardado no savegame; afeta apenas a empresa atual) -STR_CONFIG_SETTINGS_NONE :{G=m}{WHITE}- Nenhum - +STR_CONFIG_SETTINGS_NONE :{WHITE}- Nenhum - ###length 3 STR_CONFIG_SETTING_CATEGORY_HIDES :{BLACK}Mostrar todos resultados por configuração{}{SILVER}Categoria {BLACK}até {WHITE}{STRING} STR_CONFIG_SETTING_TYPE_HIDES :{BLACK}Mostrar todos resultados por configuração{}{SILVER}Tipo {BLACK}até {WHITE}Todas configurações de tipos @@ -1288,7 +1288,7 @@ STR_CONFIG_SETTING_RUNNING_COSTS :Custos de Opera STR_CONFIG_SETTING_RUNNING_COSTS_HELPTEXT :Define o nível e custos de manutenção de veículos e infraestrutura STR_CONFIG_SETTING_CONSTRUCTION_SPEED :Velocidade de construção: {STRING} -STR_CONFIG_SETTING_CONSTRUCTION_SPEED_HELPTEXT :Limita ações de construção para IA's +STR_CONFIG_SETTING_CONSTRUCTION_SPEED_HELPTEXT :Limitar a quantidade de ações de construção para IAs STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS :Quebra de veículos: {STRING} STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS_HELPTEXT :Controla o quanto veículos mal conservados podem quebrar @@ -1306,7 +1306,7 @@ STR_CONFIG_SETTING_SUBSIDY_DURATION_VALUE :{UNITS_YEARS_OR STR_CONFIG_SETTING_SUBSIDY_DURATION_DISABLED :Sem subsídios STR_CONFIG_SETTING_CONSTRUCTION_COSTS :Custos de construção: {STRING} -STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT :Define o nível de construção e custos de compra +STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT :Definir o nível de construção e os custos de aquisição STR_CONFIG_SETTING_RECESSIONS :Recessões: {STRING} STR_CONFIG_SETTING_RECESSIONS_HELPTEXT :Se ativado, recessões podem ocorrer periodicamente. Durante uma recessão toda a produção é significativamente menor (ela retorna ao nível anterior quando a recessão termina) @@ -1328,7 +1328,7 @@ STR_CONFIG_SETTING_MAP_HEIGHT_LIMIT_AUTO :(automático) STR_CONFIG_SETTING_TOO_HIGH_MOUNTAIN :{WHITE}Impossível definir o limite de altura do mapa para este valor. Há ao menos uma montanha mais alta que isso STR_CONFIG_SETTING_AUTOSLOPE :Permitir paisagismo sob edifícios, trilhos, etc.: {STRING} -STR_CONFIG_SETTING_AUTOSLOPE_HELPTEXT :Permite paisagismo sob edifícios e vias sem precisar removê-las +STR_CONFIG_SETTING_AUTOSLOPE_HELPTEXT :Permitir paisagismo sob edifícios e vias sem precisar removê-las STR_CONFIG_SETTING_CATCHMENT :Dimensionamento mais realista das áreas de abrangência: {STRING} STR_CONFIG_SETTING_CATCHMENT_HELPTEXT :Exibe áreas de abrangência de para diferentes tipos de estações e aeroportos @@ -1550,7 +1550,7 @@ STR_CONFIG_SETTING_LANDSCAPE :Terreno: {STRIN STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :O terreno define a jogabilidade básica com diferentes cargas e requerimentos para o crescimento das cidades. NewGRF's e Scripts de Jogo permitem um controle mais fino STR_CONFIG_SETTING_LAND_GENERATOR :Gerador de Terreno: {STRING} -STR_CONFIG_SETTING_LAND_GENERATOR_HELPTEXT :O gerador original depende do set gráficos base, e cria terrenos de formatos fixos. TerraGenesis é um gerador baseado em ruído Perlin com configurações mais delicadas +STR_CONFIG_SETTING_LAND_GENERATOR_HELPTEXT :O gerador original depende do conjunto gráfico base e produz formas de terreno pré-definidas. TerraGenesis é um gerador baseado no algoritmo de ruído de Perlin com definições mais refinadas ###length 2 STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :Original STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis @@ -1589,7 +1589,7 @@ STR_CONFIG_SETTING_VARIETY_HELPTEXT :(Apenas TerraGe STR_CONFIG_SETTING_RIVER_AMOUNT :Quantidade de rios: {STRING} STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT :Escolha quantos rios a serem gerados -STR_CONFIG_SETTING_TREE_PLACER :Algorítimo de colocação de árvores: {STRING} +STR_CONFIG_SETTING_TREE_PLACER :Algoritmo para colocação de árvores: {STRING} STR_CONFIG_SETTING_TREE_PLACER_HELPTEXT :Escolha a distribuição das árvores no mapa: 'Original' planta árvores uniformemente pelo mapa, 'Melhorado' planta-as em grupos ###length 3 STR_CONFIG_SETTING_TREE_PLACER_NONE :Nenhum @@ -1739,7 +1739,7 @@ STR_CONFIG_SETTING_QUICKGOTO :Criar rapidamen STR_CONFIG_SETTING_QUICKGOTO_HELPTEXT :Pre-seleciona a opção 'ir para' ao abrir a janelas de ordens STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE :Tipo padrão de ferrovia (ao criar ou carregar um jogo): {STRING} -STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_HELPTEXT :Tipo de trilho a ser selecionado ao carregar/iniciar o jogo. 'primeiro disponível' seleciona o mais antigo. 'último disponível' seleciona o mais novo. 'mais usado' seleciona o que é atualmente mais usado +STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_HELPTEXT :Tipo de trilho a ser selecionado ao carregar/iniciar um jogo. 'primeiro disponível' seleciona o tipo mais antigo. 'último disponível' seleciona o tipo mais novo de trilho e 'mais usado' seleciona o tipo que é mais usado atualmente ###length 3 STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_FIRST :Primeiro disponível STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_LAST :Último disponível @@ -1847,7 +1847,7 @@ STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Ativar limite d STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Ativado, usa limites de velocidade para vagões para decidir a velocidade máxima de um trem STR_CONFIG_SETTING_DISABLE_ELRAILS :Desativar ferrovias elétricas: {STRING} -STR_CONFIG_SETTING_DISABLE_ELRAILS_HELPTEXT :Ativado, remove a necessidade de trilhos elétricos para locomotivas elétricas, permitindo-nas usar trilhos normais +STR_CONFIG_SETTING_DISABLE_ELRAILS_HELPTEXT :Ativar essa configuração desativa o requisito de eletrificação dos trilhos para que locomotivas elétricas possam utilizá-los STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OWN :Chegada do primeiro veículo à estação do jogador: {STRING} STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OWN_HELPTEXT :Exibe um jornal quando o primeiro veículo chega numa estação do jogador @@ -1880,7 +1880,7 @@ STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_OTHER :Mudanças na pr STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_OTHER_HELPTEXT :Exibe um jornal quando a produção de indústrias muda, que são atendidas pelos competidores STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_UNSERVED :Outras mudanças de produção das indústrias: {STRING} -STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_UNSERVED_HELPTEXT :{G=f}Exibe um jornal quando a produção de indústrias muda, que não não atendidas pela companhia ou competidores +STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_UNSERVED_HELPTEXT :Exibir um jornal quando o nível de produção das indústrias que não não atendidas pela empresa ou por competidores mudar STR_CONFIG_SETTING_NEWS_ADVICE :Conselhos / informações sobre os veículos da empresa: {STRING} STR_CONFIG_SETTING_NEWS_ADVICE_HELPTEXT :Exibe mensagens sobre veículos precisando de atenção @@ -1939,7 +1939,7 @@ STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :Todos visíveis STR_CONFIG_SETTING_SIGNAL_GUI_MODE :Mostrar tipos de sinais: {STRING} STR_CONFIG_SETTING_SIGNAL_GUI_MODE_HELPTEXT :Escolha quais tipos de sinais são mostrados na barra de ferramentas de sinais ###length 2 -STR_CONFIG_SETTING_SIGNAL_GUI_MODE_PATH :Sinal de trajeto apenas +STR_CONFIG_SETTING_SIGNAL_GUI_MODE_PATH :Apenas sinais de trajeto STR_CONFIG_SETTING_SIGNAL_GUI_MODE_ALL_CYCLE_PATH :Todos os sinais STR_CONFIG_SETTING_TOWN_LAYOUT :Disposição de ruas para novas cidades: {STRING} @@ -2053,12 +2053,12 @@ STR_CONFIG_SETTING_LINKGRAPH_ACCURACY :Precisão da di STR_CONFIG_SETTING_LINKGRAPH_ACCURACY_HELPTEXT :Quanto mais alto você define esse valor, mais tempo de CPU será dado ao cálculo do gráfico. Se levar muito tempo, você poderá notar um pouco de lag. Se você definir um valor muito baixo, a distribuição será imprecisa, e você notará cargas deixando de serem enviadas aonde deveriam ir. STR_CONFIG_SETTING_DEMAND_DISTANCE :Efeito da distância na demanda: {STRING} -STR_CONFIG_SETTING_DEMAND_DISTANCE_HELPTEXT :Se você definir esse valor para maior que 0, a distância entre a estação de origem A para alguma carga e um possível destino B terá um efeito na quantidade de carga levada de A até B. Quanto mais distante B for da A, menos carga será enviada. Quanto mais alto você definir esse valor, menos carga será levada para estações distantes, e mais carga será levada para estações próximas. +STR_CONFIG_SETTING_DEMAND_DISTANCE_HELPTEXT :Se você definir esse valor para maior que 0, a distância entre a estação de origem A para alguma carga e um possível destino B terá um efeito na quantidade de carga transportada de A até B. Quanto mais distante B estiver de A, menos carga será enviada. Quanto maior valor definido, menos carga será transportada para estações distantes e mais carga será levada para estações próximas. STR_CONFIG_SETTING_DEMAND_SIZE :Quantidade de carga retornada no modo simétrico: {STRING} STR_CONFIG_SETTING_DEMAND_SIZE_HELPTEXT :Definir isso para menos de 100% faz com que a distribuição simétrica comporte-se mais como a assimétrica. Menos carga será devolvida forçosamente se uma certa quantidade for mandada a uma estação. Se você definir a 0%, a distribuição se comportará exatamente como a assimétrica. STR_CONFIG_SETTING_SHORT_PATH_SATURATION :Saturação de caminhos curtos antes de usar caminhos de alta capacidade: {STRING} -STR_CONFIG_SETTING_SHORT_PATH_SATURATION_HELPTEXT :Frequentemente há múltiplos trajetos entre duas estações. Cargodist irá saturar o trajeto mais curto primeiro, depois usar o segundo trajeto mais curto até saturá-lo, e assim por diante. A saturação é determinada por uma estimativa da capacidade e do uso planejado. Ao saturar todos os trajetos, se ainda houver demanda não atendida, irá sobrecarregar todos os trajetos, com preferência pelos de maior capacidade. Entretanto, na maioria das vezes o algoritimo não irá estimar corretamente a capacidade. Essa configuração permite definir até que porcentagem um trajeto mais curto deverá ser saturado na primeira passada antes do algoritimo selecionar o próximo trajeto mais longo. Defina-o para menos de 100% para evitar estações sobrecarregadas no caso de capacidade superestimada. +STR_CONFIG_SETTING_SHORT_PATH_SATURATION_HELPTEXT :Frequentemente há múltiplos trajetos entre duas estações. Cargodist irá saturar o trajeto mais curto primeiro, depois usar o segundo trajeto mais curto até saturá-lo, e assim por diante. A saturação é determinada por uma estimativa da capacidade e do uso planejado. Ao saturar todos os trajetos, se ainda houver demanda não atendida, irá sobrecarregar todos os trajetos, com preferência pelos de maior capacidade. Entretanto, na maioria das vezes o algoritmo não irá estimar corretamente a capacidade. Essa configuração permite definir até que porcentagem um trajeto mais curto deverá ser saturado na primeira passada antes do algoritmo selecionar o próximo trajeto mais longo. Defina-o para menos de 100% para evitar estações sobrecarregadas no caso de capacidade superestimada. STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY :Unidades de velocidade (terrestre): {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_NAUTICAL :Unidades de velocidade (náutica): {STRING} @@ -2133,12 +2133,12 @@ STR_CONFIG_SETTING_AI :Oponentes STR_CONFIG_SETTING_AI_NPC :Computadores STR_CONFIG_SETTING_NETWORK :Rede -STR_CONFIG_SETTING_PATHFINDER_FOR_TRAINS :Pathfinder para trens: {STRING} -STR_CONFIG_SETTING_PATHFINDER_FOR_TRAINS_HELPTEXT :Algorítimo de formulação de vias para trens, que define quais vias tomar -STR_CONFIG_SETTING_PATHFINDER_FOR_ROAD_VEHICLES :Pathfinder para automóveis: {STRING} -STR_CONFIG_SETTING_PATHFINDER_FOR_ROAD_VEHICLES_HELPTEXT :Algorítimo de formulação de vias para automóveis, que define quais vias tomar -STR_CONFIG_SETTING_PATHFINDER_FOR_SHIPS :Pathfinder para embarcações: {STRING} -STR_CONFIG_SETTING_PATHFINDER_FOR_SHIPS_HELPTEXT :Algorítimo de formulação de vias para embarcações, que define quais vias tomar +STR_CONFIG_SETTING_PATHFINDER_FOR_TRAINS :Gerador de rotas para trens: {STRING} +STR_CONFIG_SETTING_PATHFINDER_FOR_TRAINS_HELPTEXT :Gerador de rotas para usar nos trens +STR_CONFIG_SETTING_PATHFINDER_FOR_ROAD_VEHICLES :Gerador de rotas para veículos rodoviários: {STRING} +STR_CONFIG_SETTING_PATHFINDER_FOR_ROAD_VEHICLES_HELPTEXT :Gerador de rotas para usar nos veículos rodoviários +STR_CONFIG_SETTING_PATHFINDER_FOR_SHIPS :Gerador de rotas para embarcações: {STRING} +STR_CONFIG_SETTING_PATHFINDER_FOR_SHIPS_HELPTEXT :Gerador de rotas para usar nas embarcações STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Reversão automática em sinais: {STRING} STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Permite trens reverterem sentido num sinal, se estiverem aguardando por muito tempo ###length 2 @@ -2627,7 +2627,7 @@ STR_NETWORK_SERVER_MESSAGE_GAME_UNPAUSED :Jogo despausado STR_NETWORK_SERVER_MESSAGE_GAME_REASON_NOT_ENOUGH_PLAYERS :número de jogadores STR_NETWORK_SERVER_MESSAGE_GAME_REASON_CONNECTING_CLIENTS :clientes conectando-se STR_NETWORK_SERVER_MESSAGE_GAME_REASON_MANUAL :manual -STR_NETWORK_SERVER_MESSAGE_GAME_REASON_GAME_SCRIPT :{G=m}script do jogo +STR_NETWORK_SERVER_MESSAGE_GAME_REASON_GAME_SCRIPT :script do jogo STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :aguardando atualização do gráfico de links STR_NETWORK_MESSAGE_CLIENT_LEAVING :saindo @@ -2680,7 +2680,7 @@ STR_CONTENT_DETAIL_SUBTITLE_AUTOSELECTED :{SILVER}Esta de STR_CONTENT_DETAIL_SUBTITLE_ALREADY_HERE :{SILVER}Você já baixou isso STR_CONTENT_DETAIL_SUBTITLE_DOES_NOT_EXIST :{SILVER}Esse conteúdo é desconhecido e não pode ser baixado pelo OpenTTD -STR_CONTENT_DETAIL_UPDATE :{G=f}{SILVER}Isso substitui uma {STRING} existente +STR_CONTENT_DETAIL_UPDATE :{SILVER}Isto é uma substituição para um existente {STRING} STR_CONTENT_DETAIL_NAME :{SILVER}Nome: {WHITE}{STRING} STR_CONTENT_DETAIL_VERSION :{SILVER}Versão: {WHITE}{STRING} STR_CONTENT_DETAIL_DESCRIPTION :{SILVER}Descrição: {WHITE}{STRING} @@ -2803,7 +2803,7 @@ STR_RAIL_NAME_MAGLEV :Maglev # Rail depot construction window STR_BUILD_DEPOT_TRAIN_ORIENTATION_CAPTION :{WHITE}Orientação do Depósito Ferroviário -STR_BUILD_DEPOT_TRAIN_ORIENTATION_TOOLTIP :{BLACK}Selecionar a orientação do depósito ferroviário +STR_BUILD_DEPOT_TRAIN_ORIENTATION_TOOLTIP :{BLACK}Selecionar orientação do depósito ferroviário # Rail waypoint construction window STR_WAYPOINT_CAPTION :{WHITE}Ponto de controle @@ -2812,7 +2812,7 @@ STR_WAYPOINT_GRAPHICS_TOOLTIP :{BLACK}Selecion # Rail station construction window STR_STATION_BUILD_RAIL_CAPTION :{WHITE}Seleção de Estação STR_STATION_BUILD_ORIENTATION :{BLACK}Orientação -STR_STATION_BUILD_RAILROAD_ORIENTATION_TOOLTIP :{BLACK}Selecionar a orientação da estação ferroviária +STR_STATION_BUILD_RAILROAD_ORIENTATION_TOOLTIP :{BLACK}Selecionar orientação da estação ferroviária STR_STATION_BUILD_NUMBER_OF_TRACKS :{BLACK}Número de linhas STR_STATION_BUILD_NUMBER_OF_TRACKS_TOOLTIP :{BLACK}Selecionar o número de linhas da estação ferroviária STR_STATION_BUILD_PLATFORM_LENGTH :{BLACK}Tamanho da plataforma @@ -2833,18 +2833,18 @@ STR_STATION_CLASS_WAYP_WAYPOINT :Ponto de contro STR_BUILD_SIGNAL_CAPTION :{WHITE}Seleção de Sinais STR_BUILD_SIGNAL_TOGGLE_ADVANCED_SIGNAL_TOOLTIP :{BLACK}Ativar a exibição dos tipos de sinais avançados STR_BUILD_SIGNAL_SEMAPHORE_NORM_TOOLTIP :{BLACK}Sinal de bloco (semáforo){}Este é o tipo mais básico de sinal, permitindo que apenas um trem fique em um bloco de linha ao mesmo tempo -STR_BUILD_SIGNAL_SEMAPHORE_ENTRY_TOOLTIP :{BLACK}Sinal de Entrada (semáforo){}Fica verde enquanto houver um ou mais sinais de saída verdes na atual seção de trilhos. Caso contrário, fica vermelho +STR_BUILD_SIGNAL_SEMAPHORE_ENTRY_TOOLTIP :{BLACK}Sinal de Entrada (semáforo){}Fica verde enquanto houver um ou mais sinais de saída verdes no trecho da linha. Caso contrário, ficará vermelho STR_BUILD_SIGNAL_SEMAPHORE_EXIT_TOOLTIP :{BLACK}Sinal de saída (semáforo){}Funciona da mesma forma que o sinal de bloco, mas é necessário para ativar a cor correta nos pré-sinais de entrada e combinado. STR_BUILD_SIGNAL_SEMAPHORE_COMBO_TOOLTIP :{BLACK}Sinal combinado (semáforo){}O sinal combinado funciona simultaneamente como um sinal de entrada e de saída. Isto permite a construção de ramificações complexas de pré-sinais. STR_BUILD_SIGNAL_SEMAPHORE_PBS_TOOLTIP :{BLACK}Sinal de trajeto(semáforo){}Um sinal de trajeto permite mais de um trem entrar em um bloco de sinal ao mesmo tempo, se o trem puder reservar um trajeto para um ponto seguro de parada. Sinais de trajeto padrões podem ser passados no sentido contrário STR_BUILD_SIGNAL_SEMAPHORE_PBS_OWAY_TOOLTIP :{BLACK}Sinal de sentido único(semáforo){}Um sinal de trajeto permite mais de um trem em um bloco de sinal ao mesmo tempo, se o trem puder reservar um trajeto para um ponto seguro de parada. Os sinais de sentido único não podem ser passados no sentido contrário STR_BUILD_SIGNAL_ELECTRIC_NORM_TOOLTIP :{BLACK}Sinal de bloco (elétrico){}Este é o tipo mais básico de sinal, permitindo que apenas um trem fique em um bloco de linha em um dado momento -STR_BUILD_SIGNAL_ELECTRIC_ENTRY_TOOLTIP :{BLACK}Sinal de Entrada (elétrico){}Verde enquanto haja um ou mais sinais de saída verdes na atual seção dos trilhos. Do contrário, mostra vermelho +STR_BUILD_SIGNAL_ELECTRIC_ENTRY_TOOLTIP :{BLACK}Sinal de entrada (elétrico){}Fica verde enquanto houver um ou mais sinais de saída verdes no trecho da linha. Caso contrário, ficará vermelho. STR_BUILD_SIGNAL_ELECTRIC_EXIT_TOOLTIP :{BLACK}Sinal de saída (elétrico){}Funciona da mesma forma que o sinal de bloco, mas é necessário para ativar a cor correta nos pré-sinais de entrada e combinado. STR_BUILD_SIGNAL_ELECTRIC_COMBO_TOOLTIP :{BLACK}Sinal combinado (elétrico){}O sinal combinado funciona simultaneamente como um sinal de entrada e de saída. Isto permite construir ramificações complexas de pré-sinais. STR_BUILD_SIGNAL_ELECTRIC_PBS_TOOLTIP :{BLACK}Sinal de trajeto (elétrico){}Um sinal de trajeto permite mais de um trem entrar em um bloco de sinal ao mesmo tempo, se o trem puder reservar um trajeto para um ponto seguro de parada. Sinais de trajeto padrões podem ser passados no sentido contrário STR_BUILD_SIGNAL_ELECTRIC_PBS_OWAY_TOOLTIP :{BLACK}Sinal de sentido único (elétrico){}Um sinal de trajeto permite mais de um trem entrar em um bloco de sinal ao mesmo tempo, se o trem puder reservar um trajeto para um ponto seguro de parada. Os sinais de sentido único não podem ser passados no sentido contrário -STR_BUILD_SIGNAL_CONVERT_TOOLTIP :{BLACK}Converter sinal{}Clique em um sinal existente para convertê-lo para o tipo e variante de sinal selecionado. Ctrl+Clique anterna a variante existente. Shift+Clique mostra o custo estimado da conversão +STR_BUILD_SIGNAL_CONVERT_TOOLTIP :{BLACK}Converter sinal{}Clique em um sinal existente para convertê-lo para o tipo e variante de sinal selecionado. Ctrl+Clique muda a variante existente. Shift+Clique mostra o custo estimado da conversão STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_TOOLTIP :{BLACK}Densidade dos sinais ao clicar e arrastar STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_DECREASE_TOOLTIP :{BLACK}Diminuir a densidade dos sinais STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_INCREASE_TOOLTIP :{BLACK}Aumentar a densidade dos sinais @@ -2894,20 +2894,20 @@ STR_ROAD_NAME_ROAD :Estrada STR_ROAD_NAME_TRAM :Bonde # Road depot construction window -STR_BUILD_DEPOT_ROAD_ORIENTATION_CAPTION :{WHITE}Orientação da Garagem -STR_BUILD_DEPOT_ROAD_ORIENTATION_SELECT_TOOLTIP :{BLACK}Selecionar a orientação da garagem -STR_BUILD_DEPOT_TRAM_ORIENTATION_CAPTION :{WHITE}Orientação do Depósito -STR_BUILD_DEPOT_TRAM_ORIENTATION_SELECT_TOOLTIP :{BLACK}Selecionar a orientação do depósito de bonde +STR_BUILD_DEPOT_ROAD_ORIENTATION_CAPTION :{WHITE}Orientação do Depósito Rodoviário +STR_BUILD_DEPOT_ROAD_ORIENTATION_SELECT_TOOLTIP :{BLACK}Selecionar orientação do depósito rodoviário +STR_BUILD_DEPOT_TRAM_ORIENTATION_CAPTION :{WHITE}Orientação do Depósito de Bondes +STR_BUILD_DEPOT_TRAM_ORIENTATION_SELECT_TOOLTIP :{BLACK}Selecionar orientação do depósito de bondes # Road vehicle station construction window -STR_STATION_BUILD_BUS_ORIENTATION :{WHITE}Orientação do estação de ônibus +STR_STATION_BUILD_BUS_ORIENTATION :{WHITE}Orientação da Estação de Ônibus STR_STATION_BUILD_BUS_ORIENTATION_TOOLTIP :{BLACK}Selecionar orientação do estação de ônibus -STR_STATION_BUILD_TRUCK_ORIENTATION :{WHITE}Orientação da área de carga -STR_STATION_BUILD_TRUCK_ORIENTATION_TOOLTIP :{BLACK}Selecionar a orientação da estação de caminhões -STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION :{WHITE}Orientação da Estação de Bonde Passageiros -STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION_TOOLTIP :{BLACK}Selecionar orientação da estação de bonde -STR_STATION_BUILD_CARGO_TRAM_ORIENTATION :{WHITE}Orientação da Estação de Bondes -STR_STATION_BUILD_CARGO_TRAM_ORIENTATION_TOOLTIP :{BLACK}Selecionar orientação da estação de bondes +STR_STATION_BUILD_TRUCK_ORIENTATION :{WHITE}Orientação da estação de carga +STR_STATION_BUILD_TRUCK_ORIENTATION_TOOLTIP :{BLACK}Selecionar orientação da estação de caminhões +STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION :{WHITE}Orientação da Estação de Bonde de Passageiros +STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION_TOOLTIP :{BLACK}Selecionar orientação da estação de bondes de passageiros +STR_STATION_BUILD_CARGO_TRAM_ORIENTATION :{WHITE}Orientação da Estação de Bondes de Carga +STR_STATION_BUILD_CARGO_TRAM_ORIENTATION_TOOLTIP :{BLACK}Selecionar orientação da estação de bondes de carga # Waterways toolbar (last two for SE only) STR_WATERWAYS_TOOLBAR_CAPTION :{WHITE}Construção de Hidrovias @@ -3106,28 +3106,28 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Campos STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Neve STR_LAI_CLEAR_DESCRIPTION_DESERT :Deserto -STR_LAI_RAIL_DESCRIPTION_TRACK :Trilho de ferrovia -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Trilho de ferrovia com sinais normais -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Trilho de ferrovia com pré-sinais -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Trilho de ferrovia com sinais de saída -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Trilho de ferrovia com sinais-combo -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Trilho de ferrovia com sinais de trajeto -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Trilhos de Ferrovia com sinais de trajeto de mão única -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Trilho de ferrovia com sinais normais e pré-sinais -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Trilho de ferrovia com sinais normais e pré-sinais -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Trilho de ferrovia com sinais normais e sinais-combo -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Trilho de ferrovia com sinais normais e de trajeto -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Trilho de ferrovia com sinais normais e de trajeto de mão única -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Trilho de ferrovia com pré-sinais e de saída -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Trilho de ferrovia com pré-sinais e sinais-combo -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Trilho de ferrovia com pré-sinais e sinais de trajeto -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Trilho de ferrovia com pré-sinais de trajeto e de mão única -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Trilho de ferrovia com sinais de saída e sinais-combo -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Trilho de ferrovia com sinais de saída e de trajeto -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Trilho de ferrovia com sinais de saída de trajeto e de mão única -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Trilho de ferrovia com sinais-combo e de trajeto -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Trilho de ferrovia com sinais-combo de trajeto e de mão única -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Trilho de ferrovia com sinais de trajeto normais e de mão única +STR_LAI_RAIL_DESCRIPTION_TRACK :Ferrovia +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Ferrovia com sinais de bloqueio +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Ferrovia com pré-sinais +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Ferrovia com sinais de saída +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Ferrovia com sinais combinados +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Ferrovia com sinais de trajeto +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Ferrovia com sinais de sentido único +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Ferrovia com sinais de bloqueio e pré-sinais +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Ferrovia com sinais de bloqueio e de saida +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Ferrovia com sinais de bloqueio e combinados +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Ferrovia com sinais de bloqueio e de trajeto +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Ferrovia com sinais de bloqueio e de sentido único +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Ferrovia com pré-sinais e sinais de saida +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Ferrovia com pré-sinais e sinais combinados +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Ferrovia com pré-sinais e sinais de trajeto +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Ferrovia com pré-sinais e sinais de sentido único +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Ferrovia com sinais de saida e combinados +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Ferrovia com sinais de saída e de trajeto +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Ferrovia com sinais de saida e de sentido único +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Ferrovia com sinais combinados e de trajeto +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Ferrovia com sinais combinados e de sentido único +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Ferrovia com sinais de trajeto e de sentido único STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Depósito de ferrovia STR_LAI_ROAD_DESCRIPTION_ROAD :Rodovia @@ -3290,7 +3290,7 @@ STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}No. de cidades: STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP :{BLACK}Selecionar a densidade de cidades ou fornecer um número STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Nome das cidades: -STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Selecionar o estilo dos nomes das cidades +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Selecionar o estilo dos nomes das localidades STR_MAPGEN_DATE :{BLACK}Data: STR_MAPGEN_DATE_TOOLTIP :{BLACK}Selecionar a data inicial STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}No. de indústrias: @@ -3591,8 +3591,8 @@ STR_NEWGRF_SCAN_ARCHIVES :Procurando arqu # Sign list window STR_SIGN_LIST_CAPTION :{WHITE}Lista de Placas - {COMMA} Placa{P "" s} -STR_SIGN_LIST_MATCH_CASE :{BLACK}Diferenciar caixa alta -STR_SIGN_LIST_MATCH_CASE_TOOLTIP :{BLACK}Ativa/Desativa a diferenciação de caixa alta na comparação dos nomes pelo filtro +STR_SIGN_LIST_MATCH_CASE :{BLACK}Diferenciar maiúsculas/minúsculas +STR_SIGN_LIST_MATCH_CASE_TOOLTIP :{BLACK}Ativar correspondência de maiúsculas/minúsculas na comparação dos nomes com a sequência fornecida # Sign window STR_EDIT_SIGN_CAPTION :{WHITE}Editar texto da placa @@ -3626,7 +3626,7 @@ STR_TOWN_VIEW_TOWN_GROWS_EVERY :{BLACK}Localida STR_TOWN_VIEW_TOWN_GROWS_EVERY_FUNDED :{BLACK}Localidade cresce a cada {ORANGE}{UNITS_DAYS_OR_SECONDS} (financiada) STR_TOWN_VIEW_TOWN_GROW_STOPPED :{BLACK}A cidade {RED}não{BLACK} está crescendo STR_TOWN_VIEW_NOISE_IN_TOWN :{BLACK}Limite de ruído na cidade: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA} -STR_TOWN_VIEW_CENTER_TOOLTIP :{BLACK}Centrar visualização na localidade. Ctrl+Clique abre uma nova visualização na posição da localidade +STR_TOWN_VIEW_CENTER_TOOLTIP :{BLACK}Centrar visualização na posição da localidade. Ctrl+Clique abre uma nova visualização na posição da localidade STR_TOWN_VIEW_LOCAL_AUTHORITY_BUTTON :{BLACK}Autoridade Local STR_TOWN_VIEW_LOCAL_AUTHORITY_TOOLTIP :{BLACK}Mostrar informações sobre a autoridade local STR_TOWN_VIEW_RENAME_TOOLTIP :{BLACK}Renomear cidade @@ -3642,7 +3642,7 @@ STR_TOWN_VIEW_RENAME_TOWN_BUTTON :Renomear Cidade STR_LOCAL_AUTHORITY_CAPTION :{WHITE}{TOWN} autoridade local STR_LOCAL_AUTHORITY_ZONE :{BLACK}Zona STR_LOCAL_AUTHORITY_ZONE_TOOLTIP :{BLACK}Mostrar a zona dentro dos limites da autoridade local -STR_LOCAL_AUTHORITY_COMPANY_RATINGS :{BLACK}Avaliações das empresas +STR_LOCAL_AUTHORITY_COMPANY_RATINGS :{BLACK}Classificações das empresas de transporte: STR_LOCAL_AUTHORITY_COMPANY_RATING :{YELLOW}{COMPANY} {COMPANY_NUM}: {ORANGE}{STRING} STR_LOCAL_AUTHORITY_ACTIONS_TITLE :{BLACK}Ações disponíveis: STR_LOCAL_AUTHORITY_ACTIONS_TOOLTIP :{BLACK}Lista de ações disponíveis desta cidade - clique no item para mais detalhes @@ -3680,7 +3680,7 @@ STR_GOALS_GLOBAL_BUTTON_HELPTEXT :{BLACK}Mostrar STR_GOALS_COMPANY_BUTTON :{BLACK}Empresa STR_GOALS_COMPANY_BUTTON_HELPTEXT :{BLACK}Mostrar as metas da empresa STR_GOALS_TEXT :{ORANGE}{STRING} -STR_GOALS_NONE :{G=m}{ORANGE}- Nenhum - +STR_GOALS_NONE :{ORANGE}- Nenhum - STR_GOALS_PROGRESS :{ORANGE}{STRING} STR_GOALS_PROGRESS_COMPLETE :{GREEN}{STRING} STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Clique no objetivo para centrar a vista principal na indústria/localidade/quadrado. Ctrl+Clique abre uma nova visualização na localização da indústria/localidade/quadrado @@ -3744,7 +3744,7 @@ STR_STATION_LIST_USE_CTRL_TO_SELECT_MORE :{BLACK}Manter C STR_STATION_LIST_CAPTION :{WHITE}{COMPANY} - {COMMA} Estações STR_STATION_LIST_STATION :{YELLOW}{STATION} {STATION_FEATURES} STR_STATION_LIST_WAYPOINT :{YELLOW}{WAYPOINT} -STR_STATION_LIST_NONE :{G=m}{YELLOW}- Nenhum - +STR_STATION_LIST_NONE :{YELLOW}- Nenhum - STR_STATION_LIST_SELECT_ALL_FACILITIES :{BLACK}Selecionar todas as instalações STR_STATION_LIST_SELECT_ALL_TYPES :{BLACK}Selecionar todos os tipos de carga (inclusive as que não tem espera) STR_STATION_LIST_NO_WAITING_CARGO :{BLACK}Não há carga de nenhum tipo aguardando @@ -3761,10 +3761,10 @@ STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Aceita: STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Essa estação tem direitos exclusivos de transporte nessa cidade. STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} adquiriu direitos exclusivos de transporte nessa cidade. -STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Avaliações -STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Mostrar avaliações da estação -STR_STATION_VIEW_SUPPLY_RATINGS_TITLE_MONTH :{BLACK}Suprimento por mês e classificação local: -STR_STATION_VIEW_SUPPLY_RATINGS_TITLE_MINUTE :{BLACK}Suprimento por minuto e classificação local: +STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Classificações +STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Mostrar classificações da estação +STR_STATION_VIEW_SUPPLY_RATINGS_TITLE_MONTH :{BLACK}Fornecimento por mês e avaliação local: +STR_STATION_VIEW_SUPPLY_RATINGS_TITLE_MINUTE :{BLACK}Fornecimento por minuto e avaliação local: STR_STATION_VIEW_CARGO_SUPPLY_RATING :{WHITE}{STRING}: {YELLOW}{COMMA} / {STRING} ({COMMA}%) STR_STATION_VIEW_GROUP :{BLACK}Agrupar por @@ -3800,7 +3800,7 @@ STR_CARGO_RATING_VERY_GOOD :Muito Bom STR_CARGO_RATING_EXCELLENT :Excelente STR_CARGO_RATING_OUTSTANDING :Proeminente -STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Centrar visualização na localização da estação. Ctrl+Clique abre uma nova visualização na localização da estação +STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Centrar visualização na posição da estação. Ctrl+Clique abre uma nova visualização na posição da estação STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Alterar o nome da estação STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Mostrar todos os trens que têm esta estação na sua programação @@ -3815,9 +3815,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Impedir # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} -STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Centrar visualização na localização do ponto de controle. Ctrl+Clique abre uma nova visualização na localização do ponto de controle +STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Centrar visualização na posição do ponto de controle. Ctrl+Clique abre uma nova visualização na posição do ponto de controle STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Renomear ponto de controle -STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centrar visualização na localização da bóia. Ctrl+Clique abre uma nova visualização na localização da bóia +STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centrar visualização na posição da bóia. Ctrl+Clique abre uma nova visualização na posição da bóia STR_BUOY_VIEW_CHANGE_BUOY_NAME :{BLACK}Renomear bóia STR_EDIT_WAYPOINT_NAME :{WHITE}Editar nome do ponto de controle @@ -3895,16 +3895,16 @@ STR_COMPANY_VIEW_VIEW_HQ_TOOLTIP :{BLACK}Ver sede STR_COMPANY_VIEW_RELOCATE_HQ :{BLACK}Mover sede STR_COMPANY_VIEW_RELOCATE_COMPANY_HEADQUARTERS :{BLACK}Reconstruir sede da empresa em outro local por 1% do valor da empresa. Shift+Clique mostra o preço estimado sem reconstruir a sede STR_COMPANY_VIEW_INFRASTRUCTURE_BUTTON :{BLACK}Detalhes -STR_COMPANY_VIEW_INFRASTRUCTURE_TOOLTIP :{BLACK}Ver informações detalhadas de infraestrutura +STR_COMPANY_VIEW_INFRASTRUCTURE_TOOLTIP :{BLACK}Ver informações detalhadas da infraestrutura STR_COMPANY_VIEW_GIVE_MONEY_BUTTON :{BLACK}Dar dinheiro -STR_COMPANY_VIEW_GIVE_MONEY_TOOLTIP :{BLACK}Dá dinheiro a essa empresa +STR_COMPANY_VIEW_GIVE_MONEY_TOOLTIP :{BLACK}Dar dinheiro a essa empresa STR_COMPANY_VIEW_HOSTILE_TAKEOVER_BUTTON :{BLACK}Aquisição hostil STR_COMPANY_VIEW_HOSTILE_TAKEOVER_TOOLTIP :{BLACK}Fazer a aquisição hostil desta empresa STR_COMPANY_VIEW_NEW_FACE_BUTTON :{BLACK}Novo Rosto STR_COMPANY_VIEW_NEW_FACE_TOOLTIP :{BLACK}Selecionar novo rosto para o presidente STR_COMPANY_VIEW_COLOUR_SCHEME_BUTTON :{BLACK}Cores -STR_COMPANY_VIEW_COLOUR_SCHEME_TOOLTIP :{BLACK}Alterar cores dos veículos +STR_COMPANY_VIEW_COLOUR_SCHEME_TOOLTIP :{BLACK}Alterar cores dos veículos da empresa STR_COMPANY_VIEW_COMPANY_NAME_BUTTON :{BLACK}Empresa STR_COMPANY_VIEW_COMPANY_NAME_TOOLTIP :{BLACK}Alterar nome da empresa STR_COMPANY_VIEW_PRESIDENT_NAME_BUTTON :{BLACK}Presidente @@ -4050,13 +4050,13 @@ STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Nova Locomotiva STR_BUY_VEHICLE_TRAIN_MONORAIL_CAPTION :Nova Locomotiva Monotrilho STR_BUY_VEHICLE_TRAIN_MAGLEV_CAPTION :Nova Locomotiva Maglev -STR_BUY_VEHICLE_ROAD_VEHICLE_CAPTION :Novos Automóveis -STR_BUY_VEHICLE_TRAM_VEHICLE_CAPTION :Novo Veículo Elétrico +STR_BUY_VEHICLE_ROAD_VEHICLE_CAPTION :Novos Veículos Rodoviários +STR_BUY_VEHICLE_TRAM_VEHICLE_CAPTION :Novos Veículos tipo Bonde # Vehicle availability ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_ALL_CAPTION :Trens -STR_BUY_VEHICLE_ROAD_VEHICLE_ALL_CAPTION :Novo Veículo Terrestre +STR_BUY_VEHICLE_ROAD_VEHICLE_ALL_CAPTION :Novos Veículos Rodoviários STR_BUY_VEHICLE_SHIP_CAPTION :Novas Embarcações STR_BUY_VEHICLE_AIRCRAFT_CAPTION :Nova Aeronave @@ -4131,7 +4131,7 @@ STR_BUY_VEHICLE_AIRCRAFT_RENAME_BUTTON :{BLACK}Renomear ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_RENAME_TOOLTIP :{BLACK}Renomear tipo de veículo ferroviário -STR_BUY_VEHICLE_ROAD_VEHICLE_RENAME_TOOLTIP :{BLACK}Renomear tipo do automóvel +STR_BUY_VEHICLE_ROAD_VEHICLE_RENAME_TOOLTIP :{BLACK}Renomear tipo de veículo rodoviário STR_BUY_VEHICLE_SHIP_RENAME_TOOLTIP :{BLACK}Renomear tipo de embarcação STR_BUY_VEHICLE_AIRCRAFT_RENAME_TOOLTIP :{BLACK}Renomear tipo de aeronave @@ -4282,10 +4282,10 @@ STR_REPLACE_VEHICLE_AVAILABLE_VEHICLES :{YELLOW}Veícul STR_REPLACE_VEHICLE_AVAILABLE_VEHICLES_TOOLTIP :{BLACK}Coluna com os veículos disponíveis para substituição ###length VEHICLE_TYPES -STR_REPLACE_VEHICLE_TRAIN :{G=m}Trem -STR_REPLACE_VEHICLE_ROAD_VEHICLE :{G=m}Automóvel -STR_REPLACE_VEHICLE_SHIP :{G=m}Embarcação -STR_REPLACE_VEHICLE_AIRCRAFT :{G=f}Aeronave +STR_REPLACE_VEHICLE_TRAIN :Trem +STR_REPLACE_VEHICLE_ROAD_VEHICLE :Veículo rodoviário +STR_REPLACE_VEHICLE_SHIP :Embarcação +STR_REPLACE_VEHICLE_AIRCRAFT :Aeronave STR_REPLACE_HELP_LEFT_ARRAY :{BLACK}Selecionar o tipo de motor para substituir STR_REPLACE_HELP_RIGHT_ARRAY :{BLACK}Selecionar o novo tipo de motor para substituir o que selecionou à esquerda @@ -4770,13 +4770,13 @@ STR_AI_DEBUG_RELOAD_TOOLTIP :{BLACK}Desativa STR_AI_DEBUG_BREAK_STR_ON_OFF_TOOLTIP :{BLACK}Ativar/desativar a pausa quando uma mensagem de registo da IA corresponder à sequência de pausa STR_AI_DEBUG_BREAK_ON_LABEL :{BLACK}Falha em: STR_AI_DEBUG_BREAK_STR_OSKTITLE :{BLACK}Parar em -STR_AI_DEBUG_BREAK_STR_TOOLTIP :{BLACK}Quando uma mensagem do registo da IA corresponder a esta sequência, o jogo é pausado -STR_AI_DEBUG_MATCH_CASE :{BLACK}Caso de igualdade -STR_AI_DEBUG_MATCH_CASE_TOOLTIP :{BLACK}Ativar a verificação de letras maiúsculas/minúsculas quando comparar as mensagens de resgistro da IA com a sequência de parada +STR_AI_DEBUG_BREAK_STR_TOOLTIP :{BLACK}Quando uma mensagem de registo da IA for igual a esta sequência, o jogo é pausado +STR_AI_DEBUG_MATCH_CASE :{BLACK}Diferenciar maiúsculas/minúsculas +STR_AI_DEBUG_MATCH_CASE_TOOLTIP :{BLACK}Ativar correspondência de maiúsculas/minúsculas na comparação das mensagens de resgistro da IA com a sequência de parada STR_AI_DEBUG_CONTINUE :{BLACK}Continuar STR_AI_DEBUG_CONTINUE_TOOLTIP :{BLACK}Sair da pausa e continuar a IA STR_AI_DEBUG_SELECT_AI_TOOLTIP :{BLACK}Ver saída de depuração desta IA -STR_AI_GAME_SCRIPT :{BLACK}Game Script +STR_AI_GAME_SCRIPT :{BLACK}Script de jogo STR_AI_GAME_SCRIPT_TOOLTIP :{BLACK}Verifique o registo do Script de jogo STR_ERROR_AI_NO_AI_FOUND :Nenhuma IA adequada encontrada para carregar.{} Esta IA é falsa e não irá fazer nada.{} Você pode pode baixar várias IA através do sistema de 'Conteúdo Online' @@ -4790,19 +4790,19 @@ STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}O script STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}As IAs que serão carregadas no próximo jogo STR_AI_CONFIG_HUMAN_PLAYER :Jogador humano STR_AI_CONFIG_RANDOM_AI :IA aleatória -STR_AI_CONFIG_NONE :{G=m}(nenhum) +STR_AI_CONFIG_NONE :(nenhum) STR_AI_CONFIG_NAME_VERSION :{STRING} {YELLOW}v{NUM} STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Número máximo de concorrentes: {ORANGE}{COMMA} STR_AI_CONFIG_COMPETITORS_INTERVAL :{LTBLUE}Intervalo entre o começo dos competidores: {ORANGE}{COMMA} minuto{P "" s} STR_AI_CONFIG_MOVE_UP :{BLACK}Subir -STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Mover a IA selecionada para cima na lista +STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Move a IA seleccionada para cima STR_AI_CONFIG_MOVE_DOWN :{BLACK}Descer -STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Mover a IA selecionada para baixo na lista +STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Move a IA seleccionada para baixo STR_AI_CONFIG_GAMESCRIPT :{SILVER}Script do jogo STR_AI_CONFIG_GAMESCRIPT_PARAM :{SILVER}Parâmetros -STR_AI_CONFIG_AI :{G=f}{SILVER}IAs +STR_AI_CONFIG_AI :{SILVER}IAs STR_AI_CONFIG_CHANGE_AI :{BLACK}Selecionar IA STR_AI_CONFIG_CHANGE_GAMESCRIPT :{BLACK}Selecionar Script do Jogo @@ -4812,7 +4812,7 @@ STR_AI_CONFIG_CONFIGURE_TOOLTIP :{BLACK}Configur # Available AIs window STR_AI_LIST_CAPTION :{WHITE}Disponíveis {STRING} -STR_AI_LIST_CAPTION_AI :{G=f}IAs +STR_AI_LIST_CAPTION_AI :IAs STR_AI_LIST_CAPTION_GAMESCRIPT :Scripts de jogo STR_AI_LIST_TOOLTIP :{BLACK}Clique para selecionar um script @@ -5390,43 +5390,43 @@ STR_TOWN_BUILDING_NAME_PIGGY_BANK_1 :Mealheiro ##id 0x4800 # industry names -STR_INDUSTRY_NAME_COAL_MINE :{G=f}Mina de Carvão -STR_INDUSTRY_NAME_POWER_STATION :{G=f}Usina de Energia -STR_INDUSTRY_NAME_SAWMILL :{G=f}Serraria -STR_INDUSTRY_NAME_FOREST :{G=f}Floresta -STR_INDUSTRY_NAME_OIL_REFINERY :{G=f}Refinaria de Petróleo -STR_INDUSTRY_NAME_OIL_RIG :{G=f}Plataforma Petrolífera -STR_INDUSTRY_NAME_FACTORY :{G=f}Fábrica -STR_INDUSTRY_NAME_PRINTING_WORKS :{G=f}Gráfica -STR_INDUSTRY_NAME_STEEL_MILL :{G=f}Siderurgica -STR_INDUSTRY_NAME_FARM :{G=f}Fazenda -STR_INDUSTRY_NAME_COPPER_ORE_MINE :{G=f}Mina de Cobre -STR_INDUSTRY_NAME_OIL_WELLS :{G=m}Poços de Petróleo -STR_INDUSTRY_NAME_BANK :{G=f}Banco -STR_INDUSTRY_NAME_FOOD_PROCESSING_PLANT :{G=f}Indústria Alimentícia -STR_INDUSTRY_NAME_PAPER_MILL :{G=f}Fábrica de Papel -STR_INDUSTRY_NAME_GOLD_MINE :{G=f}Mina de Ouro -STR_INDUSTRY_NAME_BANK_TROPIC_ARCTIC :{G=m}Banco -STR_INDUSTRY_NAME_DIAMOND_MINE :{G=f}Mina de Diamante -STR_INDUSTRY_NAME_IRON_ORE_MINE :{G=f}Mina de Ferro -STR_INDUSTRY_NAME_FRUIT_PLANTATION :{G=m}Pomar -STR_INDUSTRY_NAME_RUBBER_PLANTATION :{G=f}Plantação de Seringueiras -STR_INDUSTRY_NAME_WATER_SUPPLY :{G=m}Poço Artesiano -STR_INDUSTRY_NAME_WATER_TOWER :{G=m}Reservatório de Água -STR_INDUSTRY_NAME_FACTORY_2 :{G=f}Fábrica -STR_INDUSTRY_NAME_FARM_2 :{G=f}Fazenda -STR_INDUSTRY_NAME_LUMBER_MILL :{G=f}Serraria -STR_INDUSTRY_NAME_COTTON_CANDY_FOREST :{G=f}Floresta de Algodão Doce -STR_INDUSTRY_NAME_CANDY_FACTORY :{G=f}Fábrica de Doces -STR_INDUSTRY_NAME_BATTERY_FARM :{G=m}Campo de Pilhas -STR_INDUSTRY_NAME_COLA_WELLS :{G=m}Poços de Xarope -STR_INDUSTRY_NAME_TOY_SHOP :{G=f}Loja de Brinquedos -STR_INDUSTRY_NAME_TOY_FACTORY :{G=f}Fábrica de Brinquedos -STR_INDUSTRY_NAME_PLASTIC_FOUNTAINS :{G=f}Fontes de Plástico -STR_INDUSTRY_NAME_FIZZY_DRINK_FACTORY :{G=f}Fábrica de Refrigerante -STR_INDUSTRY_NAME_BUBBLE_GENERATOR :{G=m}Gerador de Bolhas -STR_INDUSTRY_NAME_TOFFEE_QUARRY :{G=f}Extração de Caramelo -STR_INDUSTRY_NAME_SUGAR_MINE :{G=f}Mina de Açúcar +STR_INDUSTRY_NAME_COAL_MINE :Mina de Carvão +STR_INDUSTRY_NAME_POWER_STATION :Usina de Energia +STR_INDUSTRY_NAME_SAWMILL :Serraria +STR_INDUSTRY_NAME_FOREST :Floresta +STR_INDUSTRY_NAME_OIL_REFINERY :Refinaria de Petróleo +STR_INDUSTRY_NAME_OIL_RIG :Plataforma Petrolífera +STR_INDUSTRY_NAME_FACTORY :Fábrica +STR_INDUSTRY_NAME_PRINTING_WORKS :Gráfica +STR_INDUSTRY_NAME_STEEL_MILL :Siderúrgica +STR_INDUSTRY_NAME_FARM :Fazenda +STR_INDUSTRY_NAME_COPPER_ORE_MINE :Mina de Minério Cobre +STR_INDUSTRY_NAME_OIL_WELLS :Poços de Petróleo +STR_INDUSTRY_NAME_BANK :Banco +STR_INDUSTRY_NAME_FOOD_PROCESSING_PLANT :Indústria Alimentícia +STR_INDUSTRY_NAME_PAPER_MILL :Fábrica de Papel +STR_INDUSTRY_NAME_GOLD_MINE :Mina de Ouro +STR_INDUSTRY_NAME_BANK_TROPIC_ARCTIC :Banco +STR_INDUSTRY_NAME_DIAMOND_MINE :Mina de Diamantes +STR_INDUSTRY_NAME_IRON_ORE_MINE :Mina de Minério de Ferro +STR_INDUSTRY_NAME_FRUIT_PLANTATION :Plantação de Frutas +STR_INDUSTRY_NAME_RUBBER_PLANTATION :Plantação de Seringueiras +STR_INDUSTRY_NAME_WATER_SUPPLY :Fornecimento de àgua +STR_INDUSTRY_NAME_WATER_TOWER :Reservatório de Água +STR_INDUSTRY_NAME_FACTORY_2 :Fábrica +STR_INDUSTRY_NAME_FARM_2 :Fazenda +STR_INDUSTRY_NAME_LUMBER_MILL :Serraria +STR_INDUSTRY_NAME_COTTON_CANDY_FOREST :Floresta de Algodão Doce +STR_INDUSTRY_NAME_CANDY_FACTORY :Fábrica de Doces +STR_INDUSTRY_NAME_BATTERY_FARM :Produção de Pilhas +STR_INDUSTRY_NAME_COLA_WELLS :Poços de xarope de cola +STR_INDUSTRY_NAME_TOY_SHOP :Loja de Brinquedos +STR_INDUSTRY_NAME_TOY_FACTORY :Fábrica de Brinquedos +STR_INDUSTRY_NAME_PLASTIC_FOUNTAINS :Fontes de Plástico +STR_INDUSTRY_NAME_FIZZY_DRINK_FACTORY :Fábrica de Refrigerantes +STR_INDUSTRY_NAME_BUBBLE_GENERATOR :Gerador de Bolhas +STR_INDUSTRY_NAME_TOFFEE_QUARRY :Extração de Caramelo +STR_INDUSTRY_NAME_SUGAR_MINE :Mina de Açúcar ############ WARNING, using range 0x6000 for strings that are stored in the savegame ############ These strings may never get a new id, or savegames will break! diff --git a/src/lang/czech.txt b/src/lang/czech.txt index 9e43ca9e76..60551f1577 100644 --- a/src/lang/czech.txt +++ b/src/lang/czech.txt @@ -267,6 +267,11 @@ STR_COLOUR_RANDOM :Náhodná ###length 17 STR_COLOUR_SECONDARY_DARK_BLUE :Tmavomodrá +STR_COLOUR_SECONDARY_SECONDARY_PINK :Růžová +STR_COLOUR_SECONDARY_LIGHT_BLUE :Světle modrá +STR_COLOUR_SECONDARY_GREEN :Zelená +STR_COLOUR_SECONDARY_PURPLE :Purpurová +STR_COLOUR_SECONDARY_ORANGE :Oranžová STR_COLOUR_SECONDARY_BROWN :Hnědá STR_COLOUR_SECONDARY_GREY :Šedá STR_COLOUR_SECONDARY_WHITE :Bílá @@ -276,6 +281,7 @@ STR_COLOUR_SECONDARY_WHITE :Bílá STR_UNITS_VELOCITY_IMPERIAL :{DECIMAL}{NBSP}m{P íle íle il}/h STR_UNITS_VELOCITY_METRIC :{DECIMAL}{NBSP}km/h STR_UNITS_VELOCITY_SI :{DECIMAL}{NBSP}m/s +STR_UNITS_VELOCITY_KNOTS :{DECIMAL}{NBSP}uz{P el ly lů} STR_UNITS_POWER_IMPERIAL :{DECIMAL}{NBSP}hp STR_UNITS_POWER_METRIC :{DECIMAL}{NBSP}hp @@ -317,7 +323,9 @@ STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP} # Time units used in string control characters +STR_UNITS_MINUTES :{NUM}{NBSP}minut{P a y ""} +STR_UNITS_YEARS :{NUM}{NBSP}{P rok roky let} # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filtrovat řetězec: @@ -412,7 +420,9 @@ STR_SORT_BY_POPULATION :Podle populace STR_SORT_BY_RATING :Hodnocení STR_SORT_BY_NUM_VEHICLES :Počet vozidel STR_SORT_BY_TOTAL_PROFIT_LAST_YEAR :Letošní celkový zisk +STR_SORT_BY_TOTAL_PROFIT_LAST_PERIOD :Celkový zisk v minulém období STR_SORT_BY_TOTAL_PROFIT_THIS_YEAR :Celkový letošní zisk +STR_SORT_BY_TOTAL_PROFIT_THIS_PERIOD :Celkový zisk v tomto období STR_SORT_BY_AVERAGE_PROFIT_LAST_YEAR :Loňský průměrný zisk STR_SORT_BY_AVERAGE_PROFIT_THIS_YEAR :Průměrný letošní zisk @@ -772,6 +782,7 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Skladba STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Hudební stopu odstraníš ze současného programu (pouze u vlastního) kliknutím na ni # Highscore window +STR_HIGHSCORE_TOP_COMPANIES :{BIG_FONT}{BLACK}Nejlepší společnosti STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Obchodník STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Manažer @@ -864,6 +875,7 @@ STR_STATUSBAR_AUTOSAVE :{RED}Automatick STR_STATUSBAR_SAVING_GAME :{RED}* * HRA SE UKLÁDÁ * * STR_STATUSBAR_SPECTATOR :{WHITE}(spectator) +STR_STATUSBAR_INFINITE_MONEY :{WHITE}(neomezené peníze) # News message history STR_MESSAGE_HISTORY :{WHITE}Historie zpráv @@ -986,6 +998,8 @@ STR_GAME_OPTIONS_VOLUME :Hlasitost STR_GAME_OPTIONS_MUSIC_VOLUME :Hudba STR_GAME_OPTIONS_VOLUME_0 :0% +STR_GAME_OPTIONS_VOLUME_25 :25 % +STR_GAME_OPTIONS_VOLUME_50 :50 % STR_GAME_OPTIONS_VOLUME_75 :75% STR_GAME_OPTIONS_VOLUME_100 :100% @@ -1082,6 +1096,8 @@ STR_GAME_OPTIONS_GUI_SCALE_3X :3x STR_GAME_OPTIONS_GUI_SCALE_4X :4x STR_GAME_OPTIONS_GUI_SCALE_5X :5x +STR_GAME_OPTIONS_PARTICIPATE_SURVEY :{BLACK}Účastnit se automatického průzkumu +STR_GAME_OPTIONS_PARTICIPATE_SURVEY_LINK :{BLACK}O anketě a ochraně soukromí STR_GAME_OPTIONS_PARTICIPATE_SURVEY_PREVIEW :{BLACK}Náhled výsledků průzkumu STR_GAME_OPTIONS_PARTICIPATE_SURVEY_PREVIEW_TOOLTIP :{BLACK}Zobrazovat výsledek průzkumu z aktuálně běžící hry @@ -1105,6 +1121,7 @@ STR_GAME_OPTIONS_BASE_MUSIC_TOOLTIP :{BLACK}Vyberte STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP :{BLACK}Další informace o základním hudebním setu +STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE :{BLACK}Stav zásuvného modulu: @@ -1216,6 +1233,7 @@ STR_CONFIG_SETTING_EXPAND_ALL :{BLACK}Rozbalit STR_CONFIG_SETTING_COLLAPSE_ALL :{BLACK}Sbalit vše STR_CONFIG_SETTING_RESET_ALL :{BLACK}Vymazat všechny hodnoty STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT :(žádné vysvětlení není k dispozici) +STR_CONFIG_SETTING_VALUE :{PUSH_COLOUR}{ORANGE}{STRING}{POP_COLOUR} STR_CONFIG_SETTING_DEFAULT_VALUE :{LTBLUE}Výchozí hodnota: {ORANGE}{STRING} STR_CONFIG_SETTING_TYPE :{LTBLUE}Typ nastavení: {ORANGE}{STRING} STR_CONFIG_SETTING_TYPE_CLIENT :Nastavení klienta (není uchováno v uložených hrách; ovlivní všechny hry) @@ -1397,6 +1415,7 @@ STR_CONFIG_SETTING_SHOWFINANCES :Ukazovat finan ###length 2 STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT :Na konci každého roku zobrazit okno s finančním přehledem pro snadnou kontrolu hospodaření společnosti. +STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT_PERIOD :Pokud je zapnuto, na konci každého období se zobrazí okno s finančním přehledem pro snadnou kontrolu hospodaření společnosti. STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :Vydávat nové příkazy jako 'bez zastavení': {STRING} STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :Normálně vozidlo zastavuje v každé stanici, kterou projíždí. Zapnutím této možnosti budou všechny nově vydané příkazy "Jet do" vydávány jako "bez zastavení" a vozidlo tak každou stanicí po cestě do cíle pouze projede bez odbavení. U jednotlivých příkazů nicméně lze ručně nastavit odlišné chování. @@ -1447,6 +1466,7 @@ STR_CONFIG_SETTING_PLANE_CRASHES_NONE :Žádná* STR_CONFIG_SETTING_PLANE_CRASHES_REDUCED :Redukovaný STR_CONFIG_SETTING_PLANE_CRASHES_NORMAL :Obvyklý +STR_CONFIG_SETTING_CROSSING_WITH_COMPETITOR_HELPTEXT :Povolit výstavbu železničních přejezdů na silnicích nebo železničních tratích vlastněných jinými společnostmi STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD :Stavba průjezdných zastávek na obecních silnicích: {STRING} STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD_HELPTEXT :Povoluje stavbu průjezdných stanic na městem vlastněných silnicích @@ -1483,6 +1503,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Pokud je zapnut ###length 2 +STR_CONFIG_SETTING_MINUTES_PER_YEAR :Minut v roce: {STRING} ###setting-zero-is-special @@ -1696,6 +1717,7 @@ STR_CONFIG_SETTING_LOADING_INDICATORS :Používat ukaz STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Vyber jestli budou zobrazovány ukazatele naložení nad nakládajícími a vykládajícími vozidly. ###length 3 +STR_CONFIG_SETTING_TIMETABLE_MODE_SECONDS :Sekundy STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Ukazovat v jízdním řádu příjezdy a odjezdy: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Zobrazit předpokládané časy příjezdu a odjezdu v jízdních řádech. @@ -1803,6 +1825,8 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Vypnuto STR_CONFIG_SETTING_NOSERVICE :Vypnout servisy, když jsou vypnuty poruchy: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Pokud je zapnuto a zároveň jsou vypnuty poruchy, vozidla nebudou vůbec jezdit do servisu, protože se nemohou nikdy porouchat +STR_CONFIG_SETTING_STATION_LENGTH_LOADING_PENALTY :Pomalejší nakládání u vlaků delších než stanice: {STRING} +STR_CONFIG_SETTING_STATION_LENGTH_LOADING_PENALTY_HELPTEXT :Pokud je zapnuto, u vlaků delší než stanice je nakládání pomalejší než u vlaků, které se do stanice vejdou. Nastavení neovlivňuje hledání cesty. STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Zapnout omezení rychlosti vagonů: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Pokud zapnuto, použije rychlostní omezení vagónů při stanovení maximální rychlosti vlaku @@ -2023,6 +2047,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT :Kdykoliv se ryc STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL :Imperiální (mph) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_METRIC :Metrické (km/h) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_SI :SI (m/s) +STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_KNOTS :uzly STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :Jednotky výkonu vozidla: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_HELPTEXT :Kdykoliv se výkon vozidla zobrazí v uživatelském rozhraní, bude ve zvolených jednotkách @@ -2072,6 +2097,7 @@ STR_CONFIG_SETTING_ACCOUNTING :Účetnictví STR_CONFIG_SETTING_VEHICLES :Dopravní prostředky STR_CONFIG_SETTING_VEHICLES_PHYSICS :Fyzika STR_CONFIG_SETTING_VEHICLES_ROUTING :Směrování +STR_CONFIG_SETTING_VEHICLES_ORDERS :Příkazy STR_CONFIG_SETTING_LIMITATIONS :Omezení STR_CONFIG_SETTING_ACCIDENTS :Katastrofy / Nehody STR_CONFIG_SETTING_GENWORLD :Generování krajiny @@ -2080,6 +2106,7 @@ STR_CONFIG_SETTING_ENVIRONMENT_AUTHORITIES :Městská sprá STR_CONFIG_SETTING_ENVIRONMENT_TOWNS :Města STR_CONFIG_SETTING_ENVIRONMENT_INDUSTRIES :Průmysl STR_CONFIG_SETTING_ENVIRONMENT_CARGODIST :Distribuce nákladu +STR_CONFIG_SETTING_ENVIRONMENT_TREES :Stromy STR_CONFIG_SETTING_AI :Konkurenti STR_CONFIG_SETTING_AI_NPC :Umělá inteligence STR_CONFIG_SETTING_NETWORK :Síť @@ -2203,6 +2230,7 @@ STR_LIVERY_TRAIN_TOOLTIP :{BLACK}Zobrazit STR_LIVERY_ROAD_VEHICLE_TOOLTIP :{BLACK}Zobrazit barevná schémata pro silniční vozidla STR_LIVERY_SHIP_TOOLTIP :{BLACK}Zobrazit barevná schémata pro lodě STR_LIVERY_AIRCRAFT_TOOLTIP :{BLACK}Zobrazit barevná schémata pro letadla +STR_LIVERY_SHIP_GROUP_TOOLTIP :{BLACK}Zobrazit barvy skupin lodí STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}Vybrat primární barvu označeného schématu. Ctrl+kliknutí nastaví tuto barvu každému schématu STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}Vybrat sekundární barvu označeného schématu. Ctrl+Kliknutí nastaví tuto barvu každému schématu STR_LIVERY_PANEL_TOOLTIP :{BLACK}Vyber, které barevné schéma chceš změnit (více označíš s Ctrl). Schéma změníš kliknutím na tlačítko @@ -3820,6 +3848,7 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Průplav STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Stanice: STR_COMPANY_INFRASTRUCTURE_VIEW_STATIONS :{WHITE}Staniční oblasti STR_COMPANY_INFRASTRUCTURE_VIEW_AIRPORTS :{WHITE}Letiště +STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL_PERIOD :{WHITE}{CURRENCY_LONG}/období # Industry directory STR_INDUSTRY_DIRECTORY_CAPTION :{WHITE}Průmysl @@ -4145,6 +4174,9 @@ STR_ENGINE_PREVIEW_TRAM_VEHICLE :tramvaj STR_ENGINE_PREVIEW_AIRCRAFT :{G=n}letadlo STR_ENGINE_PREVIEW_SHIP :{G=f}loď +STR_ENGINE_PREVIEW_SPEED_POWER :Rychlost: {VELOCITY} Výkon: {POWER} +STR_ENGINE_PREVIEW_TYPE_RANGE :Typ letadla: {STRING} Dosah: {COMMA} políč{P ko ka ek} +STR_ENGINE_PREVIEW_RUNCOST_YEAR :Provozní náklady: {CURRENCY_LONG}/rok # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Vyměňování {STRING} - {STRING} @@ -4309,6 +4341,7 @@ STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Kapacita STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Podíl za převoz: {LTBLUE}{CURRENCY_LONG} +STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES :{BLACK}Prodloužit interval údržby o 5 minut. Ctrl+kliknutí prodlouží interval údržby o 1 minutu. STR_SERVICE_INTERVAL_DROPDOWN_TOOLTIP :{BLACK}Změnit typ servisního intervalu STR_VEHICLE_DETAILS_DEFAULT :Defaultní @@ -4416,6 +4449,7 @@ STR_ORDER_DROP_HALT_DEPOT :Zastavit # Depot action tooltips, one per vehicle type ###length VEHICLE_TYPES +STR_ORDER_ROAD_DEPOT_ACTION_TOOLTIP :{BLACK}Vyber příkaz k provedení v této garáži ###next-name-looks-similar STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Vlastnost vozidla, podle které přeskakovat @@ -4562,6 +4596,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Vozidlo STR_TIMETABLE_STATUS_LATE :{BLACK}Vozidlo má {STRING} zpoždění STR_TIMETABLE_STATUS_EARLY :{BLACK}Vozidlo jede {STRING} napřed STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Tento jízdní řád ještě nezačal +STR_TIMETABLE_STATUS_START_AT_DATE :{BLACK}Tento jízdní řád začne {STRING} +STR_TIMETABLE_STATUS_START_IN_SECONDS :{BLACK}Tento jízdní řád začne za {COMMA} sekund{P u y ""} @@ -5716,6 +5752,7 @@ STR_UNKNOWN_STATION :neznámá stani STR_DEFAULT_SIGN_NAME :Nápis STR_COMPANY_SOMEONE :někdo +STR_SAVEGAME_DURATION_REALTIME :{NUM}h {NUM}m STR_SAVEGAME_NAME_DEFAULT :{COMPANY}, {STRING} STR_SAVEGAME_NAME_SPECTATOR :Pozorovatel, {1:STRING} diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt index 0f5e12ef34..6a7ac5d005 100644 --- a/src/lang/english_US.txt +++ b/src/lang/english_US.txt @@ -4562,6 +4562,10 @@ STR_ORDER_DROP_UNBUNCH :Unbunch # Depot action tooltips, one per vehicle type ###length VEHICLE_TYPES +STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP :{BLACK}Select the action to take at this depot +STR_ORDER_ROAD_DEPOT_ACTION_TOOLTIP :{BLACK}Select the action to take at this depot +STR_ORDER_SHIP_DEPOT_ACTION_TOOLTIP :{BLACK}Select the action to take at this depot +STR_ORDER_HANGAR_ACTION_TOOLTIP :{BLACK}Select the action to take at this hangar ###next-name-looks-similar STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Vehicle data to base jumping on diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index 191650dc5a..c3df8a9dc0 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -384,32 +384,32 @@ STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}Tauko STR_TOOLBAR_TOOLTIP_FORWARD :{BLACK}Nopeuta peliä STR_TOOLBAR_TOOLTIP_OPTIONS :{BLACK}Valinnat ja asetukset STR_TOOLBAR_TOOLTIP_SAVE_GAME_ABANDON_GAME :{BLACK}Tallenna, lataa tai hylkää peli, lopeta ohjelma -STR_TOOLBAR_TOOLTIP_DISPLAY_MAP :{BLACK}Näytä kartta, lisänäkymä, rahtivirrat tai kylttilista -STR_TOOLBAR_TOOLTIP_DISPLAY_TOWN_DIRECTORY :{BLACK}Näytä kuntahakemisto -STR_TOOLBAR_TOOLTIP_DISPLAY_SUBSIDIES :{BLACK}Näytä tukitarjoukset -STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_STATIONS :{BLACK}Näytä luettelo yhtiön asemista +STR_TOOLBAR_TOOLTIP_DISPLAY_MAP :{BLACK}Avaa kartta, lisänäkymä, rahtivirrat tai kylttilista +STR_TOOLBAR_TOOLTIP_DISPLAY_TOWN_DIRECTORY :{BLACK}Näytä kuntahakemisto tai perusta kunta +STR_TOOLBAR_TOOLTIP_DISPLAY_SUBSIDIES :{BLACK}Avaa lista tuista +STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_STATIONS :{BLACK}Avaa luettelo yhtiön asemista STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_FINANCES :{BLACK}Näytä yhtiön taloustiedot STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_GENERAL :{BLACK}Näytä yhtiön yleiset tiedot -STR_TOOLBAR_TOOLTIP_DISPLAY_STORY_BOOK :{BLACK}Näytä yhtiöhistoria -STR_TOOLBAR_TOOLTIP_DISPLAY_GOALS_LIST :{BLACK}Näytä tavoitteet +STR_TOOLBAR_TOOLTIP_DISPLAY_STORY_BOOK :{BLACK}Avaa tarinakirja +STR_TOOLBAR_TOOLTIP_DISPLAY_GOALS_LIST :{BLACK}Avaa tavoiteluettelo STR_TOOLBAR_TOOLTIP_DISPLAY_GRAPHS :{BLACK}Näytä yhtiökuvaajat ja rahtitaksat -STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE :{BLACK}Näytä yhtiökilpataulukko -STR_TOOLBAR_TOOLTIP_FUND_CONSTRUCTION_OF_NEW :{BLACK}Tutki teollisuuslaitoksia tai rahoita uuden teollisuuden rakentamista +STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE :{BLACK}Avaa yhtiökilpataulukko +STR_TOOLBAR_TOOLTIP_FUND_CONSTRUCTION_OF_NEW :{BLACK}Avaa teollisuushakemisto, teollisuusketjut, tai rahoita uuden teollisuuden rakentaminen STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_TRAINS :{BLACK}Avaa luettelo yhtiön junista. Ctrl+napsautus näyttää tai piilottaa kulkuneuvoryhmät päinvastoin kuin valitussa asetuksessa. STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_ROAD_VEHICLES :{BLACK}Avaa luettelo yhtiön ajoneuvoista. Ctrl+napsautus näyttää tai piilottaa ajoneuvoryhmät päinvastoin kuin valitussa asetuksessa -STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_SHIPS :{BLACK}Näytä luettelo yhtiön laivoista. Ctrl+napsautus näyttää luettelon ilman ryhmäluetteloa. -STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_AIRCRAFT :{BLACK}Näytä luettelo yhtiön ilma-aluksista. Ctrl+napsautus näyttää luettelon ilman ryhmäluetteloa. -STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN :{BLACK}Lähennä näkymää -STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT :{BLACK}Loitonna näkymää +STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_SHIPS :{BLACK}Avaa luettelo yhtiön laivoista. Ctrl+napsautus näyttää tai piilottaa kulkuneuvoryhmät, päinvastoin kuin valitussa asetuksessa +STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_AIRCRAFT :{BLACK}Näytä luettelo yhtiön ilma-aluksista. Ctrl+napsautus näyttääksesi näyttää tai piilottaa ajoneuvoryhmiä, päinvastoin kuin valitussa asetuksessa +STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN :{BLACK}Lähennä +STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT :{BLACK}Loitonna STR_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Rakenna rautateitä STR_TOOLBAR_TOOLTIP_BUILD_ROADS :{BLACK}Tieinfrastruktuurin rakentaminen STR_TOOLBAR_TOOLTIP_BUILD_TRAMWAYS :{BLACK}Raitiotieinfrastruktuurin rakentaminen STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS :{BLACK}Vesiväyläinfrastruktuurin rakentaminen STR_TOOLBAR_TOOLTIP_BUILD_AIRPORTS :{BLACK}Rakenna lentokenttiä -STR_TOOLBAR_TOOLTIP_LANDSCAPING :{BLACK}Avaa maastonmuokkaustyökalupalkki maan kohottamiseen/madaltamiseen, puiden istuttamiseen, jne. +STR_TOOLBAR_TOOLTIP_LANDSCAPING :{BLACK}Avaa maastonmuokkausvalikko, puuvalikko, tai aseta kyltti STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW :{BLACK}Avaa ääni- ja musiikkiasetukset -STR_TOOLBAR_TOOLTIP_SHOW_LAST_MESSAGE_NEWS :{BLACK}Näytä viimeisin viesti/uutisraportti, näytä viestihistoria tai poista kaikki viestit -STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION :{BLACK}Maa-aluetiedot, kuvakaappaus, tietoja OpenTTD:stä, kehittäjätyökalut +STR_TOOLBAR_TOOLTIP_SHOW_LAST_MESSAGE_NEWS :{BLACK}Avaa viimeisin viesti tai uutisraportti, avaa viestihistoria, tai poista kaikki viestit +STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION :{BLACK}Avaa maa-aluetiedot, kuvakaappausvalikko, OpenTTD:n tekijäluettelo tai kehittäjätyökalut STR_TOOLBAR_TOOLTIP_SWITCH_TOOLBAR :{BLACK}Vaihda työkalupalkkeja # Extra tooltips for the scenario editor toolbar @@ -419,15 +419,15 @@ STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR :{YELLOW}Skenaar STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_BACKWARD :{BLACK}Siirrä aloituspäivää vuodella taaksepäin STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_FORWARD :{BLACK}Siirrä aloituspäivää vuodella eteenpäin STR_SCENEDIT_TOOLBAR_TOOLTIP_SET_DATE :{BLACK}Aseta aloitusvuosi napsauttamalla -STR_SCENEDIT_TOOLBAR_TOOLTIP_DISPLAY_MAP_TOWN_DIRECTORY :{BLACK}Avaa kartta, lisänäkymä, kylttiluettelo tahi kunta- tai teollisuushakemisto -STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION :{BLACK}Maaston luonti +STR_SCENEDIT_TOOLBAR_TOOLTIP_DISPLAY_MAP_TOWN_DIRECTORY :{BLACK}Avaa kartta, lisänäkymä, kylttiluettelo tai kunta- tai teollisuushakemisto +STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION :{BLACK}Avaa maastonmuokkausvalikko tai luo uusi maailma STR_SCENEDIT_TOOLBAR_TOWN_GENERATION :{BLACK}Kuntien rakentaminen tai luominen -STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION :{BLACK}Teollisuuden luonti +STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION :{BLACK}Rakenna tai luo teollisuutta STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Tieinfrastruktuurin rakentaminen STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}Raitiotieinfrastruktuurin rakentaminen -STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Istuta puita. Ctrl valitsee alueen vinottain. Shift vaihtaa istutustilan ja kustannusarvion välillä +STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Istuta puita. Ctrl+napsautus+veto valitaksesi alueen vinottain. Painettaessa Shift näyttää vain kustannusarvion STR_SCENEDIT_TOOLBAR_PLACE_SIGN :{BLACK}Sijoita kyltti -STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Sijoita objekti. Ctrl valitsee alueen vinottain. Shift vaihtaa rakennustilan ja kustannusarvion välillä +STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Sijoita objekti. Ctrl+napsautus+vedä valitsee alueen vinottain. Painettaessa Shit näyttää vain kustannusarvion # Scenario editor file menu ###length 7 @@ -1362,7 +1362,7 @@ STR_CONFIG_SETTING_FORBID_90_DEG :90 asteen kää STR_CONFIG_SETTING_FORBID_90_DEG_HELPTEXT :90 asteen käännöksiä esiintyy kun vaakasuuntaista rataa seuraa pystysuuntainen rata viereisellä ruudulla, tämä vaatii junan kääntymään 90 astetta ruutujen reunalla normaalin 45 asteen sijasta. STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS :Salli ei-vierekkäisten asemien yhdistäminen: {STRING} -STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS_HELPTEXT :Mahdollistaa aseman osien rakentamisen vaikka ne eivät olisi kosketuksissa olemassaoleviin aseman osiin. Vaatii Ctrl-näppäimen painamisen rakennettaessa +STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS_HELPTEXT :Mahdollistaa aseman osien rakentamisen vaikka ne eivät olisi kosketuksissa olemassaoleviin aseman osiin painamalla Ctrl-näppäintä rakennettaessa STR_CONFIG_SETTING_INFLATION :Inflaatio: {STRING} STR_CONFIG_SETTING_INFLATION_HELPTEXT :Ota talouden inflaatio käyttöön. Mikäli käytössä, hinnat nousevat hieman nopeammin kuin kuljetusmaksut @@ -1832,7 +1832,7 @@ STR_CONFIG_SETTING_SERVINT_AIRCRAFT :Lentokoneiden o STR_CONFIG_SETTING_SERVINT_AIRCRAFT_HELPTEXT :Määritä oletushuoltoväli uusille lentokoneille, mikäli kulkuneuvolle ei ole määritelty erillistä huoltoväliä STR_CONFIG_SETTING_SERVINT_SHIPS :Laivojen oletushuoltoväli: {STRING} STR_CONFIG_SETTING_SERVINT_SHIPS_HELPTEXT :Määritä oletushuoltoväli uusille laivoille, mikäli kulkuneuvolle ei ole määritelty erillistä huoltoväliä -STR_CONFIG_SETTING_SERVINT_VALUE :{COMMA}{NBSP}päivä{P 0 "" ä}/% +STR_CONFIG_SETTING_SERVINT_VALUE :{COMMA}{NBSP}Päivä{P 0 "" s}/Minuutti{P 0 "" s}/% ###setting-zero-is-special STR_CONFIG_SETTING_SERVINT_DISABLED :Pois käytöstä @@ -2203,13 +2203,13 @@ STR_INTRO_TOOLTIP_SUB_ARCTIC_LANDSCAPE :{BLACK}Valitse STR_INTRO_TOOLTIP_SUB_TROPICAL_LANDSCAPE :{BLACK}Valitse subtrooppinen maastotyyppi STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE :{BLACK}Valitse lelumaan maastotyyppi -STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Näytä pelin valinnat +STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Avaa pelin valinnat STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Avaa pistetaulukko STR_INTRO_TOOLTIP_HELP :{BLACK}Tutustu dokumentaatioon ja online-resursseihin STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Näytä asetukset STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Näytä NewGRF-asetukset STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Tarkista uutta ja päivitettyä sisältöä ladattavaksi -STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}Näytä tekoälyasetukset +STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}Avaa tekoälyasetukset STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}Avaa peliskriptiasetukset STR_INTRO_TOOLTIP_QUIT :{BLACK}Lopeta OpenTTD @@ -2267,7 +2267,7 @@ STR_LIVERY_ROAD_VEHICLE_GROUP_TOOLTIP :{BLACK}Näytä STR_LIVERY_SHIP_GROUP_TOOLTIP :{BLACK}Näytä laivaryhmien värit STR_LIVERY_AIRCRAFT_GROUP_TOOLTIP :{BLACK}Näytä ilma-alusryhmien värit STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}Valitse valitun kaavan ensisijainen väri. Ctrl+napsautus asettaa tämän värin kaikille kaavoille. -STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}Valitse valitun kaavan toissijainen väri. Ctrl+napsautus asettaa tämän värin kaikille kaavoille. +STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}Valitse valitun kaavan toissijainen väri. Ctrl+napsautus asettaaksesi tämän värin kaikille kaavoille. STR_LIVERY_PANEL_TOOLTIP :{BLACK}Valitse muutettava väriteema, tai valitse useita Ctrl pohjassa. Paina valintalaatikkoa valitaksesi teeman STR_LIVERY_TRAIN_GROUP_EMPTY :Junaryhmiä ei ole muodostettu STR_LIVERY_ROAD_VEHICLE_GROUP_EMPTY :Ajoneuvoryhmiä ei ole muodostettu @@ -2785,12 +2785,12 @@ STR_RAIL_TOOLBAR_MONORAIL_CONSTRUCTION_CAPTION :Yksiraiteisen r STR_RAIL_TOOLBAR_MAGLEV_CONSTRUCTION_CAPTION :Maglevin rakentaminen STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Rakenna rautatietä. Ctrl+napsautus poistaa rautatietä. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion -STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Rakenna rautatietä automaattisesti valittuun suuntaan. Ctrl vaihtaa rakennus-/poistotilan välillä. Shift vaihtaa rakennustilan ja kustannusarvion välillä +STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Rakenna rautatietä automaattisesti valittuun suuntaan. Ctrl+napsautus poistaaksesi rautatietä. Paina lisäksi vaihtonäppäintä näyttääksesi vain kustannusarvion STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Rakenna junavarikko (junien ostamista ja huoltoa varten). Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion -STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Rakenna reittipiste rautatielle. Ctrl mahdollistaa reittipisteiden yhdistämisen. Shift vaihtaa rakennustilan ja kustannusarvion välillä +STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Rakenna reittipiste rautatielle. Ctrl+napsautus valitsee toisen reittipisteen, johon haluat tämän liitettävän. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion. STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Rakenna rautatieasema. Ctrl+napsautus valitsee toisen aseman, johon haluat tämän liitettävän. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Rakenna opastin rautatielle. Ctrl+napsautus rakentaa vaihtoehtoista opastintyyliä{}Ctrl+veto täyttää valitun rataosuuden opastimilla määrätyin välein. Ctrl+napsautus+veto täyttää seuraavaan risteykseen, asemaan tai opastimeen asti. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion -STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Rakenna rautatiesilta. Shift vaihtaa rakennustilan ja kustannusarvion välillä +STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Rakenna rautatiesilta. Painettaessa Shift näyttää vain kustannusarvion STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Rakenna rautatietunneli. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Rautatien, opastimien, reittipisteiden ja asemien rakentaminen/poisto päälle/pois. Ctrl+napsautus poistaa myös reittipisteiden ja asemien raiteet STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL :{BLACK}Muunna/päivitä raidetyyppi. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion @@ -2869,25 +2869,25 @@ STR_BRIDGE_TUBULAR_SILICON :Putkirakenne, p # Road construction toolbar STR_ROAD_TOOLBAR_ROAD_CONSTRUCTION_CAPTION :{WHITE}Tien rakentaminen STR_ROAD_TOOLBAR_TRAM_CONSTRUCTION_CAPTION :{WHITE}Raitiotien rakentaminen -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_SECTION :{BLACK}Rakenna tieosuus. Ctrl vaihtaa rakennus-/poistotilan välillä. Shift vaihtaa rakennustilan ja kustannusarvion välillä -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_SECTION :{BLACK}Rakenna raitiotietä. Ctrl vaihtaa rakennus-/poistotilan välillä. Shift vaihtaa rakennustilan ja kustannusarvion välillä +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_SECTION :{BLACK}Rakenna tieosuus. Ctrl+napsautus poistaa tieosuuden. Paina lisäksi vaihtonäppäintä näyttääksesi vain kustannusarvion +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_SECTION :{BLACK}Rakenna raitiotietä. Ctrl+napsautus poistaa raitiotieosuuden. Paina lisäksi vaihtonäppäintä näyttääksesi vain kustannusarvion. STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOROAD :{BLACK}Rakenna tieosuus automaattisesti valittuun suuntaan. Ctrl vaihtaa rakennus-/poistotilan välillä. Shift vaihtaa rakennustilan ja kustannusarvion välillä -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOTRAM :{BLACK}Rakenna raitiotieosuus automaattisesti valittuun suuntaan. Ctrl vaihtaa rakennus-/poistotilan välillä. Shift vaihtaa rakennustilan ja kustannusarvion välillä -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Rakenna autovarikko (ajoneuvojen ostamista ja huoltoa varten). Shift vaihtaa rakennustilan ja kustannusarvion välillä -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Rakenna raitiotievarikko (vaunujen ostamiseen ja korjaamiseen). Shift vaihtaa rakennustilan ja kustannusarvion välillä -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Rakenna linja-autoasema. Ctrl liittää asemat. Shift vaihtaa rakennustilan ja kustannusarvion välillä -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Rakenna raitiotien matkustaja-asema. Ctrl liittää asemat. Shift vaihtaa rakennustilan ja kustannusarvion välillä -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Rakenna lastauslaituri. Ctrl mahdollistaa laitureiden yhdistämisen yhdeksi asemaksi. Shift vaihtaa rakennustilan ja kustannusarvion välillä -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION :{BLACK}Rakenna raitiotien rahtiasema. Ctrl liittää asemat. Shift vaihtaa rakennustilan ja kustannusarvion välillä +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOTRAM :{BLACK}Rakenna raitiotieosuus automaattisesti valittuun suuntaan. Ctrl+napsautus poistaa raitiotieosuuden. Paina lisäksi vaihtonäppäintä näyttääksesi vain kustannusarvion +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Rakenna ajoneuvovarikko (ajoneuvojen ostamista ja huoltoa varten). Painettaessa Shift näyttää vain kustannusarvion +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Rakenna raitiotievarikko (vaunujen ostamiseen ja korjaamiseen). Painettaessa Shift näyttää vain kustannusarvion +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Rakenna linja-autoasema. Ctrl+napsautus liittää asemat. Painettaessa Shift näyttää vain kustannusarvion +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Rakenna raitiotien matkustaja-asema. Ctrl+napsautus valitsee toisen aseman, johon haluat tämän liitettävän. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion. +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Rakenna lastauslaituri. Ctrl+napsautus valitsee toisen aseman, johon haluat tämän liitettävän. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion. +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION :{BLACK}Rakenna raitiotien rahtiasema. Ctrl+napsautus valitaksesi toisen aseman, johon haluat tämän liitettävän. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion. STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_ONE_WAY_ROAD :{BLACK}Ota yksisuuntaiset tiet käyttöön/pois käytöstä -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}Rakenna maantiesilta. Shift vaihtaa rakennustilan ja kustannusarvion välillä -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_BRIDGE :{BLACK}Rakenna raitiotiesilta. Shift vaihtaa rakennustilan ja kustannusarvion välillä +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}Rakenna maantiesilta. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion. +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_BRIDGE :{BLACK}Rakenna raitiotiesilta. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion. STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL :{BLACK}Rakenna maantietunneli. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL :{BLACK}Rakenna raitiotietunneli. Shift vaihtaa rakennustilan ja kustannusarvion välillä +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL :{BLACK}Rakenna raitiotietunneli. Painettaessa Shift näyttää vain kustannusarvion STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_ROAD :{BLACK}Tien rakentaminen/siirtäminen päälle/pois STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}Vaihda raitiotien rakentamisen ja purkamisen välillä -STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_ROAD :{BLACK}Muunna tai päivitä tien tyyppi. Shift vaihtaa muuntotilan ja kustannusarvion välillä -STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM :{BLACK}Muunna tai päivitä raitiotien tyyppi. Shift vaihtaa muuntotilan ja kustannusarvion välillä +STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_ROAD :{BLACK}Muunna tai päivitä tien tyyppi. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion. +STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM :{BLACK}Muunna tai päivitä raitiotien tyyppi. Painettaessa Shift näyttää vain kustannusarvion STR_ROAD_NAME_ROAD :Tie STR_ROAD_NAME_TRAM :Raitiotie @@ -2912,7 +2912,7 @@ STR_STATION_BUILD_CARGO_TRAM_ORIENTATION_TOOLTIP :{BLACK}Valitse STR_WATERWAYS_TOOLBAR_CAPTION :{WHITE}Vesireittien rakentaminen STR_WATERWAYS_TOOLBAR_CAPTION_SE :{WHITE}Vesireitit STR_WATERWAYS_TOOLBAR_BUILD_CANALS_TOOLTIP :{BLACK}Rakenna kanavia. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion -STR_WATERWAYS_TOOLBAR_BUILD_LOCKS_TOOLTIP :{BLACK}Rakenna sulku. Shift vaihtaa rakennustilan ja kustannusarvion välillä +STR_WATERWAYS_TOOLBAR_BUILD_LOCKS_TOOLTIP :{BLACK}Rakenna sulkuja. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion. STR_WATERWAYS_TOOLBAR_BUILD_DEPOT_TOOLTIP :{BLACK}Rakenna telakka (laivojen ostamista ja huoltamista varten). Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion STR_WATERWAYS_TOOLBAR_BUILD_DOCK_TOOLTIP :{BLACK}Rakenna satamalaituri. Ctrl+napsautus valitsee toisen aseman, johon haluat tämän liitettävän. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion. STR_WATERWAYS_TOOLBAR_BUOY_TOOLTIP :{BLACK}Sijoita poiju, jota voi käyttää reittipisteenä. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion @@ -2929,7 +2929,7 @@ STR_STATION_BUILD_DOCK_CAPTION :{WHITE}Satama # Airport toolbar STR_TOOLBAR_AIRCRAFT_CAPTION :{WHITE}Lentokentät -STR_TOOLBAR_AIRCRAFT_BUILD_AIRPORT_TOOLTIP :{BLACK}Rakenna lentokenttä. Ctrl liittää asemat. Shift vaihtaa rakennustilan ja kustannusarvion välillä +STR_TOOLBAR_AIRCRAFT_BUILD_AIRPORT_TOOLTIP :{BLACK}Rakenna lentokenttä. Ctrl+napsautus valitsee toisen aseman, johon haluat tämän liitettävän. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion. # Airport construction window STR_STATION_BUILD_AIRPORT_CAPTION :{WHITE}Lentokentän valinta @@ -2958,12 +2958,12 @@ STR_STATION_BUILD_NOISE :{BLACK}Aiheutet STR_LANDSCAPING_TOOLBAR :{WHITE}Maastonmuokkaus STR_LANDSCAPING_TOOLTIP_LOWER_A_CORNER_OF_LAND :{BLACK}Laske maaruudun kulmaa. Napsautus+veto laskee ensimmäisenä valittua kulmaa ja tasaa valitun alueen tämän kulman uudelle korkeudelle. Ctrl+napsautus+veto valitsee alueen vinottain. Paina lisäksi vaihtonäppäintä näyttääksesi vain kustannusarvion STR_LANDSCAPING_TOOLTIP_RAISE_A_CORNER_OF_LAND :{BLACK}Nosta maaruudun kulmaa. Napsautus+veto nostaa ensimmäisenä valittua kulmaa ja tasaa valitun alueen tämän kulman uudelle korkeudelle. Ctrl+napsautus+veto valitsee alueen vinottain. Paina lisäksi vaihtonäppäintä näyttääksesi vain kustannusarvion -STR_LANDSCAPING_LEVEL_LAND_TOOLTIP :{BLACK}Tasoita maata ensimmäisen valitun kulman korkeudelle. Ctrl valitsee alueen vinottain. Shift vaihtaa muokkaustilan ja kustannusarvion välillä +STR_LANDSCAPING_LEVEL_LAND_TOOLTIP :{BLACK}Tasoita maata ensimmäisen valitun kulman korkeudelle. Ctrl+napsautus+veto valitsee alueen vinottain. Painettaessa Shift näyttää vain kustannusarvion STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Osta maata tulevaa käyttöä varten. Ctrl+napsautus+veto valitsee alueen vinottain. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion # Object construction window STR_OBJECT_BUILD_CAPTION :{WHITE}Objektin valinta -STR_OBJECT_BUILD_TOOLTIP :{BLACK}Valitse rakennettava objekti. Ctrl valitsee alueen vinottain. Shift vaihtaa rakennustilan ja kustannusarvion välillä +STR_OBJECT_BUILD_TOOLTIP :{BLACK}Valitse rakennettava objekti. Ctrl+napsautus+veto valitaksesi alueen vinottain. Painettaessa Shift näyttää vain kustannusarvion STR_OBJECT_BUILD_CLASS_TOOLTIP :{BLACK}Valitse rakennettavan objektin luokka STR_OBJECT_BUILD_PREVIEW_TOOLTIP :{BLACK}Objektin esikatselu STR_OBJECT_BUILD_SIZE :{BLACK}Koko: {GOLD}{NUM}×{NUM} ruutua @@ -2975,7 +2975,7 @@ STR_OBJECT_CLASS_TRNS :Lähettimet STR_PLANT_TREE_CAPTION :{WHITE}Puita STR_PLANT_TREE_TOOLTIP :{BLACK}Valitse istutettava puutyyppi. Jos ruudussa on jo puu, tämä lisää uusia puita riippumatta valitun puun tyypistä STR_TREES_RANDOM_TYPE :{BLACK}Sattumanvaraisia puita -STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}Istuta sattumanvaraisia puulajeja. Ctrl valitsee alueen vinottain. Shift vaihtaa istutustilan ja kustannusarvion välillä +STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}Istuta sattumanvaraisia puulajeja. Ctrl+napsautus+veto valitsee alueen vinottain. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion. STR_TREES_RANDOM_TREES_BUTTON :{BLACK}Satunnaisia puita. STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}Istuta puita satunnaisesti maastoon STR_TREES_MODE_NORMAL_BUTTON :{BLACK}Tavallinen @@ -3317,9 +3317,9 @@ STR_MAPGEN_GENERATE_TOOLTIP :{BLACK}Luo maai STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}NewGRF-asetukset STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Näytä NewGRF-asetukset STR_MAPGEN_AI_SETTINGS :{BLACK}Tekoälyasetukset -STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}Näytä tekoälyasetukset +STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}Avaa tekoälyasetukset STR_MAPGEN_GS_SETTINGS :{BLACK}Peliskriptiasetukset -STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}Näytä peliskriptiasetukset +STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}Avaa peliskriptiasetukset ###length 21 STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Englantilainen @@ -3717,7 +3717,8 @@ STR_SUBSIDIES_OFFERED_TITLE :{BLACK}Tarjotut STR_SUBSIDIES_OFFERED_FROM_TO :{ORANGE}{STRING} välille {STRING} – {STRING}{YELLOW} ({STRING}) STR_SUBSIDIES_NONE :{ORANGE}- Ei mitään - STR_SUBSIDIES_SUBSIDISED_TITLE :{BLACK}Käytetyt tuet: -STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Napsauta kuljetusyhteyttä keskittääksesi päänäkymän laitokseen/kuntaan. Ctrl+napsautus avaa uuden näkymäikkunan laitoksen/kunnan sijaintiin. +STR_SUBSIDIES_SUBSIDISED_FROM_TO :{ORANGE}{STRING} kohteesta {STRING} kohteeseen {STRING}{YELLOW} ({COMPANY}{YELLOW}, {STRING}) +STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Napsauta kuljetusyhteyttä keskittääksesi päänäkymän tuotantolaitokseen tai kuntaan. Ctrl+napsautus avaa uuden näkymäikkunan laitoksen tai kunnan sijaintiin. STR_SUBSIDIES_OFFERED_EXPIRY_DATE :viimeistään {DATE_SHORT} STR_SUBSIDIES_OFFERED_EXPIRY_TIME :jäljellä {UNITS_MONTHS_OR_MINUTES} STR_SUBSIDIES_SUBSIDISED_EXPIRY_DATE :{DATE_SHORT} asti @@ -3862,7 +3863,7 @@ STR_FINANCES_BANK_BALANCE :{WHITE}{CURRENC STR_FINANCES_BORROW_BUTTON :{BLACK}Nosta lainaa {CURRENCY_LONG} STR_FINANCES_BORROW_TOOLTIP :{BLACK}Ota lisää lainaa. Ctrl+napsautus nostaa lainaa niin paljon kuin mahdollista. STR_FINANCES_REPAY_BUTTON :{BLACK}Lyhennä lainaa {CURRENCY_LONG} -STR_FINANCES_REPAY_TOOLTIP :{BLACK}Lyhennä lainaa. Ctrl+napsautus lyhentää lainaa niin paljon kuin mahdollista. +STR_FINANCES_REPAY_TOOLTIP :{BLACK}Lyhennä lainaa. Ctrl+napsautus lyhentääksesi lainaa niin paljon kuin mahdollista. STR_FINANCES_INFRASTRUCTURE_BUTTON :{BLACK}Infrastruktuuri # Company view @@ -3891,7 +3892,7 @@ STR_COMPANY_VIEW_BUILD_HQ_TOOLTIP :{BLACK}Rakenna STR_COMPANY_VIEW_VIEW_HQ_BUTTON :{BLACK}Näytä päämaja STR_COMPANY_VIEW_VIEW_HQ_TOOLTIP :{BLACK}Näytä yhtiön päämaja STR_COMPANY_VIEW_RELOCATE_HQ :{BLACK}Siirrä päämaja -STR_COMPANY_VIEW_RELOCATE_COMPANY_HEADQUARTERS :{BLACK}Rakenna yhtiön pääkonttori muualle, kustannus 1{NBSP}% yhtiön arvosta. Vaihto+napsautus näyttää kustannusarvion sijoittamatta pääkonttoria uudelleen. +STR_COMPANY_VIEW_RELOCATE_COMPANY_HEADQUARTERS :{BLACK}Rakenna yhtiön pääkonttori muualle, kustannus 1{NBSP}% yhtiön arvosta. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion. STR_COMPANY_VIEW_INFRASTRUCTURE_BUTTON :{BLACK}Yksityiskohdat STR_COMPANY_VIEW_INFRASTRUCTURE_TOOLTIP :{BLACK}Näytä tarkka infrastruktuurin määrä STR_COMPANY_VIEW_GIVE_MONEY_BUTTON :{BLACK}Anna rahaa @@ -3949,7 +3950,7 @@ STR_INDUSTRY_VIEW_CAPTION :{WHITE}{INDUSTR STR_INDUSTRY_VIEW_PRODUCTION_LAST_MONTH_TITLE :{BLACK}Tuotanto viime kuussa: STR_INDUSTRY_VIEW_PRODUCTION_LAST_MINUTE_TITLE :{BLACK}Tuotanto viime minuutissa: STR_INDUSTRY_VIEW_TRANSPORTED :{YELLOW}{CARGO_LONG}{STRING}{BLACK} ({COMMA}{NBSP}% kuljetettu) -STR_INDUSTRY_VIEW_LOCATION_TOOLTIP :{BLACK}Keskitä päänäkymä tuotantolaitoksen sijaintiin. Ctrl+napsautus avaa uuden näkymäikkunan laitoksen sijaintiin. +STR_INDUSTRY_VIEW_LOCATION_TOOLTIP :{BLACK}Keskitä päänäkymä tuotantolaitoksen sijaintiin. Ctrl+napsautus avataksesi uuden näkymäikkunan laitoksen sijaintiin. STR_INDUSTRY_VIEW_PRODUCTION_LEVEL :{BLACK}Tuotantotaso: {YELLOW}{COMMA}{NBSP}% STR_INDUSTRY_VIEW_INDUSTRY_ANNOUNCED_CLOSURE :{YELLOW}Teollisuuslaitos ilmoittaa välittömästä lakkautuksesta! @@ -4094,7 +4095,7 @@ STR_CARGO_TYPE_FILTER_NONE :Ei mikään ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Raideliikennevälineiden valintaluettelo. Napsauta kulkuneuvoa saadaksesi lisää tietoa. Ctrl+napsautus näyttää tai piilottaa kulkuneuvon tyypin. STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Ajoneuvojen valintaluettelo. Napsauta ajoneuvoa saadaksesi lisää tietoja. Ctrl+napsautus näyttää tai piilottaa ajoneuvon tyypin. -STR_BUY_VEHICLE_SHIP_LIST_TOOLTIP :{BLACK}Laivojen valintaluettelo. Napsauta laivaa saadaksesi lisää tietoja. Ctrl+napsautus näyttää tai piilottaa laivan tyypin. +STR_BUY_VEHICLE_SHIP_LIST_TOOLTIP :{BLACK}Laivojen valintaluettelo. Napsauta laivaa saadaksesi lisää tietoja. Ctrl+napsautus näyttää/piilottaa tämän laivatyypin STR_BUY_VEHICLE_AIRCRAFT_LIST_TOOLTIP :{BLACK}Ilma-alusten valintaluettelo. Napsauta ilma-alusta saadaksesi lisää tietoja. Ctrl+napsautus näyttää tai piilottaa tämän ilma-alustyypin ###length VEHICLE_TYPES @@ -4111,15 +4112,15 @@ STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Osta ja ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_TOOLTIP :{BLACK}Osta valittu raideliikenneväline. Vaihto+napsautus näyttää kustannusarvion ostamatta. -STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_TOOLTIP :{BLACK}Osta valittu ajoneuvo. Vaihto+napsautus näyttää kustannusarvion ostamatta. +STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_TOOLTIP :{BLACK}Osta valittu ajoneuvo. Painettaessa Shift näyyää vain kustannusarvion. STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_TOOLTIP :{BLACK}Osta valittu laiva. Paina lisäksi vaihtonäppäintä näyttääksesi vain kustannusarvion -STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_TOOLTIP :{BLACK}Osta valittu ilma-alus. Vaihto+napsautus näyttää kustannusarvion ostamatta. +STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_TOOLTIP :{BLACK}Osta valittu ilma-alus. Painettaessa Shift näyttää vain kustannusarvion ###length VEHICLE_TYPES -STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Osta ja sovita valittu raideliikenneväline. Vaihto+napsautus näyttää kustannusarvion ostamatta. +STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Osta ja sovita valittu raideliikenneväline. Painettaessa Shift näyttää vain kustannusarvion STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Osta ja sovita valittu ajoneuvo. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion -STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Osta ja sovita valittu laiva. Vaihto+napsautus näyttää kustannusarvion ostamatta. -STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Osta ja sovita valittu ilma-alus. Vaihto+napsautus näyttää kustannusarvion ostamatta. +STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Osta ja sovita valittu laiva. Paina lisäksi vaihtonäppäintä näyttääksesi vain kustannusarvion +STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Osta ja sovita valittu ilma-alus. Shift+napsautus näyttää vain kustannusarvion ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_RENAME_BUTTON :{BLACK}Nimeä @@ -4211,10 +4212,10 @@ STR_DEPOT_CLONE_SHIP :{BLACK}Kloonaa STR_DEPOT_CLONE_AIRCRAFT :{BLACK}Kloonaa ilma-alus ###length VEHICLE_TYPES -STR_DEPOT_CLONE_TRAIN_DEPOT_INFO :{BLACK}Tämä ostaa kopion junasta kaikkine vaunuineen. Napsauta tätä painiketta ja sen jälkeen junaa varikon sisä- tai ulkopuolella. Ctrl+napsautus jakaa komennot. Vaihto+napsautus näyttää kustannusarvion ostamatta kopiota. -STR_DEPOT_CLONE_ROAD_VEHICLE_DEPOT_INFO :{BLACK}Tämä ostaa kopion ajoneuvosta. Napsauta tätä painiketta ja sen jälkeen ajoneuvoa varikon sisä- tai ulkopuolella. Ctrl+napsautus jakaa komennot. Vaihto+napsautus näyttää kustannusarvion ostamatta kopiota. -STR_DEPOT_CLONE_SHIP_DEPOT_INFO :{BLACK}Tämä ostaa kopion laivasta. Napsauta tätä painiketta ja sen jälkeen laivaa telakan sisä- tai ulkopuolella. Ctrl+napsautus jakaa komennot. Vaihto+napsautus näyttää kustannusarvion ostamatta kopiota. -STR_DEPOT_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW :{BLACK}Tämä ostaa kopion lentokoneesta. Napsauta tätä painiketta ja sen jälkeen lentokonetta lentokonehallin sisä- tai ulkopuolella. Ctrl+napsautus jakaa komennot. Vaihto+napsautus näyttää kustannusarvion ostamatta kopiota. +STR_DEPOT_CLONE_TRAIN_DEPOT_INFO :{BLACK}Osta kopio junasta kaikkine vaunuineen. Napsauta tätä painiketta ja sen jälkeen junaa varikon sisä- tai ulkopuolella. Ctrl+napsautus jakaa käskyt. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion +STR_DEPOT_CLONE_ROAD_VEHICLE_DEPOT_INFO :{BLACK}Tämä ostaa kopion ajoneuvosta. Napsauta tätä painiketta ja sen jälkeen ajoneuvoa varikon sisä- tai ulkopuolella. Ctrl+napsautus jakaa käskyt. Painettaessa Shift näyttää vain kustannusarvion +STR_DEPOT_CLONE_SHIP_DEPOT_INFO :{BLACK}Osta laivan kopio. Napsauta tätä painiketta ja sitten laivaa telakan sisä- tai ulkopuolella. Ctrl+napsautus jakaa komennot. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion. +STR_DEPOT_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW :{BLACK}Osta ilma-aluksen kopio. Napsauta tätä painiketta ja sitten ilma-alusta lentokonehallin sisä- tai ulkopuolella. Ctrl+napsautus jakaa komennot. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion. ###length VEHICLE_TYPES STR_DEPOT_TRAIN_LOCATION_TOOLTIP :{BLACK}Keskitä päänäkymä veturitallin sijaintiin. Ctrl+napsautus avaa uuden näkymäikkunan veturitallin sijaintiin. @@ -4338,10 +4339,10 @@ STR_VEHICLE_VIEW_SHIP_SEND_TO_DEPOT_TOOLTIP :{BLACK}Lähetä STR_VEHICLE_VIEW_AIRCRAFT_SEND_TO_DEPOT_TOOLTIP :{BLACK}Lähetä ilma-alus lentokonehalliin. Ctrl+napsautus suorittaa vain huollon. ###length VEHICLE_TYPES -STR_VEHICLE_VIEW_CLONE_TRAIN_INFO :{BLACK}Tämä ostaa kopion junasta kaikkine vaunuineen. Ctrl+napsautus jakaa käskyt. Vaihto+napsautus näyttää kustannusarvion ostamatta kopiota. +STR_VEHICLE_VIEW_CLONE_TRAIN_INFO :{BLACK}Osta kopio junasta kaikkine vaunuineen. Ctrl+napsautus jakaa käskyt. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion STR_VEHICLE_VIEW_CLONE_ROAD_VEHICLE_INFO :{BLACK}Tämä ostaa kopion ajoneuvosta. Ctrl+napsautus jakaa käskyt. Vaihto+napsautus näyttää kustannusarvion ostamatta kopiota. -STR_VEHICLE_VIEW_CLONE_SHIP_INFO :{BLACK}Tämä ostaa kopion laivasta. Ctrl+napsautus jakaa käskyt. Vaihto+napsautus näyttää kustannusarvion ostamatta kopiota. -STR_VEHICLE_VIEW_CLONE_AIRCRAFT_INFO :{BLACK}Tämä ostaa kopion lentokoneesta. Ctrl+napsautus jakaa käskyt. Vaihto+napsautus näyttää kustannusarvion ostamatta kopiota. +STR_VEHICLE_VIEW_CLONE_SHIP_INFO :{BLACK}Osta laivan kopio. Ctrl+napsautus jakaa käskyt. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion. +STR_VEHICLE_VIEW_CLONE_AIRCRAFT_INFO :{BLACK}Osta ilma-aluksen kopio. Ctrl+napsautus jakaa käskyt. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion. STR_VEHICLE_VIEW_TRAIN_IGNORE_SIGNAL_TOOLTIP :{BLACK}Anna junalle lupa ohittaa punainen opastin STR_VEHICLE_VIEW_TRAIN_REVERSE_TOOLTIP :{BLACK}Käännä junan suunta @@ -4375,6 +4376,7 @@ STR_VEHICLE_VIEW_AIRCRAFT_STATUS_START_STOP_TOOLTIP :{BLACK}Nykyisen # Messages in the start stop button in the vehicle view STR_VEHICLE_STATUS_LOADING_UNLOADING :{LTBLUE}Lastataan/puretaan STR_VEHICLE_STATUS_LEAVING :{LTBLUE}Poistuu +STR_VEHICLE_STATUS_WAITING_UNBUNCHING :{LTBLUE}Odottamassa suman purkautumista STR_VEHICLE_STATUS_CRASHED :{RED}Kolaroitu! STR_VEHICLE_STATUS_BROKEN_DOWN :{RED}Hajonnut STR_VEHICLE_STATUS_STOPPED :{RED}Pysäytetty @@ -4492,7 +4494,7 @@ STR_REFIT_NEW_CAPACITY_COST_OF_REFIT :{BLACK}Uusi kap STR_REFIT_NEW_CAPACITY_INCOME_FROM_REFIT :{BLACK}Uusi kapasiteetti: {GOLD}{CARGO_LONG}{}{BLACK}Tulot sovittamisesta: {GREEN}{CURRENCY_LONG} STR_REFIT_NEW_CAPACITY_COST_OF_AIRCRAFT_REFIT :{BLACK}Uusi kapasiteetti: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Sovituksen kustannus: {RED}{CURRENCY_LONG} STR_REFIT_NEW_CAPACITY_INCOME_FROM_AIRCRAFT_REFIT :{BLACK}Uusi kapasiteetti: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Tulot sovittamisesta: {GREEN}{CURRENCY_LONG} -STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Valitse sovitettavat kulkuneuvot. Hiirellä vetämällä voit valita useamman kulkuneuvon. Tyhjän alueen napsautus valitsee koko kulkuneuvon. Ctrl+napsautus valitsee kulkuneuvon ja sitä seuraavan ketjun. +STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Valitse sovitettavat kulkuneuvot. Napsautus+vedä valitaksesi useamman kulkuneuvon. Tyhjän alueen napsautus valitsee koko kulkuneuvon. Ctrl+napsautus valitsee kulkuneuvon ja sitä seuraavan ketjun. ###length VEHICLE_TYPES STR_REFIT_TRAIN_LIST_TOOLTIP :{BLACK}Valitse junan rahtityyppi @@ -4519,6 +4521,7 @@ STR_ORDERS_TIMETABLE_VIEW_TOOLTIP :{BLACK}Näytä STR_ORDERS_LIST_TOOLTIP :{BLACK}Käskyt – napsauta käskyä korostaaksesi sen. Ctrl+napsautus siirtää näkymän käskyn kohteeseen. STR_ORDER_INDEX :{COMMA}:{NBSP} +STR_ORDER_TEXT :{STRING} {STRING} {STRING} {STRING} STR_ORDERS_END_OF_ORDERS :- - Käskyjen loppu - - STR_ORDERS_END_OF_SHARED_ORDERS :- - Jaettujen käskyjen loppu - - @@ -4606,7 +4609,7 @@ STR_ORDER_GO_TO_NEAREST_DEPOT :Mene lähimmäl STR_ORDER_GO_TO_NEAREST_HANGAR :Mene lähimpään lentokonehalliin STR_ORDER_CONDITIONAL :Ehdollinen hyppykäsky STR_ORDER_SHARE :Jaa käskyt -STR_ORDERS_GO_TO_TOOLTIP :{BLACK}Lisää uuden käskyn ennen valittua, tai lisää listan viimeiseksi. Ctrl:n painalluksella asemakäskyistä tulee ”lastaa täyteen mikä tahansa rahti”, reittipistekäskyistä ”pysähtymättä” ja varikkokäskyistä ”huolto”. ”Jaa käskyt” tai Ctrl jakaa käskyt valitun kulkuneuvon kanssa. Kulkuneuvon napsauttaminen kopioi käskyt kyseisestä kulkuneuvosta. Varikkokäsky estää kulkuneuvon automaattiset huollot +STR_ORDERS_GO_TO_TOOLTIP :{BLACK}Lisää uuden käskyn ennen valittua, tai lisää listan viimeiseksi. Ctrl+painalluksella asemakäskyistä tulee ”lastaa täyteen mikä tahansa rahti”, reittipistekäskyistä ”pysähtymättä” ja veturitallikäskyistä ”huolto”. Napsauta toista ajoneuvoa kopioidaksesi sen käskyt tai Ctrl+napsauta luodaksesi jaetun käskyn. Tallikäsky poistaa automaattiset huollot STR_ORDERS_VEH_WITH_SHARED_ORDERS_LIST_TOOLTIP :{BLACK}Näytä kaikki kulkuneuvot, jotka jakavat nämä käskyt @@ -4728,7 +4731,7 @@ STR_TIMETABLE_CHANGE_SPEED :{BLACK}Muuta no STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Muuta suurinta sallittua nopeutta valitulle käskylle. Ctrl+napsautus asettaa nopeusrajoituksen kaikille käskyille STR_TIMETABLE_CLEAR_SPEED :{BLACK}Tyhjennä nopeusrajoitus -STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Poista suurin sallittu nopeus valitulta käskyltä. Ctrl+napsautus poistaa kaikkien käskyjen nopeusrajoitukset +STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Poista suurin sallittu nopeus valitulta käskyltä. Ctrl+napsautus poistaaksesi kaikkien käskyjen nopeusrajoitukset STR_TIMETABLE_RESET_LATENESS :{BLACK}Nollaa myöhästymislaskuri STR_TIMETABLE_RESET_LATENESS_TOOLTIP :{BLACK}Nollaa myöhästymislaskuri, jotta kulkuneuvo olisi taas aikataulussa. Ctrl+napsautus nollaa koko ryhmän, minkä jälkeen eniten myöhässä ollut kulkuneuvo on aikataulussa ja muut ovat etuajassa diff --git a/src/lang/french.txt b/src/lang/french.txt index 91c963ff0b..684e53745f 100644 --- a/src/lang/french.txt +++ b/src/lang/french.txt @@ -4563,6 +4563,10 @@ STR_ORDER_DROP_UNBUNCH :Répartir # Depot action tooltips, one per vehicle type ###length VEHICLE_TYPES +STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP :{BLACK}Séléctionner l'action à effectuer sur ce dépôt +STR_ORDER_ROAD_DEPOT_ACTION_TOOLTIP :{BLACK}Séléctionner l'action à effectuer sur ce dépôt +STR_ORDER_SHIP_DEPOT_ACTION_TOOLTIP :{BLACK}Séléctionner l'action à effectuer sur ce dépôt +STR_ORDER_HANGAR_ACTION_TOOLTIP :{BLACK}Séléctionner l'action à effectuer sur ce hangar ###next-name-looks-similar STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Données du véhicule servant de base au saut diff --git a/src/lang/polish.txt b/src/lang/polish.txt index 93eaaf3736..523ba3d6db 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -593,6 +593,8 @@ STR_COLOUR_SECONDARY_SAME_AS_PRIMARY :Taki jak podsta STR_UNITS_VELOCITY_IMPERIAL :{DECIMAL}{NBSP}mph STR_UNITS_VELOCITY_METRIC :{DECIMAL}{NBSP}km/h STR_UNITS_VELOCITY_SI :{DECIMAL}{NBSP}m/s +STR_UNITS_VELOCITY_GAMEUNITS_DAY :{DECIMAL}{NBSP}p{P ole ola ól}/dzień +STR_UNITS_VELOCITY_GAMEUNITS_SEC :{DECIMAL}{NBSP}p{P ole ola ól}/s STR_UNITS_VELOCITY_KNOTS :{DECIMAL}{NBSP}w. STR_UNITS_POWER_IMPERIAL :{DECIMAL}{NBSP}hp @@ -638,7 +640,11 @@ STR_UNITS_DAYS :{COMMA}{NBSP}d{ STR_UNITS_SECONDS :{COMMA}{NBSP}sekund{P a y ""} STR_UNITS_TICKS :{COMMA}{NBSP}tyknię{P cie cia ć} +STR_UNITS_MONTHS :{NUM}{NBSP}miesi{P ąc ące ęcy} +STR_UNITS_MINUTES :{NUM}{NBSP}minut{P a y ""} +STR_UNITS_YEARS :{NUM}{NBSP}{P rok lata lat} +STR_UNITS_PERIODS :{NUM}{NBSP}okres{P "" y ów} # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filtr: @@ -704,8 +710,10 @@ STR_SORT_BY_PRODUCTION :Produkcja STR_SORT_BY_TYPE :Typ STR_SORT_BY_TRANSPORTED :Przetransportowano STR_SORT_BY_NUMBER :Numer -STR_SORT_BY_PROFIT_LAST_YEAR :Zysk w ostatnim roku +STR_SORT_BY_PROFIT_LAST_YEAR :Zysk w poprzednim roku +STR_SORT_BY_PROFIT_LAST_PERIOD :Zysk w poprzednim okresie STR_SORT_BY_PROFIT_THIS_YEAR :Zysk w tym roku +STR_SORT_BY_PROFIT_THIS_PERIOD :Zysk w tym okresie STR_SORT_BY_AGE :Wiek STR_SORT_BY_RELIABILITY :Niezawodność STR_SORT_BY_TOTAL_CAPACITY_PER_CARGOTYPE :Całkowita ładowność po typie ładunku @@ -732,10 +740,14 @@ STR_SORT_BY_RANGE :Zasięg STR_SORT_BY_POPULATION :Liczba mieszkańców STR_SORT_BY_RATING :Ocena STR_SORT_BY_NUM_VEHICLES :Ilość pojazdów -STR_SORT_BY_TOTAL_PROFIT_LAST_YEAR :Całkowity zysk w zeszłym roku +STR_SORT_BY_TOTAL_PROFIT_LAST_YEAR :Całkowity zysk w poprzednim roku +STR_SORT_BY_TOTAL_PROFIT_LAST_PERIOD :Całkowity zysk w poprzednim okresie STR_SORT_BY_TOTAL_PROFIT_THIS_YEAR :Całkowity zysk w obecnym roku -STR_SORT_BY_AVERAGE_PROFIT_LAST_YEAR :Średni zysk w zeszłym roku -STR_SORT_BY_AVERAGE_PROFIT_THIS_YEAR :Średni zysk w obecnym roku +STR_SORT_BY_TOTAL_PROFIT_THIS_PERIOD :Całkowity zysk w tym okresie +STR_SORT_BY_AVERAGE_PROFIT_LAST_YEAR :Średni zysk w poprzednim roku +STR_SORT_BY_AVERAGE_PROFIT_LAST_PERIOD :Średni zysk w poprzednim okresie +STR_SORT_BY_AVERAGE_PROFIT_THIS_YEAR :Średni zysk w tym roku +STR_SORT_BY_AVERAGE_PROFIT_THIS_PERIOD :Średni zysk w tym okresie # Group by options for vehicle list STR_GROUP_BY_NONE :Brak @@ -979,8 +991,11 @@ STR_GRAPH_CARGO_DELIVERED_CAPTION :{WHITE}Dostarcz STR_GRAPH_COMPANY_PERFORMANCE_RATINGS_CAPTION :{WHITE}Ocena wydajności firmy (maks. ocena=1000) STR_GRAPH_COMPANY_VALUES_CAPTION :{WHITE}Wykres wartości firmy +STR_GRAPH_LAST_72_MINUTES_TIME_LABEL :{TINY_FONT}{BLACK}Ostatnie 72 minuty STR_GRAPH_CARGO_PAYMENT_RATES_CAPTION :{WHITE}Stawki płatności za ładunek +STR_GRAPH_CARGO_PAYMENT_RATES_DAYS :{TINY_FONT}{BLACK}Dni w transporcie +STR_GRAPH_CARGO_PAYMENT_RATES_SECONDS :{TINY_FONT}{BLACK}Sekund w transporcie STR_GRAPH_CARGO_PAYMENT_RATES_TITLE :{TINY_FONT}{BLACK}Dochód z przewozu 10 jednostek (lub 10,000 litrów) ładunku na odległość 20 pól STR_GRAPH_CARGO_ENABLE_ALL :{TINY_FONT}{BLACK}Włącz wszystko STR_GRAPH_CARGO_DISABLE_ALL :{TINY_FONT}{BLACK}Wyłącz wszystko @@ -1023,18 +1038,22 @@ STR_PERFORMANCE_DETAIL_STATIONS :{BLACK}Stacje: STR_PERFORMANCE_DETAIL_MIN_PROFIT :{BLACK}Min. zysk: STR_PERFORMANCE_DETAIL_MIN_INCOME :{BLACK}Min. przychód: STR_PERFORMANCE_DETAIL_MAX_INCOME :{BLACK}Maks. przychód: -STR_PERFORMANCE_DETAIL_DELIVERED :{BLACK}Przewieziono: +STR_PERFORMANCE_DETAIL_DELIVERED :{BLACK}Dostarczono: STR_PERFORMANCE_DETAIL_CARGO :{BLACK}Ładunek: STR_PERFORMANCE_DETAIL_MONEY :{BLACK}Pieniądze: STR_PERFORMANCE_DETAIL_LOAN :{BLACK}Pożyczka: STR_PERFORMANCE_DETAIL_TOTAL :{BLACK}Łącznie: ###next-name-looks-similar +STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP_YEARS :{BLACK}Liczba pojazdów, które przyniosły zysk w poprzednim roku. Dotyczy to pojazdów drogowych, pociągów, statków i samolotów +STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP_PERIODS :{BLACK}Liczba pojazdów, które przyniosły zysk w poprzednim okresie. Dotyczy to pojazdów drogowych, pociągów, statków i samolotów STR_PERFORMANCE_DETAIL_STATIONS_TOOLTIP :{BLACK}Liczba ostatnio obsłużonych stacji. Dworce, przystanki, lotniska itp. są liczone osobno, nawet jeśli są połączone w jedną stację -STR_PERFORMANCE_DETAIL_MIN_INCOME_TOOLTIP :{BLACK}Ilość zarobionych pieniędzy w kwartale z najmniejszym zyskiem z ostatnich 12 kwartałów -STR_PERFORMANCE_DETAIL_MAX_INCOME_TOOLTIP :{BLACK}Ilość zarobionych pieniędzy w kwartale z największym zyskiem z ostatnich 12 kwartałów -STR_PERFORMANCE_DETAIL_DELIVERED_TOOLTIP :{BLACK}Ilość ładunku przewiezionego w poprzednich 4 kwartałach -STR_PERFORMANCE_DETAIL_CARGO_TOOLTIP :{BLACK}Ilość różnych typów ładunku przewiezionych w ostatnim kwartale +STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP_YEARS :{BLACK}Zysk pojazdu o najniższym przychodzie (pod uwagę brane są tylko pojazdy starsze niż dwa lata) +STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP_PERIODS :{BLACK}Zysk pojazdu o najniższym przychodzie (pod uwagę brane są tylko pojazdy starsze niż dwa okresy) +STR_PERFORMANCE_DETAIL_MIN_INCOME_TOOLTIP :{BLACK}Kwota pieniędzy zarobionych w kwartale z najniższym zyskiem spośród poprzednich 12 kwartałów +STR_PERFORMANCE_DETAIL_MAX_INCOME_TOOLTIP :{BLACK}Kwota pieniędzy zarobionych w kwartale z najwyższym zyskiem spośród poprzednich 12 kwartałów +STR_PERFORMANCE_DETAIL_DELIVERED_TOOLTIP :{BLACK}Ilość ładunku dostarczonego w poprzednich 4 kwartałach +STR_PERFORMANCE_DETAIL_CARGO_TOOLTIP :{BLACK}Ilość różnych typów ładunku dostarczonych w poprzednim kwartale STR_PERFORMANCE_DETAIL_MONEY_TOOLTIP :{BLACK}Ilość dostępnych środków pieniężnych STR_PERFORMANCE_DETAIL_LOAN_TOOLTIP :{BLACK}Wielkość pożyczki wziętej przez firmę STR_PERFORMANCE_DETAIL_TOTAL_TOOLTIP :{BLACK}Suma przyznanych punktów @@ -1264,6 +1283,8 @@ STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD :{WHITE}{VEHICLE STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD_AND :{WHITE}{VEHICLE} bardzo się starzeje i potrzebuje natychmiastowej wymiany STR_NEWS_TRAIN_IS_STUCK :{WHITE}{VEHICLE} nie potrafi znaleźć trasy, aby kontynuować STR_NEWS_VEHICLE_IS_LOST :{WHITE}{VEHICLE} się zgubił +STR_NEWS_VEHICLE_UNPROFITABLE_YEAR :{WHITE}Dochód {VEHICLE} w poprzednim roku wyniósł {CURRENCY_LONG} +STR_NEWS_VEHICLE_UNPROFITABLE_PERIOD :{WHITE}Dochód {VEHICLE} w poprzednim okresie wyniósł {CURRENCY_LONG} STR_NEWS_AIRCRAFT_DEST_TOO_FAR :{WHITE}{VEHICLE} nie może dotrzeć do kolejnego punktu docelowego, ponieważ punkt ten leży poza jego zasięgiem STR_NEWS_ORDER_REFIT_FAILED :{WHITE}Zaplanowane przeładowanie zatrzymane {VEHICLE} @@ -1627,6 +1648,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :z prawej strony STR_CONFIG_SETTING_SECONDS_VALUE :{COMMA}{NBSP}sekund{P 0 ę y ""} STR_CONFIG_SETTING_INFINITE_MONEY :Nieskończona ilość pieniędzy: {STRING} +STR_CONFIG_SETTING_INFINITE_MONEY_HELPTEXT :Pozwól na nieograniczone wydatki i wyłącz bankructwa firm STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Maksymalna wysokość początkowej pożyczki: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Maksymalna wysokość pożyczki, jaką firma może zaciągnąć (bez uwzględnienia inflacji) @@ -1842,10 +1864,16 @@ STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT :Kiedy włączon STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :Pojazdy nigdy nie są wycofywane: {STRING} STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Kiedy włączone, wszystkie modele pojazdów pozostają dostępne na zawsze od daty ich wprowadzenia +STR_CONFIG_SETTING_TIMEKEEPING_UNITS :Miara czasu: {STRING} +STR_CONFIG_SETTING_TIMEKEEPING_UNITS_HELPTEXT :Wybierz jednostki pomiaru czasu w grze. Nie można tego zmienić później.{}{}Kalendarz jest klasycznym trybem OpenTTD, z rokiem składającym się z 12 miesięcy, a każdy miesiąc ma 28-31 dni.{}{}W trybie opartym na zegarze ruch pojazdów, produkcja ładunków i finanse są natomiast oparte na jednominutowych przyrostach, czyli mniej więcej tak długo, jak trwa 30-dniowy miesiąc w trybie opartym na kalendarzu. Są one pogrupowane w 12-minutowe okresy, co odpowiada rokowi w trybie opartym na kalendarzu.{}{}W obu trybach zawsze funkcjonuje klasyczny kalendarz, który jest używany do dat wprowadzenia pojazdów, domów i innej infrastruktury. ###length 2 +STR_CONFIG_SETTING_TIMEKEEPING_UNITS_CALENDAR :Kalendarz +STR_CONFIG_SETTING_TIMEKEEPING_UNITS_WALLCLOCK :Zegar +STR_CONFIG_SETTING_MINUTES_PER_YEAR_VALUE :{NUM} ###setting-zero-is-special +STR_CONFIG_SETTING_MINUTES_PER_YEAR_FROZEN :0 (zamrożenie czasu kalendarza) STR_CONFIG_SETTING_CARGO_SCALE_VALUE :{NUM}% @@ -2103,6 +2131,7 @@ STR_CONFIG_SETTING_SOUND_NEWS_HELPTEXT :Odtwarzaj dźwi ###length 2 STR_CONFIG_SETTING_SOUND_NEW_YEAR :Koniec roku: {STRING} +STR_CONFIG_SETTING_SOUND_NEW_PERIOD :Koniec okresu: {STRING} ###length 2 STR_CONFIG_SETTING_SOUND_NEW_YEAR_HELPTEXT :Odtwarzaj dźwięk na koniec roku podsumowując roczną sytuację przedsiębiorstwa w porównaniu do roku poprzedniego @@ -2266,6 +2295,7 @@ STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Ustaw rok, w kt STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES :Przełączaj typy sygnalizatorów: {STRING} STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :Wybierz, między jakimi typami sygnalizatorów przełączać po naciśnięciu Ctrl+klik przy budowaniu sygnalizatorów ###length 2 +STR_CONFIG_SETTING_CYCLE_SIGNAL_GROUP :Tylko bieżąca grupa STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :Wszystkie widoczne STR_CONFIG_SETTING_SIGNAL_GUI_MODE :Pokazuj typy sygnalizatorów: {STRING} @@ -2398,6 +2428,8 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT :Kiedy prędkoś STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL :Imperialne (mph) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_METRIC :Metryczne (km/h) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_SI :SI (m/s) +STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS_DAYS :Jednostki gry (pola/dzień) +STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS_SECS :Jednostki gry (pola/s) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_KNOTS :Węzły STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :Jednostka mocy pojazdów: {STRING} @@ -3083,6 +3115,8 @@ STR_LINKGRAPH_LEGEND_SATURATED :{TINY_FONT}{BLA STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLACK}przeładowany # Linkgraph tooltip +STR_LINKGRAPH_STATS_TOOLTIP_MONTH :{BLACK}{CARGO_LONG} do przetransportowania w ciągu miesiąca z {STATION} do {STATION} ({COMMA}% przepustowości){STRING} +STR_LINKGRAPH_STATS_TOOLTIP_MINUTE :{BLACK}{CARGO_LONG} do przetransportowania w ciągu minuty z {STATION} do {STATION} ({COMMA}% przepustowości){STRING} STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION :{}{CARGO_LONG} do przetransportowania z powrotem ({COMMA}% przepustowości) STR_LINKGRAPH_STATS_TOOLTIP_TIME_EXTENSION :{}Średni czas podróży: {UNITS_DAYS_OR_SECONDS} @@ -3940,7 +3974,8 @@ STR_TOWN_POPULATION :{BLACK}Populacj STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN} STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (Metropolia) STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Populacja: {ORANGE}{COMMA}{BLACK} Domów: {ORANGE}{COMMA} -STR_TOWN_VIEW_CARGO_LAST_MONTH_MAX :{BLACK}{CARGO_LIST} w ostatnim miesiącu: {ORANGE}{COMMA}{BLACK} najwięcej: {ORANGE}{COMMA} +STR_TOWN_VIEW_CARGO_LAST_MONTH_MAX :{BLACK}{CARGO_LIST} w poprzednim miesiącu: {ORANGE}{COMMA}{BLACK} maks.: {ORANGE}{COMMA} +STR_TOWN_VIEW_CARGO_LAST_MINUTE_MAX :{BLACK}{CARGO_LIST} w poprzedniej minucie: {ORANGE}{COMMA}{BLACK} maks.: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Ładunek potrzebny do rozwoju miasta: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{RED}Wymagana {ORANGE}{STRING} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} wymagane zimą @@ -4263,7 +4298,8 @@ STR_INDUSTRY_DIRECTORY_FILTER_NONE :Żadne # Industry view STR_INDUSTRY_VIEW_CAPTION :{WHITE}{INDUSTRY} -STR_INDUSTRY_VIEW_PRODUCTION_LAST_MONTH_TITLE :{BLACK}Wyprodukowano w ostatnim miesiącu: +STR_INDUSTRY_VIEW_PRODUCTION_LAST_MONTH_TITLE :{BLACK}Wyprodukowano w poprzednim miesiącu: +STR_INDUSTRY_VIEW_PRODUCTION_LAST_MINUTE_TITLE :{BLACK}Wyprodukowano w poprzedniej minucie: STR_INDUSTRY_VIEW_TRANSPORTED :{YELLOW}{CARGO_LONG}{STRING}{BLACK} ({COMMA}% przetransportowano) STR_INDUSTRY_VIEW_LOCATION_TOOLTIP :{BLACK}Wyśrodkuj widok główny na lokalizacji przedsiębiorstwa. Ctrl+klik otwiera nowy podgląd na jego lokalizację STR_INDUSTRY_VIEW_PRODUCTION_LEVEL :{BLACK}Poziom produkcji: {YELLOW}{COMMA}% @@ -4304,7 +4340,7 @@ STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Wyślij STR_VEHICLE_LIST_REPLACE_VEHICLES :Zastąp pojazdy STR_VEHICLE_LIST_SEND_FOR_SERVICING :Wyślij do serwisu STR_VEHICLE_LIST_CREATE_GROUP :Stwórz grupę -STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Zysk w tym roku: {CURRENCY_LONG} (ostatni rok: {CURRENCY_LONG}) +STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Zysk w tym roku: {CURRENCY_LONG} (poprzedni rok: {CURRENCY_LONG}) STR_VEHICLE_LIST_CARGO :[{CARGO_LIST}] STR_VEHICLE_LIST_NAME_AND_CARGO :{STRING} {STRING} @@ -4350,7 +4386,9 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Usuń wszystkie STR_GROUP_RENAME_CAPTION :{BLACK}Zmień nazwę grupy STR_GROUP_PROFIT_THIS_YEAR :Zysk w tym roku: -STR_GROUP_PROFIT_LAST_YEAR :Zysk w zeszłym roku: +STR_GROUP_PROFIT_THIS_PERIOD :Zysk w tym okresie: +STR_GROUP_PROFIT_LAST_YEAR :Zysk w poprzednim roku: +STR_GROUP_PROFIT_LAST_PERIOD :Zysk w poprzednim okresie: STR_GROUP_OCCUPANCY :Aktualne wykorzystanie: STR_GROUP_OCCUPANCY_VALUE :{NUM}% @@ -4377,6 +4415,8 @@ STR_PURCHASE_INFO_SPEED_POWER :{BLACK}Prędko STR_PURCHASE_INFO_SPEED :{BLACK}Prędkość: {GOLD}{VELOCITY} STR_PURCHASE_INFO_SPEED_OCEAN :{BLACK}Prędkość na oceanie: {GOLD}{VELOCITY} STR_PURCHASE_INFO_SPEED_CANAL :{BLACK}Prędkość na kanale/rzece: {GOLD}{VELOCITY} +STR_PURCHASE_INFO_RUNNINGCOST_YEAR :{BLACK}Kosz Utrzymania: {GOLD}{CURRENCY_LONG}/rok +STR_PURCHASE_INFO_RUNNINGCOST_PERIOD :{BLACK}Kosz Utrzymania: {GOLD}{CURRENCY_LONG}/okres STR_PURCHASE_INFO_CAPACITY :{BLACK}Ładowność: {GOLD}{CARGO_LONG} {STRING} STR_PURCHASE_INFO_REFITTABLE :(przebudowywalny) STR_PURCHASE_INFO_DESIGNED_LIFE :{BLACK}Zaprojektowany: {GOLD}{NUM}{BLACK} Żywotność: {GOLD}{COMMA} lat @@ -4575,7 +4615,11 @@ STR_ENGINE_PREVIEW_AIRCRAFT.b :samolot STR_ENGINE_PREVIEW_SHIP :{G=m}statek STR_ENGINE_PREVIEW_SHIP.b :statek +STR_ENGINE_PREVIEW_TEXT3 :{BLACK}{STRING}{}{5:STRING}{}{STRING} +STR_ENGINE_PREVIEW_TEXT4 :{BLACK}{STRING}{}{STRING}{}{STRING}{}{STRING} +STR_ENGINE_PREVIEW_RUNCOST_YEAR :Kosz Utrzymania: {CURRENCY_LONG}/rok STR_ENGINE_PREVIEW_CAPACITY :Ładowność: {CARGO_LONG} +STR_ENGINE_PREVIEW_CAPACITY_2 :Ładowność: {CARGO_LONG}, {CARGO_LONG} # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Zastąp {STRING} - {STRING} @@ -4728,8 +4772,8 @@ STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}Max. pr STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Masa: {LTBLUE}{WEIGHT_SHORT} {BLACK}Moc: {LTBLUE}{POWER}{BLACK} Prędkość maksymalna: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Masa: {LTBLUE}{WEIGHT_SHORT} {BLACK}Moc: {LTBLUE}{POWER}{BLACK} Prędkość maksymalna: {LTBLUE}{VELOCITY} {BLACK}Maksymalna siła pociągowa: {LTBLUE}{FORCE} -STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Zysk w tym roku: {LTBLUE}{CURRENCY_LONG} (ostatni rok: {CURRENCY_LONG}) -STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR_MIN_PERFORMANCE :{BLACK}Zysk w tym roku: {LTBLUE}{CURRENCY_LONG} (ostatni rok: {CURRENCY_LONG}) {BLACK}Min. wydajność: {LTBLUE}{POWER_TO_WEIGHT} +STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Zysk w tym roku: {LTBLUE}{CURRENCY_LONG} (poprzedni rok: {CURRENCY_LONG}) +STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR_MIN_PERFORMANCE :{BLACK}Zysk w tym roku: {LTBLUE}{CURRENCY_LONG} (poprzedni rok: {CURRENCY_LONG}) {BLACK}Min. wydajność: {LTBLUE}{POWER_TO_WEIGHT} STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}Niezawodność: {LTBLUE}{COMMA}% {BLACK}Awarie od ostatniego serwisowania: {LTBLUE}{COMMA} STR_VEHICLE_INFO_BUILT_VALUE :{LTBLUE}{ENGINE} {BLACK}Zakupiony: {LTBLUE}{NUM}{BLACK} Wartość: {LTBLUE}{CURRENCY_LONG} @@ -4850,6 +4894,10 @@ STR_ORDER_DROP_HALT_DEPOT :Zatrzymaj # Depot action tooltips, one per vehicle type ###length VEHICLE_TYPES +STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP :{BLACK}Wybierz akcję do wykonania w tych warsztatach +STR_ORDER_ROAD_DEPOT_ACTION_TOOLTIP :{BLACK}Wybierz akcję do wykonania w tej zajezdni +STR_ORDER_SHIP_DEPOT_ACTION_TOOLTIP :{BLACK}Wybierz akcję do wykonania w tej stoczni +STR_ORDER_HANGAR_ACTION_TOOLTIP :{BLACK}Wybierz akcję do wykonania w tym hangarze ###next-name-looks-similar STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Dane pojazdu wykorzystane w warunku @@ -6093,6 +6141,7 @@ STR_COMPANY_SOMEONE.n :kimś STR_COMPANY_SOMEONE.m :kimś STR_COMPANY_SOMEONE.w :ktoś +STR_SAVEGAME_DURATION_REALTIME :{NUM}h {NUM}min STR_SAVEGAME_NAME_DEFAULT :{COMPANY}, {STRING} STR_SAVEGAME_NAME_SPECTATOR :Obserwator, {1:STRING} @@ -6126,6 +6175,10 @@ STR_TOWN_NAME :{TOWN} STR_VEHICLE_NAME :{VEHICLE} STR_WAYPOINT_NAME :{WAYPOINT} +STR_CURRENCY_SHORT_KILO :{NBSP}k +STR_CURRENCY_SHORT_MEGA :{NBSP}M +STR_CURRENCY_SHORT_GIGA :{NBSP}G +STR_CURRENCY_SHORT_TERA :{NBSP}T STR_JUST_CARGO :{CARGO_LONG} STR_JUST_RIGHT_ARROW :{RIGHT_ARROW} diff --git a/src/lang/simplified_chinese.txt b/src/lang/simplified_chinese.txt index 5d1326d7e2..3f100d7136 100644 --- a/src/lang/simplified_chinese.txt +++ b/src/lang/simplified_chinese.txt @@ -1308,7 +1308,7 @@ STR_CONFIG_SETTING_CONSTRUCTION_COSTS :建设费用: { STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT :设定建造的成本水平。 STR_CONFIG_SETTING_RECESSIONS :经济衰退: {STRING} -STR_CONFIG_SETTING_RECESSIONS_HELPTEXT :启用后,经济衰退将每隔几年就出现。在衰退期内,所有产出将大幅下降直至衰退结束。 +STR_CONFIG_SETTING_RECESSIONS_HELPTEXT :启用时,经济衰退将每隔几经济周期发生一次。经济衰退时所有工业货物产量都将大幅下降,直至衰退结束为止。 STR_CONFIG_SETTING_TRAIN_REVERSING :禁止列车在站台调头: {STRING} STR_CONFIG_SETTING_TRAIN_REVERSING_HELPTEXT :启用后,如果列车有到下一站的捷径,列车将不在非终点站台调头, diff --git a/src/lang/spanish.txt b/src/lang/spanish.txt index eb35523a30..3b39c6293e 100644 --- a/src/lang/spanish.txt +++ b/src/lang/spanish.txt @@ -536,7 +536,7 @@ STR_ABOUT_MENU_ABOUT_OPENTTD :Acerca de 'Open STR_ABOUT_MENU_SPRITE_ALIGNER :Alineador de sprites STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Activar cajas delimitadoras STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS :Activar/Desactivar coloreado de bloques modificados -STR_ABOUT_MENU_TOGGLE_WIDGET_OUTLINES :Activar/desactivar los bordes de los "widgets" +STR_ABOUT_MENU_TOGGLE_WIDGET_OUTLINES :Activa/Desactiva los bordes de los "widgets" ###length 31 STR_DAY_NUMBER_1ST :1 @@ -758,9 +758,9 @@ STR_SMALLMAP_TOOLTIP_SHOW_LINK_STATS_ON_MAP :{BLACK}Muestra STR_SMALLMAP_TOOLTIP_SHOW_TRANSPORT_ROUTES_ON :{BLACK}Muestra las rutas de transporte en el mapa STR_SMALLMAP_TOOLTIP_SHOW_VEGETATION_ON_MAP :{BLACK}Muestra la vegetación en el mapa STR_SMALLMAP_TOOLTIP_SHOW_LAND_OWNERS_ON_MAP :{BLACK}Muestra los propietarios de terreno en el mapa -STR_SMALLMAP_TOOLTIP_INDUSTRY_SELECTION :{BLACK}Haz clic en un tipo de industria para mostrarlo u ocultarlo. Ctrl+Clic alterna entre mostrar todos los tipos, con excepción del elegido, o mostrar solo el elegido -STR_SMALLMAP_TOOLTIP_COMPANY_SELECTION :{BLACK}Haz clic en una empresa para mostrar u ocultar sus bienes. Ctrl+Clic alterna entre mostrar todas las empresas, con excepción de la elegida, o mostrar solo la elegida -STR_SMALLMAP_TOOLTIP_CARGO_SELECTION :{BLACK}Haz clic en una carga para mostrar u ocultar sus bienes. Ctrl+Clic alterna entre mostrar todas las cargas, con excepción de la elegida, o mostrar solo la elegida +STR_SMALLMAP_TOOLTIP_INDUSTRY_SELECTION :{BLACK}Clica en un tipo de industria para mostrarlo u ocultarlo. Ctrl+Clic alterna entre mostrar todos los tipos, con excepción del elegido, o mostrar solo el elegido +STR_SMALLMAP_TOOLTIP_COMPANY_SELECTION :{BLACK}Clica en una empresa para mostrar u ocultar sus propiedades. Ctrl+Clic alterna entre mostrar todas las empresas, con excepción de la elegida, o mostrar solo la elegida +STR_SMALLMAP_TOOLTIP_CARGO_SELECTION :{BLACK}Clica en una carga para mostrar u ocultar sus flujos. Ctrl+Clic alterna entre mostrar todas las cargas, con excepción de la elegida, o mostrar solo la elegida STR_SMALLMAP_LEGENDA_ROADS :{TINY_FONT}{BLACK}Carreteras STR_SMALLMAP_LEGENDA_RAILROADS :{TINY_FONT}{BLACK}Ferrocarriles @@ -1065,11 +1065,11 @@ STR_GAME_OPTIONS_GUI_SCALE_5X :5x STR_GAME_OPTIONS_PARTICIPATE_SURVEY_FRAME :{BLACK}Encuesta automática STR_GAME_OPTIONS_PARTICIPATE_SURVEY :{BLACK}Participar en la encuesta automática -STR_GAME_OPTIONS_PARTICIPATE_SURVEY_TOOLTIP :{BLACK}Si está activado, OpenTTD enviará una encuesta al finalizar el juego +STR_GAME_OPTIONS_PARTICIPATE_SURVEY_TOOLTIP :{BLACK}Si está activado, OpenTTD enviará una encuesta al salir el juego STR_GAME_OPTIONS_PARTICIPATE_SURVEY_LINK :{BLACK}Acerca de la encuesta y la privacidad -STR_GAME_OPTIONS_PARTICIPATE_SURVEY_LINK_TOOLTIP :{BLACK}Se abrirá un navegador web con más información sobre la encuesta automática -STR_GAME_OPTIONS_PARTICIPATE_SURVEY_PREVIEW :{BLACK}Visualizar el resultado de la encuesta -STR_GAME_OPTIONS_PARTICIPATE_SURVEY_PREVIEW_TOOLTIP :{BLACK}Mostrar el resultado de la encuesta del juego actual +STR_GAME_OPTIONS_PARTICIPATE_SURVEY_LINK_TOOLTIP :{BLACK}Se abrirá el navegador web con más información sobre la encuesta automática +STR_GAME_OPTIONS_PARTICIPATE_SURVEY_PREVIEW :{BLACK}Vista previa del resultado +STR_GAME_OPTIONS_PARTICIPATE_SURVEY_PREVIEW_TOOLTIP :{BLACK}Muestra el resultado de la encuesta para el juego actual STR_GAME_OPTIONS_GRAPHICS :{BLACK}Gráficos @@ -1452,8 +1452,8 @@ STR_CONFIG_SETTING_PLANE_CRASHES_NONE :Ninguno* STR_CONFIG_SETTING_PLANE_CRASHES_REDUCED :Reducida STR_CONFIG_SETTING_PLANE_CRASHES_NORMAL :Normal -STR_CONFIG_SETTING_CROSSING_WITH_COMPETITOR :Permitir intersecciones con carreteras o ferrocarriles que sean propiedad de otras empresas: {STRING} -STR_CONFIG_SETTING_CROSSING_WITH_COMPETITOR_HELPTEXT :Permitir construir intersecciones en carreteras o ferrocarriles que sean propiedad de otras empresas +STR_CONFIG_SETTING_CROSSING_WITH_COMPETITOR :Permitir pasos a nivel con carreteras o ferrocarriles propiedad de otras empresas: {STRING} +STR_CONFIG_SETTING_CROSSING_WITH_COMPETITOR_HELPTEXT :Permite construir pasos a nivel en carreteras o ferrocarriles que sean propiedad de otras empresas STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD :Permitir construir paradas sobre carreteras de los municipios: {STRING} STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD_HELPTEXT :Permite construir estaciones de paso en carreteras que sean propiedad de los municipios @@ -1467,8 +1467,8 @@ STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE_HELPTEXT :Si se activa, l STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR :Color inicial de la empresa: {STRING} STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_HELPTEXT :Selecciona el color inicial de la empresa -STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_SECONDARY :Color secundario inicial de la empresa: {STRING} -STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_SECONDARY_HELPTEXT :Selecciona un color secundario para la empresa, si usas un NewGRF que lo permita +STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_SECONDARY :Color secundario de la empresa inicial: {STRING} +STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_SECONDARY_HELPTEXT :Selecciona un color secundario para la empresa, si usas un NewGRF que lo permita. STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS :Aeropuertos nunca caducan: {STRING} STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS_HELPTEXT :Permite a todos los aeropuertos estar disponibles permanentemente una vez han sido introducidos @@ -1491,7 +1491,7 @@ STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT_PERIOD :Cuando se activ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :Los vehículos nunca caducan: {STRING} STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Cuando se activa, todos los modelos de vehículos permanecen disponibles para siempre una vez han sido introducidos -STR_CONFIG_SETTING_TIMEKEEPING_UNITS :Control de horarios: {STRING} +STR_CONFIG_SETTING_TIMEKEEPING_UNITS :Cronometraje: {STRING} STR_CONFIG_SETTING_TIMEKEEPING_UNITS_HELPTEXT :Selecciona las unidades de gestión temporal del juego. Este ajuste no puede ser cambiado más adelante.{}{}"Basado en calendario" es la experiencia clásica de OpenTTD, donde un año tiene 12 meses y cada mes entre 28 y 31 días.{}{}En "Basado en reloj", el movimiento de los vehículos, la producción de carga y la gestión financiera se basan en incrementos de un minuto, que es similar a lo que tarda un mes de 30 días en el modo "basado en calendario". Estos se agrupan en períodos de 12 minutos, que equivalen a un año en el modo "basado en calendario".{}{}En uno y otro modo siempre hay un calendario clásico que es usado para las fechas de aparición de vehículos, casas y otras infraestructuras. ###length 2 STR_CONFIG_SETTING_TIMEKEEPING_UNITS_CALENDAR :Calendario diff --git a/src/lang/spanish_MX.txt b/src/lang/spanish_MX.txt index 56973c07d5..e055165a6a 100644 --- a/src/lang/spanish_MX.txt +++ b/src/lang/spanish_MX.txt @@ -239,6 +239,7 @@ STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP} # Time units used in string control characters +STR_UNITS_MONTHS :{NUM}{NBSP}mes{P "" es} # Common window strings @@ -493,6 +494,7 @@ STR_NEWS_MENU_DELETE_ALL_MESSAGES :Eliminar todos # About menu STR_ABOUT_MENU_LAND_BLOCK_INFO :Información sobre área de terreno +STR_ABOUT_MENU_HELP :Ayuda y manuales STR_ABOUT_MENU_TOGGLE_CONSOLE :Activar consola STR_ABOUT_MENU_AI_DEBUG :Depuración de scripts de IA o juego STR_ABOUT_MENU_SCREENSHOT :Captura de pantalla @@ -973,6 +975,8 @@ STR_GAME_OPTIONS_GUI_SCALE_AUTO_TOOLTIP :{BLACK}Detectar STR_GAME_OPTIONS_GUI_SCALE_BEVELS :{BLACK}Ajustar biseles STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP :{BLACK}Ajustar el tamaño de los biseles respecto a la interfaz +STR_GAME_OPTIONS_GUI_FONT_SPRITE :{BLACK}Usar la fuente sprite tradicional +STR_GAME_OPTIONS_GUI_FONT_SPRITE_TOOLTIP :{BLACK}Marca esta casilla si prefieres usar la fuente de letra tradicional. STR_GAME_OPTIONS_GUI_SCALE_1X :1x STR_GAME_OPTIONS_GUI_SCALE_2X :2x @@ -4015,6 +4019,7 @@ STR_ENGINE_PREVIEW_TRAM_VEHICLE :tranvía STR_ENGINE_PREVIEW_AIRCRAFT :{G=f}aeronave STR_ENGINE_PREVIEW_SHIP :{G=m}barco +STR_ENGINE_PREVIEW_SPEED_POWER :Velocidad: {VELOCITY} Potencia: {POWER} # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Reemplazar {STRING} - {STRING} @@ -4286,6 +4291,7 @@ STR_ORDER_DROP_HALT_DEPOT :Detenerse # Depot action tooltips, one per vehicle type ###length VEHICLE_TYPES +STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP :Seleccione una acción que quiera realizar en este depósito. ###next-name-looks-similar STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Datos del vehículo para recorridos condicionales @@ -4999,6 +5005,7 @@ STR_ERROR_AIRCRAFT_NOT_ENOUGH_RANGE :{WHITE}... la a # Extra messages which go on the third line of errors, explaining why orders failed STR_ERROR_NO_BUS_STATION :{WHITE}No hay una estación de autobus STR_ERROR_NO_STOP_COMPATIBLE_TRAM_TYPE :{WHITE}No hay paradas con un tipo de tramo compatible +STR_ERROR_AIRPORT_NO_HELICOPTERS :{WHITE}El helicóptero no puede aterrizar en este aeropuerto # Timetable related errors STR_ERROR_CAN_T_TIMETABLE_VEHICLE :{WHITE}No se pueden asignar itinerarios al vehículo... From 34b05465d5683b60c2af68a22063bf2fbd82250e Mon Sep 17 00:00:00 2001 From: merni-ns <66267867+merni-ns@users.noreply.github.com> Date: Wed, 7 Feb 2024 00:24:38 +0530 Subject: [PATCH 22/25] Fix 5a88027: [Script] Avoid overflow in scripts when infinite money is enabled (#12016) --- src/script/api/script_company.cpp | 2 ++ src/script/api/script_company.hpp | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/script/api/script_company.cpp b/src/script/api/script_company.cpp index 717aee5f50..881af1ec05 100644 --- a/src/script/api/script_company.cpp +++ b/src/script/api/script_company.cpp @@ -178,6 +178,8 @@ { company = ResolveCompanyID(company); if (company == COMPANY_INVALID) return -1; + /* If we return INT64_MAX as usual, overflows may occur in the script. So return a smaller value. */ + if (_settings_game.difficulty.infinite_money) return INT32_MAX; return GetAvailableMoney((::CompanyID)company); } diff --git a/src/script/api/script_company.hpp b/src/script/api/script_company.hpp index 762b8ffcdf..bfdc2a70c2 100644 --- a/src/script/api/script_company.hpp +++ b/src/script/api/script_company.hpp @@ -258,9 +258,10 @@ public: /** * Gets the bank balance. In other words, the amount of money the given company can spent. + * If infinite money is enabled, it returns INT32_MAX. * @param company The company to get the bank balance of. * @pre ResolveCompanyID(company) != COMPANY_INVALID. - * @return The actual bank balance. + * @return The actual bank balance or INT32_MAX. */ static Money GetBankBalance(CompanyID company); From 0858377e9e2633140319c11ffb545945452f0374 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Guilloux?= Date: Tue, 6 Feb 2024 19:58:30 +0100 Subject: [PATCH 23/25] Fix: [Script] Don't kill GS misusing GSText (#12009) --- src/script/api/script_text.cpp | 34 ++++++++++++++++++++++++---------- src/script/api/script_text.hpp | 5 ++++- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src/script/api/script_text.cpp b/src/script/api/script_text.cpp index d0b2157b66..2b16a6de9e 100644 --- a/src/script/api/script_text.cpp +++ b/src/script/api/script_text.cpp @@ -181,6 +181,15 @@ void ScriptText::_FillParamList(ParamList ¶ms) } } +void ScriptText::ParamCheck::Encode(std::back_insert_iterator &output) +{ + if (this->used) return; + if (std::holds_alternative(*this->param)) fmt::format_to(output, ":\"{}\"", std::get(*this->param)); + if (std::holds_alternative(*this->param)) fmt::format_to(output, ":{:X}", std::get(*this->param)); + if (std::holds_alternative(*this->param)) fmt::format_to(output, ":{:X}", this->owner); + this->used = true; +} + void ScriptText::_GetEncodedText(std::back_insert_iterator &output, int ¶m_count, StringIDList &seen_ids, ParamSpan args) { const std::string &name = GetGameStringName(this->string); @@ -198,7 +207,7 @@ void ScriptText::_GetEncodedText(std::back_insert_iterator &output, if (idx >= args.size()) throw Script_FatalError(fmt::format("{}({}): Not enough parameters", name, param_count + 1)); ParamCheck &pc = args[idx++]; if (pc.owner != this->string) ScriptLog::Warning(fmt::format("{}({}): Consumes {}({})", name, param_count + 1, GetGameStringName(pc.owner), pc.idx + 1)); - return pc.param; + return &pc; }; auto skip_args = [&](size_t nb) { idx += nb; }; @@ -209,19 +218,24 @@ void ScriptText::_GetEncodedText(std::back_insert_iterator &output, break; case StringParam::RAW_STRING: { - Param *p = get_next_arg(); - if (!std::holds_alternative(*p)) throw Script_FatalError(fmt::format("{}({}): {{{}}} expects a raw string", name, param_count + 1, cur_param.cmd)); - fmt::format_to(output, ":\"{}\"", std::get(*p)); + ParamCheck &p = *get_next_arg(); + if (!std::holds_alternative(*p.param)) ScriptLog::Error(fmt::format("{}({}): {{{}}} expects a raw string", name, param_count + 1, cur_param.cmd)); + p.Encode(output); break; } case StringParam::STRING: { - Param *p = get_next_arg(); - if (!std::holds_alternative(*p)) throw Script_FatalError(fmt::format("{}({}): {{{}}} expects a GSText", name, param_count + 1, cur_param.cmd)); + ParamCheck &p = *get_next_arg(); + if (!std::holds_alternative(*p.param)){ + ScriptLog::Error(fmt::format("{}({}): {{{}}} expects a GSText", name, param_count + 1, cur_param.cmd)); + p.Encode(output); + break; + } int count = 0; fmt::format_to(output, ":"); - ScriptTextRef &ref = std::get(*p); + ScriptTextRef &ref = std::get(*p.param); ref->_GetEncodedText(output, count, seen_ids, args.subspan(idx)); + p.used = true; if (++count != cur_param.consumes) { ScriptLog::Error(fmt::format("{}({}): {{{}}} expects {} to be consumed, but {} consumes {}", name, param_count + 1, cur_param.cmd, cur_param.consumes - 1, GetGameStringName(ref->string), count - 1)); /* Fill missing params if needed. */ @@ -233,9 +247,9 @@ void ScriptText::_GetEncodedText(std::back_insert_iterator &output, default: for (int i = 0; i < cur_param.consumes; i++) { - Param *p = get_next_arg(); - if (!std::holds_alternative(*p)) throw Script_FatalError(fmt::format("{}({}): {{{}}} expects an integer", name, param_count + i + 1, cur_param.cmd)); - fmt::format_to(output, ":{:X}", std::get(*p)); + ParamCheck &p = *get_next_arg(); + if (!std::holds_alternative(*p.param)) ScriptLog::Error(fmt::format("{}({}): {{{}}} expects an integer", name, param_count + i + 1, cur_param.cmd)); + p.Encode(output); } } diff --git a/src/script/api/script_text.hpp b/src/script/api/script_text.hpp index f46490fbae..9e6f1333c7 100644 --- a/src/script/api/script_text.hpp +++ b/src/script/api/script_text.hpp @@ -136,8 +136,11 @@ private: StringID owner; int idx; Param *param; + bool used; - ParamCheck(StringID owner, int idx, Param *param) : owner(owner), idx(idx), param(param) {} + ParamCheck(StringID owner, int idx, Param *param) : owner(owner), idx(idx), param(param), used(false) {} + + void Encode(std::back_insert_iterator &output); }; using ParamList = std::vector; From b0f3417025064d2a0890ff0356d954e1e794de20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Guilloux?= Date: Tue, 6 Feb 2024 20:22:18 +0100 Subject: [PATCH 24/25] Add: [Script] ScriptTileList_StationCoverage (#12015) --- regression/regression/main.nut | 16 +++ regression/regression/result.txt | 153 ++++++++++++++++++++++++++++- src/script/api/ai_changelog.hpp | 1 + src/script/api/game_changelog.hpp | 3 +- src/script/api/script_tilelist.cpp | 10 ++ src/script/api/script_tilelist.hpp | 13 +++ 6 files changed, 192 insertions(+), 4 deletions(-) diff --git a/regression/regression/main.nut b/regression/regression/main.nut index b2daa5b687..7e98dd6ab4 100644 --- a/regression/regression/main.nut +++ b/regression/regression/main.nut @@ -1358,6 +1358,21 @@ function Regression::Station() } } +function Regression::StationList() +{ + print(""); + print("--StationList--"); + local road_stations = AIStationList(AIStation.STATION_TRUCK_STOP); + for (local st = road_stations.Begin(); !road_stations.IsEnd(); st = road_stations.Next()) { + print(" GetName(): " + AIStation.GetName(st)); + print(" TileList_StationCoverage:"); + local coverage = AITileList_StationCoverage(st); + for (local i = coverage.Begin(); !coverage.IsEnd(); i = coverage.Next()) { + print(" " + i); + } + } +} + function Regression::Tile() { print(""); @@ -1989,6 +2004,7 @@ function Regression::Start() this.Road(); this.Sign(); this.Station(); + this.StationList(); this.Tile(); this.TileList(); this.Town(); diff --git a/regression/regression/result.txt b/regression/regression/result.txt index 57c8a400a9..2119ada528 100644 --- a/regression/regression/result.txt +++ b/regression/regression/result.txt @@ -7761,6 +7761,153 @@ ERROR: IsEnd() is invalid as Begin() is never called GetCargoPlannedFromVia(1000, 1000, 0, 1000): -1 GetCargoPlannedFromVia(1000, 1000, 1000, 1000): -1 +--StationList-- + GetName(): Little Frutford Valley + TileList_StationCoverage: + 34192 + 34191 + 34190 + 34189 + 34188 + 34187 + 34186 + 33936 + 33935 + 33934 + 33933 + 33932 + 33931 + 33930 + 33680 + 33679 + 33678 + 33677 + 33676 + 33675 + 33674 + 33424 + 33423 + 33422 + 33421 + 33420 + 33419 + 33418 + 33168 + 33167 + 33166 + 33165 + 33164 + 33163 + 33162 + 32912 + 32911 + 32910 + 32909 + 32908 + 32907 + 32906 + 32656 + 32655 + 32654 + 32653 + 32652 + 32651 + 32650 + GetName(): Little Frutford Woods + TileList_StationCoverage: + 34439 + 34438 + 34437 + 34436 + 34435 + 34434 + 34433 + 34432 + 34187 + 34186 + 34185 + 34184 + 34183 + 34182 + 34181 + 34180 + 34179 + 34178 + 34177 + 34176 + 33931 + 33930 + 33929 + 33928 + 33927 + 33926 + 33925 + 33924 + 33923 + 33922 + 33921 + 33920 + 33675 + 33674 + 33673 + 33672 + 33671 + 33670 + 33669 + 33668 + 33667 + 33666 + 33665 + 33664 + 33419 + 33418 + 33417 + 33416 + 33415 + 33414 + 33413 + 33412 + 33411 + 33410 + 33409 + 33408 + 33163 + 33162 + 33161 + 33160 + 33159 + 33158 + 33157 + 33156 + 33155 + 33154 + 33153 + 33152 + 32907 + 32906 + 32905 + 32904 + 32903 + 32902 + 32901 + 32900 + 32899 + 32898 + 32897 + 32896 + 32651 + 32650 + 32649 + 32648 + 32647 + 32646 + 32645 + 32644 + 32643 + 32642 + 32641 + 32640 + --Tile-- HasTreeOnTile(): false IsFarmTile(): true @@ -9589,9 +9736,9 @@ ERROR: IsEnd() is invalid as Begin() is never called --Valuate() with excessive CPU usage-- Your script made an error: excessive CPU usage in valuator function -*FUNCTION [unknown()] regression/main.nut line [2034] +*FUNCTION [unknown()] regression/main.nut line [2050] *FUNCTION [Valuate()] NATIVE line [-1] -*FUNCTION [Start()] regression/main.nut line [2035] +*FUNCTION [Start()] regression/main.nut line [2051] [id] 0 [this] TABLE @@ -9600,7 +9747,7 @@ Your script made an error: excessive CPU usage in valuator function [this] INSTANCE Your script made an error: excessive CPU usage in valuator function -*FUNCTION [Start()] regression/main.nut line [2035] +*FUNCTION [Start()] regression/main.nut line [2051] [Infinite] CLOSURE [list] INSTANCE diff --git a/src/script/api/ai_changelog.hpp b/src/script/api/ai_changelog.hpp index 96f4bc32a6..96ecbed7f5 100644 --- a/src/script/api/ai_changelog.hpp +++ b/src/script/api/ai_changelog.hpp @@ -21,6 +21,7 @@ * \li AITimeMode * \li AITown::ROAD_LAYOUT_RANDOM * \li AIVehicle::IsPrimaryVehicle + * \li AITileList_StationCoverage * * API removals: * \li AIError::ERR_PRECONDITION_TOO_MANY_PARAMETERS, that error is never returned anymore. diff --git a/src/script/api/game_changelog.hpp b/src/script/api/game_changelog.hpp index 810bea83e2..8736cce8b8 100644 --- a/src/script/api/game_changelog.hpp +++ b/src/script/api/game_changelog.hpp @@ -87,10 +87,11 @@ * \li GSStoryPage::IsValidStoryPageButtonColour * \li GSStoryPage::IsValidStoryPageButtonFlags * \li GSStoryPage::IsValidStoryPageButtonCursor + * \li GSTileList_StationCoverage * * API removals: * \li GSError::ERR_PRECONDITION_TOO_MANY_PARAMETERS, that error is never returned anymore. - * \li AIInfo::CONFIG_RANDOM, no longer used. + * \li GSInfo::CONFIG_RANDOM, no longer used. * * Other changes: * \li GSGroupList accepts an optional filter function diff --git a/src/script/api/script_tilelist.cpp b/src/script/api/script_tilelist.cpp index 6262db3acc..7b3d101490 100644 --- a/src/script/api/script_tilelist.cpp +++ b/src/script/api/script_tilelist.cpp @@ -147,3 +147,13 @@ ScriptTileList_StationType::ScriptTileList_StationType(StationID station_id, Scr this->AddTile(cur_tile); } } + +ScriptTileList_StationCoverage::ScriptTileList_StationCoverage(StationID station_id) +{ + if (!ScriptStation::IsValidStation(station_id)) return; + + BitmapTileIterator it(::Station::Get(station_id)->catchment_tiles); + for (TileIndex tile = it; tile != INVALID_TILE; tile = ++it) { + this->AddTile(tile); + } +} diff --git a/src/script/api/script_tilelist.hpp b/src/script/api/script_tilelist.hpp index ea584b7111..67779bb2d2 100644 --- a/src/script/api/script_tilelist.hpp +++ b/src/script/api/script_tilelist.hpp @@ -104,4 +104,17 @@ public: ScriptTileList_StationType(StationID station_id, ScriptStation::StationType station_type); }; +/** + * Creates a list of tiles in the catchment area of the StationID. + * @api ai game + * @ingroup ScriptList + */ +class ScriptTileList_StationCoverage : public ScriptTileList { +public: + /** + * @param station_id The station to create the ScriptTileList for. + */ + ScriptTileList_StationCoverage(StationID station_id); +}; + #endif /* SCRIPT_TILELIST_HPP */ From b085f610e2a92eb78aee547f1345007e5c4d8baf Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Tue, 6 Feb 2024 21:48:07 +0100 Subject: [PATCH 25/25] Doc: Prepare for 14.0-beta3 release (#12018) Co-authored-by: Michael Lutz --- changelog.txt | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/changelog.txt b/changelog.txt index 046c3868e4..9310b5b981 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,4 +1,18 @@ -14.0-beta2 (2023-02-04) +14.0-beta3 (2024-02-06) +------------------------------------------------------------------------ +Add: [Script] ScriptTileList_StationCoverage to get station coverage area (#12015) +Change: Update OpenTTD TTF fonts to v0.5 (#11994) +Fix #12012: Crash when opening orders of another company (#12013) +Fix #12001: Use correct valid cargo check for old-style NewGRF town house 3rd cargo set up (#12006) +Fix #11997: Adjust economy date by 1920 when loading TTD/TTO savegames (#12007) +Fix: Focus hotkey in road/tram stop building window (#12008) +Fix: Signals were incorrectly shifted by 1 pixel when selected (#12005) +Fix: Missing default vehicles and industry acceptance/production (#12000) +Fix: [Script] Avoid overflow in scripts when infinite money is enabled (#12016) +Fix: [Script] Don't kill GS misusing GSText (#12009) + + +14.0-beta2 (2024-02-04) ------------------------------------------------------------------------ Change: [NewGRF] Improved support for redefining default cargo types (#11719) Fix #11982: Crash when trying to place signals on things other than plain rails (#11977) @@ -10,7 +24,7 @@ Fix #11802: Made determining water region edge traversability more robust (#1198 Fix: Second colour vehicle-type default liveries were not being updated (#11971) -14.0-beta1 (2023-02-03) +14.0-beta1 (2024-02-03) ------------------------------------------------------------------------ Feature: Order option to unbunch vehicles at depot (#11945) Feature: Infinite money mode (#11902)