Start of entity loading.
This commit is contained in:
parent
7f237e3c8f
commit
d999c14776
11
common.mk
11
common.mk
|
@ -9,6 +9,7 @@ SEARCHPATH += src/entities/blobs
|
||||||
SEARCHPATH += src/entities/boss
|
SEARCHPATH += src/entities/boss
|
||||||
SEARCHPATH += src/entities/cannons
|
SEARCHPATH += src/entities/cannons
|
||||||
SEARCHPATH += src/entities/decoration
|
SEARCHPATH += src/entities/decoration
|
||||||
|
SEARCHPATH += src/entities/evilBlobs
|
||||||
SEARCHPATH += src/entities/items
|
SEARCHPATH += src/entities/items
|
||||||
SEARCHPATH += src/entities/misc
|
SEARCHPATH += src/entities/misc
|
||||||
SEARCHPATH += src/entities/structures
|
SEARCHPATH += src/entities/structures
|
||||||
|
@ -27,19 +28,19 @@ vpath %.h $(SEARCHPATH)
|
||||||
|
|
||||||
DEPS += defs.h structs.h
|
DEPS += defs.h structs.h
|
||||||
|
|
||||||
OBJS += atlas.o atlasTest.o
|
OBJS += atlas.o atlasTest.o aquaBlob.o
|
||||||
OBJS += battery.o blaze.o bob.o boss.o blobBoss.o
|
OBJS += battery.o blaze.o bob.o boss.o blobBoss.o
|
||||||
OBJS += camera.o cannon.o cardReader.o cell.o cherry.o combat.o consumable.o
|
OBJS += camera.o cannon.o cardReader.o cell.o cherry.o combat.o consumable.o
|
||||||
OBJS += debris.o destructable.o door.o draw.o
|
OBJS += debris.o destructable.o door.o draw.o
|
||||||
OBJS += effects.o entities.o exit.o explosions.o eyeDroidCommander.o
|
OBJS += effects.o entities.o entityFactory.o exit.o explosions.o eyeDroidCommander.o evilBlob.o
|
||||||
OBJS += fleshChunk.o frost.o
|
OBJS += fleshChunk.o frost.o
|
||||||
OBJS += game.o
|
OBJS += game.o grenade.o
|
||||||
OBJS += heart.o horizontalDoor.o horizontalLaserTrap.o hub.o hud.o
|
OBJS += heart.o horizontalDoor.o horizontalLaserTrap.o hub.o hud.o
|
||||||
OBJS += i18n.o init.o infoPoint.o input.o io.o item.o items.o itemPad.o
|
OBJS += i18n.o init.o infoPoint.o input.o io.o item.o items.o itemPad.o
|
||||||
OBJS += cJSON.o
|
OBJS += cJSON.o
|
||||||
OBJS += key.o keycard.o
|
OBJS += key.o keycard.o
|
||||||
OBJS += laserTrap.o lift.o lookup.o
|
OBJS += laser.o laserTrap.o lift.o lookup.o
|
||||||
OBJS += main.o map.o maths.o mia.o
|
OBJS += main.o map.o maths.o mia.o missile.o
|
||||||
OBJS += objectives.o
|
OBJS += objectives.o
|
||||||
OBJS += particles.o player.o powerPoint.o powerPool.o pressurePlate.o pushBlock.o
|
OBJS += particles.o player.o powerPoint.o powerPool.o pressurePlate.o pushBlock.o
|
||||||
OBJS += quadtree.o
|
OBJS += quadtree.o
|
||||||
|
|
|
@ -64,7 +64,7 @@ void addExplosion(float x, float y, int radius, Entity *owner)
|
||||||
|
|
||||||
if (e->type == ET_BOB)
|
if (e->type == ET_BOB)
|
||||||
{
|
{
|
||||||
stunPlayer();
|
stunBob();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (e->health <= 0)
|
if (e->health <= 0)
|
||||||
|
|
|
@ -21,7 +21,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
#include "../common.h"
|
#include "../common.h"
|
||||||
|
|
||||||
extern int rrnd(int low, int high);
|
extern int rrnd(int low, int high);
|
||||||
extern void stunPlayer(void);
|
extern void stunBob(void);
|
||||||
extern void addExplosionEffect(int x, int y, int dx, int dy);
|
extern void addExplosionEffect(int x, int y, int dx, int dy);
|
||||||
extern void playSound(int snd, int ch);
|
extern void playSound(int snd, int ch);
|
||||||
extern Entity **getAllEntsWithin(int x, int y, int w, int h, Entity *ignore);
|
extern Entity **getAllEntsWithin(int x, int y, int w, int h, Entity *ignore);
|
||||||
|
|
|
@ -0,0 +1,132 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 Parallel Realities
|
||||||
|
|
||||||
|
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 "grenade.h"
|
||||||
|
|
||||||
|
static void tick(void);
|
||||||
|
static void touch(Entity *other);
|
||||||
|
static float bounce(float x);
|
||||||
|
static float (*superBounce)(float x);
|
||||||
|
static void die(void);
|
||||||
|
static void explode(void);
|
||||||
|
|
||||||
|
void initGrenade(Bullet *b)
|
||||||
|
{
|
||||||
|
b->flags |= EF_BOUNCES | EF_IGNORE_BULLETS | EF_KILL_OFFSCREEN | EF_FRICTIONLESS | EF_NO_TELEPORT;
|
||||||
|
|
||||||
|
superBounce = b->bounce;
|
||||||
|
|
||||||
|
b->tick = tick;
|
||||||
|
b->touch = touch;
|
||||||
|
b->bounce = bounce;
|
||||||
|
b->die = die;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void tick(void)
|
||||||
|
{
|
||||||
|
Bullet *b;
|
||||||
|
|
||||||
|
b = (Bullet*)self;
|
||||||
|
|
||||||
|
b->health--;
|
||||||
|
|
||||||
|
if (b->x <= 0 || b->y <= 0 || b->x >= (MAP_WIDTH * MAP_TILE_SIZE) - b->w || b->y >= (MAP_HEIGHT * MAP_TILE_SIZE) - b->h)
|
||||||
|
{
|
||||||
|
b->alive = ALIVE_DEAD;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void touch(Entity *other)
|
||||||
|
{
|
||||||
|
Bullet *b;
|
||||||
|
|
||||||
|
b = (Bullet*)self;
|
||||||
|
|
||||||
|
if (b->alive == ALIVE_ALIVE)
|
||||||
|
{
|
||||||
|
/* don't bounce too high */
|
||||||
|
if (b->dy < -8)
|
||||||
|
{
|
||||||
|
b->dy = -8;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (other != b->owner)
|
||||||
|
{
|
||||||
|
if (other != NULL && (!(other->flags & EF_IGNORE_BULLETS)) && !other->isSolid && b->owner->type != other->type && other->type != ET_LIFT)
|
||||||
|
{
|
||||||
|
if (other->flags & EF_EXPLODES)
|
||||||
|
{
|
||||||
|
addSparkParticles(b->x, b->y);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
addSmallFleshChunk(b->x, b->y);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (b->owner->type == world.bob->type)
|
||||||
|
{
|
||||||
|
game.statShotsHit[WPN_GRENADES]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(other->flags & EF_BOMB_SHIELD))
|
||||||
|
{
|
||||||
|
other->applyDamage(25);
|
||||||
|
}
|
||||||
|
|
||||||
|
explode();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static float bounce(float x)
|
||||||
|
{
|
||||||
|
Bullet *b;
|
||||||
|
|
||||||
|
b = (Bullet*)self;
|
||||||
|
|
||||||
|
if (b->environment == ENV_AIR)
|
||||||
|
{
|
||||||
|
playSound(SND_GRENADE_BOUNCE, CH_EFFECTS);
|
||||||
|
}
|
||||||
|
|
||||||
|
return superBounce(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void die(void)
|
||||||
|
{
|
||||||
|
explode();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void explode(void)
|
||||||
|
{
|
||||||
|
Bullet *b;
|
||||||
|
int mx, my;
|
||||||
|
|
||||||
|
b = (Bullet*)self;
|
||||||
|
|
||||||
|
addExplosion(b->x, b->y, 100, b->owner);
|
||||||
|
|
||||||
|
b->alive = ALIVE_DEAD;
|
||||||
|
|
||||||
|
mx = (int) ((b->x + (b->w / 2)) / MAP_TILE_SIZE);
|
||||||
|
my = (int) (b->y / MAP_TILE_SIZE) + 1;
|
||||||
|
addScorchDecal(mx, my);
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 Parallel Realities
|
||||||
|
|
||||||
|
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 "../common.h"
|
||||||
|
|
||||||
|
extern void playSound(int snd, int ch);
|
||||||
|
extern void initGrenade(Bullet *b);
|
||||||
|
extern void addSmallFleshChunk(float x, float y);
|
||||||
|
extern void addSparkParticles(float x, float y);
|
||||||
|
extern void addExplosion(float x, float y, int radius, Entity *owner);
|
||||||
|
extern void addScorchDecal(int x, int y);
|
||||||
|
|
||||||
|
extern Entity *self;
|
||||||
|
extern Game game;
|
||||||
|
extern World world;
|
|
@ -0,0 +1,87 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 Parallel Realities
|
||||||
|
|
||||||
|
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 "laser.h"
|
||||||
|
|
||||||
|
static void tick(void);
|
||||||
|
static void touch(Entity *other);
|
||||||
|
|
||||||
|
void initLaser(Bullet *b)
|
||||||
|
{
|
||||||
|
b->flags |= EF_WEIGHTLESS | EF_BOUNCES | EF_FRICTIONLESS | EF_NO_ENVIRONMENT | EF_IGNORE_BULLETS | EF_KILL_OFFSCREEN | EF_NO_TELEPORT;
|
||||||
|
|
||||||
|
b->tick = tick;
|
||||||
|
b->touch = touch;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void tick(void)
|
||||||
|
{
|
||||||
|
Bullet *b;
|
||||||
|
|
||||||
|
b = (Bullet*)self;
|
||||||
|
|
||||||
|
b->health--;
|
||||||
|
|
||||||
|
if (b->x <= 0 || b->y <= 0 || b->x >= (MAP_WIDTH * MAP_TILE_SIZE) - b->w || b->y >= (MAP_HEIGHT * MAP_TILE_SIZE) - b->h)
|
||||||
|
{
|
||||||
|
b->alive = ALIVE_DEAD;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void touch(Entity *other)
|
||||||
|
{
|
||||||
|
Bullet *b;
|
||||||
|
|
||||||
|
b = (Bullet*)self;
|
||||||
|
|
||||||
|
if (b->alive == ALIVE_ALIVE)
|
||||||
|
{
|
||||||
|
if (other != b->owner)
|
||||||
|
{
|
||||||
|
if (other != NULL && (!(other->flags & EF_IGNORE_BULLETS)) && b->owner->type != other->type)
|
||||||
|
{
|
||||||
|
if (other->flags & EF_EXPLODES)
|
||||||
|
{
|
||||||
|
addSparkParticles(b->x, b->y);
|
||||||
|
playSound(SND_METAL_HIT, CH_ANY);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
addSmallFleshChunk(b->x, b->y);
|
||||||
|
playSound(SND_FLESH_HIT, CH_ANY);
|
||||||
|
}
|
||||||
|
|
||||||
|
other->applyDamage(2);
|
||||||
|
|
||||||
|
if (b->owner->type == world.bob->type)
|
||||||
|
{
|
||||||
|
game.statShotsHit[WPN_LASER]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (other->type == ET_BOB && !world.bob->stunTimer > 0)
|
||||||
|
{
|
||||||
|
other->dx = rrnd(-8, 8);
|
||||||
|
other->dy = rrnd(-12, 0);
|
||||||
|
stunBob();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 Parallel Realities
|
||||||
|
|
||||||
|
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 "../common.h"
|
||||||
|
|
||||||
|
extern void playSound(int snd, int ch);
|
||||||
|
extern int rrnd(int low, int high);
|
||||||
|
extern void initLaser(Bullet *b);
|
||||||
|
extern void addSmallFleshChunk(float x, float y);
|
||||||
|
extern void addSparkParticles(float x, float y);
|
||||||
|
extern void stunBob(void);
|
||||||
|
|
||||||
|
extern Entity *self;
|
||||||
|
extern Game game;
|
||||||
|
extern World world;
|
|
@ -0,0 +1,71 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 Parallel Realities
|
||||||
|
|
||||||
|
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 "missile.h"
|
||||||
|
|
||||||
|
static void tick(void);
|
||||||
|
static void touch(Entity *other);
|
||||||
|
|
||||||
|
void initMissile(Bullet *b)
|
||||||
|
{
|
||||||
|
b->flags |= EF_WEIGHTLESS | EF_NO_ENVIRONMENT | EF_IGNORE_BULLETS | EF_KILL_OFFSCREEN | EF_NO_TELEPORT;
|
||||||
|
|
||||||
|
b->tick = tick;
|
||||||
|
b->touch = touch;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void tick(void)
|
||||||
|
{
|
||||||
|
Bullet *b;
|
||||||
|
|
||||||
|
b = (Bullet*)self;
|
||||||
|
|
||||||
|
b->health--;
|
||||||
|
|
||||||
|
if (b->x <= 0 || b->y <= 0 || b->x >= (MAP_WIDTH * MAP_TILE_SIZE) - b->w || b->y >= (MAP_HEIGHT * MAP_TILE_SIZE) - b->h)
|
||||||
|
{
|
||||||
|
b->alive = ALIVE_DEAD;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (b->health % 2)
|
||||||
|
{
|
||||||
|
addFlameParticles(b->x + (b->facing * 35) + rrnd(-1, 1), b->y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void touch(Entity *other)
|
||||||
|
{
|
||||||
|
Bullet *b;
|
||||||
|
|
||||||
|
b = (Bullet*)self;
|
||||||
|
|
||||||
|
if (other == NULL)
|
||||||
|
{
|
||||||
|
addExplosion(b->x, b->y, 65, b->owner);
|
||||||
|
|
||||||
|
b->alive = ALIVE_DEAD;
|
||||||
|
}
|
||||||
|
else if (other != b->owner && (!(other->flags & EF_IGNORE_BULLETS)) && b->owner->type != other->type)
|
||||||
|
{
|
||||||
|
addExplosion(b->x, b->y, 65, b->owner);
|
||||||
|
|
||||||
|
b->alive = ALIVE_DEAD;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 Parallel Realities
|
||||||
|
|
||||||
|
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 "../common.h"
|
||||||
|
|
||||||
|
extern int rrnd(int low, int high);
|
||||||
|
extern void initMissile(Bullet *b);
|
||||||
|
extern void addExplosion(float x, float y, int radius, Entity *owner);
|
||||||
|
extern void addFlameParticles(float x, float y);
|
||||||
|
|
||||||
|
extern Entity *self;
|
|
@ -33,6 +33,9 @@ static int alienGrenadeSprite;
|
||||||
static int shotgunPelletSprite;
|
static int shotgunPelletSprite;
|
||||||
static int missileSprite[2];
|
static int missileSprite[2];
|
||||||
|
|
||||||
|
static void tick(void);
|
||||||
|
static void touch(Entity *other);
|
||||||
|
|
||||||
void initWeapons(void)
|
void initWeapons(void)
|
||||||
{
|
{
|
||||||
bulletSprite[0] = getSpriteIndex("BulletRight");
|
bulletSprite[0] = getSpriteIndex("BulletRight");
|
||||||
|
@ -160,6 +163,8 @@ void fireLaser(Unit *owner)
|
||||||
laser->health = FPS * 3;
|
laser->health = FPS * 3;
|
||||||
laser->sprite[0] = laser->sprite[1] = (owner->type == ET_BOB) ? laserSprite[0] : laserSprite[1];
|
laser->sprite[0] = laser->sprite[1] = (owner->type == ET_BOB) ? laserSprite[0] : laserSprite[1];
|
||||||
|
|
||||||
|
initLaser(laser);
|
||||||
|
|
||||||
owner->reload = owner->type == ET_BOB ? FPS / 2 : FPS;
|
owner->reload = owner->type == ET_BOB ? FPS / 2 : FPS;
|
||||||
|
|
||||||
playSound(SND_LASER, owner->type == ET_BOB ? CH_PLAYER : CH_WEAPON);
|
playSound(SND_LASER, owner->type == ET_BOB ? CH_PLAYER : CH_WEAPON);
|
||||||
|
@ -176,9 +181,10 @@ void fireGrenade(Unit *owner)
|
||||||
grenade->health = FPS * 3;
|
grenade->health = FPS * 3;
|
||||||
grenade->dx = owner->facing == FACING_RIGHT ? 8 : -8;
|
grenade->dx = owner->facing == FACING_RIGHT ? 8 : -8;
|
||||||
grenade->sprite[0] = grenade->sprite[1] = (owner->type == ET_BOB) ? grenadeSprite : alienGrenadeSprite;
|
grenade->sprite[0] = grenade->sprite[1] = (owner->type == ET_BOB) ? grenadeSprite : alienGrenadeSprite;
|
||||||
|
|
||||||
grenade->dy = -6;
|
grenade->dy = -6;
|
||||||
|
|
||||||
|
initGrenade(grenade);
|
||||||
|
|
||||||
owner->reload = FPS / 2;
|
owner->reload = FPS / 2;
|
||||||
|
|
||||||
playSound(SND_THROW, owner->type == ET_BOB ? CH_PLAYER : CH_WEAPON);
|
playSound(SND_THROW, owner->type == ET_BOB ? CH_PLAYER : CH_WEAPON);
|
||||||
|
@ -222,6 +228,8 @@ void fireMissile(Unit *owner)
|
||||||
missile->sprite[0] = missileSprite[0];
|
missile->sprite[0] = missileSprite[0];
|
||||||
missile->sprite[1] = missileSprite[1];
|
missile->sprite[1] = missileSprite[1];
|
||||||
|
|
||||||
|
initMissile(missile);
|
||||||
|
|
||||||
owner->reload = FPS / 2;
|
owner->reload = FPS / 2;
|
||||||
|
|
||||||
playSound(SND_MISSILE, CH_WEAPON);
|
playSound(SND_MISSILE, CH_WEAPON);
|
||||||
|
@ -235,6 +243,8 @@ Bullet *createBaseBullet(Unit *owner)
|
||||||
memset(bullet, 0, sizeof(Bullet));
|
memset(bullet, 0, sizeof(Bullet));
|
||||||
world.entityTail->next = (Entity*)bullet;
|
world.entityTail->next = (Entity*)bullet;
|
||||||
world.entityTail = (Entity*)bullet;
|
world.entityTail = (Entity*)bullet;
|
||||||
|
|
||||||
|
initEntity((Entity*)bullet);
|
||||||
|
|
||||||
bullet->x = (owner->x + owner->w / 2);
|
bullet->x = (owner->x + owner->w / 2);
|
||||||
bullet->y = (owner->y + owner->h / 2) - 3;
|
bullet->y = (owner->y + owner->h / 2) - 3;
|
||||||
|
@ -245,9 +255,86 @@ Bullet *createBaseBullet(Unit *owner)
|
||||||
bullet->health = FPS * 3;
|
bullet->health = FPS * 3;
|
||||||
bullet->flags |= EF_WEIGHTLESS | EF_IGNORE_BULLETS | EF_NO_ENVIRONMENT | EF_KILL_OFFSCREEN | EF_NO_TELEPORT;
|
bullet->flags |= EF_WEIGHTLESS | EF_IGNORE_BULLETS | EF_NO_ENVIRONMENT | EF_KILL_OFFSCREEN | EF_NO_TELEPORT;
|
||||||
|
|
||||||
|
bullet->tick = tick;
|
||||||
|
bullet->touch = touch;
|
||||||
|
|
||||||
return bullet;
|
return bullet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void tick(void)
|
||||||
|
{
|
||||||
|
Bullet *b;
|
||||||
|
|
||||||
|
b = (Bullet*)self;
|
||||||
|
|
||||||
|
b->health--;
|
||||||
|
|
||||||
|
if (b->x <= 0 || b->y <= 0 || b->x >= (MAP_WIDTH * MAP_TILE_SIZE) - b->w || b->y >= (MAP_HEIGHT * MAP_TILE_SIZE) - b->h)
|
||||||
|
{
|
||||||
|
b->alive = ALIVE_DEAD;
|
||||||
|
}
|
||||||
|
|
||||||
|
// don't allow the player to kill everything on the map by firing
|
||||||
|
// constantly
|
||||||
|
if (b->owner->type == ET_BOB)
|
||||||
|
{
|
||||||
|
if (b->x < camera.x || b->y < camera.y || b->x > camera.x + SCREEN_WIDTH || b->y > camera.y + SCREEN_HEIGHT)
|
||||||
|
{
|
||||||
|
b->alive = ALIVE_DEAD;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void touch(Entity *other)
|
||||||
|
{
|
||||||
|
Bullet *b;
|
||||||
|
|
||||||
|
b = (Bullet*)self;
|
||||||
|
|
||||||
|
if (b->alive == ALIVE_ALIVE)
|
||||||
|
{
|
||||||
|
if (other == NULL)
|
||||||
|
{
|
||||||
|
addSparkParticles(b->x, b->y);
|
||||||
|
|
||||||
|
b->alive = ALIVE_DEAD;
|
||||||
|
|
||||||
|
if (rand() % 2)
|
||||||
|
{
|
||||||
|
playSound(SND_RICO_1, CH_ANY);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
playSound(SND_RICO_2, CH_ANY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (other != b->owner && (!(other->flags & EF_IGNORE_BULLETS)) && b->owner->type != other->type)
|
||||||
|
{
|
||||||
|
other->applyDamage(b->damage);
|
||||||
|
|
||||||
|
if (other->flags & EF_EXPLODES)
|
||||||
|
{
|
||||||
|
playSound(SND_METAL_HIT, CH_ANY);
|
||||||
|
|
||||||
|
addSparkParticles(b->x, b->y);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
playSound(SND_FLESH_HIT, CH_ANY);
|
||||||
|
|
||||||
|
addSmallFleshChunk(b->x, b->y);
|
||||||
|
}
|
||||||
|
|
||||||
|
b->alive = ALIVE_DEAD;
|
||||||
|
|
||||||
|
if (b->owner->type == world.bob->type)
|
||||||
|
{
|
||||||
|
game.statShotsHit[b->weaponType]++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int getRandomPlayerWeapon(int excludeGrenades)
|
int getRandomPlayerWeapon(int excludeGrenades)
|
||||||
{
|
{
|
||||||
if (excludeGrenades)
|
if (excludeGrenades)
|
||||||
|
|
|
@ -24,5 +24,14 @@ extern int getSpriteIndex(char *name);
|
||||||
extern void playSound(int snd, int ch);
|
extern void playSound(int snd, int ch);
|
||||||
extern int rrnd(int low, int high);
|
extern int rrnd(int low, int high);
|
||||||
extern void getSlope(int x1, int y1, int x2, int y2, float *dx, float *dy);
|
extern void getSlope(int x1, int y1, int x2, int y2, float *dx, float *dy);
|
||||||
|
extern void initLaser(Bullet *b);
|
||||||
|
extern void initGrenade(Bullet *b);
|
||||||
|
extern void initMissile(Bullet *b);
|
||||||
|
extern void initEntity(Entity *e);
|
||||||
|
extern void addSmallFleshChunk(float x, float y);
|
||||||
|
extern void addSparkParticles(float x, float y);
|
||||||
|
|
||||||
|
extern Camera camera;
|
||||||
|
extern Entity *self;
|
||||||
|
extern Game game;
|
||||||
extern World world;
|
extern World world;
|
||||||
|
|
|
@ -20,9 +20,13 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
#include "bob.h"
|
#include "bob.h"
|
||||||
|
|
||||||
void initBob(Entity *e)
|
void initBob(void)
|
||||||
{
|
{
|
||||||
e->type = ET_BOB;
|
Unit *u;
|
||||||
|
|
||||||
|
u = createUnit();
|
||||||
|
|
||||||
|
u->type = ET_BOB;
|
||||||
}
|
}
|
||||||
|
|
||||||
void addBobItem(Item *i)
|
void addBobItem(Item *i)
|
||||||
|
|
|
@ -19,3 +19,5 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "../../common.h"
|
#include "../../common.h"
|
||||||
|
|
||||||
|
extern Unit *createUnit(void);
|
||||||
|
|
|
@ -26,13 +26,12 @@ static void touch(Entity *other);
|
||||||
static void preTeleport(void);
|
static void preTeleport(void);
|
||||||
static void teleport(void);
|
static void teleport(void);
|
||||||
|
|
||||||
void initMIA(Entity *e)
|
void initMIA(void)
|
||||||
{
|
{
|
||||||
MIA *m;
|
MIA *m;
|
||||||
|
|
||||||
initUnit(e);
|
m = malloc(sizeof(MIA));
|
||||||
|
memset(m, 0, sizeof(MIA));
|
||||||
m = (MIA*)e;
|
|
||||||
|
|
||||||
m->type = ET_MIA;
|
m->type = ET_MIA;
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,6 @@ extern void setGameplayMessage(int type, char *format, ...);
|
||||||
extern void playSound(int snd, int ch);
|
extern void playSound(int snd, int ch);
|
||||||
extern void updateObjective(char *targetName);
|
extern void updateObjective(char *targetName);
|
||||||
extern void addRescuedMIA(char *name);
|
extern void addRescuedMIA(char *name);
|
||||||
extern void initUnit(Entity *e);
|
|
||||||
|
|
||||||
extern Entity *self;
|
extern Entity *self;
|
||||||
extern World world;
|
extern World world;
|
||||||
|
|
|
@ -29,13 +29,11 @@ static Entity *target;
|
||||||
static int aimedSprite;
|
static int aimedSprite;
|
||||||
static int exitMission;
|
static int exitMission;
|
||||||
|
|
||||||
void initTeeka(Entity *e)
|
void initTeeka(void)
|
||||||
{
|
{
|
||||||
Unit *u;
|
Unit *u;
|
||||||
|
|
||||||
initUnit(e);
|
u = createUnit();
|
||||||
|
|
||||||
u = (Unit*)e;
|
|
||||||
|
|
||||||
u->type = ET_TEEKA;
|
u->type = ET_TEEKA;
|
||||||
|
|
||||||
|
@ -49,7 +47,7 @@ void initTeeka(Entity *e)
|
||||||
u->sprite[FACING_RIGHT] = getSpriteIndex("TeekaRight");
|
u->sprite[FACING_RIGHT] = getSpriteIndex("TeekaRight");
|
||||||
u->sprite[FACING_DIE] = getSpriteIndex("TeekaLeft");
|
u->sprite[FACING_DIE] = getSpriteIndex("TeekaLeft");
|
||||||
|
|
||||||
u->health = e->healthMax = 9999;
|
u->health = u->healthMax = 9999;
|
||||||
|
|
||||||
u->tick = tick;
|
u->tick = tick;
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
#include "../../common.h"
|
#include "../../common.h"
|
||||||
|
|
||||||
extern void initUnit(Entity *e);
|
extern Unit *createUnit(void);
|
||||||
extern void unitTick(void);
|
extern void unitTick(void);
|
||||||
extern int getSpriteIndex(char *name);
|
extern int getSpriteIndex(char *name);
|
||||||
extern int rrnd(int low, int high);
|
extern int rrnd(int low, int high);
|
||||||
|
|
|
@ -28,13 +28,11 @@ static SDL_Rect *getBounds(void);
|
||||||
static int canFire(Entity *target);
|
static int canFire(Entity *target);
|
||||||
static void preFire(void);
|
static void preFire(void);
|
||||||
|
|
||||||
void initCannon(Entity *e)
|
void initCannon(void)
|
||||||
{
|
{
|
||||||
Unit *u;
|
Unit *u;
|
||||||
|
|
||||||
initUnit(e);
|
u = createUnit();
|
||||||
|
|
||||||
u = (Unit*)self;
|
|
||||||
|
|
||||||
u->type = ET_ENEMY;
|
u->type = ET_ENEMY;
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
#include "../../common.h"
|
#include "../../common.h"
|
||||||
|
|
||||||
extern void initUnit(Entity *e);
|
|
||||||
extern void addExplosion(float x, float y, int radius, Entity *owner);
|
extern void addExplosion(float x, float y, int radius, Entity *owner);
|
||||||
extern int rrnd(int low, int high);
|
extern int rrnd(int low, int high);
|
||||||
extern int getSpriteIndex(char *name);
|
extern int getSpriteIndex(char *name);
|
||||||
|
@ -30,6 +29,7 @@ extern void updateObjective(char *targetName);
|
||||||
extern void fireTriggers(char *targetName);
|
extern void fireTriggers(char *targetName);
|
||||||
extern void dropCarriedItem(void);
|
extern void dropCarriedItem(void);
|
||||||
extern void addScorchDecal(int x, int y);
|
extern void addScorchDecal(int x, int y);
|
||||||
|
extern Unit *createUnit(void);
|
||||||
|
|
||||||
extern Dev dev;
|
extern Dev dev;
|
||||||
extern Entity *self;
|
extern Entity *self;
|
||||||
|
|
|
@ -25,75 +25,10 @@ static void applyDamage(int damage);
|
||||||
static float bounce(float x);
|
static float bounce(float x);
|
||||||
static SDL_Rect *getBounds(void);
|
static SDL_Rect *getBounds(void);
|
||||||
|
|
||||||
Entity *createEntity(int type)
|
|
||||||
{
|
|
||||||
Entity *e;
|
|
||||||
|
|
||||||
switch (type)
|
|
||||||
{
|
|
||||||
case ET_BOB:
|
|
||||||
e = malloc(sizeof(Bob));
|
|
||||||
memset(e, 0, sizeof(Bob));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ET_ENEMY:
|
|
||||||
case ET_TEEKA:
|
|
||||||
e = malloc(sizeof(Unit));
|
|
||||||
memset(e, 0, sizeof(Unit));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ET_BOSS:
|
|
||||||
e = malloc(sizeof(Boss));
|
|
||||||
memset(e, 0, sizeof(Boss));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ET_HEART_CELL:
|
|
||||||
case ET_KEY:
|
|
||||||
case ET_ITEM:
|
|
||||||
case ET_CONSUMABLE:
|
|
||||||
e = malloc(sizeof(Item));
|
|
||||||
memset(e, 0, sizeof(Item));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ET_MIA:
|
|
||||||
e = malloc(sizeof(MIA));
|
|
||||||
memset(e, 0, sizeof(MIA));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ET_DECORATION:
|
|
||||||
e = malloc(sizeof(Decoration));
|
|
||||||
memset(e, 0, sizeof(Decoration));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ET_DOOR:
|
|
||||||
case ET_LIFT:
|
|
||||||
case ET_PUSHBLOCK:
|
|
||||||
case ET_DESTRUCTABLE:
|
|
||||||
case ET_POWER_POINT:
|
|
||||||
case ET_CARD_READER:
|
|
||||||
case ET_PRESSURE_PLATE:
|
|
||||||
case ET_TELEPORTER:
|
|
||||||
case ET_ITEM_PAD:
|
|
||||||
case ET_POOL:
|
|
||||||
case ET_TRAP:
|
|
||||||
case ET_EXIT:
|
|
||||||
case ET_INFO_POINT:
|
|
||||||
e = malloc(sizeof(Structure));
|
|
||||||
memset(e, 0, sizeof(Structure));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
world.entityTail->next = e;
|
|
||||||
world.entityTail = e;
|
|
||||||
|
|
||||||
e->type = type;
|
|
||||||
e->uniqueId = world.entityCounter++;
|
|
||||||
|
|
||||||
return e;
|
|
||||||
}
|
|
||||||
|
|
||||||
void initEntity(Entity *e)
|
void initEntity(Entity *e)
|
||||||
{
|
{
|
||||||
|
e->uniqueId = world.entityCounter++;
|
||||||
|
|
||||||
e->sprite[0] = e->sprite[1] = e->sprite[2] = -1;
|
e->sprite[0] = e->sprite[1] = e->sprite[2] = -1;
|
||||||
|
|
||||||
e->environment = ENV_AIR;
|
e->environment = ENV_AIR;
|
||||||
|
@ -116,6 +51,9 @@ void initEntity(Entity *e)
|
||||||
e->applyDamage = applyDamage;
|
e->applyDamage = applyDamage;
|
||||||
e->bounce = bounce;
|
e->bounce = bounce;
|
||||||
e->getBounds = getBounds;
|
e->getBounds = getBounds;
|
||||||
|
|
||||||
|
world.entityTail->next = e;
|
||||||
|
world.entityTail = e;
|
||||||
}
|
}
|
||||||
|
|
||||||
static SDL_Rect *getBounds(void)
|
static SDL_Rect *getBounds(void)
|
||||||
|
|
|
@ -23,5 +23,4 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
extern void addTeleportStars(Entity *e);
|
extern void addTeleportStars(Entity *e);
|
||||||
|
|
||||||
extern Entity *self;
|
extern Entity *self;
|
||||||
extern Game game;
|
|
||||||
extern World world;
|
extern World world;
|
||||||
|
|
|
@ -0,0 +1,68 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 Parallel Realities
|
||||||
|
|
||||||
|
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 "entityFactory.h"
|
||||||
|
|
||||||
|
static void addEntityDef(char *name, int type, Entity *(*initFunc)(void));
|
||||||
|
|
||||||
|
static EntityDef head;
|
||||||
|
static EntityDef *tail;
|
||||||
|
|
||||||
|
void initEntityFactory(void)
|
||||||
|
{
|
||||||
|
memset(&head, 0, sizeof(EntityDef));
|
||||||
|
tail = &head;
|
||||||
|
|
||||||
|
addEntityDef("AquaBlob", ET_ENEMY, initAquaBlob);
|
||||||
|
|
||||||
|
addEntityDef("Bob", ET_BOB, initBob);
|
||||||
|
}
|
||||||
|
|
||||||
|
Entity *createEntity(char *name)
|
||||||
|
{
|
||||||
|
EntityDef *def;
|
||||||
|
|
||||||
|
for (def = head.next ; def != NULL ; def = def->next)
|
||||||
|
{
|
||||||
|
if (strcmp(def->name, name) == 0)
|
||||||
|
{
|
||||||
|
return def->initFunc();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_ERROR, "No such entity definition '%s'", name);
|
||||||
|
exit(1);
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void addEntityDef(char *name, int type, Entity *(*initFunc)(void))
|
||||||
|
{
|
||||||
|
EntityDef *def;
|
||||||
|
|
||||||
|
def = malloc(sizeof(EntityDef));
|
||||||
|
memset(def, 0, sizeof(EntityDef));
|
||||||
|
tail->next = def;
|
||||||
|
tail = def;
|
||||||
|
|
||||||
|
STRNCPY(def->name, name, MAX_NAME_LENGTH);
|
||||||
|
def->type = type;
|
||||||
|
def->initFunc = initFunc;
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 Parallel Realities
|
||||||
|
|
||||||
|
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 "../common.h"
|
||||||
|
|
||||||
|
extern Entity *initAquaBlob(void);
|
||||||
|
extern Entity *initBob(void);
|
|
@ -0,0 +1,49 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 Parallel Realities
|
||||||
|
|
||||||
|
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 "aquaBlob.h"
|
||||||
|
|
||||||
|
static int canFire(Entity *target);
|
||||||
|
|
||||||
|
void initAquaBlob(void)
|
||||||
|
{
|
||||||
|
Unit *u;
|
||||||
|
|
||||||
|
u = createUnit();
|
||||||
|
|
||||||
|
initEvilBlob(u);
|
||||||
|
|
||||||
|
u->sprite[FACING_LEFT] = getSpriteIndex("AquaBlobLeft");
|
||||||
|
u->sprite[FACING_RIGHT] = getSpriteIndex("AquaBlobRight");
|
||||||
|
u->sprite[FACING_DIE] = getSpriteIndex("AquaBlobSpin");
|
||||||
|
|
||||||
|
u->weaponType = WPN_AIMED_PISTOL;
|
||||||
|
|
||||||
|
u->flags |= EF_SWIMS | EF_WATER_BREATHING;
|
||||||
|
|
||||||
|
u->maxShotsToFire = 3;
|
||||||
|
|
||||||
|
u->canFire = canFire;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int canFire(Entity *target)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 Parallel Realities
|
||||||
|
|
||||||
|
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 "../../common.h"
|
||||||
|
|
||||||
|
extern Unit *createUnit(void);
|
||||||
|
extern void initEvilBlob(Unit *u);
|
||||||
|
extern int getSpriteIndex(char *name);
|
|
@ -0,0 +1,311 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 Parallel Realities
|
||||||
|
|
||||||
|
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 "evilBlob.h"
|
||||||
|
|
||||||
|
static void (*superAnimate)(void);
|
||||||
|
static void die(void);
|
||||||
|
static void die2(void);
|
||||||
|
static void returnToStart(void);
|
||||||
|
static void lookForPlayer(void);
|
||||||
|
static void walk(void);
|
||||||
|
static void animate(void);
|
||||||
|
|
||||||
|
void initEvilBlob(Unit *u)
|
||||||
|
{
|
||||||
|
u->reload = 0;
|
||||||
|
|
||||||
|
u->returnToStartTimer = 0;
|
||||||
|
|
||||||
|
u->flags |= EF_HALT_AT_EDGE;
|
||||||
|
|
||||||
|
superAnimate = u->animate;
|
||||||
|
|
||||||
|
u->walk = walk;
|
||||||
|
u->animate = animate;
|
||||||
|
u->die = die;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void die2(void)
|
||||||
|
{
|
||||||
|
Unit *u;
|
||||||
|
int mx, my;
|
||||||
|
|
||||||
|
u = (Unit*)self;
|
||||||
|
|
||||||
|
u->health--;
|
||||||
|
|
||||||
|
/* burst on impact, due to speed */
|
||||||
|
if (u->dy > 15)
|
||||||
|
{
|
||||||
|
u->health = -FPS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (u->health <= -FPS && (u->isOnGround || u->environment != ENV_AIR))
|
||||||
|
{
|
||||||
|
dropCarriedItem();
|
||||||
|
|
||||||
|
u->alive = ALIVE_DEAD;
|
||||||
|
|
||||||
|
throwFleshChunks(u->x + u->w / 2, u->y + u->h / 2, rrnd(3, 6));
|
||||||
|
|
||||||
|
if (rand() % 10 < 3)
|
||||||
|
{
|
||||||
|
addRandomWeapon(u->x, u->y);
|
||||||
|
}
|
||||||
|
|
||||||
|
addRandomItems(u->x, u->y);
|
||||||
|
|
||||||
|
updateObjective(u->name);
|
||||||
|
updateObjective("ENEMY");
|
||||||
|
fireTriggers(u->name);
|
||||||
|
|
||||||
|
if (u->isMissionTarget)
|
||||||
|
{
|
||||||
|
addDefeatedTarget(u->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
game.enemiesKilled++;
|
||||||
|
|
||||||
|
mx = (int) ((u->x + (u->w / 2)) / MAP_TILE_SIZE);
|
||||||
|
my = (int) (u->y / MAP_TILE_SIZE) + 1;
|
||||||
|
addBloodDecal(mx, my);
|
||||||
|
|
||||||
|
playSound(SND_SPLAT, CH_ANY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void moveTowardsPlayer(void)
|
||||||
|
{
|
||||||
|
Unit *u;
|
||||||
|
|
||||||
|
u = (Unit*)self;
|
||||||
|
|
||||||
|
if (world.bob->x < u->x)
|
||||||
|
{
|
||||||
|
u->dx = -2;
|
||||||
|
u->facing = FACING_LEFT;
|
||||||
|
}
|
||||||
|
else if (world.bob->x > u->x)
|
||||||
|
{
|
||||||
|
u->dx = 2;
|
||||||
|
u->facing = FACING_RIGHT;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (u->flags & EF_SWIMS)
|
||||||
|
{
|
||||||
|
u->dx = limit(u->dx, -1, 1);
|
||||||
|
|
||||||
|
if (world.bob->y < u->y)
|
||||||
|
{
|
||||||
|
u->dy = -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
u->dy = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void patrol(void)
|
||||||
|
{
|
||||||
|
Unit *u;
|
||||||
|
|
||||||
|
u = (Unit*)self;
|
||||||
|
|
||||||
|
if (u->returnToStartTimer > 0)
|
||||||
|
{
|
||||||
|
returnToStart();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!u->spawnedIn && rand() % 100 < 25)
|
||||||
|
{
|
||||||
|
u->returnToStartTimer = FPS * 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
u->facing = rand() % 100 < 50 ? FACING_LEFT : FACING_RIGHT;
|
||||||
|
u->dx = rrnd(-1, 1);
|
||||||
|
u->thinkTime = rrnd(FPS / 2, FPS);
|
||||||
|
|
||||||
|
if (u->dx == -1)
|
||||||
|
{
|
||||||
|
u->facing = FACING_LEFT;
|
||||||
|
}
|
||||||
|
else if (u->dx == 1)
|
||||||
|
{
|
||||||
|
u->facing = FACING_RIGHT;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (u->flags & EF_SWIMS)
|
||||||
|
{
|
||||||
|
u->dy = rrnd(-1, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void returnToStart(void)
|
||||||
|
{
|
||||||
|
Unit *u;
|
||||||
|
|
||||||
|
u = (Unit*)self;
|
||||||
|
|
||||||
|
u->returnToStartTimer--;
|
||||||
|
|
||||||
|
u->thinkTime = 10;
|
||||||
|
|
||||||
|
/* jump up if your start is above you */
|
||||||
|
if (u->startY - u->y < -64 && u->isOnGround && u->dx == 0)
|
||||||
|
{
|
||||||
|
u->dy = JUMP_POWER;
|
||||||
|
u->isOnGround = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
u->facing = u->startX < u->x ? FACING_LEFT : FACING_RIGHT;
|
||||||
|
u->dx = u->facing == FACING_LEFT ? -1 : 1;
|
||||||
|
if (!u->isOnGround)
|
||||||
|
{
|
||||||
|
u->thinkTime = 0;
|
||||||
|
u->returnToStartTimer = MAX(u->returnToStartTimer, FPS);
|
||||||
|
u->dx *= 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (u->flags & EF_SWIMS)
|
||||||
|
{
|
||||||
|
u->dy = u->startY < u->y ? -1 : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (abs(u->startX - u->x) <= MAP_TILE_SIZE)
|
||||||
|
{
|
||||||
|
u->returnToStartTimer = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void lookForPlayer(void)
|
||||||
|
{
|
||||||
|
Unit *u;
|
||||||
|
float r;
|
||||||
|
|
||||||
|
u = (Unit*)self;
|
||||||
|
|
||||||
|
u->thinkTime = (int) rrnd(FPS / 2, FPS);
|
||||||
|
|
||||||
|
if (world.state != WS_IN_PROGRESS || dev.cheatBlind)
|
||||||
|
{
|
||||||
|
patrol();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((u->facing == FACING_LEFT && world.bob->x > u->x) || (u->facing == FACING_RIGHT && world.bob->x < u->x))
|
||||||
|
{
|
||||||
|
patrol();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (getDistance(world.bob->x, world.bob->y, u->x, u->y) > 650)
|
||||||
|
{
|
||||||
|
patrol();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!enemyCanSeePlayer(self))
|
||||||
|
{
|
||||||
|
patrol();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
r = randF();
|
||||||
|
if (u->isMissionTarget)
|
||||||
|
{
|
||||||
|
r = randF() * 0.3;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (r < 0.125)
|
||||||
|
{
|
||||||
|
moveTowardsPlayer();
|
||||||
|
u->shotsToFire = rrnd(1, u->maxShotsToFire);
|
||||||
|
u->action = u->preFire;
|
||||||
|
}
|
||||||
|
else if (r < 0.25)
|
||||||
|
{
|
||||||
|
u->dx = 0;
|
||||||
|
u->shotsToFire = rrnd(1, u->maxShotsToFire);
|
||||||
|
u->action = u->preFire;
|
||||||
|
}
|
||||||
|
else if (r < 0.5)
|
||||||
|
{
|
||||||
|
u->dx = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
moveTowardsPlayer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void walk(void)
|
||||||
|
{
|
||||||
|
self->action = lookForPlayer;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void die(void)
|
||||||
|
{
|
||||||
|
Unit *u;
|
||||||
|
|
||||||
|
u = (Unit*)self;
|
||||||
|
|
||||||
|
u->flags |= EF_BOUNCES | EF_ALWAYS_PROCESS;
|
||||||
|
|
||||||
|
u->action = die2;
|
||||||
|
|
||||||
|
u->thinkTime = 0;
|
||||||
|
u->spriteTime = 0;
|
||||||
|
u->spriteFrame = 0;
|
||||||
|
|
||||||
|
if (u->environment == ENV_AIR)
|
||||||
|
{
|
||||||
|
u->dy = -9;
|
||||||
|
}
|
||||||
|
|
||||||
|
u->dx = (randF() - randF()) * 5;
|
||||||
|
|
||||||
|
u->flags &= ~EF_HALT_AT_EDGE;
|
||||||
|
|
||||||
|
switch (rand() % 3)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
playSound(SND_DEATH_1, CH_DEATH);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
playSound(SND_DEATH_2, CH_DEATH);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
playSound(SND_DEATH_3, CH_DEATH);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void animate(void)
|
||||||
|
{
|
||||||
|
if (self->dx != 0 || self->health <= 0)
|
||||||
|
{
|
||||||
|
superAnimate();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,41 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 Parallel Realities
|
||||||
|
|
||||||
|
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 "../../common.h"
|
||||||
|
|
||||||
|
extern void dropCarriedItem(void);
|
||||||
|
extern int getDistance(int x1, int y1, int x2, int y2);
|
||||||
|
extern double randF(void);
|
||||||
|
extern void throwFleshChunks(double x, double y, int amount);
|
||||||
|
extern void addRandomWeapon(double x, double y);
|
||||||
|
extern float limit(float i, float a, float b);
|
||||||
|
extern void playSound(int snd, int ch);
|
||||||
|
extern void addBloodDecal(int x, int y);
|
||||||
|
extern void updateObjective(char *targetName);
|
||||||
|
extern int enemyCanSeePlayer(Entity *e);
|
||||||
|
extern void addDefeatedTarget(char *name);
|
||||||
|
extern void fireTriggers(char *name);
|
||||||
|
extern void addRandomItems(float x, float y);
|
||||||
|
extern int rrnd(int low, int high);
|
||||||
|
|
||||||
|
extern Dev dev;
|
||||||
|
extern Entity *self;
|
||||||
|
extern Game game;
|
||||||
|
extern World world;
|
|
@ -0,0 +1,60 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 Parallel Realities
|
||||||
|
|
||||||
|
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 "grenadeBlob.h"
|
||||||
|
|
||||||
|
static void preFire2(void);
|
||||||
|
static int canFire(Entity *target);
|
||||||
|
|
||||||
|
void initGrenadeBlob(Unit *u)
|
||||||
|
{
|
||||||
|
initEvilBlob(u);
|
||||||
|
|
||||||
|
u->sprite[FACING_LEFT] = getSpriteIndex("GrenadeBlobLeft");
|
||||||
|
u->sprite[FACING_RIGHT] = getSpriteIndex("GrenadeBlobRight");
|
||||||
|
u->sprite[FACING_DIE] = getSpriteIndex("GrenadeBlobSpin");
|
||||||
|
|
||||||
|
u->weaponType = WPN_GRENADES;
|
||||||
|
|
||||||
|
u->preFire = preFire2;
|
||||||
|
u->canFire = canFire;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void preFire2(void)
|
||||||
|
{
|
||||||
|
preFire(this);
|
||||||
|
|
||||||
|
if (u->shotsToFire == 0)
|
||||||
|
{
|
||||||
|
if (rand() % 100 < 25)
|
||||||
|
{
|
||||||
|
u->weaponType = WPN_AIMED_PISTOL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
u->weaponType = WPN_GRENADES;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int canFire(Entity *target)
|
||||||
|
{
|
||||||
|
return abs(target->y - self->y) <= MAP_TILE_SIZE * 2;
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 Parallel Realities
|
||||||
|
|
||||||
|
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 "laserBlob.h"
|
||||||
|
|
||||||
|
static int canFire(Entity *target);
|
||||||
|
|
||||||
|
void initLaserBlob(Unit *u)
|
||||||
|
{
|
||||||
|
initEvilBlob(u);
|
||||||
|
|
||||||
|
u->sprite[FACING_LEFT] = getSpriteIndex("LaserBlobLeft");
|
||||||
|
u->sprite[FACING_RIGHT] = getSpriteIndex("LaserBlobRight");
|
||||||
|
u->sprite[FACING_DIE] = getSpriteIndex("LaserBlobSpin");
|
||||||
|
|
||||||
|
u->weaponType = WPN_LASER;
|
||||||
|
|
||||||
|
u->maxShotsToFire = 1;
|
||||||
|
|
||||||
|
u->canFire = canFire;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int canFire(Entity *target)
|
||||||
|
{
|
||||||
|
return abs(target->y - self->y) <= MAP_TILE_SIZE * 2;
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 Parallel Realities
|
||||||
|
|
||||||
|
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 "machineGunBlob.h"
|
||||||
|
|
||||||
|
static int canFire(Entity *target);
|
||||||
|
|
||||||
|
void initMachineGunBlob(Unit *u)
|
||||||
|
{
|
||||||
|
initEvilBlob(u);
|
||||||
|
|
||||||
|
u->sprite[FACING_LEFT] = getSpriteIndex("MachineGunBlobLeft");
|
||||||
|
u->sprite[FACING_RIGHT] = getSpriteIndex("MachineGunBlobRight");
|
||||||
|
u->sprite[FACING_DIE] = getSpriteIndex("MachineGunBlobSpin");
|
||||||
|
|
||||||
|
u->weaponType = WPN_MACHINE_GUN;
|
||||||
|
|
||||||
|
u->maxShotsToFire = 5;
|
||||||
|
|
||||||
|
u->canFire = canFire;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int canFire(Entity *target)
|
||||||
|
{
|
||||||
|
return abs(target->y - self->y) <= MAP_TILE_SIZE * 2;
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 Parallel Realities
|
||||||
|
|
||||||
|
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 "pistolBlob.h"
|
||||||
|
|
||||||
|
static int canFire(Entity *target);
|
||||||
|
|
||||||
|
void initPistolBlob(Unit *u)
|
||||||
|
{
|
||||||
|
initEvilBlob(u);
|
||||||
|
|
||||||
|
u->sprite[FACING_LEFT] = getSpriteIndex("PistolBlobLeft");
|
||||||
|
u->sprite[FACING_RIGHT] = getSpriteIndex("PistolBlobRight");
|
||||||
|
u->sprite[FACING_DIE] = getSpriteIndex("PistolBlobSpin");
|
||||||
|
|
||||||
|
u->weaponType = WPN_AIMED_PISTOL;
|
||||||
|
|
||||||
|
u->maxShotsToFire = 3;
|
||||||
|
|
||||||
|
u->canFire = canFire;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int canFire(Entity *target)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 Parallel Realities
|
||||||
|
|
||||||
|
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 "plasmaBlob.h"
|
||||||
|
|
||||||
|
static int canFire(Entity *target);
|
||||||
|
|
||||||
|
void initPlasmaBlob(Unit *u)
|
||||||
|
{
|
||||||
|
initEvilBlob(u);
|
||||||
|
|
||||||
|
u->sprite[FACING_LEFT] = getSpriteIndex("PlasmaBlobLeft");
|
||||||
|
u->sprite[FACING_RIGHT] = getSpriteIndex("PlasmaBlobRight");
|
||||||
|
u->sprite[FACING_DIE] = getSpriteIndex("PlasmaBlobSpin");
|
||||||
|
|
||||||
|
u->weaponType = WPN_PLASMA;
|
||||||
|
|
||||||
|
u->maxShotsToFire = 6;
|
||||||
|
|
||||||
|
u->canFire = canFire;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int canFire(Entity *target)
|
||||||
|
{
|
||||||
|
return abs(target->y - self->y) <= MAP_TILE_SIZE * 2;
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 Parallel Realities
|
||||||
|
|
||||||
|
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 "shotgunBlob.h"
|
||||||
|
|
||||||
|
static int canFire(Entity *target);
|
||||||
|
|
||||||
|
void initShotgunBlob(Unit *u)
|
||||||
|
{
|
||||||
|
initEvilBlob(u);
|
||||||
|
|
||||||
|
u->sprite[FACING_LEFT] = getSpriteIndex("ShotgunBlobLeft");
|
||||||
|
u->sprite[FACING_RIGHT] = getSpriteIndex("ShotgunBlobRight");
|
||||||
|
u->sprite[FACING_DIE] = getSpriteIndex("ShotgunBlobSpin");
|
||||||
|
|
||||||
|
u->weaponType = WPN_SHOTGUN;
|
||||||
|
|
||||||
|
u->maxShotsToFire = 2;
|
||||||
|
|
||||||
|
u->canFire = canFire;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int canFire(Entity *target)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 Parallel Realities
|
||||||
|
|
||||||
|
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 "spreadGunBlob.h"
|
||||||
|
|
||||||
|
static int canFire(Entity *target);
|
||||||
|
|
||||||
|
void initSpreadGunBlob(Unit *u)
|
||||||
|
{
|
||||||
|
initEvilBlob(u);
|
||||||
|
|
||||||
|
u->sprite[FACING_LEFT] = getSpriteIndex("SpreadGunBlobLeft");
|
||||||
|
u->sprite[FACING_RIGHT] = getSpriteIndex("SpreadGunBlobRight");
|
||||||
|
u->sprite[FACING_DIE] = getSpriteIndex("SpreadGunBlobSpin");
|
||||||
|
|
||||||
|
u->weaponType = WPN_SPREAD;
|
||||||
|
|
||||||
|
u->maxShotsToFire = 3;
|
||||||
|
|
||||||
|
u->canFire = canFire;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int canFire(Entity *target)
|
||||||
|
{
|
||||||
|
return abs(target->y - u->y) <= MAP_TILE_SIZE * 5;
|
||||||
|
}
|
|
@ -0,0 +1,243 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 Parallel Realities
|
||||||
|
|
||||||
|
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 "eyeDroid.h"
|
||||||
|
|
||||||
|
static void tick(void);
|
||||||
|
static void superTick(void);
|
||||||
|
static void touch(void);
|
||||||
|
static void superTouch(void);
|
||||||
|
|
||||||
|
void initEyeDroid(void)
|
||||||
|
{
|
||||||
|
u->flags |= FL_WEIGHTLESS | FL_HALT_AT_EDGE | FL_EXPLODES;
|
||||||
|
|
||||||
|
superTick = u->tick;
|
||||||
|
superTouch = u->touch;
|
||||||
|
|
||||||
|
u->tick = tick;
|
||||||
|
u->touch = touch;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void tick(void)
|
||||||
|
{
|
||||||
|
Unit *u;
|
||||||
|
|
||||||
|
u = (Unit*)self;
|
||||||
|
|
||||||
|
superTick();
|
||||||
|
|
||||||
|
if (u->alive == ALIVE_DYING)
|
||||||
|
{
|
||||||
|
addSmokeParticles(u->x + (u->w / 2), u->y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void touch(Entity *other)
|
||||||
|
{
|
||||||
|
Unit *u;
|
||||||
|
int mx, my;
|
||||||
|
|
||||||
|
u = (Unit*)self;
|
||||||
|
|
||||||
|
superTouch();
|
||||||
|
|
||||||
|
if (u->alive == ALIVE_DYING && (other == NULL || other->isSolid))
|
||||||
|
{
|
||||||
|
dropCarriedItem();
|
||||||
|
|
||||||
|
u->alive = ALIVE_DEAD;
|
||||||
|
|
||||||
|
addExplosion(u->x, u->y, 80, self);
|
||||||
|
|
||||||
|
throwDebris(u->x + u->w / 2, u->y + u->h / 2, rrnd(3, 5));
|
||||||
|
|
||||||
|
if (rand() % 100 < 30)
|
||||||
|
{
|
||||||
|
addRandomWeapon(u->x, u->y);
|
||||||
|
}
|
||||||
|
|
||||||
|
addRandomItems((int) u->x, (int) u->y);
|
||||||
|
|
||||||
|
updateObjectives();
|
||||||
|
|
||||||
|
if (u->isMissionTarget)
|
||||||
|
{
|
||||||
|
addDefeatedTarget(u->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
game.enemiesKilled++;
|
||||||
|
|
||||||
|
mx = (int) ((u->x + (u->w / 2)) / MAP_TILE_SIZE);
|
||||||
|
my = (int) ((u->y + u->h) / MAP_TILE_SIZE) + 1;
|
||||||
|
addScorchDecal(mx, my);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void unitDie(void)
|
||||||
|
{
|
||||||
|
if (self->environment != Environment.AIR)
|
||||||
|
{
|
||||||
|
touch(NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void die(void)
|
||||||
|
{
|
||||||
|
Unit *u;
|
||||||
|
|
||||||
|
u = (Unit*)self;
|
||||||
|
|
||||||
|
u->dx = (fRand() - fRand()) * 3;
|
||||||
|
|
||||||
|
u->spriteTime = 0;
|
||||||
|
u->spriteFrame = 0;
|
||||||
|
|
||||||
|
u->action = unitDie;
|
||||||
|
u->thinkTime = 0;
|
||||||
|
u->flags |= EF_ALWAYS_PROCESS;
|
||||||
|
u->flags &= ~(EF_WEIGHTLESS | EF_HALT_AT_EDGE);
|
||||||
|
|
||||||
|
u->dy = JUMP_POWER;
|
||||||
|
|
||||||
|
if (rand() % 2)
|
||||||
|
{
|
||||||
|
playSound(SND_DROID_DIE_1, CH_DEATH);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
playSound(SND_DROID_DIE_2, CH_DEATH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void chase(void)
|
||||||
|
{
|
||||||
|
Unit *u;
|
||||||
|
|
||||||
|
u = (Unit*)self;
|
||||||
|
|
||||||
|
u->dx = world.bob->x - u->x;
|
||||||
|
u->dy = world.bob->y - u->y;
|
||||||
|
|
||||||
|
u->dx = limit(u->dx, -1, 1);
|
||||||
|
u->dy = limit(u->dy, -1, 1);
|
||||||
|
|
||||||
|
u->thinkTime = (int) rrnd(FPS / 2, FPS);
|
||||||
|
|
||||||
|
u->facing = (u->dx >= 0) ? FACING_RIGHT : FACING_LEFT;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void patrol(void)
|
||||||
|
{
|
||||||
|
Unit *u;
|
||||||
|
|
||||||
|
u = (Unit*)self;
|
||||||
|
|
||||||
|
switch (rand() % 3)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
u->dx = 0;
|
||||||
|
u->facing = rand() % 2 ? FACING_LEFT : FACING_RIGHT;
|
||||||
|
u->thinkTime = rrnd(FPS / 2, FPS);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
u->dx = rrnd(-100, 100);
|
||||||
|
u->dy = rrnd(-100, 100);
|
||||||
|
u->dx *= 0.01;
|
||||||
|
u->dy *= 0.01;
|
||||||
|
u->thinkTime = rrnd(FPS / 2, FPS);
|
||||||
|
u->facing = (u->dx >= 0) ? FACING_RIGHT : FACING_LEFT;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
u->dx = 0;
|
||||||
|
u->thinkTime = rrnd(FPS / 2, FPS);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void lookForPlayer(void)
|
||||||
|
{
|
||||||
|
Unit *u;
|
||||||
|
double distance, r;
|
||||||
|
|
||||||
|
u = (Unit*)self;
|
||||||
|
|
||||||
|
u->dx *= 0.5;
|
||||||
|
u->dy *= 0.5;
|
||||||
|
|
||||||
|
u->thinkTime = rrnd(FPS / 2, FPS);
|
||||||
|
|
||||||
|
if (world.state != WS_IN_PROGRESS || game.cheatBlind)
|
||||||
|
{
|
||||||
|
patrol();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
distance = getDistance(world.bob->x, world.bob->y, u->x, u->y);
|
||||||
|
|
||||||
|
if (distance > 650)
|
||||||
|
{
|
||||||
|
patrol();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!enemyCanSeePlayer(self))
|
||||||
|
{
|
||||||
|
patrol();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
r = fRand();
|
||||||
|
if (u->isMissionTarget)
|
||||||
|
{
|
||||||
|
r = fRand() * 0.3;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (r < 0.125)
|
||||||
|
{
|
||||||
|
chase();
|
||||||
|
u->shotsToFire = rrnd(1, u->maxShotsToFire);
|
||||||
|
u->action = preFire;
|
||||||
|
}
|
||||||
|
else if (r < 0.25)
|
||||||
|
{
|
||||||
|
u->dx = 0;
|
||||||
|
u->shotsToFire = rrnd(1, u->maxShotsToFire);
|
||||||
|
u->action = preFire;
|
||||||
|
}
|
||||||
|
else if (r < 0.5)
|
||||||
|
{
|
||||||
|
u->dx = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
chase();
|
||||||
|
}
|
||||||
|
|
||||||
|
u->thinkTime = rrnd(FPS / 2, FPS);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void walk(void)
|
||||||
|
{
|
||||||
|
self->action = lookForPlayer;
|
||||||
|
}
|
|
@ -0,0 +1,64 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 Parallel Realities
|
||||||
|
|
||||||
|
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 "grenadeDroid.h"
|
||||||
|
|
||||||
|
static void preFire2(void);
|
||||||
|
static int canFire(Entity *target);
|
||||||
|
|
||||||
|
void initGrenadeDroid(Unit *u)
|
||||||
|
{
|
||||||
|
initEyeDroid(u);
|
||||||
|
|
||||||
|
u->sprite[FACING_LEFT] = getSpriteIndex("GrenadeDroidLeft");
|
||||||
|
u->sprite[FACING_RIGHT] = getSpriteIndex("GrenadeDroidRight");
|
||||||
|
u->sprite[FACING_DIE] = getSpriteIndex("GrenadeDroidDie");
|
||||||
|
|
||||||
|
u->weaponType = WPN_GRENADES;
|
||||||
|
|
||||||
|
u->preFire = preFire2;
|
||||||
|
u->canFire = canFire;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void preFire2(void)
|
||||||
|
{
|
||||||
|
Unit *u;
|
||||||
|
|
||||||
|
u = (Unit*)self;
|
||||||
|
|
||||||
|
preFire(self);
|
||||||
|
|
||||||
|
if (u->shotsToFire == 0)
|
||||||
|
{
|
||||||
|
if (rand() % 100 < 25)
|
||||||
|
{
|
||||||
|
u->weaponType = WPN_AIMED_PISTOL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
u->weaponType = WPN_GRENADES;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int canFire(Entity *target)
|
||||||
|
{
|
||||||
|
return abs(target->y - y) <= MAP_TILE_SIZE * 2;
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 Parallel Realities
|
||||||
|
|
||||||
|
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 "laserDroid.h"
|
||||||
|
|
||||||
|
static int canFire(Entity *target);
|
||||||
|
|
||||||
|
void initLaserDroid(Unit *u)
|
||||||
|
{
|
||||||
|
initEyeDroid(u);
|
||||||
|
|
||||||
|
u->sprite[FACING_LEFT] = getSpriteIndex("LaserDroidLeft");
|
||||||
|
u->sprite[FACING_RIGHT] = getSpriteIndex("LaserDroidRight");
|
||||||
|
u->sprite[FACING_DIE] = getSpriteIndex("LaserDroidDie");
|
||||||
|
|
||||||
|
u->weaponType = WPN_LASER;
|
||||||
|
|
||||||
|
u->maxShotsToFire = 1;
|
||||||
|
|
||||||
|
u->canFire = canFire;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int canFire(Entity *target)
|
||||||
|
{
|
||||||
|
return abs(target->y - self->y) <= MAP_TILE_SIZE * 2;
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 Parallel Realities
|
||||||
|
|
||||||
|
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 "machineGunDroid.h"
|
||||||
|
|
||||||
|
static int canFire(Entity *target);
|
||||||
|
|
||||||
|
void initMachineGunDroid(Unit *u)
|
||||||
|
{
|
||||||
|
initEyeDroid(u);
|
||||||
|
|
||||||
|
u->sprite[FACING_LEFT] = getSpriteIndex("MachineGunDroidLeft");
|
||||||
|
u->sprite[FACING_RIGHT] = getSpriteIndex("MachineGunDroidRight");
|
||||||
|
u->sprite[FACING_DIE] = getSpriteIndex("MachineGunDroidDie");
|
||||||
|
|
||||||
|
u->weaponType = WPN_MACHINE_GUN;
|
||||||
|
|
||||||
|
u->maxShotsToFire = 5;
|
||||||
|
|
||||||
|
u->canFire = canFire;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int canFire(Entity *target)
|
||||||
|
{
|
||||||
|
return abs(target->y - self->y) <= MAP_TILE_SIZE * 2;
|
||||||
|
}
|
|
@ -0,0 +1,41 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 Parallel Realities
|
||||||
|
|
||||||
|
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 "pistolDroid.h"
|
||||||
|
|
||||||
|
static int canFire(Entity *target);
|
||||||
|
|
||||||
|
void initPistolDroid(Unit *u)
|
||||||
|
{
|
||||||
|
u->sprite[FACING_LEFT] = getSpriteIndex("PistolDroidLeft");
|
||||||
|
u->sprite[FACING_RIGHT] = getSpriteIndex("PistolDroidRight");
|
||||||
|
u->sprite[FACING_DIE] = getSpriteIndex("PistolDroidDie");
|
||||||
|
|
||||||
|
u->weaponType = WPN_AIMED_PISTOL;
|
||||||
|
|
||||||
|
u->maxShotsToFire = 3;
|
||||||
|
|
||||||
|
u->canFire = canFire;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int canFire(Entity *target)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 Parallel Realities
|
||||||
|
|
||||||
|
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 "plasmaDroid.h"
|
||||||
|
|
||||||
|
static int canFire(Entity *target);
|
||||||
|
|
||||||
|
void initPlasmaDroid(Unit *u)
|
||||||
|
{
|
||||||
|
initEyeDroid(u);
|
||||||
|
|
||||||
|
u->sprite[FACING_LEFT] = getSpriteIndex("PlasmaDroidLeft");
|
||||||
|
u->sprite[FACING_RIGHT] = getSpriteIndex("PlasmaDroidRight");
|
||||||
|
u->sprite[FACING_DIE] = getSpriteIndex("PlasmaDroidDie");
|
||||||
|
|
||||||
|
u->weaponType = WPN_PLASMA;
|
||||||
|
|
||||||
|
u->maxShotsToFire = 6;
|
||||||
|
|
||||||
|
u->canFire = canFire;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int canFire(Entity *target)
|
||||||
|
{
|
||||||
|
return abs(target->y - self->y) <= MAP_TILE_SIZE * 2;
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 Parallel Realities
|
||||||
|
|
||||||
|
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 "shotgunDroid.h"
|
||||||
|
|
||||||
|
static int canFire(Entity *target);
|
||||||
|
|
||||||
|
void initShotgunDroid(Unit *u)
|
||||||
|
{
|
||||||
|
initEyeDroid(u);
|
||||||
|
|
||||||
|
u->sprite[FACING_LEFT] = getSpriteIndex("ShotgunDroidLeft");
|
||||||
|
u->sprite[FACING_RIGHT] = getSpriteIndex("ShotgunDroidRight");
|
||||||
|
u->sprite[FACING_DIE] = getSpriteIndex("ShotgunDroidDie");
|
||||||
|
|
||||||
|
u->weaponType = WPN_SHOTGUN;
|
||||||
|
|
||||||
|
u->maxShotsToFire = 2;
|
||||||
|
|
||||||
|
u->canFire = canFire;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int canFire(Entity *target)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2018 Parallel Realities
|
||||||
|
|
||||||
|
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 "spreadGunDroid.h"
|
||||||
|
|
||||||
|
static int canFire(Entity *target);
|
||||||
|
|
||||||
|
void initSpreadGunDroid(Unit *u)
|
||||||
|
{
|
||||||
|
initEyeDroid(u);
|
||||||
|
|
||||||
|
u->sprite[FACING_LEFT] = getSpriteIndex("SpreadGunDroidLeft");
|
||||||
|
u->sprite[FACING_RIGHT] = getSpriteIndex("SpreadGunDroidRight");
|
||||||
|
u->sprite[FACING_DIE] = getSpriteIndex("SpreadGunDroidDie");
|
||||||
|
|
||||||
|
u->weaponType = WPN_SPREAD;
|
||||||
|
|
||||||
|
u->maxShotsToFire = 3;
|
||||||
|
|
||||||
|
u->canFire = canFire;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int canFire(Entity *target)
|
||||||
|
{
|
||||||
|
return abs(target->y - self->y) <= MAP_TILE_SIZE * 5;
|
||||||
|
}
|
|
@ -130,7 +130,7 @@ static void touch(Entity *other)
|
||||||
|
|
||||||
if (other == (Entity*)world.bob && world.bob->stunTimer == 0)
|
if (other == (Entity*)world.bob && world.bob->stunTimer == 0)
|
||||||
{
|
{
|
||||||
stunPlayer();
|
stunBob();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,7 @@ extern int isOnScreen(Entity *e);
|
||||||
extern void setGameplayMessage(int type, char *format, ...);
|
extern void setGameplayMessage(int type, char *format, ...);
|
||||||
extern int getSpriteIndex(char *name);
|
extern int getSpriteIndex(char *name);
|
||||||
extern int rrnd(int low, int high);
|
extern int rrnd(int low, int high);
|
||||||
extern void stunPlayer(void);
|
extern void stunBob(void);
|
||||||
extern void addSparkParticles(float x, float y);
|
extern void addSparkParticles(float x, float y);
|
||||||
extern void addSmallFleshChunk(float x, float y);
|
extern void addSmallFleshChunk(float x, float y);
|
||||||
|
|
||||||
|
|
|
@ -23,14 +23,18 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
void unitTick(void);
|
void unitTick(void);
|
||||||
static void attack(void);
|
static void attack(void);
|
||||||
static int canFire(Entity *target);
|
static int canFire(Entity *target);
|
||||||
|
static void preFire(void);
|
||||||
|
|
||||||
void initUnit(Entity *e)
|
Unit *createUnit(void)
|
||||||
{
|
{
|
||||||
Unit *u;
|
Unit *u;
|
||||||
|
|
||||||
initEntity(e);
|
u = malloc(sizeof(Unit));
|
||||||
|
memset(u, 0, sizeof(Unit));
|
||||||
|
world.entityTail->next = (Entity*)u;
|
||||||
|
world.entityTail = (Entity*)u;
|
||||||
|
|
||||||
u = (Unit*)e;
|
initEntity((Entity*)u);
|
||||||
|
|
||||||
u->oxygen = MAX_OXYGEN;
|
u->oxygen = MAX_OXYGEN;
|
||||||
|
|
||||||
|
@ -48,8 +52,11 @@ void initUnit(Entity *e)
|
||||||
|
|
||||||
u->tick = unitTick;
|
u->tick = unitTick;
|
||||||
u->action = lookForPlayer;
|
u->action = lookForPlayer;
|
||||||
|
u->preFire = preFire;
|
||||||
u->attack = attack;
|
u->attack = attack;
|
||||||
u->canFire = canFire;
|
u->canFire = canFire;
|
||||||
|
|
||||||
|
return u;
|
||||||
}
|
}
|
||||||
|
|
||||||
void reInitUnit(Entity *e)
|
void reInitUnit(Entity *e)
|
||||||
|
@ -177,6 +184,37 @@ static void attack(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void preFire(void)
|
||||||
|
{
|
||||||
|
Unit *u;
|
||||||
|
|
||||||
|
u = (Unit*)self;
|
||||||
|
|
||||||
|
if (!(u->flags & EF_WEIGHTLESS))
|
||||||
|
{
|
||||||
|
if (world.bob->y < u->y && u->isOnGround && rand() % 4 == 0)
|
||||||
|
{
|
||||||
|
u->dy = JUMP_POWER;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
u->facing = (world.bob->x < u->x) ? FACING_LEFT : FACING_RIGHT;
|
||||||
|
|
||||||
|
if (u->reload > 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
u->attack();
|
||||||
|
|
||||||
|
u->shotsToFire--;
|
||||||
|
|
||||||
|
if (u->shotsToFire == 0)
|
||||||
|
{
|
||||||
|
u->walk();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int canFire(Entity *target)
|
static int canFire(Entity *target)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -31,6 +31,7 @@ typedef struct HubMission HubMission;
|
||||||
typedef struct Widget Widget;
|
typedef struct Widget Widget;
|
||||||
typedef struct Atlas Atlas;
|
typedef struct Atlas Atlas;
|
||||||
typedef struct Bucket Bucket;
|
typedef struct Bucket Bucket;
|
||||||
|
typedef struct EntityDef EntityDef;
|
||||||
|
|
||||||
typedef struct Entity Entity;
|
typedef struct Entity Entity;
|
||||||
typedef struct EntityExt EntityExt;
|
typedef struct EntityExt EntityExt;
|
||||||
|
@ -92,6 +93,13 @@ struct Lookup {
|
||||||
Lookup *next;
|
Lookup *next;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct EntityDef {
|
||||||
|
char name[MAX_NAME_LENGTH];
|
||||||
|
int type;
|
||||||
|
Entity *(*initFunc)(void);
|
||||||
|
EntityDef *next;
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
void (*logic)(void);
|
void (*logic)(void);
|
||||||
void (*draw)(void);
|
void (*draw)(void);
|
||||||
|
@ -160,7 +168,9 @@ struct Unit {
|
||||||
int spawnedInTimer;
|
int spawnedInTimer;
|
||||||
int oxygen;
|
int oxygen;
|
||||||
int spawnedIn;
|
int spawnedIn;
|
||||||
|
int returnToStartTimer;
|
||||||
int startX, startY;
|
int startX, startY;
|
||||||
|
void (*preFire)(void);
|
||||||
void (*attack)(void);
|
void (*attack)(void);
|
||||||
int (*canFire)(Entity *target);
|
int (*canFire)(Entity *target);
|
||||||
};
|
};
|
||||||
|
|
|
@ -72,7 +72,8 @@ void initGameSystem(void)
|
||||||
initFonts,
|
initFonts,
|
||||||
initAtlas,
|
initAtlas,
|
||||||
initSounds,
|
initSounds,
|
||||||
initSprites
|
initSprites,
|
||||||
|
initEntityFactory
|
||||||
};
|
};
|
||||||
|
|
||||||
numInitFuns = sizeof(initFuncs) / sizeof(void*);
|
numInitFuns = sizeof(initFuncs) / sizeof(void*);
|
||||||
|
|
|
@ -31,6 +31,7 @@ extern void initFonts(void);
|
||||||
extern void initAtlas(void);
|
extern void initAtlas(void);
|
||||||
extern void initSounds(void);
|
extern void initSounds(void);
|
||||||
extern void initSprites(void);
|
extern void initSprites(void);
|
||||||
|
extern void initEntityFactory(void);
|
||||||
extern void destroyLookups(void);
|
extern void destroyLookups(void);
|
||||||
extern void destroyFonts(void);
|
extern void destroyFonts(void);
|
||||||
extern void destroyTextures(void);
|
extern void destroyTextures(void);
|
||||||
|
|
|
@ -167,7 +167,7 @@ void dropBattery(double x, double y)
|
||||||
throwItem(i);
|
throwItem(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
void addRandomItems(double x, double y)
|
void addRandomItems(float x, float y)
|
||||||
{
|
{
|
||||||
if (rand() % 100 < 25)
|
if (rand() % 100 < 25)
|
||||||
{
|
{
|
||||||
|
|
|
@ -23,5 +23,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
extern int rrnd(int low, int high);
|
extern int rrnd(int low, int high);
|
||||||
extern int getRandomPlayerWeapon(int excludeGrenades);
|
extern int getRandomPlayerWeapon(int excludeGrenades);
|
||||||
extern int getSpriteIndex(char *name);
|
extern int getSpriteIndex(char *name);
|
||||||
|
extern void addRandomItems(float x, float y);
|
||||||
|
|
||||||
extern World world;
|
extern World world;
|
||||||
|
|
|
@ -20,6 +20,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
#include "player.h"
|
#include "player.h"
|
||||||
|
|
||||||
void stunPlayer(void)
|
void stunBob(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
@ -128,7 +128,7 @@ static void loadBob(cJSON *root)
|
||||||
{
|
{
|
||||||
Bob *b;
|
Bob *b;
|
||||||
|
|
||||||
b = (Bob*)createEntity(ET_BOB);
|
b = (Bob*)createEntity("Bob");
|
||||||
b->x = cJSON_GetObjectItem(root, "x")->valueint;
|
b->x = cJSON_GetObjectItem(root, "x")->valueint;
|
||||||
b->y = cJSON_GetObjectItem(root, "y")->valueint;
|
b->y = cJSON_GetObjectItem(root, "y")->valueint;
|
||||||
b->facing = lookup(cJSON_GetObjectItem(root, "facing")->valuestring);
|
b->facing = lookup(cJSON_GetObjectItem(root, "facing")->valuestring);
|
||||||
|
@ -138,8 +138,32 @@ static void loadBob(cJSON *root)
|
||||||
|
|
||||||
static void loadEntities(cJSON *root)
|
static void loadEntities(cJSON *root)
|
||||||
{
|
{
|
||||||
|
cJSON *node;
|
||||||
|
|
||||||
|
for (node = root->child ; node != NULL ; node = node->next)
|
||||||
|
{
|
||||||
|
createEntity(cJSON_GetObjectItem(node, "type")->valuestring);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void loadObjectives(cJSON *root)
|
static void loadObjectives(cJSON *root)
|
||||||
{
|
{
|
||||||
|
Objective *o;
|
||||||
|
cJSON *node;
|
||||||
|
|
||||||
|
for (node = root->child ; node != NULL ; node = node->next)
|
||||||
|
{
|
||||||
|
o = malloc(sizeof(Objective));
|
||||||
|
memset(o, 0, sizeof(Objective));
|
||||||
|
world.objectiveTail->next = o;
|
||||||
|
world.objectiveTail = o;
|
||||||
|
|
||||||
|
STRNCPY(o->id, cJSON_GetObjectItem(node, "id")->valuestring, MAX_NAME_LENGTH);
|
||||||
|
STRNCPY(o->targetName, cJSON_GetObjectItem(node, "targetName")->valuestring, MAX_NAME_LENGTH);
|
||||||
|
STRNCPY(o->description, cJSON_GetObjectItem(node, "description")->valuestring, MAX_DESCRIPTION_LENGTH);
|
||||||
|
o->totalValue = cJSON_GetObjectItem(node, "totalValue")->valueint;
|
||||||
|
o->targetValue = cJSON_GetObjectItem(node, "totalValue")->valueint;
|
||||||
|
o->currentValue = cJSON_GetObjectItem(node, "currentValue")->valueint;
|
||||||
|
o->required = cJSON_GetObjectItem(node, "required")->valueint;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
extern char *readFile(const char *filename);
|
extern char *readFile(const char *filename);
|
||||||
extern void loadSprite(cJSON *root);
|
extern void loadSprite(cJSON *root);
|
||||||
extern Entity *createEntity(int type);
|
extern Entity *createEntity(char *typeStr);
|
||||||
extern long lookup(const char *name);
|
extern long lookup(const char *name);
|
||||||
extern void initBob(Bob *b);
|
extern void initBob(Bob *b);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue