From 26c4fd9e1cc1b679926493b9f25f6c3ce2050765 Mon Sep 17 00:00:00 2001 From: Lephenixnoir Date: Tue, 31 May 2022 20:45:48 +0100 Subject: [PATCH] more improvements to UI and balance --- assets-cg/levels/lv1.txt | 5 +++-- assets-cg/skillicons.png | Bin 588 -> 7869 bytes src/aoe.c | 6 +++--- src/enemies.c | 8 ++++---- src/main.c | 13 +++++++++++-- src/render.c | 12 ++++++------ src/skills.c | 40 +++++++++++++++++++++++++++------------ src/skills.h | 3 +++ 8 files changed, 58 insertions(+), 29 deletions(-) diff --git a/assets-cg/levels/lv1.txt b/assets-cg/levels/lv1.txt index e0cff64..d5afa27 100644 --- a/assets-cg/levels/lv1.txt +++ b/assets-cg/levels/lv1.txt @@ -22,10 +22,11 @@ delay: 8s wave: 10s 10*slime/1 wave: 12s 4*slime/1 4*bat/2 -wave: 4s 2*fire_slime/4 +wave: 8s 2*fire_slime/4 +wave: 5s 4*slime/1 # "Boss" wave #2 item: potion_hp wave: 6s 8*slime/1 8*bat/2 2*fire_slime/4 -delay: 5s +delay: 8s wave: 8s 12*bat/2 4*fire_slime/4 1*gunslinger/8 diff --git a/assets-cg/skillicons.png b/assets-cg/skillicons.png index f6aa9c163174a0bc4a2d36b2b5234cc10258abc4..1ab876a2e6b48ce04999ebfb89ccc95882b0565a 100644 GIT binary patch literal 7869 zcmeHMc|6qX_aDi=W>4i#BfHrc#tb8S#+FbBF`Ep7F*EihOR`k5RD`n27KtQF+3BVv zTb2+CAtg)N{D!*sc7MO`KlkZqy+O1cng877HE(w`jFn@z;2ukjGh4o`X97s`;L9b0 zK^{rA^97G5&$kbGXk{r}o&D(hHgskSI;;PDgYA{gn>6RGlfe^PKHsxgPQ^6e`}|m^ zW?cNu5Km)6=RI%MM+=FehTlUUa=cxRxYGd1-vCVCz4fAQzQQ4G);Hwv7B}me=EL!! zPV3%VO1-030`GJ^QaGYb4}$`~WS!OeWVJc73t2d}d8+EewUthn-7_~eLLZ=&>K^p3 zOq)AfZhl?o0|&-{LXMPneYyG-+_m)a)AVNI+j~5l^sr6eH~3}mm9>ym4QHj#Vxe30 z{-dGm-4G-4*}6vL+FrG-mQY@+5O*HsTZXSIRL*KIKOOCQYpA$bo9469D0lEP@=A4| zG4lFs?Q?vbp@rb<^IgebGpoyQ8-(wf z;BU_aez>{({-(g#LP273r_fv7OgAk2>6jhrfe>^)Oh6|#t?o|RWnDnORe5ni5hz_K0s)BhHKQeQ?J7Po ztZZfSl#gN-;x5&@I;MDBG^%s&=`B?^+;i1@`{0F_@MCJvdr^s{UKT z(f;w<-`Bsh_CMdJ7MQrQZ%tV3X-ODwQl>=-f!#&OWS5UGr?Hz)cW!}ITN1rn-n%51 z`+Ql#utkCd=hc+_@zn^YMDg5&v8`x_XDe*TP3I&Y{+GXjHZ;8s=hQfz8;p8U%8e<4 zTZg75F3R{`(6Wt+p8<3@{jTr1yRXXh;aFPFg$OkQ1GKS|GObR9V4M}p74;24|I#*Imbrkce1 zxi2Q9mKhO~6{6PkB-hliMdYYJv5q%_necT?-gK}8a^SYD`(^~oz$M}rJ=_qj^y*QE zo7Hs7$6+IxE=e%iPRPn*BjZT)kdcZ5U;9Y~%#|cX=T`|9qA9QadhTy>BQF^hu4RCZ zK~lMl7aTiv&FC30I0U`O=j-D2^(j{aV1ZOJKKFL?wr-%vDoP;}X`&EjcN zhgY=O9brlp!ZIU6ydA(rOIA5zl&I&PzWAO!NGmLa30`~Zt~wRUYCu~Uur9F*A}P-2=F?b69*3F zm(H-v&$p+y*xx=O)$vRevXBHzVXs=kYvNx7m)~PJYA$q^Hr=?W*DG^FhcYIXVfK>i ztzaWt#v#FMy+IeFTYLGfxE33$tTfIxS=q^Lc%Uv8w_W^5WfLYvzeuiX!#}t-6j0{P zu}9QqdPXM@T!?mn3}~SX*jA3cdEFRWLpv1JxX5qg?k8Ge-lz&)->uIRW8SJi-mqLU zoh+L_Ie$uTpGtQ8^90&~_7iWTAurjR^z%1C?$3giD1E~UF{kzK_uD*@;{0O7IrdqD z$hBP#;uASwMJx}vNiHalxE>FN_Y6;k{VU8G0YHl#clN~UlH4LJ|c&BwTd%JFf!Kl zSkrFcr2|?6y_v+=9tsSR=X>>mW!~!+Zl6+-Smd%BESY7o!AMB!uK~M}ppbo~Sy5ED58nL!ise(FeH~ z7TX*z{;u+V^+mSYwf6I>uh!pmv6}@G(!x&-%lbx7>GlLP!UYyOGL#+>MI)~-Qd6K) zJ}t-nOKw5~xMoUHytreQ^f)E_mV_^1B)^;+=NwWD5pVXX4GHHbb!E4+&FAKn6|88O z?LC&%Ah-+PkfWub8H@qJ<&Ndb^SzTJ%wka=zDEP}7?TSk*)rs4uS*NqwCe%Y>aMqV znj~V5H>H_;hd^IvsP~&~&6!9Gk`$1s+ShU`3NeS{!RU3iNb^I zt?GBD*X%S(k{sR}^lf%Y`K0g3DLgFwAohT%XHS0L=uLr2de!Hymkx`PGJ46L;!S*N|*P*9-ESKVD8L(;T!RbPap zO5tPYH;HVyR0Q1D!A_NtKo5xf5AiTe7*J;OXK(PG|OLwldvi}%1`d2h%MONn{f zP6#v^SC%Gk-~f~AcDqckxcQVv%^F=7Upkg~0Ao1*m~YizV$rag4b`rL?;TLW4p9ZN zwe0DE{cJfz=VvcOO<1Pcodb^h@GT&foK~Y(yrn7Uoti(slTH(5F>16I-5=*UvKT)A z{i*=M#<+|NOaiJ>yA0*>Y%3i)V|&hDiFch6SD=UlOuH%tE;?*~2eYtF$op!6Py6w6i^whu^X7 zht$fbtE)zRuGOC{V{Y$?*=%~OE%%pJ|+s0V0q;IEz znWzZ@JR|j;<3L;Pv-2)8K=HF|5d|MctU2{p%4V_3G8;xN1=>^17b83xjrp&OkfX{( zock4}5nUw;r^=_evX|rR>+4h8EEz3X4?=d;85`YBou0pBJLwmYt1TC!@&2r|Ocy#8Aab=a!Kp+cL zCr4wUwi=0dew`@hIOvb_Cbb`T$PrNMZvQU>p-uUbTBjCbH&UHai zLO1i!z8Smhm}=kX&u_}JJYzWFK@d@??IvNwIw%1w-Q!HqII*Y{DgOy`{15NE2E ziFu%89d-TV!tN)6PoNg%s8@+bTtg0NctgAytg!E^V}Sp zm%dP@4x0|J9%di1BfApu@#%s1nc zFJ4;&R%I-)7b{_0K;|huymYaE?9HRBWfuch+C-?W;2&e77;(ve0OrP6F<=0Zg0zB zt1I{w;KQIhff#jy`+fKM%`vXH#GE=#Wd~aT~4T|O<||fO6D&^iI@{8Z=XR$wZS^MGdTH* z3T66rR}ri-o=eC;z9{DcH>Hg{fUQg{{AM7&mAH`FRghT9Ym~rdlcVeRZSu_fdWTXN z{GCj+kj`YgkM_BUNyxJ@&8Hic(}<&hEmdm4y>A2Tuy5F)##`+P;mo5wRd-7vxal=N z>=Uu8aM2_zT`vdFkkyNP9sVBt?B1KT!I92+*2J80D`ZpiL6}wk;u>W6-O}RHgzByD zVSuk{APXBpkOu)p1Rd7q)(Su~0X#_z95BF>;zdUX zU_d*#Xy$l(843dKs4zS*AUktQpuRVa1Vlg(5E$4nfb6FN(&h$g(TJ{SD+8mS5X>0{ zZB)YdRjX*N=BY82Te}y0t{ zi){){lRc?BR!p-0rpX|?{zcZ`V%wJNr1NVaO!Gf+|EB#%?mNm%Epv0Ufj7Z-J3Oob z2DI%TP4p&^iRhgnTm^|jArM3`0*63=nFBl+uc4+2Mrx?L;&B9ms)mZ{FHl%7Is@lL zAZe1QJOg5PyL(Wt|jC#ds8r= z?T~=mmOJGQ)cUb0#$-BEBXGOof7ZM;$>+!H#}S~AcSJzoPT8Vygda}mI6u-4I+=Dq zL-eE%${Ki0|rVY84hqAQ%>stzV0VI(jDrGfx!5b>&DRSkkGN)16kBGmsE zI^Elq;g6${bWbxgWoE-Hpq*@h@;g*2>?HkXEdFk!ZJuDvvkg-NtHNyHD72ae8V*x} z!O<`n2>LT&==Q1pBV#S-|KUVyN8y)ifNA$*jd{H=Z!74Z*VRwXwrTt?zJBh-f6)UI z`d=sih~Izd`j@VM#K1pN{3T8GI(FzJ~d) zLG_^Ex89-Im}L8+n<#+R!-ide^3;#t(m?g!)@ba2vJ*;xCK&GqA%1ba6$SvP*GmH? z{YEA(Dcl*Iun5k{Wjm{`!!8wX7A#I=O^k>E^^LO)16IF%H+mObrRf@_oa@o?DqLGI zl>e%dIMIU28w-Da(iV#|xtIrD1LU04zU5oaY7vpP5N-{8gU&8(Uk@K8A5Ire&nUcX zrN%O|zlY=0#RV>OP7(Be_Ue>fJ6-RX!3+6035eUeo!1;?$+37|e=dZrrHu>17hZAZ zqr;^H3A#nj{S<1ZMz4%6C(C#qtKucA2vNBUnRCe&Y1}n~CpQ3xNV=b&Isqw}0);J} zVg>@hx@qgYvpQ*&pXmp?_?9r?T}d~LEz;nx?jwQX*;0Bmc>xi*5J0LKUxk`;TB@H; z#O+Aa!brOjmd=jsvul-GG3Bj87A-yi|_ahTRV%AaXP=m(&T+y?QTQXD6V#b)gpTB>d{eERsmZ~jsx(q{n0tG zu0oOAb8W|f`#yfFCVelK?N>?e_7tBUBTUsv%t{FlaiKQSVkPrc?~J~CNWACd^bOGG W|NGfYq4kyR;=>wR7?kU|ME(!cp$LHh literal 588 zcmV-S0<-;zP)r000*V1^@s6)PL9c00001b5ch_0Itp) z=>Px%21!IgRA_kFqrpxu_@P_#P`KHz}90?-;e0+WZ0G^Ng>skYU{PS@K08G;a0GQ|bb*+Ivex7Hw zofA5Ye8EZP1Z%+KCD}O1B?;#7C1g9H#{iToi4RFO%jD*e%{jM8Nv-9_d8lDO7j(Ja zT&a>s`1VSbM1t+b_9#5DL{xnb<0sM5Ux*xAyw4Jbmd@W9GMRf>`L!^vKk{Cvx$-0# zd|$Fmv{rx^VuW6cw=1G-Rdz!5`L{hPOG->@bJtDj@h78ZvernrM0YTFf27?zvL(lWLOvRIVjZuTe) z>(AEGB)29B$50wamx{6kjoRdvk}VJYQsS_{p@(zqou_^PJ0oiaY=ze`1_E%~9+QX=!IYT=VU=N(hxJk-f-Z7dzx z%loB%YW*FcwRISx#P%54iL*>*=&&$kujMA0xD`@%rfCqfVbPf;ZD?B|tyik`ImuE9 zYxxy50RNkfN+6q{Ec;O`nxInt@5r@hVaK-@gQcHbyh=~3jWGwY@fK~2XB%W&(AkB5 aA_aeH1erRtPQrKq0000data.generic.strength = f->ATK; + aoe->data.generic.strength = f->MAG; aoe->data.generic.dir = p->facing; } else if(type == AOE_PROJECTILE) { @@ -132,7 +132,7 @@ entity_t *aoe_make_attack(uint16_t type, entity_t *origin, vec2 dir) aoe->repeat_delay = fix(0.2); } else if(type == AOE_BULLET) { - aoe->data.bullet.strength = f->ATK; + aoe->data.bullet.strength = f->MAG; aoe->data.bullet.dir = p->facing; aoe->data.bullet.v = fix(10.0); aoe->data.bullet.final_v = fix(4.5); @@ -221,7 +221,7 @@ static bool attack_apply(game_t *game, aoe_t *aoe, entity_t *target) } else if(aoe->type == AOE_JUDGEMENT) { r = fix(0); - damage = aoe->data.generic.strength * 5; + damage = aoe->data.generic.strength * 3; } else if(aoe->type == AOE_BULLET) { /* TODO: Sideways knockback */ diff --git a/src/enemies.c b/src/enemies.c index 6e64b1d..810c057 100644 --- a/src/enemies.c +++ b/src/enemies.c @@ -31,8 +31,8 @@ static enemy_t const slime_1 = { .friction = fix(0.6), .max_disruption_speed = fix(999.0), }, - .stats_base = { .HP=10, .ATK=8, .MAG=5, .DEF=4 }, - .stats_growth = { .HP=8, .ATK=4, .MAG=4, .DEF=3 }, + .stats_base = { .HP=10, .ATK=8, .MAG=5, .DEF=5 }, + .stats_growth = { .HP=8, .ATK=4, .MAG=4, .DEF=2 }, .shadow_size = 4, .xp = 2, @@ -70,8 +70,8 @@ static enemy_t const fire_slime_4 = { .max_disruption_speed = fix(999.0), }, /* Same as slime/1 */ - .stats_base = { .HP=10, .ATK=8, .MAG=5, .DEF=4 }, - .stats_growth = { .HP=8, .ATK=4, .MAG=4, .DEF=3 }, + .stats_base = { .HP=10, .ATK=8, .MAG=5, .DEF=5 }, + .stats_growth = { .HP=8, .ATK=4, .MAG=4, .DEF=2 }, .shadow_size = 4, .xp = 14, diff --git a/src/main.c b/src/main.c index b88f753..3334d2d 100644 --- a/src/main.c +++ b/src/main.c @@ -461,8 +461,17 @@ int main(void) player_data.equipment[slot] = game.menu_cursor; /* Update skills */ - player_compute_skills(player, player_data.equipment, - player_f->skills); + int sk[6]; + player_compute_skills(player, player_data.equipment, sk); + /* Reet the cooldown for all skills that changed */ + for(int i = 0; i < 6; i++) { + if(sk[i] < 0) + player_f->actions_cooldown[i] = 0; + else if(sk[i] != player_f->skills[i]) + player_f->actions_cooldown[i] = + skill_cooldown(sk[i]); + player_f->skills[i] = sk[i]; + } } } } diff --git a/src/render.c b/src/render.c index 2c975e0..098a67c 100644 --- a/src/render.c +++ b/src/render.c @@ -693,14 +693,14 @@ void render_game(game_t const *g, bool show_hitboxes) if(selected_item >= 0) { int w, h; dsize(item_name(selected_item), NULL, &w, &h); - drect(x1+5, 99, x1+w+8, 98+h+4, RGB24(0x3d5050)); - dtext(x1+7, 100, C_WHITE, item_name(selected_item)); + drect(x1+5, 104, x1+w+8, 104+h+3, RGB24(0x3d5050)); + dtext(x1+7, 105, C_WHITE, item_name(selected_item)); char const *desc = item_description(selected_item); if(desc) - dtext_multi(x1+7, 116, C_WHITE, desc); + dtext_multi(x1+7, 123, C_WHITE, desc); - int dx = small_text(x1+7, 158, -1, "SHIFT", -1); + int dx = small_text(x1+7, 156, -1, "SHIFT", -1); char const *use_str = "Use"; if(item_is_equip(selected_item)) { use_str = "Equip"; @@ -708,7 +708,7 @@ void render_game(game_t const *g, bool show_hitboxes) if(slot >= 0 && player_data->equipment[slot] == g->menu_cursor) use_str = "Unequip"; } - dtext(x1+7+dx+4, 158, C_WHITE, use_str); + dtext(x1+7+dx+4, 156, C_WHITE, use_str); } /* What the growth is with the current equips */ @@ -747,7 +747,7 @@ void render_game(game_t const *g, bool show_hitboxes) if(s1 == s2) continue; int x = 31 + 48*i + 64*(i>=3); int y = HUD_Y - 33; - skill_render(x+2, y+2, s2, 1, RGB24(0x3868a8)); + skill_render(x+2, y+2, s2, 3, C_WHITE); } } diff --git a/src/skills.c b/src/skills.c index cffb809..a42522d 100644 --- a/src/skills.c +++ b/src/skills.c @@ -109,24 +109,40 @@ bool skill_use(game_t *game, entity_t *e, int slot, vec2 dir) return true; } -void skill_render(int x, int y, int skill, int bg, int color) +bool skill_render_get(int skill, image_t **img, int *left, int *top) { extern bopti_image_t img_skillicons; + *img = &img_skillicons; + *top = 0; + + int base = 3; - int n = -1; if(skill == SKILL_DASH) - n = 0; - if(skill == AOE_SHOCK) - n = 1; - if(skill == AOE_JUDGEMENT) - n = 2; - if(skill == AOE_BULLET) - n = 3; + *left = 23 * (base + 0); + else if(skill == AOE_SHOCK) + *left = 23 * (base + 1); + else if(skill == AOE_JUDGEMENT) + *left = 23 * (base + 2); + else if(skill == AOE_BULLET) + *left = 23 * (base + 3); + else + return false; + + return true; +} + +void skill_render(int x, int y, int skill, int bg, int color) +{ + image_t *img; + int left, top; + bool exists = skill_render_get(skill, &img, &left, &top); if(bg > 0) - dsubimage(x, y, &img_skillicons, 23*(bg-1), 0, 23, 23, DIMAGE_NONE); - if(n >= 0) - dsubimage(x, y, &img_skillicons, 23*(n+2), 0, 23, 23, DIMAGE_NONE); + dsubimage(x, y, img, 23*(bg-1), 0, 23, 23, DIMAGE_NONE); + if(!exists) + return; + + dsubimage(x, y, img, left, top, 23, 23, DIMAGE_NONE); /* Hacky color change */ for(int dy = 0; dy < 23; dy++) diff --git a/src/skills.h b/src/skills.h index 254cb1f..80e540b 100644 --- a/src/skills.h +++ b/src/skills.h @@ -27,3 +27,6 @@ bool skill_use(game_t *g, entity_t *e, int slot, vec2 dir); /* Render a skill's image */ void skill_render(int x, int y, int skill, int bg, int color); + +/* Reference to a skill's image */ +bool skill_render_get(int skill, image_t **img, int *left, int *top);