From baae73a38d36f3d9de75667f4dbae7970f5eeb2b Mon Sep 17 00:00:00 2001 From: Raimon Zamora Date: Thu, 10 Oct 2024 12:58:22 +0200 Subject: [PATCH] =?UTF-8?q?-=20[FIX]=20Un=20caf=C3=A9=20feia=20impossible?= =?UTF-8?q?=20passar=20per=20una=20habitaci=C3=B3=20-=20[FIX]=20No=20s'act?= =?UTF-8?q?ivaba=20el=20pr=C3=B3logo=20quan=20toca=20-=20[FIX]=20El=20gr?= =?UTF-8?q?=C3=A0fic=20de=20les=20portes=20de=20vegades=20era=20transparen?= =?UTF-8?q?t=20-=20[FIX]=20Separades=20unes=20caixes=20que=20feien=20molt?= =?UTF-8?q?=20frustrant=20agafar=20una=20cosa=20-=20[FIX]=20Quan=20tenia?= =?UTF-8?q?=20el=20caf=C3=A9=20de=20doble=20velocitat=20no=20podia=20creua?= =?UTF-8?q?r=20portes=20-=20[FIX]=20Algunes=20vegades=20el=20objecte=20dro?= =?UTF-8?q?pejat=20encara=20feia=20clipping=20amb=20altres=20-=20[NEW]=20M?= =?UTF-8?q?issatges=20en=20els=20moments=20importants=20-=20[NEW]=20Quan?= =?UTF-8?q?=20te=20pases=20el=20joc=20tamb=C3=A9=20te=20dona=20els=20'stat?= =?UTF-8?q?s'=20de=20temps,=20vides=20i=20habitacions=20visitades.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/doors.gif | Bin 2795 -> 2779 bytes data/rooms/56.txt | 13 ++++++ data/rooms/57.txt | 13 ------ data/rooms/61.txt | 2 +- source/actor.cpp | 87 +++++++++++++++++++++++++++++++++++--- source/actor.h | 1 + source/m_end_sequence.cpp | 26 +++++++++++- source/m_game.cpp | 36 ++++++++++++++++ source/m_game.h | 2 + 9 files changed, 158 insertions(+), 22 deletions(-) diff --git a/data/doors.gif b/data/doors.gif index ee29cf20b25b0e4fcac981b3bc644937ad05523d..7e12499b3f96dacda3951deeb979e9c7c1e4c131 100644 GIT binary patch literal 2779 zcmV<13MBPMNk%v~VekNU0FeLy{{a8Mz`y_i00000A^8Le3IG5AEC2ui0Pp~I00092 zgdq|ec@LwMi8V2^hLyPuPTlf_=82~2IeOQcwF-&B)NIlAoqP2T3<@_mT&}b$_H;qx z^3{A=ki)8V)gmpasqE30bV|7>+4y%&t24BxF@Z+4wP%>Z>yDr1(gt)52C$M zh_`h}f$eOD!sLHpz*)`H5@2T@2kiZ7K&F>-{PQt6^QC z?x-66;LZMR&PLNL?>yf4<(H6T-IxhH@X4R8YQ9jxD{`yXHH2-vNQ4wYmc?@ap(fVr zbI{Hkj`=jeOLUUpmy!q{MvT{S-L6-jQcdELu;0Eh|2PDs2LzOlW<(ooP?%C-MNMUQd7R&IA%>@RR@ADNI0-(VEoplBCOip;+;=#F^paMbXA+jpO=HV zm9px z4mF!!8XBUYRid@%A%Z3-G?CAH9x*Hk$taw%@c0i;)k(xs!_bm^6yF@U5cr_504XLNrU zw&ierx>O#L!WEgRlQqKEjR=#CnOK%HeF|ZRj~Ww$lv8p>;eN>f<|G*um)=P0RI;uJ zYgW-N3M-URUP_CUywd1vj~#;Q26wu0h3s!dOx0hraOHOd50zG%6nZz3s#7Q?Vl>x2 ztH@{6KMy@Iv2U9_hbGF3X%L>l9T_xza#~cg%&V=I^(!0y?+qfjK>PhCpkH=NIBqAy z+2i7ho1Uhp-(5W*M05{qx0T1ft#`jBD$uxr!3NGFGBi6L;~~7vY%HNsqm7}Yq`wM# zX0y)j6UQ?ewE4n+#~kF&&zI?Z+G?-89K4oqecn3LP5rvIrmMH}t{u1gG3T8VZL87S z(^aqVK0@fN@zyU?Cd$2`7GYCP#uj%u@nNo0Te}|a2&S|Is)bXEDp}&HBBIstYg-0% zjaXi%ITztCZ+XH}_1Gn}zEP@o_j1?CXjHUctx0`j`Jnvnhck$gZ%!Q4hy-I|yZHTY zeny(tDVntiv8YOaTgsou;w3}(w8=Q25ni^$MlrJg!K`-45+Vv6_@_9r@J>~F2DA7F zvdoC=Jv~tw!*nMp=vl3E8Pr+o8VJN^F>r{t!k2<1m>eb63v3q*AL`_YDxJlOO*$i> zAJ%Qe zRRrD9UU!g`25G+Y!Etvy{p7}K+A+%U6t6-^OSgd)} z$af*>A844mqf8>zY8&#F4}Uod5bd#u4K)co5y{o8K4_^)_>DD#Ai3KSBdV0-rX95E z#V{0gtvedgAIl0%Wn#F=f=2Fopsa<~W6f0UWF_fY)Yeu7 zM#L>|dDB_mwn|E9#aLWD3)oNaN1T`cUF0rdFvM+!WuXg{IhL@~?tQlriggc?44nvBr{hg|aKWtzU>sQ6D zcrArn6A1qH6eCv%(=l$0;~Y~s4_1I2i**d-Am3Os+^wr_iY(+LD_IQ}`3hUXL*pe& zdCFE$$|7K3<$qCm%UrgB=vHwKE3>4_WG-_?=2IKf9!9BAHnW?#91Pf~IB=IS@tg0g z_(_icJEVv<{2^J;jIOftB$VdU-qJpXZnULiEM4wJ`j;D zkrx}9wrQ&h2e_%+dQ^0(1w+0YY2PY-YlhEPmP>gP#D~F&&!$KFey>*^051E_8(OaFJn=a^p zW1QqrMv~0~B+9E}9nVB(t=_N=bX&SdqhoJ$*|nz|!|6`!+#+7vE&cY>dPz>wmT}9z zx$?UMIqwBMTi9jXnA?R^@L9h&)MM_?wbLEq=VpAM3GcT!GMDa<{;uWm{PdS+?vqRB ze1vBH`7&$$@uQEk;!&>dX!<+#aCW@tHJ;eH&zm^bL_O_mpYz*$bQa2yG-`bRdn#j| zkMlYG?8h^wT?GC}{N;bVPL`8K{Av_kS~hR(Z7~A$V($*8;^=I39$8t!8v$P=eqxS}*8y zt!Dux=zIcZgCdA~i{}dL2YWquXE3(}EQo!xM}%)?ggx*Xvd4o4s0IZ906QRfU&jCd literal 2795 zcmVedHBBW2vre>#nD`y{fE;J-5iK@`MC zgp`nINF#i3*wSH0COBP6^>payNJL2Yd4q~GAk9Qr_=(iv1P{eCD#=k?NseTWnNwMA zeH&E}%C@f{S~@uw;}^SG;OVtXcn=(aPH5?*x^|*n#Xs9pRq8G&WJ@~%43=wF>=gzi z0at1>r;g6GAW8NLPW=>;S50XxZxUgtq0N=Gj>{{RB zpHp{1tetvwR-MbIr=$55v+Kgb1t%}f>1OS-%-Py#*p7NTZ0gywkBZ**G_TrS?&W>{ zZ}6i3Re?p^Z5<`Y7JNSavkyC6#MatO&}9^0PS+iSibt^B^-)C=4pkCCRRQx4t7}ALhFrWV{gZhXy#-hGU_v*VP0C7qk1eN z<>qaJl?7b}d)|}bfnySd5j=hw7+i6ZShfI^k}+dkQx6TfO_p~u*Wza&P`YI)VM-cK zm}2Q!14&+j3JsQmRyT-ZUmh2zOzAOcT#}tinInDSm~h#djdgj`s1$}csWLTKc_nE7 z82-m>PnJ=!>5jNwW$TNyc2(`8v{G5+rnp!MERMnk86v52fafb%%np~tRRKmzSARiXrR!zw1UZK@4p)t;v_gQlgF)inu;OxhZ|aV;bVYvQE3 ztgEa&b3Qg~K{9CuW<*baml&h6#>8)ouKt^Hzyl5%K*0~1>|fT0PPTQZT-qr_Fg!jREYq{*)eg~|g1Cc9OY~esMgR|r{ zE&|NW$|71d+Z%DW`)w6r6 zx_dwW8gjfNgC084x+?uWUilg?B!%Kqp7tJ+Cd|zt7iDu!#~!yi^KmXzU)vt<5azT7 zx&>5@N?GHwVxrdp>{|+yjag>rIT`VSaUu#7Q}%FS-->9rRi2B1pt(LGXyX;+KOg*c>P3 zi)@!WJl`dMLp#ST$(Nm!lfQ&{NhAqMlPgSH z3m3*g!{sWC-ccVZpXSEPv5blXtQ`R9g$6~zrC1)U80Td6C*IjFkfE`ro0!NS2|Z7m zd+C-5MbfbiB9DHcj2k8Mh{8S^5_7%d(ZUJ`N^h>kVB0iT$+ju~8`-T(WzlFPf{-yK zA0_c_3R`EAX!(Fs0gq@slIJ{;*1GtJ!lV;r$E*y+DkoNHo-$1a?5x=>5|PUxvk z7>+iJV7c8PqpFw$ryjg2#xf-Jtv@=^Ak#`r=M>ehVhcePtj8&`(3N0OP~wNg>eRiG z#jlC`t6>G{g~Z0SuyZ9AV(khf$Iex8p5=l^?vmKX{A92qT`V^sT1ze{HfL#2p-RIb zp{|uyWYKi(Wi2UM*5=j)O5`nYffHKb#>z@;XJPD+bS;f8@R*R3wg5QAFowzpZZg+VTtYutrmwzs1^qibCn%c3Mx zzs3b1f&3fO-=24P)J?w$|Go?<$+=O%V5@l>0Yr8EyEVV1=<15yA#<#E zt%5u=rPdsPQh#*B7!C9K*b~qWcF@!ZSVeZ&DB3czr@iKQp?b7^P-~@(rKu)%m)g^w zPJ${4=$EN)+vR(9L%_{$sabo>8|u-IDeZ2VGI!}3OExu!|8oA-d z*Y<`C&A5%kfg@Yoa;4monO7T}#_6jLC%CHQx>R<$g+szSY2Y%xYlz?1mQR@z$G*MP zNwS#aUpBdh{glJ`MmO0#LnzEO{_d04G`q$B2I9wn_~@OhS?1Ke8g)##D~Yhg!$vo? zzJ1;<5vd!*)q93s!bY05Fqi2tF+P&u+#re+c z;6h&9H9hy$ipfsawsFkH`SQIJx$g;GTiIxO)x5ihtp zLKp9p9J;6-y1pFWIgV4 z-}Bvz^cK#sG;4%Ed@OSwkoQ^r?aypos.zpos.z+obj2->size.z) && check_2d_collision(obj1, obj2)) return true; obj2 = obj2->next; } return false; } + void find_non_colliding_position(actor_t *obj) + { + int dist = 1; + while (does_collide(obj)) + { + obj->pos.x += dist; + if (!does_collide(obj)) return; + obj->pos.x -= dist*2; + if (!does_collide(obj)) return; + obj->pos.x += dist; + obj->pos.y += dist; + if (!does_collide(obj)) return; + obj->pos.y -= dist*2; + if (!does_collide(obj)) return; + obj->pos.y += dist; + dist++; + } + } + + const bool is_above(actor_t *obj1, actor_t *obj2) { return check_2d_collision(obj1, obj2) && (obj1->pos.z == obj2->pos.z + obj2->size.z); @@ -736,6 +756,7 @@ namespace actor if ((act->pos.x > min.x && act->pos.y >= min.y && (act->pos.y + act->size.y) <= max.y) || ((room::getDoors() & DOOR_XN) && (act->pos.y >= 24) && (act->pos.y <= 32))) { moving = true; + // Si està en les vores d'una porta, espenta cap a centrar-lo if ((act->pos.x <= min.x) && (act->pos.z == room::getDoor(XN) * 4) && (room::getDoors() & DOOR_XN)) { if (act->pos.y < 28) @@ -743,10 +764,16 @@ namespace actor else if (act->pos.y > 28) act->push |= PUSH_YN; else + { act->push |= PUSH_XN; + if (hero::getBoostRun() > 0) act->push |= PUSH_DOUBLE; + } } else + { act->push |= PUSH_XN; + if (hero::getBoostRun() > 0) act->push |= PUSH_DOUBLE; + } } } else if (controller::down(KEY_RIGHT)) //(input::keyDown(SDL_SCANCODE_RIGHT) || input::keyDown(config::getKey(KEY_RIGHT))) @@ -756,6 +783,7 @@ namespace actor if (((act->pos.x + act->size.x) < max.x && act->pos.y >= min.y && (act->pos.y + act->size.y) <= max.y) || ((room::getDoors() & DOOR_XP) && (act->pos.y >= 24) && (act->pos.y <= 32))) { moving = true; + // Si està en les vores d'una porta, espenta cap a centrar-lo if (((act->pos.x + act->size.x) >= max.x) && (act->pos.z == room::getDoor(XP) * 4) && (room::getDoors() & DOOR_XP)) { if (act->pos.y < 28) @@ -763,10 +791,16 @@ namespace actor else if (act->pos.y > 28) act->push |= PUSH_YN; else + { act->push |= PUSH_XP; + if (hero::getBoostRun() > 0) act->push |= PUSH_DOUBLE; + } } else + { act->push |= PUSH_XP; + if (hero::getBoostRun() > 0) act->push |= PUSH_DOUBLE; + } } } else if (controller::down(KEY_UP)) // input::keyDown(SDL_SCANCODE_UP) || input::keyDown(config::getKey(KEY_UP))) @@ -776,6 +810,7 @@ namespace actor if ((act->pos.y > min.y && act->pos.x >= min.x && (act->pos.x + act->size.x) <= max.x) || ((room::getDoors() & DOOR_YN) && (act->pos.x >= 24) && (act->pos.x <= 32))) { moving = true; + // Si està en les vores d'una porta, espenta cap a centrar-lo if ((act->pos.y <= min.y) && (act->pos.z == room::getDoor(YN) * 4) && (room::getDoors() & DOOR_YN)) { if (act->pos.x < 28) @@ -783,10 +818,16 @@ namespace actor else if (act->pos.x > 28) act->push |= PUSH_XN; else + { act->push |= PUSH_YN; + if (hero::getBoostRun() > 0) act->push |= PUSH_DOUBLE; + } } else + { act->push |= PUSH_YN; + if (hero::getBoostRun() > 0) act->push |= PUSH_DOUBLE; + } } } else if (controller::down(KEY_DOWN)) // input::keyDown(SDL_SCANCODE_DOWN) || input::keyDown(config::getKey(KEY_DOWN))) @@ -796,6 +837,7 @@ namespace actor if (((act->pos.y + act->size.y) < max.y && act->pos.x >= min.x && (act->pos.x + act->size.x) <= max.x) || ((room::getDoors() & DOOR_YP) && (act->pos.x >= 24) && (act->pos.x <= 32))) { moving = true; + // Si està en les vores d'una porta, espenta cap a centrar-lo if (((act->pos.y + act->size.y) >= max.y) && (act->pos.z == room::getDoor(YP) * 4) && (room::getDoors() & DOOR_YP)) { if (act->pos.x < 28) @@ -803,10 +845,16 @@ namespace actor else if (act->pos.x > 28) act->push |= PUSH_XN; else + { act->push |= PUSH_YP; + if (hero::getBoostRun() > 0) act->push |= PUSH_DOUBLE; + } } else + { act->push |= PUSH_YP; + if (hero::getBoostRun() > 0) act->push |= PUSH_DOUBLE; + } } } // if ((input::keyPressed(SDL_SCANCODE_RETURN) || input::keyPressed(config::getKey(KEY_PICK))) && (hero::getSkills() & SKILL_PANTS)) @@ -821,7 +869,8 @@ namespace actor if (picked->pos.y + picked->size.y > room::getMax().y) picked->pos.y = room::getMax().y - picked->size.y; picked->pos.z = act->pos.z; - if (does_collide(picked)) + find_non_colliding_position(picked); + /*if (does_collide(picked)) { picked->pos.x -= 2; if (does_collide(picked)) @@ -829,7 +878,7 @@ namespace actor picked->pos.x += 2; picked->pos.y -= 2; } - } + }*/ act->pos.z += picked->size.z; actor::actor_t *above = act->above; while (above) @@ -1111,7 +1160,9 @@ namespace actor act->pos.z += act->react_push; } - int vel = (act->flags & FLAG_HERO) && (hero::getBoostRun() > 0) ? 2 : 1; + //int vel = (act->flags & FLAG_HERO) && (hero::getBoostRun() > 0) ? 2 : 1; + int vel = (act->flags & FLAG_HERO) && (act->push & PUSH_DOUBLE) ? 2 : 1; + act->push &= ~ PUSH_DOUBLE; if (act->push & PUSH_ZP) { @@ -2207,7 +2258,12 @@ namespace actor bool giveSkill(char *skill) { - return giveSkill(getSkillFromString(skill)); + const int skill_number = getSkillFromString(skill); + if (skill_number==SKILL_SHOES) modules::game::setMissatge(" JA TENS LES SABATES!- ARA JA POTS BOTAR!"); + else if (skill_number==SKILL_GLOVES) modules::game::setMissatge(" JA TENS ELS GUANTS!- ARA JA POTS ESPENTAR!"); + else if (skill_number==SKILL_PANTS) modules::game::setMissatge(" JA TENS ELS PANTALONS!- JA POTS AGAFAR COSES!"); + else if (skill_number==SKILL_BAG) modules::game::setMissatge(" JA TENS LA MOTXILLA!- A ARREPLEGAR PECES!"); + return giveSkill(skill_number); } bool dropSkill(int skill) @@ -2269,8 +2325,13 @@ namespace actor { const int value = getPartFromString(part); parts |= value; - if (value != 0) - stats::collectPart(); + if (value != 0) stats::collectPart(); + + int num_parts = stats::getNumPartsCollected(); + char text[] = " PECES ARREPLEGADES:- 0/6"; + text[34] = num_parts + 48; + modules::game::setMissatge(text); + return value != 0; } @@ -2294,6 +2355,18 @@ namespace actor void pickAnbernic(char *name) { anbernics[name[8] - 48] = true; + int num_anbernics = getNumAmbernicsCollected(); + if (num_anbernics==10) + { + modules::game::setMissatge(" HAS DESBLOQUEJAT- EL PROLOGO!"); + config::setProgoloDesbloquejat(); + } + else + { + char text[] = " ANBERNICS ARREPLEGADES:- 0/10"; + text[36] = num_anbernics+48; + modules::game::setMissatge(text); + } } bool wasAnbernicCollected(char *name) diff --git a/source/actor.h b/source/actor.h index 924747b..e43b4cc 100644 --- a/source/actor.h +++ b/source/actor.h @@ -33,6 +33,7 @@ #define PUSH_ZP 16 #define PUSH_ZN 32 #define PUSH_KILL 64 +#define PUSH_DOUBLE 128 // Tipus de moviment de l'actor #define MOV_NONE 0 // Ningun diff --git a/source/m_end_sequence.cpp b/source/m_end_sequence.cpp index 365eaaf..b03f2d9 100644 --- a/source/m_end_sequence.cpp +++ b/source/m_end_sequence.cpp @@ -17,6 +17,7 @@ namespace modules actor::actor_t *act = nullptr; const char *actor_names[] = {"JAILDESIGNER", "BATMAN", "ROBIN", "EL ALTRE BATMAN", "EL ABAD", "LA ROOMBA", "EL OBRER", "BAMBOLLA DE CAFE", "EL YONKI", "LA PILOTA", "SAM", "LORD ABAD"}; const char *actor_ids[] = {"JAILDES", "GAT-BATMAN", "GAT-ROBIN", "BATMAN", "ABAD", "ROOMBA2", "OBRER", "COFFEE", "YONKI", "PILOTA", "SAM", "LORD-ABAD"}; + char time_text[7] = " 00:00"; void init(bool go_direct_to_credits) { @@ -36,6 +37,19 @@ namespace modules if (audio::getCurrentMusic() != "mus_menu.ogg") audio::playMusic("mus_menu.ogg"); actor::templates::load(); + + int milliseconds = SDL_GetTicks()-actor::stats::getStartTime(); + int seconds = milliseconds/1000; + int minutes = seconds / 60; + seconds = seconds % 60; + + time_text[0] = minutes<100 ? ' ' : (minutes/100)+48; + time_text[1] = minutes<10 ? ' ' : ((minutes%100)/10)+48; + time_text[2] = (minutes%10)+48; + + time_text[4] = (seconds/10)+48; + time_text[5] = (seconds%10)+48; + time_text[6] = 0; } const bool shouldGoToNext() @@ -130,7 +144,17 @@ namespace modules } case 16: draw::cls(2); - draw::print2("GRACIES PER JUGAR!", 11, 15, PURPLE, FONT_ZOOM_NONE); + draw::print2("GRACIES PER JUGAR!", 11, 9, PURPLE, FONT_ZOOM_VERTICAL); + + draw::print2(actor::stats::getRoomsVisited(), 2, 8, 14, TEAL, FONT_ZOOM_NONE); + draw::print2("HABITACIONS VISITADES", 11, 14, GREEN, FONT_ZOOM_NONE); + + draw::print2(actor::stats::getLivesLost(), 2, 11, 16, TEAL, FONT_ZOOM_NONE); + draw::print2("VIDES PERDUDES", 14, 16, GREEN, FONT_ZOOM_NONE); + + draw::print2(time_text, 11, 18, TEAL, FONT_ZOOM_NONE); + draw::print2("TEMPS TOTAL", 18, 18, GREEN, FONT_ZOOM_NONE); + break; } diff --git a/source/m_game.cpp b/source/m_game.cpp index 9ccdeaf..15c2257 100644 --- a/source/m_game.cpp +++ b/source/m_game.cpp @@ -289,8 +289,38 @@ namespace modules return section; } + char missatge[255] = ""; + + void mostra_missatge() + { + if ( (controller::pressed(KEY_MENU)) || (controller::pressed(KEY_PICK)) || (controller::pressed(KEY_JUMP)) ) + { + missatge[0] = 0; + return; + } + draw::color(BLACK); + draw::fillrect(56, 68, 208, 48); + draw::color(WHITE); + draw::rect(56, 68, 208, 48); + char text[2][25]; + int i=0, j=0, k=0; + while (missatge[i]!=0) + { + if (missatge[i]=='-') { text[k][j]=0; i++; j=0; k++; } + text[k][j] = missatge[i]; + i++; j++; + } + text[k][j]=0; + draw::print2(text[0], 8, 10, WHITE, FONT_ZOOM_NONE); + draw::print2(text[1], 8, 12, WHITE, FONT_ZOOM_NONE); + + draw::render(); + } + int loop() { + if (missatge[0] != 0) { mostra_missatge(); return GAME_NONE; } + int return_value = GAME_NONE; if (actor::hero::isDead()) return GAME_DEAD; @@ -956,5 +986,11 @@ namespace modules return return_value; } + + void setMissatge(const char *text) + { + strcpy(missatge, text); + } + } } diff --git a/source/m_game.h b/source/m_game.h index ec9d211..1e5a48b 100644 --- a/source/m_game.h +++ b/source/m_game.h @@ -27,5 +27,7 @@ namespace modules const int getSection(); std::vector getGifs(); + + void setMissatge(const char *text); } }