From f1c7a49dd18ff59d0d32bd118044402ff35f66f5 Mon Sep 17 00:00:00 2001 From: Marek Moeckel Date: Thu, 25 Nov 2004 11:16:03 +0000 Subject: [PATCH] added badguy Nolok_01, as he may appear as the boss of world 1 (still very basic). added sprite "Dummyguy" which can be used for badguys that don't have sprites yet (i.e. nolok and dispenser). added new test level "noloktest.stl", moved dispenser and secretarea tests to that level. Bugs: Nolok can only be killed when he's jumping; no idea why, probably set the offsets wrong. Also, currently there's no limit on how many snowballs he can throw, so kill him quickly :-) This is the last thing I'll add before fixing all my other stuff. :-) SVN-Revision: 2184 --- data/images/shared/dummyguy-dead.png | Bin 0 -> 796 bytes data/images/shared/dummyguy-jump.png | Bin 0 -> 1301 bytes data/images/shared/dummyguy-stand.png | Bin 0 -> 1258 bytes data/images/shared/dummyguy-throw.png | Bin 0 -> 1408 bytes data/images/shared/dummyguy-walk-1.png | Bin 0 -> 1224 bytes data/images/shared/dummyguy-walk-2.png | Bin 0 -> 1164 bytes data/images/supertux.strf | 41 +++++++++++++++ data/levels/test/bonusblock.stl | 2 - data/levels/test/noloktest.stl | 83 +++++++++++++++++++++++++++++ src/badguy/bouncing_snowball.cpp | 6 ++- src/badguy/bouncing_snowball.h | 4 +- src/badguy/dispenser.cpp | 6 ++- src/badguy/nolok_01.cpp | 92 +++++++++++++++++++++++++++++++++ src/badguy/nolok_01.h | 26 ++++++++++ src/sector.cpp | 3 ++ src/trigger/door.cpp | 4 +- src/trigger/door.h | 2 +- 17 files changed, 261 insertions(+), 8 deletions(-) create mode 100644 data/images/shared/dummyguy-dead.png create mode 100644 data/images/shared/dummyguy-jump.png create mode 100644 data/images/shared/dummyguy-stand.png create mode 100644 data/images/shared/dummyguy-throw.png create mode 100644 data/images/shared/dummyguy-walk-1.png create mode 100644 data/images/shared/dummyguy-walk-2.png create mode 100644 data/levels/test/noloktest.stl create mode 100644 src/badguy/nolok_01.cpp create mode 100644 src/badguy/nolok_01.h diff --git a/data/images/shared/dummyguy-dead.png b/data/images/shared/dummyguy-dead.png new file mode 100644 index 0000000000000000000000000000000000000000..97b8b31ed9cb296df86e6c68cd294fc3799912fc GIT binary patch literal 796 zcmV+%1LOROP)WFU8GbZ8({Xk{QrNlj4iWF>9@00MwXL_t(&-tE^-h>c+s z2k_sWON>#-7>Q6Mk)0X~iF_=W)vRn-2peT%>9dp#SxmC?SrR1+B}5uhiiXJNLKyNn z`DV(DYjYO58ScmX-h1hudV1d8_kBA5=bZofKj)!tbt}zsG0L_~0gg&pS35f_)p^CN zq1t4sSpXGFL#6;OWXj}FrkpY?1jwHp=8`Pi+yJGTE2pZ;32ze7OC`TWfy@-?JX1h; zQ<3RhHMQdZc3yQUu6pRJ9)UqAMJiJX0J*>Df2uuUlJZ_%a@Je2s;8l$R=DubU0!M? z3Uy2UdY*67u@;li_{;luxQr8clP2Jla5N_1U^uygF}RB-;WUef_*9HO6bc|4^S7Ai z2jMPZ6qaHij$%BXB_003LA;BR`)uC#u`y4M-7imr1IvQtU6?n(KYQ>IEooK4Lfl3# z_G1y6;@j#d#jR%xvty ztpIQ#6fv8Y(@d~_GaiN04>%LgJuyFw6f8~}Kxa7kjFWLD3`2XopBB||9kB>n#)YEwL}<&k5jYe)X)k2K(8%A^gt;^q!|Qj! aeESK=_o9PS!+yH}00001Q!4R03CEi zSad^gZEa<4bO1wgWnpw>WFU8GbZ8({Xk{QrNlj4iWF>9@00enSL_t(&-tCxOXk0}U z$A4#L?%jJg8biUB7%94rdUwWSXydrp)bW!;)9WZ_*CCi6u$}<3?caOq6iUM z6e$*wf>@AP`k;LfEGShhMo|+@NP>-xjoIDn%emniv&nwkO{;cbxVtlF=KSZ(`5gGa zH>q?%Hk%FR=H|8)3Wd!Jn}|#qV?HPp3g6cituf{S5g7xbrMie5@jUOE`iM&8pfdVH zL(V%V9}pR1o=zxk`yvHy1@26MII3$NPUG%h)y-n9->+icpCEe+C;~SD zc%Ij#Qg|l~0K-5O1VK)R+JVFRjoTf-6F^erGa~Xs8fq}CC$1Fuhd|_cUhA?~TrZyy zMbR$+`FuWC695tU9UwKcssg|XfI^|Lx56uEP%Ekpq33z)fN5aDIhQMEjdQM9M9u?0 zrsWCy)fAsAlm4*MKa&ao=UlT&Va8g!y%b##1c5Q;kotf#&bc79a4aHwqbNE8SP^+2 z_&AE9iz3nzMNy-OY>c94H?UqrezMkX&*$@Br>e2exg8>Mwp2J)=QHS>YprWu;GF9M z9s(wSaSh40hhZ45c1AU#y?%b+vTfGdeTn3wZB?18LmElsf(KVOl@@t@Q8GFi1VOM` z%=?t-x4=S%Y>atyHALSD%&14a6_^&0Y4!W(v)OEO-IxbK&=J=J#+aTs>;uCh@~leb z<$7uS22HObYwdtaV~sLBk;!Coz&AR-C+$0551iG_pHGapsRV`;WEU_mB9qR!U8ykl zJg+@wZj2dRH2pUK8isp-d8HpJH-A{NWipwLSnR;y5;4D9uV7%&_~tlZiO5$~rE=coH5jkb8P1R471>mv|$Nydc#+VjWw2Soyutm%7 z4avb`vDl#i&edB=N8_NAEWhKNz*@Vh#JW!46JSTJ5(pDozb{e!`YMU3CDv>Njsf=o zyK4oI^yhB?_pU&HJ#Z4}(Eq>I3Lq{r27oMZ9Jsp#?H=G1a5FHgW3#pDz?Z56R|8M# z?@{2i2Aocy7x+lui6Y=#1sVan(gYAcNF~d$KNG*lfgY9A1?`P#12Di#38okH#5;kE z(rnealPd>B+}S92}>Ktb&|j)cc6$>_Cy zyZ~$h?g!ok&H=BKyU9-7Aa*wIRRCaXi3hAA@LE|r_`Z)uy;)uSR0ROm0-poF0iUWA z9|5i{dxuWFU8GbZ8({Xk{QrNlj4iWF>9@00d4+L_t(&-tAdUXk1kk z{=Re1d-L8*nnW_%s98iwO296PDfM>|)M7VNc=x<}zH{!m=X~c5 zaI+6K`a!W+jOOR(pQzPpJFhK5UJ;S6Yqi?BT+xciizKH2_~jmwCxal^nvbi)E z$q@hp$s-~|B+nR#DG_-fYs=rU#s3tM`<9bwYim;x`OrXCRJA7)<#8N$nAOv&+FggI zUNx{kIOjAA>jwdN5jmU++@2)?Tn6xP3dC3T&1+fg{l~Ug67~Dd&HGbgUjSGHa4!G^ zLC|kr_%aIs;{bdVMJ@KK2f CSwp~TL3-?g7T_coLA29 z-d_TMYPH(3Apj)*27t_t)j9y227p?vwzt78DA_667{VY3?f@_gU|LmM>iI@h+euyp za6YR{c-)TSkviqaO#Z!00H|uad73Gog^P>nA5jl{QeE{Pm-#4#(lvl*x zW%SBB=T4Y6ZZoB)3xz@pfM0C>xvclR6TqY`el+#I+dMF8Ao~Fk}3ACgikl_C)twfV~=4~Aj5rQV~q%|2WZkwdG9t_UC%Cx?+ z@*eyBeNzBMA@tmJ;$ROMk9K16Z`K$YaBB^)vL(Ps?U ztLmVt-ft{d;>x&5y=>@PzaN>!`Y~X(++0t;}0rer}2C zR99D5eOH3za#=}!V*5CO>;D626o8Wa-V8Zhuj`YW&dD$gH_YSXINl22qBS}XuBH41 zv;2G%MYm_z-alpQUI@dmb2Y(Xi`@Pku6B-?XUA3*Y;A3A%kh3`$T{~oZjIFV7utRs UQ@4LO=l}o!07*qoM6N<$f~hG$4FCWD literal 0 HcmV?d00001 diff --git a/data/images/shared/dummyguy-throw.png b/data/images/shared/dummyguy-throw.png new file mode 100644 index 0000000000000000000000000000000000000000..9db9383806a7c3b8955b487778e599cf3c08036f GIT binary patch literal 1408 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 zK=x)create("bouncingsnowball"); + set_direction = false; } -BouncingSnowball::BouncingSnowball(float pos_x, float pos_y) +BouncingSnowball::BouncingSnowball(float pos_x, float pos_y, Direction d) { start_position.x = pos_x; start_position.y = pos_y; bbox.set_size(31.8, 31.8); sprite = sprite_manager->create("bouncingsnowball"); + set_direction = true; + initial_direction = d; } void @@ -35,6 +38,7 @@ BouncingSnowball::write(LispWriter& writer) void BouncingSnowball::activate() { + if (set_direction) {dir = initial_direction;} physic.set_velocity_x(dir == LEFT ? -WALKSPEED : WALKSPEED); sprite->set_action(dir == LEFT ? "left" : "right"); } diff --git a/src/badguy/bouncing_snowball.h b/src/badguy/bouncing_snowball.h index 7aea25dae..4bb4d862c 100644 --- a/src/badguy/bouncing_snowball.h +++ b/src/badguy/bouncing_snowball.h @@ -7,7 +7,7 @@ class BouncingSnowball : public BadGuy { public: BouncingSnowball(LispReader& reader); - BouncingSnowball(float pos_x, float pos_y); + BouncingSnowball(float pos_x, float pos_y, Direction d); void activate(); void write(LispWriter& writer); @@ -15,6 +15,8 @@ public: protected: bool collision_squished(Player& player); + bool set_direction; + Direction initial_direction; }; #endif diff --git a/src/badguy/dispenser.cpp b/src/badguy/dispenser.cpp index 1f62e61fd..2975c1a89 100644 --- a/src/badguy/dispenser.cpp +++ b/src/badguy/dispenser.cpp @@ -13,7 +13,8 @@ Dispenser::Dispenser(LispReader& reader) reader.read_string("badguy", badguy); bbox.set_size(32, 32); //FIXME: Create dispenser sprite - sprite = sprite_manager->create("snowball"); + sprite = sprite_manager->create("dummyguy"); + sprite->set_action("stand"); } void @@ -69,6 +70,7 @@ Dispenser::collision_solid(GameObject& , const CollisionHit& hit) //TODO: Add launching velocity to badguys // Add more badguys and randomizer // Clean up stuff I copied without understanding what it does :) +// Stop dispensing when game is paused // Lots-O-Stuff (tm) void Dispenser::launch_badguy() @@ -78,7 +80,7 @@ Dispenser::launch_badguy() if (badguy == "snowball") Sector::current()->add_object(new SnowBall(get_pos().x-2, get_pos().y)); else if (badguy == "bouncingsnowball") - Sector::current()->add_object(new BouncingSnowball(get_pos().x-2, get_pos().y)); + Sector::current()->add_object(new BouncingSnowball(get_pos().x-2, get_pos().y, dir)); else if (badguy == "random") {} } diff --git a/src/badguy/nolok_01.cpp b/src/badguy/nolok_01.cpp new file mode 100644 index 000000000..4bbc14e73 --- /dev/null +++ b/src/badguy/nolok_01.cpp @@ -0,0 +1,92 @@ +#include + +#include "nolok_01.h" +#include "badguy/bouncing_snowball.h" +#include "trigger/door.h" + +#define SHOOT_TIME 2.5 +#define IDLE_TIME 0.4 +#define JUMP_TIME 0.3 + +static const float WALKSPEED = 80; + +//TODO: Create sprite, give multiple hitpoints, limit max number of snowballs +// Can only be killed when jumping, no idea why +Nolok_01::Nolok_01(LispReader& reader) +{ + reader.read_float("x", start_position.x); + reader.read_float("y", start_position.y); + bbox.set_size(31.8, 31.8); + sprite = sprite_manager->create("dummyguy"); +} + +Nolok_01::Nolok_01(float pos_x, float pos_y) +{ + start_position.x = pos_x; + start_position.y = pos_y; + bbox.set_size(31.8, 31.8); + sprite = sprite_manager->create("dummyguy"); +} + +void +Nolok_01::write(LispWriter& writer) +{ + writer.start_list("nolok01"); + + writer.write_float("x", get_pos().x); + writer.write_float("y", get_pos().y); + + writer.end_list("nolok01"); +} + +void +Nolok_01::activate() +{ + physic.set_velocity_x(dir == LEFT ? -WALKSPEED : WALKSPEED); + sprite->set_action(dir == LEFT ? "left" : "right"); + action_timer.start(SHOOT_TIME, true); +} + +void +Nolok_01::active_action(float elapsed_time) +{ + movement = physic.get_movement(elapsed_time); + if (action_timer.check()) { + physic.set_velocity_y(700); + jump_timer.start(JUMP_TIME); + } + if (jump_timer.check()) { + sprite->set_action("throw"); + idle_timer.start(IDLE_TIME); + } + if (idle_timer.check()) { + Sector::current()->add_object(new BouncingSnowball(get_pos().x-32, get_pos().y, LEFT)); + Sector::current()->add_object(new BouncingSnowball(get_pos().x, get_pos().y, RIGHT)); + physic.set_velocity_x(dir == LEFT ? -WALKSPEED : WALKSPEED); + sprite->set_action(dir == LEFT ? "left" : "right"); + } +} + +bool +Nolok_01::collision_squished(Player& player) +{ + sprite->set_action("dead"); + kill_squished(player); + Sector::current()->add_object(new Door((int)get_pos().x+32, 512, "sector1", "main2")); + return true; +} + +HitResponse +Nolok_01::collision_solid(GameObject& , const CollisionHit& hit) +{ + if(fabsf(hit.normal.y) > .5) { // hit floor or roof? + //physic.set_velocity_y(0); + } else { // hit right or left + dir = dir == LEFT ? RIGHT : LEFT; + sprite->set_action(dir == LEFT ? "left" : "right"); + physic.set_velocity_x(-physic.get_velocity_x()); + } + + return CONTINUE; +} + diff --git a/src/badguy/nolok_01.h b/src/badguy/nolok_01.h new file mode 100644 index 000000000..4049892db --- /dev/null +++ b/src/badguy/nolok_01.h @@ -0,0 +1,26 @@ +#ifndef __NOLOK01_H__ +#define __NOLOK01_H__ + +#include "badguy.h" +#include "timer.h" + +class Nolok_01 : public BadGuy +{ +public: + Nolok_01(LispReader& reader); + Nolok_01(float pos_x, float pos_y); + + void activate(); + void write(LispWriter& writer); + void active_action(float elapsed_time); + HitResponse collision_solid(GameObject& other, const CollisionHit& hit); + +protected: + bool collision_squished(Player& player); + Timer2 action_timer; + Timer2 idle_timer; + Timer2 jump_timer; +}; + +#endif + diff --git a/src/sector.cpp b/src/sector.cpp index 809b119b0..f5609fdae 100644 --- a/src/sector.cpp +++ b/src/sector.cpp @@ -55,6 +55,7 @@ #include "badguy/mrbomb.h" #include "badguy/dispenser.h" #include "badguy/spike.h" +#include "badguy/nolok_01.h" #include "trigger/door.h" #include "trigger/sequence_trigger.h" #include "trigger/secretarea_trigger.h" @@ -158,6 +159,8 @@ Sector::parse_object(const std::string& name, LispReader& reader) return new Dispenser(reader); } else if(name == "spike") { return new Spike(reader); + } else if(name == "nolok_01") { + return new Nolok_01(reader); } #if 0 else if(badguykind_from_string(name) != BAD_INVALID) { diff --git a/src/trigger/door.cpp b/src/trigger/door.cpp index 1d576aee3..43a4b291d 100644 --- a/src/trigger/door.cpp +++ b/src/trigger/door.cpp @@ -42,10 +42,12 @@ Door::Door(LispReader& reader) sprite = sprite_manager->create("door"); } -Door::Door(int x, int y) +Door::Door(int x, int y, std::string sector, std::string spawnpoint) { bbox.set_pos(Vector(x, y)); bbox.set_size(32, 64); + target_sector = sector; + target_spawnpoint = spawnpoint; sprite = sprite_manager->create("door"); } diff --git a/src/trigger/door.h b/src/trigger/door.h index 151773561..abcff6706 100644 --- a/src/trigger/door.h +++ b/src/trigger/door.h @@ -31,7 +31,7 @@ class Door : public TriggerBase, public Serializable { public: Door(LispReader& reader); - Door(int x, int y); + Door(int x, int y, std::string sector, std::string spawnpoint); virtual ~Door(); virtual void write(LispWriter& writer); -- 2.11.0