From 8dde188b365f32b5dfa37d3912b959d7acf5c845 Mon Sep 17 00:00:00 2001 From: Christoph Sommer Date: Fri, 3 Mar 2006 22:30:17 +0000 Subject: [PATCH] New badguy SkullHop - a skull that hops around on one foot. Graphics based on data/images/creatures/skullhead/skullhead.xcf SVN-Revision: 3070 --- data/images/creatures/skullhead/skullhead2.xcf | Bin 0 -> 9738 bytes data/images/creatures/skullyhop/charging-0.png | Bin 0 -> 3247 bytes data/images/creatures/skullyhop/charging-1.png | Bin 0 -> 3219 bytes data/images/creatures/skullyhop/jumping-0.png | Bin 0 -> 3487 bytes data/images/creatures/skullyhop/skullyhop.xcf | Bin 0 -> 14014 bytes data/images/creatures/skullyhop/squished-0.png | Bin 0 -> 2517 bytes data/images/creatures/skullyhop/standing-0.png | Bin 0 -> 3269 bytes data/images/sprites.strf | 46 ++++++++ src/badguy/dispenser.cpp | 6 +- src/badguy/skullyhop.cpp | 151 +++++++++++++++++++++++++ src/badguy/skullyhop.hpp | 59 ++++++++++ 11 files changed, 261 insertions(+), 1 deletion(-) create mode 100644 data/images/creatures/skullhead/skullhead2.xcf create mode 100644 data/images/creatures/skullyhop/charging-0.png create mode 100644 data/images/creatures/skullyhop/charging-1.png create mode 100644 data/images/creatures/skullyhop/jumping-0.png create mode 100644 data/images/creatures/skullyhop/skullyhop.xcf create mode 100644 data/images/creatures/skullyhop/squished-0.png create mode 100644 data/images/creatures/skullyhop/standing-0.png create mode 100644 src/badguy/skullyhop.cpp create mode 100644 src/badguy/skullyhop.hpp diff --git a/data/images/creatures/skullhead/skullhead2.xcf b/data/images/creatures/skullhead/skullhead2.xcf new file mode 100644 index 0000000000000000000000000000000000000000..2f990399009793f200ccff8803716fe81c1c39d9 GIT binary patch literal 9738 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 literal 0 HcmV?d00001 diff --git a/data/images/creatures/skullyhop/charging-1.png b/data/images/creatures/skullyhop/charging-1.png new file mode 100644 index 0000000000000000000000000000000000000000..95051bf7b10ec82943c67703dedc27d55d6e36a1 GIT binary patch literal 3219 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 F{2z6^CV>C| literal 0 HcmV?d00001 diff --git a/data/images/creatures/skullyhop/jumping-0.png b/data/images/creatures/skullyhop/jumping-0.png new file mode 100644 index 0000000000000000000000000000000000000000..a1aa6c88ba677e2ca1b4b970a810f36984a8cea4 GIT binary patch literal 3487 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 literal 0 HcmV?d00001 diff --git a/data/images/creatures/skullyhop/skullyhop.xcf b/data/images/creatures/skullyhop/skullyhop.xcf new file mode 100644 index 0000000000000000000000000000000000000000..599ef0a56082d6789423e098afeeb4ac83ded4cc GIT binary patch literal 14014 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 literal 0 HcmV?d00001 diff --git a/data/images/creatures/skullyhop/squished-0.png b/data/images/creatures/skullyhop/squished-0.png new file mode 100644 index 0000000000000000000000000000000000000000..384f6a9674a6922ccb892bdb420c6eb1968ff68d GIT binary patch literal 2517 zcmV;`2`cu9P)WFU8GbZ8({Xk{QrNlj4iWF>9@00}usL_t(o!3T;Xn*ng-$Ptmx=Sihf3=Iv@ z-``I*n?;hOfQj|>b*j}WwOWlU%5nD`m+PoQ|G!z^PUaNt0|MnIns)a!K? z7Z+(Zn;3?{>gp=1tE>3F&*I`Dp63CON~Ks>SYUE;l18J!<;$0~4RK2V@&C+J8V%CvG_hEWp`oGHW&)J$A$j%HSH;lK5YcFqY&J_Y8b#AIdV71xWHQXp z&l3uT$Y!%tDitit!Y~X>)5Q0ET-U|6ZG7KHRaK(VD6LkDLZQIo;v&B96AFcpWto|o znSTHaZAP|)rG1Ld&Q5Z<9J;P!7zV1UBFi$nckgD`u3gx+jb&M^tgK)d2EOm#t_PtI zu~-aQmQfT1RaNQe=%7}sk22*U9JeoIih_OeRArl>)$ZT|CdjFbo{W!S{V6NkRz0>gp<<=MfHve_p9n zej{(f@r%bFf1I(gG4lC5kw^sFwow#?LZQG%AAN+TX=E~)AY&ZIL5TklIyySa_3PJ} zo}T90Z@8HH?_S-!7 z+;e>M%{R==&0!b@p64Ni2z2qvE3fdv3omf`^l6&SCPD~QRpp_F9^&h-zh>{=y(}y& z1ocFcBwDQ&zV9Q1z;#^!!r?H0EpMDe3=R%*_Uu_!R#qq$i(I>QjRzlmkYce&tyZH@ zDBw5_Yinz~`R1GS_4VPpF7xyAjE|4Ayu2K2uxr;YWLc)azaPhOXf~UHcG{_~s%ns7 zfF=WskB{^2yYI5RyiB9f;Kq#`K_-lkk7HRDx~>Co>eMOr?c0Z87%VR@2W*@;aRS@6 zktB&7J9Z#R5}Kyrc^-UN~IFLy}hWa%F@yjhGA^cNU2mp2oZo5LZB!LvMe({KTok(q*N*~IXOwQ*(8}v zq9_VLCIoQf#tl?eMOD=;HKDy+*Tr>RE?l@kCX)%kwhgYmR8#qw<)6g^xS(XDqZC>;9^Fb=gvW#upK{{?;i;Iha z7k&Qu=QxgoX_`UVmm~?(G=p~m?Zf;{4uwM8bI(0Ej)P@cL?V$b#@43TG)?;Y`hpX; zuiF`EZ{DuZ9UUD+A`t+Z%_g;4EpThsb(xx)`Xzw;)?05$u~-b-wu921OeVK%(%IRG z>$<3_O0(GvIy6;Pw*X0})0E3)%H=X&eDMXXRtwMb@O__pz0S(YO5o0}>r$;&0e%;F zP5WUX1U)@H?B2Z_UDtzFFqur^x-MN^T|q_6<#Ob5xh-H6MZvNxOw**Zvy*1CiRXC% zOB*#KXqws<(RN>s9Xs~xd+)uMN~MA<%OnzscKPM_@#EZg-+c%n2!%rQ_xDpQ772&L zfu~rO#ryBSPovSGR;$ryG{|PN#A2}^)GI41fxsJ$2IX>@si~=eb{Sw|VuDyK#?hlk z(RCfyb?NTz=H$tf3=a=8J3AZ1cW`i!*Is*#bUF<{EEeO#4?n~(3~bvb9*+loNn2aC zZBr_hxO(+!Aku9@zb%BZu`#iK|9&2R_+fNi$FeLknM}}2y!YOFjE;^nIXTHQ&pZ=k zmthzvibAPW3VIF8vhaN$P16F6G#U-Q`sypH)hd={;kqtD2(Dhex|NZ0=gvvrfB!wM z>k^B_xclzA>FVktolY|~HN_*3JQ5h7=Xr!eA)?VJ(P%WN89-oy?Gm0yB+xVs-}mY3 z>tk?mkj~Cd5{U$R_UyUyT$9h|iO1tqDis{Zp;oJ5+cv7IV%s*!WRjgbcQP|GgJBpX z5(!+_4aNsWQHVyPghCJ3=I5vXlUrC z`}gnvNjx4um`o;*-3i2hjhw2ga{vAJGdnv=DwV?XJa+EfNjjY-9*>jD<%mY3_baDQpRS)e fb?T2lb_oABU)#J42~XoD00000NkvXXu0mjf#gffM literal 0 HcmV?d00001 diff --git a/data/images/creatures/skullyhop/standing-0.png b/data/images/creatures/skullyhop/standing-0.png new file mode 100644 index 0000000000000000000000000000000000000000..c9f2f0eb91519c23a930f8c7c8d58779d6e6b907 GIT binary patch literal 3269 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 literal 0 HcmV?d00001 diff --git a/data/images/sprites.strf b/data/images/sprites.strf index 144e63812..fefa3ed52 100644 --- a/data/images/sprites.strf +++ b/data/images/sprites.strf @@ -944,6 +944,52 @@ (name "attacking") (images "creatures/angrystone/attacking-0.png"))) +; SkullyHop + (sprite (name "skullyhop") + (action + (name "standing-left") + (x-offset 0) + (y-offset 0) + (images "creatures/skullyhop/standing-0.png")) + (action + (name "standing-right") + (x-offset 0) + (y-offset 0) + (mirror-action "standing-left")) + (action + (name "charging-left") + (x-offset 0) + (y-offset 0) + (fps 10.0) + (images "creatures/skullyhop/charging-0.png" + "creatures/skullyhop/charging-1.png")) + (action + (name "charging-right") + (fps 10.0) + (x-offset 0) + (y-offset 0) + (mirror-action "charging-left")) + (action + (name "jumping-left") + (x-offset 0) + (y-offset 0) + (images "creatures/skullyhop/jumping-0.png")) + (action + (name "jumping-right") + (x-offset 0) + (y-offset 0) + (mirror-action "jumping-left")) + (action + (name "squished-left") + (x-offset 0) + (y-offset -14) + (images "creatures/skullyhop/squished-0.png")) + (action + (name "squished-right") + (x-offset 0) + (y-offset -14) + (mirror-action "squished-left"))) + ;; Game elements follow (sprite (name "egg") diff --git a/src/badguy/dispenser.cpp b/src/badguy/dispenser.cpp index 010e9c792..e22f81998 100644 --- a/src/badguy/dispenser.cpp +++ b/src/badguy/dispenser.cpp @@ -27,6 +27,7 @@ #include "badguy/mrrocket.hpp" #include "badguy/poisonivy.hpp" #include "badguy/snowsnail.hpp" +#include "badguy/skullyhop.hpp" Dispenser::Dispenser(const lisp::Lisp& reader) { @@ -104,9 +105,11 @@ Dispenser::launch_badguy() Sector::current()->add_object(new MrRocket(get_pos().x+(dir == LEFT ? -32 : 32), get_pos().y, dir));} else if (badguy == "poisonivy") Sector::current()->add_object(new PoisonIvy(get_pos().x, get_pos().y+32, dir)); + else if (badguy == "skullyhop") + Sector::current()->add_object(new SkullyHop(get_pos().x, get_pos().y+44, dir)); else if (badguy == "random") { - switch (rand()%6) + switch (rand()%7) { case 0: Sector::current()->add_object(new SnowBall(get_pos().x, get_pos().y+32, dir)); break; case 1: Sector::current()->add_object(new BouncingSnowball(get_pos().x, get_pos().y+32, dir)); break; @@ -114,6 +117,7 @@ Dispenser::launch_badguy() case 3: Sector::current()->add_object(new MrIceBlock(get_pos().x, get_pos().y+32, dir, false)); break; case 4: Sector::current()->add_object(new PoisonIvy(get_pos().x, get_pos().y+32, dir)); break; case 5: Sector::current()->add_object(new SnowSnail(get_pos().x, get_pos().y+32, dir)); break; + case 6: Sector::current()->add_object(new SkullyHop(get_pos().x, get_pos().y+44, dir)); break; } } } diff --git a/src/badguy/skullyhop.cpp b/src/badguy/skullyhop.cpp new file mode 100644 index 000000000..418a63fc3 --- /dev/null +++ b/src/badguy/skullyhop.cpp @@ -0,0 +1,151 @@ +// $Id: skullyhop.cpp 2960 2005-12-28 00:09:51Z matzebraun $ +// +// SkullyHop - A Hopping Skull +// Copyright (C) 2006 Christoph Sommer +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +// 02111-1307, USA. +#include + +#include "skullyhop.hpp" + +namespace { + const float VERTICAL_SPEED = 450; /**< y-speed when jumping */ + const float HORIZONTAL_SPEED = 220; /**< x-speed when jumping */ + const float MIN_RECOVER_TIME = 0.1; /**< minimum time to stand still before starting a (new) jump */ + const float MAX_RECOVER_TIME = 1.0; /**< maximum time to stand still before starting a (new) jump */ +} + +SkullyHop::SkullyHop(const lisp::Lisp& reader) +{ + reader.get("x", start_position.x); + reader.get("y", start_position.y); + bbox.set_size(33.8, 43.8); //sprite is 34x44 + sprite = sprite_manager->create("skullyhop"); + has_initial_direction = false; +} + +SkullyHop::SkullyHop(float pos_x, float pos_y, Direction d) +{ + start_position.x = pos_x; + start_position.y = pos_y; + bbox.set_size(33.8, 43.8); //sprite is 34x44 + sprite = sprite_manager->create("skullyhop"); + has_initial_direction = true; + initial_direction = d; +} + +void +SkullyHop::write(lisp::Writer& writer) +{ + writer.start_list("skullyhop"); + writer.write_float("x", start_position.x); + writer.write_float("y", start_position.y); + writer.end_list("skullyhop"); +} + +void +SkullyHop::activate() +{ + if (has_initial_direction) dir = initial_direction; + + // initial state is JUMPING, because we might start airborne + state = JUMPING; + sprite->set_action(dir == LEFT ? "jumping-left" : "jumping-right"); +} + +void +SkullyHop::set_state(SkullyHopState newState) +{ + if (newState == STANDING) { + physic.set_velocity_x(0); + physic.set_velocity_y(0); + sprite->set_action(dir == LEFT ? "standing-left" : "standing-right"); + + float recover_time = MIN_RECOVER_TIME + (float)rand() / RAND_MAX * (MAX_RECOVER_TIME - MIN_RECOVER_TIME); + recover_timer.start(recover_time); + } else + if (newState == CHARGING) { + sprite->set_action(dir == LEFT ? "charging-left" : "charging-right", 1); + } else + if (newState == JUMPING) { + sprite->set_action(dir == LEFT ? "jumping-left" : "jumping-right"); + physic.set_velocity_x(dir == LEFT ? -HORIZONTAL_SPEED : HORIZONTAL_SPEED); + physic.set_velocity_y(VERTICAL_SPEED); + } + + state = newState; +} + +bool +SkullyHop::collision_squished(Player& player) +{ + sprite->set_action(dir == LEFT ? "squished-left" : "squished-right"); + kill_squished(player); + return true; +} + +HitResponse +SkullyHop::collision_solid(GameObject& , const CollisionHit& hit) +{ + // ignore collisions while standing still + if(state != JUMPING) return CONTINUE; + + // check if we hit the floor while falling + if ((hit.normal.y < 0) && (physic.get_velocity_y() < 0)) { + set_state(STANDING); + } + + // check if we hit the roof while climbing + if ((hit.normal.y > 0) && (physic.get_velocity_y() > 0)) { + physic.set_velocity_y(0); + } + + // check if we hit left or right while moving in either direction + if ((hit.normal.x != 0) && (physic.get_velocity_x() != 0)) { + dir = dir == LEFT ? RIGHT : LEFT; + sprite->set_action(dir == LEFT ? "jumping-left" : "jumping-right"); + physic.set_velocity_x(-0.25*physic.get_velocity_x()); + } + + return CONTINUE; +} + +HitResponse +SkullyHop::collision_badguy(BadGuy& badguy, const CollisionHit& hit) +{ + // behaviour for badguy collisions is the same as for collisions with solids + return collision_solid(badguy, hit); +} + +void +SkullyHop::active_update(float elapsed_time) +{ + BadGuy::active_update(elapsed_time); + + // charge when fully recovered + if ((state == STANDING) && (recover_timer.check())) { + set_state(CHARGING); + return; + } + + // jump as soon as charging animation completed + if ((state == CHARGING) && (sprite->animation_done())) { + set_state(JUMPING); + return; + } +} + +IMPLEMENT_FACTORY(SkullyHop, "skullyhop") diff --git a/src/badguy/skullyhop.hpp b/src/badguy/skullyhop.hpp new file mode 100644 index 000000000..3f4dd5278 --- /dev/null +++ b/src/badguy/skullyhop.hpp @@ -0,0 +1,59 @@ +// $Id: skullyhop.hpp 2642 2005-06-26 13:38:53Z matzebraun $ +// +// SkullyHop - A Hopping Skull +// Copyright (C) 2006 Christoph Sommer +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +// 02111-1307, USA. + +#ifndef __SKULLYHOP_H__ +#define __SKULLYHOP_H__ + +#include "badguy.hpp" + +/** + * Badguy "SkullyHop" - A Hopping Skull + */ +class SkullyHop : public BadGuy +{ +public: + SkullyHop(const lisp::Lisp& reader); + SkullyHop(float pos_x, float pos_y, Direction d); + + void activate(); + void write(lisp::Writer& writer); + HitResponse collision_solid(GameObject& other, const CollisionHit& hit); + HitResponse collision_badguy(BadGuy& badguy, const CollisionHit& hit); + bool collision_squished(Player& player); + void active_update(float elapsed_time); + +protected: + enum SkullyHopState { + STANDING, + CHARGING, + JUMPING + }; + + bool has_initial_direction; + Direction initial_direction; + + Timer recover_timer; + SkullyHopState state; + + void set_state(SkullyHopState newState); +}; + +#endif + -- 2.11.0