From 97921a389efdbd7f2ebf06780ddf1c9e5e4f2ba6 Mon Sep 17 00:00:00 2001 From: Dave Conley Date: Mon, 24 Jul 2017 13:49:43 +0100 Subject: [PATCH] Added reserve driver to the list of drivers in the teams tab Added player tab back Started adding driver personality traits --- .vs/MMSaveEditor/v15/.suo | Bin 526848 -> 595456 bytes MMSaveEditor.csproj | 14 ++ Model/Contract.cs | 97 ++++++------ Model/ContractManagerTeam.cs | 13 ++ Model/ContractPerson.cs | 89 ++++++----- Model/Driver.cs | 179 ++++++---------------- Model/EmployeeSlot.cs | 15 +- Model/PersonalityTrait.cs | 41 ++++- Model/PersonalityTraitController_v2.cs | 30 +++- Model/PersonalityTraitData.cs | 15 +- Model/Team.cs | 19 ++- Utils/VisibilityConverters.cs | 28 ++-- View/MainWindow.xaml | 10 +- View/MainWindow.xaml.cs | 41 ++++- View/TabPages/PersonPage.xaml | 10 +- View/TabPages/PersonPage_DriverStats.xaml | 4 +- View/TabPages/PersonPage_Trait.xaml | 18 +++ View/TabPages/PersonPage_Trait.xaml.cs | 28 ++++ View/TabPages/PersonPage_Traits.xaml | 18 +++ View/TabPages/PersonPage_Traits.xaml.cs | 28 ++++ ViewModel/PlayerViewModel.cs | 17 +- ViewModel/TeamPrincipalViewModel.cs | 6 +- 22 files changed, 452 insertions(+), 268 deletions(-) create mode 100644 View/TabPages/PersonPage_Trait.xaml create mode 100644 View/TabPages/PersonPage_Trait.xaml.cs create mode 100644 View/TabPages/PersonPage_Traits.xaml create mode 100644 View/TabPages/PersonPage_Traits.xaml.cs diff --git a/.vs/MMSaveEditor/v15/.suo b/.vs/MMSaveEditor/v15/.suo index a9b13a17088933eaad4f52fa572af27739a3a85e..fb097ea2700ba8e9c85bb36a70c0df0dbb571b8a 100644 GIT binary patch delta 21164 zcmeHv3s_Xu-ZyK{p0x)=91sx+aYVu!;)rN!hNGexUP3d|A{$Ul3;_{MNntcI^A@so z{%UF?8k(7*s8eQ&W_L5Rn@7#iZf0g!<}EMZZ>ZfchF1hsS%2Ujx|E?4&V}10grh+aOlaJ4Pof+T2|;4rWg*aNtM-GJa!I*#*!69B1LARzzU!%V8*p~aa;>DK=}ZUd4Ra*WX|H!1LuX!kfU9>@Tm07P9TjuU|_AREX5 zCIPv?WFQZi0!#&-1f~Jgfqdo@=JON^Gk}>u0Z<6I1oYmsQ)$Z)ZY!Vt@EVhD+uzF9 zXFDpk0Q%6at#rF$*7Nq?ufJ{Wq+hH#=Dm$`rIWcQB&+LJA8o5g4GS+%aGqwmXQWyl zHSz?bpd&oCJa+66b8*)wii&2H=I5c|FX~sjw5O=ntkT~N{*{3b;c8_I|<&kN_n0Xm`DiuBH>&K+%t`?}Ddcx#B zDC#%gWb14*EV^wC2)PMDa#!+5s$8H(mk*fxx`|4bsv+eev1gfH5%(wsoaJFul*G8+ z>&-jMOBRmSN_HtFOBHh6qeL!S&oHayryH-c#Vh5uEmf?zRiqv{e3gjciLL z>sh3w0?gW9k74F-Q4azm+v<_;MoKMzyMA>q@a6I@nuwMN4KS2mOol z^2{RHI;T(1drBGRQ+_GWkFm{q@97tZks>cTnyQl=~tVzEiairnw5OZ;kWm7 zV&f>Fsm84zS9ZA;(f?Av&OYj(CC$&+gwd22U&&%gVIXoBIxhvD1AKA*2p|O54d>T^ zdC<-iICcUS0cQa#+APKK7vM)Afays`dziPPxJ7^NXsh6dQ2G+M1>kM(esRw9c7Ka36vS@A>0AtS z6-SOHb5LG`@<%`ha31&@Al&jn9ESs4fKk9HKy=w0$1}ipz-C|}AY9H@fD;gHLeaO- z`-wnf;EKrS9>&FDoO};l0Ga+f`Hi1V+;|%YFHq3oTadeb7DqK0iO8c`Q;SEdL zMp|})`n~mLU|tU8T`S#R$(%^b9#p+izxoAK*LcUapx$aXufdfShQC}8X?Y8c_tm?> z|2@e5b%PB)#M(00@lhqn+vQ>Qk!j}%R>`PxEvB&TO>XnroUE!5n@22yJwlZ?wJ5JE zLUA#=pjigdS(7D%s-96A)A=lOBl?J0lGwd8=^3RHJ)dQ6K#t$F2g!Lax4}2`9>uaL z;+kTm{foJ6gDsB*>9%32H%b-LpT`tp*Vx^SQcMFwN3Ff_!PBnYw%>R6r@(C1gdV%7 zwUhzu{Autvb{7w&gKx2@z|_anC#NK*=T6SfN=ErHmqBJD6N|PMcA1{}Xx@kmy*_4> zyZ<~eQ1}e0V3sg8gL*eXFpPaq3--=j$e#8s$yZ93GwWX(yReCW$Jkqd$^XpQt+@YI zePh>mAGQ5Y7`iaP|C@#`=JlU4^k8sG8oGX?w6!;C6FU*8uO8fl980+$IhU{yZx=Ts z*687oHT#y0`(aU!%Hw@bp06;pp_-VLW+kvz?sJM?d53GiGjC)CJ83StsJNpPKd;~W zEF_3*eoUpPxoo|`s|8gZQUm36ZdbXK>8N@mU-_I6fyV#Eba+JX_)! zRCoa5lXoEv2|;SH1iE7m8{z1^k56+Eel~D))A}$v!cYV?TS0oQ;$KvVExq>4jz6 ztoPcU@g8_<-nk!EB|LH5b^2?)_tw1|*m6ZFwJ5541jCxW%2V=u!L;4#1^gGHUtjz1T$Y7YV?rt4cHL+18m87WuZH)GzYZsxx1X zJ}LZ!DbBtS`NIR`+|T{#!!LNOHTz)kyQ5aF@(WWdlrNdTC>Mf9 zv!QaOkqT!sboRTGVp7y_>*1I$@743uZaw6DtG(%o#OI_BTYE`s!Qkoa@Td7VlpyQy z$tyNeJ3e^Iny)rL)o)#rY}KL_^9#H$YjR#{W@dVBN^)-Y*ePT3XqLvDbaJX15NKpp zx&HCHuaz|keQbcee)tg~qn2Iu!%rI{{QN08{mbybBa#s2uS_kIQ+2mgOqDw8P#dUUy9B;DW!SlK|op7_~kx#Fb3B5;zPn3LK_*O-MEAa2anURlsXcP%4?VfvscZ zt`R<#&+gfACMm6lN}Y1dv6MYmG1HHKXidp>S&KFtn9K-BWCV^*K6k;-r6K2y$M!)S z{_BpjuJ|_|ey_7U6aH~5{9hONL_2)qSnP48$#R+xIZ|0gaTshg5#hhr7~GJKs&2S7 z9u4hqpQ-4s8#?YL2T8^Cc+`$V%Q)F(3icc`aMzPQgT?xahFO%X-r2ZWtQ-2^_Q@z2 zy3~w@z4pQOMO)q+`>S8G9MehRiv-uiPn1Oh`vZ{YQ;d9a4CP!>?6lNZ$;6`8vBP0; zutKDo(Bo7z>WWQ;@i^|qu?W{hR=pnQW096_z_A4;YuvPsadvxG*75%Z1$?tf zZQvD?{AW9D?hy*o<~E9*aTjc9s))JqkxBjM}QRI zQD8Li7~oW)=cy>90b_u%KsqoEcpMlHWB?O@CxA>~B9H}S13ADXAQzYnOOKq24~;wpVu39h#cIeb6T{ZDe0KzcDxY2_W1qipY9+D%bte`n3% zb!=8DG`YQ`ug?hgCLB`sGxr`PkKcrejkHpJ4<%n&r_iMyN&$P?JLPWW5cBqZQ+Z3- znWS`M;X)q-hC)Zg5xd@U?JMm_SN} zQo;OY!SqE_&E)kvs9Zw+=uiIdDxoYL`zu)o}j7QV0es~bQmt$JS> z@3$YNw}Ar+1$?0V&;Z@s!l@620aKJxr{Z7wg`(^nX)f_+5#DwA$^=F$rz;I8bewr7 z4VkSpWY18=ICC@leTI@q-5)mxP;{3YFeO8Rh`9Joj!YRPI&iz+$Bt`DJ3MCp#<p!RL_0BYpq1ZyD zVe1s!EB0j3nbD8$4xIV!6qg#j{d=2Uc(#K7>1d|8`yH}l-#wzi-aj{B-k6EzM=i!6 zUl@aIol-kU8XEt3kmI5cu>)giuyk5524VQ0228CR{|SZid9q1T@9X{F~+zy zRg95gZrFMp+SZN%#{4Yq7ds@k?>E@AH}DS}pUg8DsXHRx_`_2{ldYm`D4jnS&L~@V2jm}w3+)RRWc1c&7C zcN?=mvrNoBL3Dy1d&$|;Ah!}vt^(LZzhz1gc?!&ZWXW%4En9{eYzZp_TV!{`joAz> zteZ{2Kg?#7pjT{h{b@F53hUG_O*9zucMZHfUFP#9vNbggA$zhKL}k~pFx&h#5AtqS zO~V;e^p@CI2`*J~=s*nb>5kZ%ljI@^*A{gA(BNpKrd{ zgl2a#b)~8@CBi#A!nC<}smILe^mvoqYaeH-{En2jO%dLRQuAqFDmrG4AV*7cgtzB5 z^MPLUYX+#PEHH&q?0IuAITN&YYu{oDq-OcSpX^=PUclG;-(g4ju zp4O&rRNdCphbp?7?38?m7UbO>rX@BYOdOQAMrVQ#bnHtdn#$VNvZcC>7KGiY%}N`p z9*#C2zN~a5=Vk>xerigfl$R9;*_I;#u@nH~5?1Uz^*^y~CWjtjwI~ElbmqO_Y2Q zjIP>f3Uim6!l}$`F7{Tf)NBph-(l3Otx!?h0do)qTvO+ID^z5mTbgm(~8{JZhYdqvUVUz2lOaNjblxo1%}*kraCnRLKhG0<^2W zW~GA%A@4dK6L{Q>Y!}s4wB|?LTYU((Rjx*Vo}Lf`PP6JteW-G`n&>`k3UcpO_fWuL zGZ?i?Ej30hdjW!3xJ&Ix6>q5Xjo#$7#c!x_7_0*VRE(^_h7r zc`ibR;C3W=J~y{9sILCpJb;o{LM^2jHtkfCjdA3u^-GL>dv@~LnlGV2^4gFcV2^b- zMyy%_e&-)G+o*E8I)Ju+1S_b#14d-ut`4K>E#Q1*xjKX-kDTS|Xet_4d)tS{%<?@n(83WNt`;KGg)Z#*YMFrThx4VY=P)2UsZD?OWkMH zSX%X}8gGc-bIJ_y3obcMn}--$SpAAR*60{Lh0*wLAaCm{>Qst&r?&U%O%QsO&_2F5R7+z0cE#MGsV%NBrwxfZC-AWXuD6{C5J|(gRWnIyrm_`(?J8klVSjZgIbSh)f>GsO&hZI)iK0OJ*lId#evq&Skjis!Qf* zqr!0+6>{!XxiBHWD^NSht)f2a9J0PH#L`D~iMco^K=^>1I4#^52zNNBsI3-kbXAoN zce}>{8%*8@s^n=qhuU9G$k|JsL1nYRkds*^E1kU#8w5Qg$(5kaCBK_c+sbvSoorbk zzQ;HC$KDl#C1-+3=X#=@brJ>}-4onH3C{Bgu=V8K5Wi%B{cfn8l*@d^rI7@cmYEf* zWIV?Z^3m>UlH0_y$kh#eOa2TLijYH26$W`*_|+=!W-!2dm-;#!zOeks7_etoa9>U! zN#ixn?L@q~(jccO9_|E+kU(cU!(wcm)rAK0JaK|~uq^io7~sQk!ggL$fn>Qf^OJJhLNLk=c&0+UuY1kF-PhI{R(j&=_Ow;T__SQZ8t z3@A*;#kkVkWs{Uf*s78}?QVpgV4v`c9WVpowm_(b+*U62pdIA|@&F3& z0I3SP#i`x6K~{ubfg(vts@p^D9Z8_V(;oIC$jNyCCNiKs_!iq1rwG-Fbf|Hy6~QSZ z^bbQ+&1nbgD4Wlx8dl_7z{l70xq#2DQO?#-9~pC!TdM^|F!Bt6SP=9P)1>VVf&OMi zi&+S*wY|Z|OLvcEc1pPu=1>_0?UAl?aTHi@i-H%J@BxpeqCa3FNEA3#et_xa+^fah z&KtB?&sb3_c^N)hu<;K=b!BZ5U1|;{;kIdpv0 z``zRoH#_*qHdyaRapfrHasbDvR3m>mSL!Bl> za(D_5FKXjW!s{vOe94O$4YaXRASlGr0DnB?aI`>!f(GFBQGczQ!3tSBt)Z4^#I2lY zXyeU>qHzbo-T)1XxB(?p__=SHMo_!sSY>4XU>ar! z{M`3YBG>mY2ix~1Cms3@71GN&<1{NJ_knAWc?wS9!@k8VrGuIKEm(*QFPP?chUB1P zDmlM}owRumh+1-eR;oo4bW4{Z`klHPCO8aTlVlb6T!+8ZAx{gfd ze3qDLsglApxhnIP%`+#n4UPz|(T8n$1eLYs>%D!VxoXC`ZAoi>2f4=JiPi?i!e-Oj zBg%v1dYk*<5jl&(ixbDN%)|zU+>}W9eY7El)XREKHP+t=FzEm+}6G`kM<_T^PQ&B#qh^UJdY%E7ar+N?8bMq(p@~DvBL_Bx(p{*B`=6G=v z=H%+f+R%Zv*ll#p;}7W(LnGYP((w;k`O!~u}8}NS?P(n8H2E`BVKL^!|M}+ z`IF|%)amKDG;=VIXFJF`nP)eim_0TA87$m4SLE@%HRB(M?Y8ywtQD`I1A9e91wSW2dD~%$zaf zss5ch_3qm@u3LxBof12Bi0|9Y-l2Er_&y!_$M>^$Pwbp{SC`IxXO@a?3fum>&E=@s zO$_3v;+du_WoC~_&C8})1F)3GbRS`~XCR+!!lcPHfOnve?&G=YLB<0irXtVunp0zi?kplYoYt>nCS z^C(`V1lGQG3XfIs7Mhr8a0=f-Y!IXbQE9B}?Xq^=WEa2EXif2ME#M86CgRna+Fx%J zB7wv|32hATT4Q53$MD|uiUHE{>I71cT=8aMXVH;iNkjjumelC>Yev!nC3E{T(;G9_pW2db?B0wI<9l~`1JJ7UAxEH?VY>Ccb@^O{_bZG z`L7JGN#nXn4wB}WTPxrWVTM}$Wqrs$ua~^qJAr#ylV0`68CX+JBv|Szv}-aC7Q$;w z&4=)&47OBTR#vGrYaDM@8n5Bitx5bD?=N|LDGNDV*I95yI~bwVWWx`2|9AaRqrs^e zSr27ojm>^iGW#B($+7Y!GghzM?LW(QVxxGznp5k+%)ZH@xOEioqSlqTD5dA#Rw=U; zGiyON()jxZ7bXto;jG{7vcB$*N4*9|@d&u?Cp0k(kShHz99nP)tXF!(!G@a??u3Sp zfQPLb#d+g@S=;FEYQ3qC@;emT zuVK?)gowt0wR1E~5#%`}c|m`1-BNqq`&ABaUc(IGT=1aYCvly0V}A}g4I9+ng3f!$ z&i()4N?o_N=j<0E=6t(XdNl+4^wR&K)PVK4U9MGUN3v2UbR5#;mP7eydVdIZJ^DY%0}YyR z8pitGF4xY?%V@@9NMx^1=O2sOjx^(b-q@I)QNB$*WzFRKXzeVHwM8-l#XYynw;Ops zbm5^vX{k2a8&SwNGa5FBKS)o{QCiA3PHFXJyus@7wK%=Ma7&;mT!AF&Kl&GMMgIRs z|6t1h{zw0KONqA>>0tnEeuf9pPszNEx6w2F8-+$5#~XXj<7|Mk9qW_DdxW3 zi96}*4lE4w8^kDi37^Nd(S@aa5_!JnA^Q6V+ac$_N;jV8t0}QS!>eLPxRq8;Py@)b znp?0gNF_c-ue!|X-J41n8tq7xOu^ z{vGU0c#5&16StBV)A|*BF&&w$4R^2MAym0Z3!{P+*u&cI;c3`&RYf0X>B5_Q3^_kz z(Uh~Ca~exXKc~{HcX+nmaS^A{#5tQlfh)8zbi$2g&PZC4sXc^SAEdR*Fnsk=z8#N& zxl_0OWT8z@VoiML1$4CjDo-KX3p|#sq(Pz6b zX7VY>rS|>sFeT83&adM~NPU?X2`)Qz&kj|7ucEi#9!xhkg5Ws^aUawnfCg>kad;Cp z@H8BY=X;IQ`x~%Cjm*-VhEPLcjyDh4TsqzW63oB5Mqk`|vd=l@xc*W@z%3j#9)4bpK0GS}@g5|H>tFEsWU9 zU}n`0W}}>sG=H|2dT-;4X!d?Q7bsiBv8w@6**scuzxiHroyA6{(_|8kQfE~Cyf#AU zww2EBz+PzS3O-u5&258jd(q78ypXwRNi|P*|DmWfWILGWk|Lt2fp~X$TBh2DPL^Y$ zVrIJMV{GQXDW-iIta0wb27}8O^iML2pq^enU+SWurYG}Ir?+6VuHDdhDGEbU2p|?c)hlQGrcWq0Qu~;10H&w*HOJq=XGj*mYBywa3sqKmF0c z;h1P7-b38O57GYjwBgV$e%mc5Q=ni%230ESiF>0c@F0XA2XCUQs0<#KuymPnGU;Rk4VPFA|OhY}(2=ReXZU z$`M{HXA!7eKx^O89;c!ok;|mhzLikdX#yo%h999OS za|+6A*vLc9Bz36l7?iv0Z`h|l@+nO6q_4?OZ@)Jf#QsdPj`Eiw=6%z(DcH;8Q7lEc z;`{0TE1EwTA-)2ebK3|O|Ez_xN%VZYArSf2csvCk6bycX#i7TJLjA^&=Y59fV<%t< z-yTQ6kPNCgj!iNdYN{@W)H&d7ba68@QmLv4J08hZJd*9I3z0*ZAzq)^8@A#(%HmM}fvitG zj^Sg^E0L5lTn#4s_Xu-SsnY~4n>s$sIPTgY+|@%y=S|({R7knfiYLuRx#lPe8KOzbz#O&e3#lzcxG6~ed4XoyQFoy zsGyWZP|-OMQ(`b=&re82rKZ?^f`1p%(Vfi^IGSUNxat?FaB?oL$5fU2KdxFa(rijS z&lgb9&-^p8{mgSPvs0y*uXxYiuQrZtmB~pO+3-My&R>D~!^aoUo@ZDDxYP{VRO7Ao ztdPk}L!-T3^(LhF8@64SI<>KM^B8n`&#%zw;LT9j@L$mn3}QHym7>X(3vdoa)rjbc zCveSC&68>NVyHa^#Vagtz?^=ey*bcAXCV`Bo$m1=*M2R8Y{h7fPa*w4Y!4kZC#j@S^(#I7yqUKOeZusy>6 zba4NoWm3SWc(T;d#5kIPg+6->F(#*(2BE*kH0vOAN(4o!j@LvSMS}4lIpVcpA~w}z z4Hd27g^;*_Pf=2Xf21W&?KzP)zzK;-W;wNJitnc#bniu1eok$qU^pIARl${3FNVjl z_tR8XWH`pk&$T4;QjoJv`Ueu!P}UQeunc2G6SNqLe+$ETrm}dD87TrC4E<>qPemDM zCPRTIj3M0#XTmR^l6fOEQN+LLhF|a`D9!&CVw! z%`K_-3B#KukaJS))SR7Ugg#^>i`E=)?ZB@*&Hb}trB&HlFf3#1EG?C+*+@=>nd!Dq z#OP0m&@hm4p456GXzx3&JxSM=s5S^S9BkYvgt~yN7kCW&T{!M^p+o+(WeT2>A|Hoa zKP^rEOQAndZhSyStMY2Kxnc|Qu*c>hHrVn&=xwRan+*EEYnhac2N`DS^d7>W=hrw& zm@ecXG6|WaxTZm7aDXGI2VQ=tczYvV6@hGKCtovf&ggF%q!ahd-F~2uvE^C$Hs?P>p5Gqfcf-$})LBbVCWD zbA@=GhCgLc`a^?CWgVrYJsS-KUMFAv&T|wwU#+tR}Zi zn5QA4?$aKo#Scl{5U*5DrNdkKqx$MWVx7}cB*9~3CUnt(i=(uS#?k((??HpnLeJR zMN728I=_n?yd!+g!Hsa=j=De|eOr%oXCLuNLL8j=iwFv~bJB^uXrwr{Pnh8TI=XOL zWOiTK%#*?P!$zWKyBbCIr5Ii=+vLhPU)SQuh>m5t z5p0NQh{!+2P|*gcicB65Zp4acJ_VL)BzT!c&YPHNKq-cju|f`Y?l;XM7j$UbTTHAe zd6sKAVo?{2_b;_fc91Tt<2oH8Edh4Y@>L`mt>ah#CVOv91fS5@B;u#|Lr`02=rNul zR^Ca5?t1RT13l*^$idKbs(4x|#p8y=YnPK4eX;Pblj`{FPZeunqqTm-qHL%MXSTL- zH4rZh9;w``2q}p5-@~KDj6sC$7^{d>W`OAJA+fTIpiP@$UAGsg_zN8E3?5aMX>FwQ z(mmlKPZFP>%4GThk=_Ks_t)ui-DZWd-p9Q|+gZzs^V{LNipxY+^EKXu*e;kG58JUH zz#xvDP?tW!=0=hAQ#{odQIZ_xXe8H5&OE$5g)r0*Jz;gQ>lTalF!sGMHT6P8J#NU z0|~)#09mhrjH);B4-yr)7CTD-3%Wsw+ocfoO(&DcvkUdu>PVyH@yJ^bz5#C!TG6~a z;b{+7op8 zGepmvZ!fB|y=N(KZ?|`<6F8)*#3Sh!`<+mALL5Mws6iKEO zIS1gizc4Id{@dW1O!R6~DE~TpJRsQoEX_Gn+n23x8!CGjx?yZj*s(McABuvOZH$~B zX!DHi1;ndp+7x6GesZ$0VoeE^&Y~;reGefRtC!{VR-IKJ!T(B+=XqYr_iMSspxb_E z2jPjoRgo#3F|9t!MA{}^U#M9oFa8*MHfIk+Ef=^OnlM34H1-)jM@TJu9JH3bg`I;O z{5=ttTeIf)28_6f3>#hD2hGSKB;Fb19IXl)J7;7>Rh1%rc#IabgdGlFATsVbQklaHr&YCE&KO@~e2VlZ?o;T7Oo5SDMu{D*r4*2+ ziZDSke2E2Qkl3jMQ7>SA#fF1NCN)S|#i(e7mL?;d^B9Jc`#QD>EC!9^FoWe{t=w3o zw|EI=n$`wyiXdN+`KiB90NwG4m|908d$Juxc4A1dOs=#xVZ1zJF<$%0bZEWZKBPQf zK%bAijd%qk8&Z?5`6}@kej|pjS;$v)#9l(mSBP}5z4gKp5V=oawn4|WE!YG*dn-qq1CA}Rd@mS)-3sv3x(5`(@0_}Pr)>>@WQ)Ur?fsaXEEl4Z`*|~9hLbh0xI^M zUgQDT&YX3Ik8xKaO@IcciB*Ju?W*q%!&Qn5T|ZgUhHPKMyo{8tDYDlIKWM?q5=H^v zX&a60%X&-OMKTc`BLbU|Q;5_e8_f2D`n%P zT--k+(~LU@&eZHUhKV%P!j4ejPudGckQM6*-PYGm0Y8CIndv)yl>oiNHDNQafY);k z8QXt_M@G8SU-;&(<^`x3Z`3$0K)Iyj^t>t^=O54vxuRd7AN)lq>lOOsy!J*tnmzXm zJLx9#TdLZ|;>dAcI5M$Yn}b~`xsiuG3>ytUj;say>|=G$Jz?Tc5!@-BpF9n76_3uI z!SV0^P{Mp%>nlDz{$+{h44si)iCXhHoOCfoJ;D7s#Dy5wpw_|M*eAOWK{(zCe+G zaAX?3m!CClblsLyDBWm}r&`aOERNC+oYAT0@S@ck#S&@4hx+7*bY delta 41790 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 PersonPage_DriverStats.xaml + + PersonPage_Traits.xaml + PersonPage_TPStats.xaml TeamPage.xaml + + PersonPage_Trait.xaml + TeamPage_CarPart.xaml @@ -694,6 +700,10 @@ MSBuild:Compile Designer + + MSBuild:Compile + Designer + Designer MSBuild:Compile @@ -702,6 +712,10 @@ Designer MSBuild:Compile + + MSBuild:Compile + Designer + Designer MSBuild:Compile diff --git a/Model/Contract.cs b/Model/Contract.cs index 8449c8c..11bc90a 100644 --- a/Model/Contract.cs +++ b/Model/Contract.cs @@ -2,55 +2,62 @@ using FullSerializer; using System; -[fsObject( MemberSerialization = fsMemberSerialization.OptOut )] +[fsObject(MemberSerialization = fsMemberSerialization.OptOut)] public class Contract { - public Contract.Job job = Contract.Job.Unemployed; - public DateTime startDate = new DateTime(); - private DateTime mEndDate = new DateTime(); - private Contract.ContractStatus mContractStatus = Contract.ContractStatus.OnGoing; - public Action OnOptionClauseEnd; - protected CalendarEvent_v1 mCalendarEvent; + public Contract.Job job = Contract.Job.Unemployed; + public DateTime startDate = new DateTime(); + private DateTime mEndDate = new DateTime(); + private Contract.ContractStatus mContractStatus = Contract.ContractStatus.OnGoing; + public Action OnOptionClauseEnd; + protected CalendarEvent_v1 mCalendarEvent; + public Contract.ContractStatus contractStatus + { + get + { + return this.mContractStatus; + } + } - public enum ContractStatus - { - InProposalState, - OnGoing, - InOptionClause, - Terminated, - } + public enum ContractStatus + { + InProposalState, + OnGoing, + InOptionClause, + Terminated, + } - public enum Job - { - [LocalisationID( "PSG_10003547" )] Driver, - [LocalisationID( "PSG_10003548" )] Staff, - [LocalisationID( "PSG_10003549" )] Engineer, - [LocalisationID( "PSG_10004602" )] EngineerLead, - [LocalisationID( "PSG_10009360" )] TeamAssistant, - [LocalisationID( "PSG_10003552" )] TeamPrincipal, - [LocalisationID( "PSG_10003553" )] Scout, - [LocalisationID( "PSG_10003554" )] Mechanic, - [LocalisationID( "PSG_10003555" )] Chairman, - [LocalisationID( "PSG_10007918" )] IMAPresident, - [LocalisationID( "PSG_10003556" )] PrivateInvestigator, - [LocalisationID( "PSG_10003557" )] Photographer, - [LocalisationID( "PSG_10003558" )] BookKeeper, - [LocalisationID( "PSG_10003559" )] Barrister, - [LocalisationID( "PSG_10003560" )] Actor, - [LocalisationID( "PSG_10003561" )] SponsorLiasion, - [LocalisationID( "PSG_10003562" )] Journalist, - [LocalisationID( "PSG_10005269" )] Fan, - [LocalisationID( "PSG_10003563" )] Unemployed, - [LocalisationID( "PSG_10003555" )] InvestorChairman, - } + public enum Job + { + [LocalisationID("PSG_10003547")] Driver, + [LocalisationID("PSG_10003548")] Staff, + [LocalisationID("PSG_10003549")] Engineer, + [LocalisationID("PSG_10004602")] EngineerLead, + [LocalisationID("PSG_10009360")] TeamAssistant, + [LocalisationID("PSG_10003552")] TeamPrincipal, + [LocalisationID("PSG_10003553")] Scout, + [LocalisationID("PSG_10003554")] Mechanic, + [LocalisationID("PSG_10003555")] Chairman, + [LocalisationID("PSG_10007918")] IMAPresident, + [LocalisationID("PSG_10003556")] PrivateInvestigator, + [LocalisationID("PSG_10003557")] Photographer, + [LocalisationID("PSG_10003558")] BookKeeper, + [LocalisationID("PSG_10003559")] Barrister, + [LocalisationID("PSG_10003560")] Actor, + [LocalisationID("PSG_10003561")] SponsorLiasion, + [LocalisationID("PSG_10003562")] Journalist, + [LocalisationID("PSG_10005269")] Fan, + [LocalisationID("PSG_10003563")] Unemployed, + [LocalisationID("PSG_10003555")] InvestorChairman, + } - public enum ContractTerminationType - { - Generic, - ContractElapsed, - FiredByPlayer, - HiredBySomeoneElse, - IsRetiring, - } + public enum ContractTerminationType + { + Generic, + ContractElapsed, + FiredByPlayer, + HiredBySomeoneElse, + IsRetiring, + } } diff --git a/Model/ContractManagerTeam.cs b/Model/ContractManagerTeam.cs index 66021a9..abb08ec 100644 --- a/Model/ContractManagerTeam.cs +++ b/Model/ContractManagerTeam.cs @@ -14,4 +14,17 @@ public class ContractManagerTeam private Team mTeam; private Driver mLatestFiredActiveDriver; + + public void GetAllDrivers(ref List drivers) + { + int count = this.mEmployeeSlots.Count; + for (int index = 0; index < count; ++index) + { + if (this.mEmployeeSlots[index].jobType == Contract.Job.Driver && !this.mEmployeeSlots[index].IsAvailable()) + { + Driver personHired = this.mEmployeeSlots[index].personHired as Driver; + drivers.Add(personHired); + } + } + } } diff --git a/Model/ContractPerson.cs b/Model/ContractPerson.cs index b899a1c..0bd4345 100644 --- a/Model/ContractPerson.cs +++ b/Model/ContractPerson.cs @@ -1,51 +1,58 @@ using FullSerializer; using System; -[fsObject( MemberSerialization = fsMemberSerialization.OptOut )] +[fsObject(MemberSerialization = fsMemberSerialization.OptOut)] public class ContractPerson : Contract { - private ContractPerson.Status mCurrentStatus = ContractPerson.Status.Reserve; - private ContractPerson.Status mProposedStatus = ContractPerson.Status.Reserve; - public DateTime optionClauseEndDate = new DateTime(); - public string employeerName = string.Empty; - public ContractPerson.BuyoutClauseSplit buyoutSplit = ContractPerson.BuyoutClauseSplit.PersonPaysAll; - public int yearlyWages; - public int signOnFee; - public int qualifyingBonus; - public int qualifyingBonusTargetPosition; - public int raceBonus; - public int raceBonusTargetPosition; - public int championBonus; - public int payDriver; - public int amountForContractorToPay; - public int amountForTargetToPay; - public Entity employeer; - public bool hasSignOnFee; - public bool hasRaceBonus; - public bool hasQualifyingBonus; - public ContractPerson.ContractLength length; - private Person mPerson; + private ContractPerson.Status mCurrentStatus = ContractPerson.Status.Reserve; + private ContractPerson.Status mProposedStatus = ContractPerson.Status.Reserve; + public DateTime optionClauseEndDate = new DateTime(); + public string employeerName = string.Empty; + public ContractPerson.BuyoutClauseSplit buyoutSplit = ContractPerson.BuyoutClauseSplit.PersonPaysAll; + public int yearlyWages; + public int signOnFee; + public int qualifyingBonus; + public int qualifyingBonusTargetPosition; + public int raceBonus; + public int raceBonusTargetPosition; + public int championBonus; + public int payDriver; + public int amountForContractorToPay; + public int amountForTargetToPay; + public Entity employeer; + public bool hasSignOnFee; + public bool hasRaceBonus; + public bool hasQualifyingBonus; + public ContractPerson.ContractLength length; + private Person mPerson; + public ContractPerson.Status currentStatus + { + get + { + return this.mCurrentStatus; + } + } - public enum Status - { - [LocalisationID( "PSG_10005057" )] Equal, - [LocalisationID( "PSG_10005068" )] One, - [LocalisationID( "PSG_10005069" )] Two, - [LocalisationID( "PSG_10005070" )] Reserve, - } + public enum Status + { + [LocalisationID("PSG_10005057")] Equal, + [LocalisationID("PSG_10005068")] One, + [LocalisationID("PSG_10005069")] Two, + [LocalisationID("PSG_10005070")] Reserve, + } - public enum ContractLength - { - Short, - Medium, - Long, - } + public enum ContractLength + { + Short, + Medium, + Long, + } - public enum BuyoutClauseSplit - { - [LocalisationID( "PSG_10009283" )] TeamPaysAll, - [LocalisationID( "PSG_10009282" )] EvenSplit, - [LocalisationID( "PSG_10009281" )] PersonPaysAll, - } + public enum BuyoutClauseSplit + { + [LocalisationID("PSG_10009283")] TeamPaysAll, + [LocalisationID("PSG_10009282")] EvenSplit, + [LocalisationID("PSG_10009281")] PersonPaysAll, + } } diff --git a/Model/Driver.cs b/Model/Driver.cs index f6c5902..35769df 100644 --- a/Model/Driver.cs +++ b/Model/Driver.cs @@ -5,6 +5,7 @@ using GalaSoft.MvvmLight.Command; using MMSaveEditor.ViewModel; using GalaSoft.MvvmLight.Ioc; +using MMSaveEditor.View; [fsObject(MemberSerialization = fsMemberSerialization.OptOut)] public class Driver : Person @@ -13,7 +14,7 @@ public class Driver : Person public DriverMentalState mentalState = new DriverMentalState(); public CarOpinion carOpinion = new CarOpinion(); - public PersonalityTraitController_v2 personalityTraitController; + private PersonalityTraitController_v2 personalityTraitController; private int desiredChampionships; private long desiredBudget; @@ -77,223 +78,135 @@ public class Driver : Person public bool hasBeenScouted { - get - { - return this.mHasBeenScouted; - } - set - { - mHasBeenScouted = value; - } + get => this.mHasBeenScouted; + set => mHasBeenScouted = value; } public int daysToScoutShort { - get - { - return this.mDaysToScoutShort; - } - set - { - mDaysToScoutShort = value; - } + get => this.mDaysToScoutShort; + set => mDaysToScoutShort = value; } public int daysToScoutLong { - get - { - return this.mDaysToScoutLong; - } - set - { - mDaysToScoutLong = value; - } + get => this.mDaysToScoutLong; + set => mDaysToScoutLong = value; } public Championship.Series preferedSeries { - get - { - return this.mPreferedSeries; - } - set - { - mPreferedSeries = value; - } - } - public IEnumerable SeriesTypes - { - get - { - return Enum.GetValues(typeof(Championship.Series)).Cast(); - } + get => this.mPreferedSeries; + set => mPreferedSeries = value; } + public IEnumerable SeriesTypes => Enum.GetValues(typeof(Championship.Series)).Cast(); public bool joinsAnySeries { - get - { - return this.mJoinsAnySeries; - } - set - { - mJoinsAnySeries = value; - } + get => this.mJoinsAnySeries; + set => mJoinsAnySeries = value; } public int DesiredChampionships { - get - { - return desiredChampionships; - } + get => desiredChampionships; - set - { - desiredChampionships = value; - } + set => desiredChampionships = value; } public long DesiredBudget { - get - { - return desiredBudget; - } + get => desiredBudget; - set - { - desiredBudget = value; - } + set => desiredBudget = value; } public int MDesiredWins { - get - { - return mDesiredWins; - } + get => mDesiredWins; - set - { - mDesiredWins = value; - } + set => mDesiredWins = value; } public long MDesiredEarnings { - get - { - return mDesiredEarnings; - } + get => mDesiredEarnings; - set - { - mDesiredEarnings = value; - } + set => mDesiredEarnings = value; } public int DriverNumber { - get - { - return driverNumber; - } + get => driverNumber; - set - { - driverNumber = value; - } + set => driverNumber = value; } public int StartOfSeasonExpectedChampionshipPosition { - get - { - return startOfSeasonExpectedChampionshipPosition; - } + get => startOfSeasonExpectedChampionshipPosition; - set - { - startOfSeasonExpectedChampionshipPosition = value; - } + set => startOfSeasonExpectedChampionshipPosition = value; } public int ExpectedChampionshipPosition { - get - { - return expectedChampionshipPosition; - } + get => expectedChampionshipPosition; - set - { - expectedChampionshipPosition = value; - } + set => expectedChampionshipPosition = value; } public int ExpectedRacePosition { - get - { - return expectedRacePosition; - } + get => expectedRacePosition; - set - { - expectedRacePosition = value; - } + set => expectedRacePosition = value; } public float MPotential { - get - { - return mPotential; - } + get => mPotential; - set - { - mPotential = value; - } + set => mPotential = value; } public float MModifiedPotential { - get - { - return mModifiedPotential; - } + get => mModifiedPotential; - set - { - mModifiedPotential = value; - } + set => mModifiedPotential = value; } public DriverStats MStats + { + get => mStats; + + set => mStats = value; + } + + public RelayCommand ViewDriver { get; private set; } + + public PersonalityTraitController_v2 PersonalityTraitController { get { - return mStats; + return personalityTraitController; } set { - mStats = value; + personalityTraitController = value; } } - public RelayCommand ViewDriver { get; private set; } - public Driver() { - ViewDriver = new RelayCommand((s) => _viewDriver(s)); + ViewDriver = new RelayCommand(_viewDriver); } private void _viewDriver(Driver d) { var driverVM = SimpleIoc.Default.GetInstance(); driverVM.SetModel(this); + MainWindow.Instance.SwitchToTab(MainWindow.TabPage.Driver); } } diff --git a/Model/EmployeeSlot.cs b/Model/EmployeeSlot.cs index 24bfc2d..337c7e7 100644 --- a/Model/EmployeeSlot.cs +++ b/Model/EmployeeSlot.cs @@ -1,13 +1,16 @@  using FullSerializer; -[fsObject( MemberSerialization = fsMemberSerialization.OptOut )] +[fsObject(MemberSerialization = fsMemberSerialization.OptOut)] public class EmployeeSlot { - public Contract.Job jobType = Contract.Job.Unemployed; - public int slotID = -1; - public Person personHired; - private Team mTeam; - + public Contract.Job jobType = Contract.Job.Unemployed; + public int slotID = -1; + public Person personHired; + private Team mTeam; + public bool IsAvailable() + { + return this.personHired == null || this.personHired.contract.contractStatus == Contract.ContractStatus.Terminated; + } } diff --git a/Model/PersonalityTrait.cs b/Model/PersonalityTrait.cs index 82162f7..57dbf06 100644 --- a/Model/PersonalityTrait.cs +++ b/Model/PersonalityTrait.cs @@ -5,13 +5,52 @@ [fsObject("v1", new System.Type[] { }, MemberSerialization = fsMemberSerialization.OptOut)] public class PersonalityTrait { - public PersonalityTraitData data; + private PersonalityTraitData data; private DateTime mTraitStartDate = DateTime.MaxValue; private DateTime mTraitEndTime = new DateTime(); private DriverStats mDriverStats = new DriverStats(); private PersonalityTraitSpecialCaseBehaviour specialCaseBehaviour = new PersonalityTraitSpecialCaseBehaviour(); private Driver mDriver; + public DateTime TraitStartDate + { + get + { + return mTraitStartDate; + } + + set + { + mTraitStartDate = value; + } + } + + public DateTime TraitEndTime + { + get + { + return mTraitEndTime; + } + + set + { + mTraitEndTime = value; + } + } + + public PersonalityTraitData Data + { + get + { + return data; + } + + set + { + data = value; + } + } + public enum StatModified { [LocalisationID("PSG_10001289")] Braking, diff --git a/Model/PersonalityTraitController_v2.cs b/Model/PersonalityTraitController_v2.cs index 2694916..2560613 100644 --- a/Model/PersonalityTraitController_v2.cs +++ b/Model/PersonalityTraitController_v2.cs @@ -6,8 +6,8 @@ [fsObject("v2", new System.Type[] { typeof(PersonalityTraitController) }, MemberSerialization = fsMemberSerialization.OptOut)] public class PersonalityTraitController_v2 { - public List permanentPersonalityTraits = new List(); - public List temporaryPersonalityTraits = new List(); + private List permanentPersonalityTraits = new List(); + private List temporaryPersonalityTraits = new List(); public List allTraits = new List(); private List mTraitHistory = new List(); private readonly int mMaxCooldownDaysRange = 180; @@ -16,6 +16,32 @@ public class PersonalityTraitController_v2 private int mLastRandomCooldownDayValue; private Driver mDriver; + public List PermanentPersonalityTraits + { + get + { + return permanentPersonalityTraits; + } + + set + { + permanentPersonalityTraits = value; + } + } + + public List TemporaryPersonalityTraits + { + get + { + return temporaryPersonalityTraits; + } + + set + { + temporaryPersonalityTraits = value; + } + } + public PersonalityTraitController_v2(PersonalityTraitController inOldController) { this.permanentPersonalityTraits = inOldController.permanentPersonalityTraits; diff --git a/Model/PersonalityTraitData.cs b/Model/PersonalityTraitData.cs index 6cb9b10..569aa19 100644 --- a/Model/PersonalityTraitData.cs +++ b/Model/PersonalityTraitData.cs @@ -13,7 +13,7 @@ public class PersonalityTraitData public PersonalityTraitData.TraitType type; public int[] possibleLength; public List requirements; - public float probability; + private float probability; public int[] evolvesInto; public int[] opposites; public int[] removesTraits; @@ -33,6 +33,19 @@ public class PersonalityTraitData private string nameID; private string descriptionID; + public float Probability + { + get + { + return probability; + } + + set + { + probability = value; + } + } + public enum TraitType { Permanent, diff --git a/Model/Team.cs b/Model/Team.cs index 5bcd8d8..c387dcb 100644 --- a/Model/Team.cs +++ b/Model/Team.cs @@ -4,7 +4,7 @@ using FullSerializer; using System.Linq; -[fsObject( MemberSerialization = fsMemberSerialization.OptOut )] +[fsObject(MemberSerialization = fsMemberSerialization.OptOut)] public class Team : Entity { public static int mainDriverCount = 2; @@ -69,7 +69,22 @@ public List Drivers { get { - return mSelectedDriver.ToList(); + var result = mSelectedDriver.ToList(); + result.Add(GetReserveDriver()); + return result; } } + + public Driver GetReserveDriver() + { + this.mDriversCache.Clear(); + this.contractManager.GetAllDrivers(ref this.mDriversCache); + for (int index = 0; index < this.mDriversCache.Count; ++index) + { + Driver driver = this.mDriversCache[index]; + if (driver.contract.currentStatus == ContractPerson.Status.Reserve) + return driver; + } + return (Driver)null; + } } diff --git a/Utils/VisibilityConverters.cs b/Utils/VisibilityConverters.cs index 7bfc4de..5cbccbe 100644 --- a/Utils/VisibilityConverters.cs +++ b/Utils/VisibilityConverters.cs @@ -1,9 +1,6 @@ -using System; -using System.Collections.Generic; +using GalaSoft.MvvmLight; +using System; using System.Globalization; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using System.Windows; using System.Windows.Data; @@ -11,11 +8,24 @@ namespace MMSaveEditor.Utils { public class IsTypeVisiblityConverter : IValueConverter { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + public object Convert(object value, Type targetType, object inParameter, CultureInfo culture) { - if (parameter == null) return null; - Type type = Type.GetType($"MMSaveEditor.ViewModel.{(string)parameter}"); - return value != null && value.GetType() == type ? Visibility.Visible : Visibility.Collapsed; + if (inParameter == null) + { + return null; + } + string[] parameters = ((string)inParameter).Split(','); + bool canConvert = false; + foreach (string parameter in parameters) + { + Type type = Type.GetType($"MMSaveEditor.ViewModel.{parameter}"); + if (value != null && value.GetType().IsAssignableFrom(type)) + { + canConvert = true; + break; + } + } + return canConvert ? Visibility.Visible : Visibility.Collapsed; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) diff --git a/View/MainWindow.xaml b/View/MainWindow.xaml index 75ffd4c..522b393 100644 --- a/View/MainWindow.xaml +++ b/View/MainWindow.xaml @@ -5,7 +5,7 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:tabPages="clr-namespace:MMSaveEditor.View.TabPages" mc:Ignorable="d" - Title="Motorsport Manager Save Game Editor" Height="600" Width="700" + Title="Motorsport Manager Save Game Editor" Height="1083" Width="700" DataContext="{Binding Source={StaticResource Locator}, Path=ViewModelName}" > @@ -40,11 +40,11 @@ - - - + + + - + diff --git a/View/MainWindow.xaml.cs b/View/MainWindow.xaml.cs index 20b23c0..59d9653 100644 --- a/View/MainWindow.xaml.cs +++ b/View/MainWindow.xaml.cs @@ -1,8 +1,10 @@ using System; using System.Diagnostics; using System.IO; +using System.Linq; using System.Text; using System.Windows; +using System.Windows.Controls; using FullSerializer; using GalaSoft.MvvmLight.Ioc; using LZ4; @@ -22,7 +24,7 @@ public partial class MainWindow : Window private static readonly int saveFileVersion = 4; private SaveFileInfo _currentSaveInfo; - private MainWindow Instance; + public static MainWindow Instance; public string VersionString { @@ -35,6 +37,13 @@ public string VersionString } } + public enum TabPage + { + TeamPrincipal, + Driver, + Team, Game, + } + public MainWindow() { InitializeComponent(); @@ -260,5 +269,35 @@ private void Exit_Click(object sender, RoutedEventArgs e) { Application.Current.Shutdown(); } + + public void SwitchToTab(TabPage driver) + { + TabItem chosenTab = null; + switch (driver) + { + case TabPage.TeamPrincipal: + break; + case TabPage.Driver: + foreach (TabItem tabControlItem in tabControl.Items) + { + if (tabControlItem.Name.Equals("DriversTabItem")) + { + chosenTab = tabControlItem; + break; + } + } + break; + case TabPage.Team: + break; + case TabPage.Game: + break; + default: + throw new ArgumentOutOfRangeException(nameof(driver), driver, null); + } + if (chosenTab != null) + { + tabControl.SelectedItem = chosenTab; + } + } } } diff --git a/View/TabPages/PersonPage.xaml b/View/TabPages/PersonPage.xaml index c61bab2..ca777fa 100644 --- a/View/TabPages/PersonPage.xaml +++ b/View/TabPages/PersonPage.xaml @@ -10,8 +10,7 @@ xmlns:system="clr-namespace:System;assembly=mscorlib" xmlns:viewModel="clr-namespace:MMSaveEditor.ViewModel" x:Class="MMSaveEditor.View.TabPages.PersonPage" - mc:Ignorable="d" - d:DesignHeight="500" d:DesignWidth="800"> + mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="1311"> @@ -26,17 +25,20 @@ - + - + + + + diff --git a/View/TabPages/PersonPage_DriverStats.xaml b/View/TabPages/PersonPage_DriverStats.xaml index 7444c92..8757523 100644 --- a/View/TabPages/PersonPage_DriverStats.xaml +++ b/View/TabPages/PersonPage_DriverStats.xaml @@ -69,8 +69,8 @@ - + - + diff --git a/View/TabPages/PersonPage_Trait.xaml b/View/TabPages/PersonPage_Trait.xaml new file mode 100644 index 0000000..71b3276 --- /dev/null +++ b/View/TabPages/PersonPage_Trait.xaml @@ -0,0 +1,18 @@ + + + + + + + + + diff --git a/View/TabPages/PersonPage_Trait.xaml.cs b/View/TabPages/PersonPage_Trait.xaml.cs new file mode 100644 index 0000000..dd31896 --- /dev/null +++ b/View/TabPages/PersonPage_Trait.xaml.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace MMSaveEditor.View.TabPages +{ + /// + /// Interaction logic for PersonPage_Trait.xaml + /// + public partial class PersonPage_Trait : UserControl + { + public PersonPage_Trait() + { + InitializeComponent(); + } + } +} diff --git a/View/TabPages/PersonPage_Traits.xaml b/View/TabPages/PersonPage_Traits.xaml new file mode 100644 index 0000000..bb0b924 --- /dev/null +++ b/View/TabPages/PersonPage_Traits.xaml @@ -0,0 +1,18 @@ + + + + + + + + + + diff --git a/View/TabPages/PersonPage_Traits.xaml.cs b/View/TabPages/PersonPage_Traits.xaml.cs new file mode 100644 index 0000000..1ab0dcd --- /dev/null +++ b/View/TabPages/PersonPage_Traits.xaml.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace MMSaveEditor.View.TabPages +{ + /// + /// Interaction logic for PersonPage_TPStats.xaml + /// + public partial class PersonPage_Traits : UserControl + { + public PersonPage_Traits() + { + InitializeComponent(); + } + } +} diff --git a/ViewModel/PlayerViewModel.cs b/ViewModel/PlayerViewModel.cs index bcccfac..636cba8 100644 --- a/ViewModel/PlayerViewModel.cs +++ b/ViewModel/PlayerViewModel.cs @@ -6,21 +6,8 @@ namespace MMSaveEditor.ViewModel { - public class PlayerViewModel : PersonViewModel + public class PlayerViewModel : TeamPrincipalViewModelBase { - private Player _player - { - get - { - return PersonData as Player; - } - } - public string PlayerTeamName - { - get - { - return _player?.team.name; - } - } + public string PlayerTeamName => PersonData?.team.name; } } diff --git a/ViewModel/TeamPrincipalViewModel.cs b/ViewModel/TeamPrincipalViewModel.cs index 8ed71ac..36eb016 100644 --- a/ViewModel/TeamPrincipalViewModel.cs +++ b/ViewModel/TeamPrincipalViewModel.cs @@ -6,7 +6,11 @@ namespace MMSaveEditor.ViewModel { - public class TeamPrincipalViewModel : PersonViewModel + public class TeamPrincipalViewModel : TeamPrincipalViewModelBase + { + + } + public abstract class TeamPrincipalViewModelBase : PersonViewModel where T : TeamPrincipal { public float RaceManagement {