From 1b9dfddc9462f0c9eb8dcdaadbcd2bed09b91abc Mon Sep 17 00:00:00 2001 From: Raimon Zamora Date: Wed, 25 Sep 2024 13:48:36 +0200 Subject: [PATCH] =?UTF-8?q?-=20[CHG]=20Ja=20no=20se=20perden=20vides=20al?= =?UTF-8?q?=20jugar=20des=20de=20l'editor=20-=20[NEW]=20Funcions=20per=20a?= =?UTF-8?q?=20obtindre=20el=20nom=20dels=20boosters,=20skills=20i=20parts,?= =?UTF-8?q?=20segons=20el=20seu=20numero=20-=20[NEW]=20El=20minimapa=20mos?= =?UTF-8?q?tra=20on=20est=C3=A0n=20els=20boosts,=20skills=20i=20parts=20-?= =?UTF-8?q?=20M=C3=A9s=20habitacions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/altres.gif | Bin 3816 -> 3939 bytes data/rooms/13.txt | 11 ++ data/rooms/18.txt | 34 +++++ data/rooms/19.txt | 36 +++--- data/rooms/20.txt | 273 +++++++++++++++++++++++++++++++++++++++- data/rooms/21.txt | 2 +- data/rooms/22.txt | 10 +- data/rooms/23.txt | 2 +- data/rooms/24.txt | 2 +- data/rooms/25.txt | 46 ++++++- data/templates.txt | 12 ++ source/actor.cpp | 46 ++++++- source/actor.h | 6 + source/m_editor_map.cpp | 57 ++++++++- 14 files changed, 496 insertions(+), 41 deletions(-) diff --git a/data/altres.gif b/data/altres.gif index ecbb187a161cb6b7c99755291ab7a0827c76db4d..903a54bc3a0f1ce469850566058a2787e3ed7b83 100644 GIT binary patch delta 2525 zcmV<32_p9B9pfIbp#^`k$w+TbaGTi|D`PD#67m<$S|gMurO1XDs3t*E3mWbAfl7Yh zkJ~Z{60>MFw}jCiM+*!n|24{YaPf^=BAoYf5dcfN@{-qslSWkOAYy6gKYSFUr2K?S zQ;M>VlJbX&^zzDL!g34b5uzMfYk>`vWI>~uWS5ecQ z(G=s95ch{8crzOh%}+YTqfkQz)Sm={QNaj`A>DERWjKYWr7|XVi;jPd=Ncm`x>tmgqrxZ>dZs|w zVtVxj)bXVPLz~Uf-mSElAgv>dg)Ycu@Tt;jRra3JS;N+9PfrZW5s`w6MJ7#Qx$W(4 ze^Nd^*{N5(O9xx^GqRuAr+?4=Uvw46Tj*BTe*by`Y{4AcmrBB|g3eXo2-PkRq)tw#KkVfpB}**?;j#OW*NeKSZv4l6c5;=5Md zl2j_r)c6)R2C;y3al7|n7pyMqRwq1cV*B=xz(;>BF%Zvp!w|1HR}JQCQ`XADV~JR> zwb~$WnJ3>YgD{Xwu&{wOj7NjL$zZMc@@+$8pEzMzxh~}Gl0Sl1d(^r04A+19&iVpiu z@T4eQyH)2I%5m1gj`h~QW>vXc)9`-|6TH+wYicMF+QZJSy|>H^nBuV4{P;EE z_$&oooBH63X3?OhXw+nF`$OIK_Ok`<>57MWSoOY@OVuqZeG^YGAOA3HYX9cw&S|GR+Y|%(xW-{iqC1gQr6_Yw#2KwAy2#H>}c1Vrpl9It(Y=N5aA8^u<3EtB)Dp-+yh{wNHKa2j{wufET=M5F=J$XZS7moVfgNZDj zO;+-SGnj>C=S~q<8-^%zb0~;=NME(|NJb-8`L_meH%LpgL>M=SOE^8YQg3i%EJA2^ zFgGx@hB90zbi1{PfYuITMgQMk0viFIw2#nN1g)o&&rU;6txG7)-mwV8Ma&MDIEQE(tm}V-0W|@|edl-Y6s4@!aVT>U$0&+eA zS&t`n6AWRI`VQ)2$p{;xif9Hc4S$UPt`09 zn3f-TR=BnqZi$tA!j|4Jm$(>GesyPfsfIViS9&QceVKvyW)KG=jDtCVU&M5c_;!g2 zgR3_(@%EUC*?4RNV8uh3co$l;gqcXGncZ_ZmUe_z37X5ZmU3p6pJ|#Fq-d(iT&u~N zMrl+u^O|xZo9}-Xb!xPY^oN`JbC|A~kG{!-miZqBIGmM9E=X0H$Z18{fqKn3f>~vT z(fN_kS)ItpoY=XY^|xW%X_OVXEyC$!-??MGX@7c|U-wg1+gA%hmmLv8mpA8MbO2T7YGdI6M6o7SRr zsedHtKKzM5hS^cn#DcWcg~nBhG@^|l)0XE)qq{d$QUn)9VtUc?D+mfmdNZG=$%!;2 zO_7D5hIxNRV8o&62ZTwMdced`9J)g(az_e!ZISpi_}@Ct%*^V*i1h(MP1jZKqH0K_mW!Lk~0&c zD%T@@=u8T_se8AZkxHoGc1o!qL{NyNjFF_NqI!QLdQ}6&C8^5unr%9CPK05+M5~r4 zrw6!z6ep2qrA1OBT2v}F4BDbl$66l9s*_5pe2OO8Bu~8pG>&?lCa54dhODm2rO<(( z?3FRxx~bGztUmgw2ew)V^)CH1jv4c(o64heYJ~1e47pgUDYIAu=EfC~@>`JVD zIj>bO5<#-(E)1Kj0>pw(h_J|bHFZNjzO{-silQ=Fg>KlfCMr|$*);!Zo)8;l>bS3= n=?rz2S?R?ua7lFI8I^D|I0hMEFj18%o10cSln_`mApih7NLJe3 delta 2401 zcmV-n37+=j9_Ssgp#^_3LRe`}thd4X)A7}11D z^6*BEzwD$hKeeF$0xnr9^5+ zR;hGP1_fy$gL!{P3PDPa6#ZOE%c-AD?eQlpt&~q^1XO0a(L{RMD3%b&#+sc% z8Qas-1#WYVQ@!d>z_Y7|qG_4v+9ILCiq(#Jt*j~|>sIA(H)JXhrm;$-fS77Vsjlyd zK{+B)Z~>);@>Q>EO&_1^)GN-xt$qr#PyZDAKgKFalm%Z8)Nt5BuT$hck9Kp6( z%q~u|4)Ur_O(?#|9uO#}9aCjV$*+?QDYd06ZTe)ZKR;&YMYX*pdLE?)+M=gstW}V2 zf9BB=a_^3?=qP7yBg67}^S6CO?Q;d&vfMgVEB`kUEc%jEs^tpTyUwkVXNSwXn##~n zosdtrx_f`a@B;CC?S*d-!3NvlUH4jSW#O@!i>$+fu&*23D}Nv6h2Yj!xNbyCH#m~s zIsLa*=iO_Z`U~L@5m1I)+^%dL1^#e! z)0*N61Gxx*l~1fntJGFI-{VJwROD>FJ&gE=qrEHHkr6u6AXMvuj1lHxS4 zjtPHeRS|m3b%rs#B-!UAgE~x+hLoozJZV{;TFR-;bg5Tcnmzk-YoSi_ShVb{WC?l` zbSboVXtN=eX0q9nZdcV>+KRxm(g2-KFJeA5>nK!i-ob=e)qb7KEp6;4 z<%f0-JIeH% zZ!F!}sx}Lo9`pOd9PIP-_I{H$zfyng;974lX48%@_2H9kf#d7GfNyu=zX!g~(mYn$ z|Fz?#XVPI;pZUrvAIi0)aqK5P-&TOQuX1;=k*}}be|t~&)9*USt|Pqda~<{FATjv^ z!N(rN>&>m-uVLB``kRWiW4%Uw*H;w(d$C|Ugk>F5e!b>;Gm{p(w+j3>f2@D^BMCEn zmBBoM)_a>2ZuDdlPV{X|)O!*bXG--Rkrz;CbY%M{ODzXAF8CorGHIWsd=#W3^5zqn zMPv(@a=YYC%b`S55rL^^E5W8@frJ$cCm8#taS3%*#-f8!B!NU2Y&aw(8>oZrH8AP~ zf=nnmyY?;Cr$04lgAC{%SeJi<3Z{j@lvdQ@g-a-en>U8hR(#(gR%>vFlCy>Y*h*1^ zhl%!gwj?azz%JppZ-zK9kMUdz)iUaqgd<3T%p`SnhFE?me;Nme`$irq7Js`oeqTp` z31dI+!-q$z^H(`=!_V+iLIE7P-a}eD1T%1j9aj3>4S{a$YM+tjL;Z{ zC{+x{_>IPMdn?u!zQ_b&h>l&OS?`E@z6X!M6F0n9k2YYBFE@|o$dAkCj{r%HDk6{r zIe;BCiU)a+{}ds$w~&7xw?%+tkPxY16A2%)SCKSG7{&Gr(5I2}cT>&cF(4_0DENM3 zRFVT2Qpto|5vP)XSZ=A5O45BPSn23pvZ<(0NGj{Yx zn9P-zJPDbchk{bjmyEfMm`Q&v$vQcinTL`;x9Co?XG6X9kd0S^3^!#3oe9Bc@P_ zR-Y%IL5e*))0wW4Oxy%ZaQdh1nSpvkqZV~euhb$1Dq4-Ss74f+(9yh{push & PUSH_KILL) && (act->flags & FLAG_HERO) ) { - const int lives = hero::getLives()-1; - hero::setLives(lives); - stats::loseLive(); + if (!editor::isDevMode()) + { + const int lives = hero::getLives()-1; + hero::setLives(lives); + stats::loseLive(); + } // [TODO] If lives == 0 anar a la pantalla de game-over o cat's life actor_t *act = actor::find("HERO"); act = actor::replaceWithTemplate(act, "EXPLOSION"); @@ -1585,6 +1588,17 @@ namespace actor } return 0; } + const char *getBoosterName(int booster) + { + switch (booster) + { + case 1: return "RUN"; + case 2: return "GOD"; + case 4: return "JUMP"; + case 8: return "LIVE"; + default: return ""; + } + } bool giveBooster(char *booster) { @@ -1660,6 +1674,18 @@ namespace actor return 0; } + const char *getSkillName(int skill) + { + switch (skill) + { + case 1: return "SHOES"; + case 2: return "GLOVES"; + case 4: return "PANTS"; + case 8: return "BAG"; + default: return ""; + } + } + bool giveSkill(int skill) { skills |= skill; @@ -1705,6 +1731,20 @@ namespace actor return PART_NONE; } + const char *getPartName(int part) + { + switch (part) + { + case 1: return "FILTER"; + case 2: return "PUMP"; + case 4: return "TIMER"; + case 8: return "SALT"; + case 16: return "PIPE"; + case 32: return "ELBOW"; + default: return ""; + } + } + bool pickPart(char *part) { const int value = getPartFromString(part); diff --git a/source/actor.h b/source/actor.h index dac4eda..d1978ac 100644 --- a/source/actor.h +++ b/source/actor.h @@ -202,6 +202,8 @@ namespace actor void die(); bool isDead(); + const int getBoosterFromString(char *booster); + const char *getBoosterName(int booster); bool giveBooster(char *booster); void collectBooster(int booster, int id); bool wasBoosterCollected(int id); @@ -212,6 +214,8 @@ namespace actor void useBoostRun(); void useBoostJump(); + const int getSkillFromString(char *skill); + const char *getSkillName(int skill); bool giveSkill(int skill); bool giveSkill(char *skill); bool dropSkill(int skill); @@ -219,6 +223,8 @@ namespace actor bool wasSkillCollected(char *skill); int getSkills(); + const int getPartFromString(char *part); + const char *getPartName(int part); bool pickPart(char *part); bool dropPart(char *part); bool wasPartCollected(char *part); diff --git a/source/m_editor_map.cpp b/source/m_editor_map.cpp index 9190f56..3c107dd 100644 --- a/source/m_editor_map.cpp +++ b/source/m_editor_map.cpp @@ -4,6 +4,7 @@ #include "misc.h" #include #include "room.h" +#include "actor.h" namespace modules { @@ -20,6 +21,7 @@ namespace modules uint8_t h; uint8_t color; uint8_t exits[6]; + uint32_t specials; }; miniroom_t minirooms[64]; @@ -34,8 +36,8 @@ namespace modules if (minirooms[room].exits[YN] != 255) { draw::isoline(x,y,+1,-1,14); /*draw::isoline(x,y-1,+1,-1,14);*/ draw::isoline(x,y+1,+1,-1,14); } if (minirooms[room].exits[XP] != 255) { draw::isoline(x,y,+1,+1,14); /*draw::isoline(x,y-1,+1,+1,14);*/ draw::isoline(x,y+1,+1,+1,14); } if (minirooms[room].exits[YP] != 255) { draw::isoline(x,y,-1,+1,14); /*draw::isoline(x,y-1,-1,+1,14);*/ draw::isoline(x,y+1,-1,+1,14); } - if (minirooms[room].exits[ZN] != 255) { draw::vline(x,y,24); /*draw::isoline(x,y-1,-1,+1,14);*/ draw::vline(x+1,y,24); } - if (minirooms[room].exits[ZP] != 255) { draw::vline(x,y-24,24); /*draw::isoline(x,y-1,-1,+1,14);*/ draw::vline(x+1,y-24,24); } + if (minirooms[room].exits[ZN] != 255) { draw::vline(x-1,y,24); /*draw::isoline(x,y-1,-1,+1,14);*/ draw::vline(x,y,24); } + if (minirooms[room].exits[ZP] != 255) { draw::vline(x-1,y-24,24); /*draw::isoline(x,y-1,-1,+1,14);*/ draw::vline(x,y-24,24); } } if (minirooms[room].exits[XN] != 255) drawLines(minirooms[room].exits[XN], x-24, y-12); if (minirooms[room].exits[XP] != 255) drawLines(minirooms[room].exits[XP], x+24, y+12); @@ -59,6 +61,10 @@ namespace modules { char num[] = "00"; num[0] = 48+(room/10); num[1] = 48+(room%10); draw::print(num, x-4, y-3, LIGHT+(room==current_room?YELLOW:WHITE), BLACK); + if (minirooms[room].specials&0x000000ff) { draw::color(BLACK); draw::rect(x+3, y-4, 3, 3); draw::color(BLUE); draw::fillrect(x+4, y-3, 1, 1); } + if (minirooms[room].specials&0x0000ff00) { draw::color(BLACK); draw::rect(x+3, y-2, 3, 3); draw::color(GREEN); draw::fillrect(x+4, y-1, 1, 1); } + if (minirooms[room].specials&0x00ff0000) { draw::color(BLACK); draw::rect(x+3, y, 3, 3); draw::color(YELLOW); draw::fillrect(x+4, y+1, 1, 1); } + if (minirooms[room].specials&0xff000000) { draw::color(RED); draw::fillrect(x+4, y-3, 1, 5); } } } if (minirooms[room].exits[XN] != 255) drawRoom(minirooms[room].exits[XN], x-24, y-12, shadow); @@ -78,6 +84,27 @@ namespace modules minirooms[room].color = room::getColor(0); minirooms[room].w = (room::getSize().x >> 1)-1; minirooms[room].h = (room::getSize().y >> 1)-1; + minirooms[room].specials = 0; + + // Recolectem els especials de l'habitació per a mostrar-los + actor::actor_t *act = actor::getFirst(); + while (act) + { + if (act->flags & FLAG_SPECIAL) + { + if (act->name[0]=='B') { // Es un booster + minirooms[room].specials |= actor::hero::getBoosterFromString(&act->name[2]); + } else if (act->name[0]=='S') { // Es un skill + minirooms[room].specials |= (actor::hero::getSkillFromString(&act->name[2])<<8); + } else if (act->name[0]=='P') { // Es una part + minirooms[room].specials |= (actor::hero::getPartFromString(&act->name[2])<<16); + } else { + minirooms[room].specials |= (1<<24); // Es algo invalid + } + } + act = act->next; + } + for (int i=0; i<=ZN; ++i) minirooms[room].exits[i] = room::getExit(i); for (int i=0; i<=ZN; ++i) { @@ -113,6 +140,13 @@ namespace modules drawRoom(room::getCurrent(), scroll.x+x, scroll.y+y, true); } + draw::stencil::enable(); + draw::stencil::clear(255); + + for (int i=0;i<64;++i) drawn[i]=false; + drawRoom(room::getCurrent(), scroll.x, scroll.y); + + draw::render(); } @@ -120,11 +154,22 @@ namespace modules { if (input::keyPressed(SDL_SCANCODE_ESCAPE) || input::keyPressed(SDL_SCANCODE_TAB)) return false; - draw::stencil::enable(); - draw::stencil::clear(255); + //draw::stencil::enable(); + //draw::stencil::clear(255); + + //for (int i=0;i<64;++i) drawn[i]=false; + //drawRoom(room::getCurrent(), scroll.x, scroll.y); + + const int hover = draw::stencil::query(input::mouseX(), input::mouseY()); + if (hover!=255) { + draw::color(BLACK); draw::fillrect(0,0,60,60); + int line = 4; + draw::print2(hover, -2, 1, 1, WHITE, FONT_ZOOM_VERTICAL); + if (minirooms[hover].specials & 0x000000ff) draw::print2(actor::hero::getBoosterName(minirooms[hover].specials & 0xff), 1, line++, BLUE, FONT_ZOOM_NONE); + if (minirooms[hover].specials & 0x0000ff00) draw::print2(actor::hero::getSkillName((minirooms[hover].specials>>8) & 0xff), 1, line++, GREEN, FONT_ZOOM_NONE); + if (minirooms[hover].specials & 0x00ff0000) draw::print2(actor::hero::getPartName((minirooms[hover].specials>>16) & 0xff), 1, line++, YELLOW, FONT_ZOOM_NONE); + } - for (int i=0;i<64;++i) drawn[i]=false; - drawRoom(room::getCurrent(), scroll.x, scroll.y); draw::render(); if (input::mouseClk(1)) {