1
0
Fork 0
mirror of https://github.com/TerryCavanagh/VVVVVV.git synced 2025-01-24 17:54:59 +01:00

Completely replace animate system for entities

This removes the magic numbers used for `animate`, and makes the
animation system far more flexible, instead giving entities the option
to control what they need, instead of having a bunch of duplicated
hardly-readable code.
This commit is contained in:
AllyTally 2023-09-04 00:30:46 -03:00 committed by NyakoFox
parent a82bd39871
commit fd831dcb27
6 changed files with 178 additions and 232 deletions

View file

@ -22,7 +22,6 @@ void entclass::clear(void)
colour = 0;
para = 0;
behave = 0;
animate = 0;
xp = 0;
yp = 0;
@ -69,6 +68,10 @@ void entclass::clear(void)
SDL_zero(realcol);
lerpoldxp = 0;
lerpoldyp = 0;
animation_frames = 4;
animation_type = EntityAnimationType_OSCILLATE;
animation_speed = 8;
}
bool entclass::outside(void)

View file

@ -52,6 +52,16 @@ enum EntityRenderType
EntityRenderType_SPRITE_6x
};
enum EntityAnimationTypes
{
EntityAnimationType_STILL,
EntityAnimationType_OSCILLATE,
EntityAnimationType_LOOP,
EntityAnimationType_ONESHOT,
EntityAnimationType_CONVEYOR_LEFT,
EntityAnimationType_CONVEYOR_RIGHT
};
class entclass
{
public:
@ -77,7 +87,7 @@ public:
EntityRenderType render_type;
int tile, rule;
int state, statedelay;
int behave, animate;
int behave;
float para;
int life, colour;
@ -98,6 +108,9 @@ public:
int onground, onroof;
//Animation
int framedelay, drawframe, walkingframe, dir, actionframe;
int animation_frames;
EntityAnimationTypes animation_type;
int animation_speed;
int collisionframedelay, collisiondrawframe, collisionwalkingframe;
int visualonground, visualonroof;
int yp;int xp;

View file

@ -105,12 +105,18 @@ void entityclass::init(void)
add_default_types();
}
EnemyType* entityclass::create_type(const char* type, int tile, int colour, int animate, int width, int height)
EnemyType* entityclass::create_type(
const char* type, int tile, int colour,
EntityAnimationTypes animation_type, int animation_frames, int animation_speed,
int width, int height
)
{
EnemyType enemy_type;
enemy_type.tile = tile;
enemy_type.colour = colour;
enemy_type.animate = animate;
enemy_type.animation_type = animation_type;
enemy_type.animation_frames = animation_frames;
enemy_type.animation_speed = animation_speed;
enemy_type.width = width;
enemy_type.height = height;
enemy_type.harmful = true;
@ -135,79 +141,79 @@ void entityclass::add_default_types(void)
EnemyType* type;
// Copies for the editor, without the color set:
create_type("custom_square", 78, -1, 1, 16, 16);
create_type("custom_circle", 88, -1, 1, 16, 16);
create_type("custom_disc", 36, -1, 1, 16, 16);
create_type("custom_glitch", 164, -1, 1, 16, 16);
create_type("custom_coin", 68, -1, 1, 16, 16);
create_type("custom_cross", 48, -1, 5, 16, 16);
create_type("custom_triangle", 176, -1, 1, 16, 16);
create_type("custom_ice", 168, -1, 1, 16, 16);
create_type("custom_heart", 112, -1, 5, 16, 16);
create_type("custom_broken_heart", 114, -1, 5, 16, 16);
create_type("custom_square", 78, -1, EntityAnimationType_LOOP, 4, 8, 16, 16);
create_type("custom_circle", 88, -1, EntityAnimationType_LOOP, 4, 8, 16, 16);
create_type("custom_disc", 36, -1, EntityAnimationType_LOOP, 4, 8, 16, 16);
create_type("custom_glitch", 164, -1, EntityAnimationType_LOOP, 4, 8, 16, 16);
create_type("custom_coin", 68, -1, EntityAnimationType_LOOP, 4, 8, 16, 16);
create_type("custom_cross", 48, -1, EntityAnimationType_LOOP, 2, 6, 16, 16);
create_type("custom_triangle", 176, -1, EntityAnimationType_LOOP, 4, 8, 16, 16);
create_type("custom_ice", 168, -1, EntityAnimationType_LOOP, 4, 8, 16, 16);
create_type("custom_heart", 112, -1, EntityAnimationType_LOOP, 2, 6, 16, 16);
create_type("custom_broken_heart", 114, -1, EntityAnimationType_LOOP, 2, 6, 16, 16);
create_type("square", 78, 7, 1, 16, 16); // Vibrating String Problem
create_type("circle", 88, 11, 1, 16, 16); // Kids His Age Bounce
create_type("disc", 36, 8, 1, 16, 16); // Security Sweep
create_type("glitch", 164, 7, 1, 16, 16); // Backsliders
create_type("coin", 68, 7, 1, 16, 16); // $eeing Dollar $ign$
create_type("cross", 48, 9, 5, 16, 16); // Ascending and Descending
create_type("triangle", 176, 6, 1, 16, 16); // Shockwave Rider
create_type("ice", 168, 7, 1, 16, 16); // Mind The Gap
create_type("heart", 112, 8, 5, 16, 16); // I Love You
create_type("broken_heart", 114, 6, 5, 16, 16); // That's Why I Have To Kill You
create_type("square", 78, 7, EntityAnimationType_LOOP, 4, 8, 16, 16); // Vibrating String Problem
create_type("circle", 88, 11, EntityAnimationType_LOOP, 4, 8, 16, 16); // Kids His Age Bounce
create_type("disc", 36, 8, EntityAnimationType_LOOP, 4, 8, 16, 16); // Security Sweep
create_type("glitch", 164, 7, EntityAnimationType_LOOP, 4, 8, 16, 16); // Backsliders
create_type("coin", 68, 7, EntityAnimationType_LOOP, 4, 8, 16, 16); // $eeing Dollar $ign$
create_type("cross", 48, 9, EntityAnimationType_LOOP, 2, 6, 16, 16); // Ascending and Descending
create_type("triangle", 176, 6, EntityAnimationType_LOOP, 4, 8, 16, 16); // Shockwave Rider
create_type("ice", 168, 7, EntityAnimationType_LOOP, 4, 8, 16, 16); // Mind The Gap
create_type("heart", 112, 8, EntityAnimationType_LOOP, 2, 6, 16, 16); // I Love You
create_type("broken_heart", 114, 6, EntityAnimationType_LOOP, 2, 6, 16, 16); // That's Why I Have To Kill You
create_type("bowtie", 92, 6, 1, 16, 16); // A Deception
create_type("crate", 24, 6, 1, 16, 16); // UNUSED in main game
create_type("bowtie", 92, 6, EntityAnimationType_LOOP, 4, 8, 16, 16); // A Deception
create_type("crate", 24, 6, EntityAnimationType_LOOP, 4, 8, 16, 16); // UNUSED in main game
create_type("wavelength", 32, 7, 1, 32, 16); // Linear Collider
create_type("stop", 28, 6, 1, 22, 32); // Traffic Jam
create_type("yes", 40, 9, 1, 20, 20); // The Yes Men
create_type("vertigo", 172, 7, 100, 32, 32); // Vertigo
create_type("guard", 44, 8, 1, 16, 20); // Trench Warfare
create_type("obey", 51, 11, 100, 30, 14); // Time to get serious
create_type("ghost", 106, 7, 2, 24, 25); // The Tomb of Mad Carew
create_type("wheel", 116, 12, 1, 32, 32); // The Hanged Man, Reversed
create_type("skeleton", 56, 6, 1, 15, 24); // You Chose... Poorly
create_type("wavelength", 32, 7, EntityAnimationType_LOOP, 4, 8, 32, 16); // Linear Collider
create_type("stop", 28, 6, EntityAnimationType_LOOP, 4, 8, 22, 32); // Traffic Jam
create_type("yes", 40, 9, EntityAnimationType_LOOP, 4, 8, 20, 20); // The Yes Men
create_type("vertigo", 172, 7, EntityAnimationType_STILL, 1, 1, 32, 32); // Vertigo
create_type("guard", 44, 8, EntityAnimationType_LOOP, 4, 8, 16, 20); // Trench Warfare
create_type("obey", 51, 11, EntityAnimationType_STILL, 1, 1, 30, 14); // Time to get serious
create_type("ghost", 106, 7, EntityAnimationType_LOOP, 2, 2, 24, 25); // The Tomb of Mad Carew
create_type("wheel", 116, 12, EntityAnimationType_LOOP, 4, 8, 32, 32); // The Hanged Man, Reversed
create_type("skeleton", 56, 6, EntityAnimationType_LOOP, 4, 8, 15, 24); // You Chose... Poorly
type = create_type("mannequin", 52, 7, 5, 16, 25); // Short Circuit
type = create_type("mannequin", 52, 7, EntityAnimationType_LOOP, 2, 6, 16, 25); // Short Circuit
type->y_offset = -4;
type = create_type("numbers", 100, 6, 1, 32, 14); // Take the Red Pill
type = create_type("numbers", 100, 6, EntityAnimationType_LOOP, 4, 8, 32, 14); // Take the Red Pill
type->y_offset = 1;
type = create_type("soldier", 82, 8, 5, 28, 32); // Brass Sent Us Under The Top
type = create_type("soldier", 82, 8, EntityAnimationType_LOOP, 2, 6, 28, 32); // Brass Sent Us Under The Top
type->corner_x = 4;
type = create_type("truth", 64, 7, 100, 44, 10); // Boldly To Go
type = create_type("truth", 64, 7, EntityAnimationType_STILL, 1, 1, 44, 10); // Boldly To Go
type->render_type = EntityRenderType_SPRITE_2x1;
type = create_type("bus", 96, 6, 4, 64, 44); // B-B-B-Busted
type = create_type("bus", 96, 6, EntityAnimationType_LOOP, 2, 6, 64, 44); // B-B-B-Busted
type->render_type = EntityRenderType_SPRITE_2x2;
type = create_type("transmitter", 104, 4, 7, 16, 16); // Comms Relay
type = create_type("transmitter", 104, 4, EntityAnimationType_LOOP, 2, 6, 16, 16); // Comms Relay
type->harmful = false;
type->x_offset = -24;
type->y_offset = -16;
type = create_type("radar", 124, 4, 6, 64, 64); // Comms Relay
type = create_type("radar", 124, 4, EntityAnimationType_LOOP, 4, 4, 64, 64); // Comms Relay
type->harmful = false;
type->x_offset = -4;
type->y_offset = -32;
type->corner_x = 4;
type->render_type = EntityRenderType_SPRITE_2x2;
create_type("edgegames_left", 160, 8, 1, 16, 16); // Edge Games
create_type("edgegames_right", 156, 8, 1, 16, 16); // Edge Games
create_type("edgegames_left", 160, 8, EntityAnimationType_LOOP, 4, 8, 16, 16); // Edge Games
create_type("edgegames_right", 156, 8, EntityAnimationType_LOOP, 4, 8, 16, 16); // Edge Games
type = create_type("centipede_right", 66, 12, 100, 60, 16); // Sweeney's Maze
type = create_type("centipede_right", 66, 12, EntityAnimationType_STILL, 1, 1, 60, 16); // Sweeney's Maze
type->render_type = EntityRenderType_SPRITE_2x1;
type = create_type("centipede_left", 54, 12, 100, 60, 16); // Sweeney's Maze
type = create_type("centipede_left", 54, 12, EntityAnimationType_STILL, 1, 1, 60, 16); // Sweeney's Maze
type->render_type = EntityRenderType_SPRITE_2x1;
// LIES
type = create_type("lies_emitter", 60, 6, 2, 32, 32);
type = create_type("lies_emitter", 60, 6, EntityAnimationType_LOOP, 2, 2, 32, 32);
type->behave = 10;
type->x1 = -200;
type->override_behave = true;
type->override_x1 = true;
type = create_type("lies", 63, 6, 100, 26, 10);
type = create_type("lies", 63, 6, EntityAnimationType_STILL, 1, 1, 26, 10);
type->corner_x = 1;
type->corner_y = 1;
type->y_offset = 10;
@ -219,17 +225,17 @@ void entityclass::add_default_types(void)
type->override_para = true;
type->override_x1 = true;
type->override_x2 = true;
type = create_type("lies_collector", 62, 6, 100, 32, 32);
type = create_type("lies_collector", 62, 6, EntityAnimationType_STILL, 1, 1, 32, 32);
type->behave = -1;
type->override_behave = true;
// Factory
type = create_type("factory_emitter", 72, 6, 3, 64, 40);
type = create_type("factory_emitter", 72, 6, EntityAnimationType_LOOP, 2, 2, 64, 40);
type->corner_y = 24;
type->render_type = EntityRenderType_SPRITE_2x2;
type->behave = 12;
type->override_behave = true;
type = create_type("factory_clouds", 76, 6, 100, 32, 12);
type = create_type("factory_clouds", 76, 6, EntityAnimationType_STILL, 1, 1, 32, 12);
type->corner_y = 6;
type->x_offset = 4;
type->y_offset = -4;
@ -239,12 +245,12 @@ void entityclass::add_default_types(void)
type->override_behave = true;
type->override_para = true;
type->override_x2 = true;
type = create_type("factory_collector", 77, 6, 100, 32, 16);
type = create_type("factory_collector", 77, 6, EntityAnimationType_STILL, 1, 1, 32, 16);
type->behave = -1;
type->override_behave = true;
// Elephant
type = create_type("elephant", 0, 102, 0, 464, 320);
type = create_type("elephant", 0, 102, EntityAnimationType_STILL, 1, 1, 464, 320);
type->render_type = EntityRenderType_ELEPHANT;
type->harmful = false;
}
@ -260,7 +266,9 @@ void entityclass::set_enemy_type(entclass* entity, const char* type)
{
EnemyType* enemyType = &enemy_types[type];
entity->tile = enemyType->tile;
entity->animate = enemyType->animate;
entity->animation_frames = enemyType->animation_frames;
entity->animation_speed = enemyType->animation_speed;
entity->animation_type = enemyType->animation_type;
entity->w = enemyType->width;
entity->h = enemyType->height;
entity->harmful = enemyType->harmful;
@ -1693,10 +1701,12 @@ entclass* entityclass::createentity(int xp, int yp, int t, int meta1, int meta2,
entity.harmful = true;
entity.tile = 24;
entity.animate = 0;
entity.colour = 8;
entity.type = EntityType_MOVING;
entity.animation_frames = 4;
entity.animation_type = EntityAnimationType_OSCILLATE;
entity.animation_speed = 8;
if (game.roomy == 111 && (game.roomx >= 113 && game.roomx <= 117))
{
@ -1756,20 +1766,20 @@ entclass* entityclass::createentity(int xp, int yp, int t, int meta1, int meta2,
if (meta1 >= 8 && meta1 <= 9)
{
horplatforms = true; //threadmill!
entity.animate = 10;
entity.animation_type = EntityAnimationType_CONVEYOR_LEFT;
if(customplatformtile>0){
entity.tile = customplatformtile+4;
if (meta1 == 8) entity.tile += 4;
if (meta1 == 9) entity.animate = 11;
if (meta1 == 9) entity.animation_type = EntityAnimationType_CONVEYOR_RIGHT;
}else{
entity.settreadmillcolour(game.roomx, game.roomy);
if (meta1 == 8) entity.tile += 40;
if (meta1 == 9) entity.animate = 11;
if (meta1 == 9) entity.animation_type = EntityAnimationType_CONVEYOR_RIGHT;
}
}
else
{
entity.animate = 100;
entity.animation_type = EntityAnimationType_STILL;
}
entity.x1 = p1;
@ -1807,7 +1817,7 @@ entclass* entityclass::createentity(int xp, int yp, int t, int meta1, int meta2,
entity.behave = meta1;
entity.para = meta2;
entity.onentity = 1;
entity.animate = 100;
entity.animation_type = EntityAnimationType_STILL;
createblock(0, xp, yp, 32, 8);
break;
@ -1822,7 +1832,7 @@ entclass* entityclass::createentity(int xp, int yp, int t, int meta1, int meta2,
entity.behave = meta1;
entity.para = meta2;
entity.onentity = 1;
entity.animate = 100;
entity.animation_type = EntityAnimationType_STILL;
createblock(0, xp, yp, 8, 8);
break;
@ -1836,7 +1846,7 @@ entclass* entityclass::createentity(int xp, int yp, int t, int meta1, int meta2,
entity.behave = meta1;
entity.para = meta2;
entity.onentity = 1;
entity.animate = 100;
entity.animation_type = EntityAnimationType_STILL;
break;
case 6: //Decorative particles
entity.rule = 2;
@ -1866,7 +1876,7 @@ entclass* entityclass::createentity(int xp, int yp, int t, int meta1, int meta2,
entity.w = 8;
entity.h = 8;
entity.onentity = 1;
entity.animate = 100;
entity.animation_type = EntityAnimationType_STILL;
//Check if it's already been collected
entity.para = meta1;
@ -1881,7 +1891,7 @@ entclass* entityclass::createentity(int xp, int yp, int t, int meta1, int meta2,
entity.h = 16;
entity.colour = 3;
entity.onentity = 1;
entity.animate = 100;
entity.animation_type = EntityAnimationType_STILL;
//Check if it's already been collected
entity.para = meta1;
@ -1896,7 +1906,7 @@ entclass* entityclass::createentity(int xp, int yp, int t, int meta1, int meta2,
entity.h = 16;
entity.colour = 4;
entity.onentity = 1;
entity.animate = 100;
entity.animation_type = EntityAnimationType_STILL;
entity.para = meta2;
if (game.savepoint == meta2)
@ -1938,7 +1948,6 @@ entclass* entityclass::createentity(int xp, int yp, int t, int meta1, int meta2,
entity.h = 16;
entity.colour = 10;
entity.onentity = 1;
entity.animate = 2;
//Added in port, hope it doesn't break anything
entity.behave = meta1;
entity.para = meta2;
@ -1952,7 +1961,7 @@ entclass* entityclass::createentity(int xp, int yp, int t, int meta1, int meta2,
entity.h = 96;
entity.colour = 100;
entity.onentity = 1;
entity.animate = 100;
entity.animation_type = EntityAnimationType_STILL;
entity.para = meta2;
break;
case 15: // Crew Member (warp zone)
@ -2053,7 +2062,7 @@ entclass* entityclass::createentity(int xp, int yp, int t, int meta1, int meta2,
entity.h = 16;
entity.colour = 4;
entity.onentity = 1;
entity.animate = 100;
entity.animation_type = EntityAnimationType_STILL;
entity.para = meta2;
break;
case 21: //as above, except doesn't highlight
@ -2065,7 +2074,7 @@ entclass* entityclass::createentity(int xp, int yp, int t, int meta1, int meta2,
entity.h = 16;
entity.colour = 4;
entity.onentity = 0;
entity.animate = 100;
entity.animation_type = EntityAnimationType_STILL;
entity.para = meta2;
break;
case 22: //Fake trinkets, only appear if you've collected them
@ -2077,7 +2086,7 @@ entclass* entityclass::createentity(int xp, int yp, int t, int meta1, int meta2,
entity.h = 16;
entity.colour = 3;
entity.onentity = 0;
entity.animate = 100;
entity.animation_type = EntityAnimationType_STILL;
//Check if it's already been collected
entity.para = meta1;
@ -2105,7 +2114,9 @@ entclass* entityclass::createentity(int xp, int yp, int t, int meta1, int meta2,
entity.render_type = EntityRenderType_SPRITE_NO_WRAP; //don't wrap around
entity.colour = 21;
entity.tile = 78; //default case
entity.animate = 1;
entity.animation_frames = 4;
entity.animation_speed = 8;
entity.animation_type = EntityAnimationType_LOOP;
if (game.swngame == SWN_SUPERGRAVITRON)
{
//set colour based on current state
@ -2163,7 +2174,7 @@ entclass* entityclass::createentity(int xp, int yp, int t, int meta1, int meta2,
entity.h = 16;
entity.colour = 4;
entity.onentity = 1;
entity.animate = 100;
entity.animation_type = EntityAnimationType_STILL;
entity.para = meta2;
//Decide tile here based on given achievement: both whether you have them and what they are
@ -2338,7 +2349,7 @@ entclass* entityclass::createentity(int xp, int yp, int t, int meta1, int meta2,
entity.h = 16;
entity.colour = 3;
entity.onentity = 0;
entity.animate = 100;
entity.animation_type = EntityAnimationType_STILL;
entity.para = meta2;
entity.render_type = EntityRenderType_SPRITE_6x;
break;
@ -3799,28 +3810,48 @@ void entityclass::animateentities( int _i )
break;
case EntityType_MOVING:
case EntityType_GRAVITRON_ENEMY:
//Variable animation
switch(entities[_i].animate)
{
int offset = 1;
if (entities[_i].render_type == EntityRenderType_SPRITE_2x1 || entities[_i].render_type == EntityRenderType_SPRITE_2x2)
{
case 0:
//Simple oscilation
offset = 2;
}
switch (entities[_i].animation_type)
{
case EntityAnimationType_LOOP:
entities[_i].framedelay--;
if(entities[_i].framedelay<=0)
if (entities[_i].framedelay <= 0)
{
entities[_i].framedelay = 8;
if(entities[_i].actionframe==0)
entities[_i].framedelay = entities[_i].animation_speed;
entities[_i].walkingframe++;
if (entities[_i].walkingframe >= entities[_i].animation_frames)
{
entities[_i].walkingframe = 0;
}
}
entities[_i].drawframe = entities[_i].tile + entities[_i].walkingframe * offset;
break;
case EntityAnimationType_OSCILLATE:
entities[_i].framedelay--;
if (entities[_i].framedelay <= 0)
{
entities[_i].framedelay = entities[_i].animation_speed;
if (entities[_i].actionframe == 0)
{
entities[_i].walkingframe++;
if (entities[_i].walkingframe == 4)
if (entities[_i].walkingframe >= entities[_i].animation_frames)
{
entities[_i].walkingframe = 2;
entities[_i].walkingframe = entities[_i].animation_frames - 1;
entities[_i].actionframe = 1;
}
}
else
{
entities[_i].walkingframe--;
if (entities[_i].walkingframe == -1)
if (entities[_i].walkingframe < 0)
{
entities[_i].walkingframe = 1;
entities[_i].actionframe = 0;
@ -3829,126 +3860,12 @@ void entityclass::animateentities( int _i )
}
entities[_i].drawframe = entities[_i].tile;
entities[_i].drawframe += entities[_i].walkingframe;
entities[_i].drawframe += entities[_i].walkingframe * offset;
break;
case 1:
//Simple Loop
entities[_i].framedelay--;
if(entities[_i].framedelay<=0)
{
entities[_i].framedelay = 8;
entities[_i].walkingframe++;
if (entities[_i].walkingframe == 4)
{
entities[_i].walkingframe = 0;
}
}
entities[_i].drawframe = entities[_i].tile;
entities[_i].drawframe += entities[_i].walkingframe;
break;
case 2:
//Simpler Loop (just two frames)
entities[_i].framedelay--;
if(entities[_i].framedelay<=0)
{
entities[_i].framedelay = 2;
entities[_i].walkingframe++;
if (entities[_i].walkingframe == 2)
{
entities[_i].walkingframe = 0;
}
}
entities[_i].drawframe = entities[_i].tile;
entities[_i].drawframe += entities[_i].walkingframe;
break;
case 3:
//Simpler Loop (just two frames, but double sized)
entities[_i].framedelay--;
if(entities[_i].framedelay<=0)
{
entities[_i].framedelay = 2;
entities[_i].walkingframe++;
if (entities[_i].walkingframe == 2)
{
entities[_i].walkingframe = 0;
}
}
entities[_i].drawframe = entities[_i].tile;
entities[_i].drawframe += (entities[_i].walkingframe*2);
break;
case 4:
//Simpler Loop (just two frames, but double sized) (as above but slower)
entities[_i].framedelay--;
if(entities[_i].framedelay<=0)
{
entities[_i].framedelay = 6;
entities[_i].walkingframe++;
if (entities[_i].walkingframe == 2)
{
entities[_i].walkingframe = 0;
}
}
entities[_i].drawframe = entities[_i].tile;
entities[_i].drawframe += (entities[_i].walkingframe*2);
break;
case 5:
//Simpler Loop (just two frames) (slower)
entities[_i].framedelay--;
if(entities[_i].framedelay<=0)
{
entities[_i].framedelay = 6;
entities[_i].walkingframe++;
if (entities[_i].walkingframe == 2)
{
entities[_i].walkingframe = 0;
}
}
entities[_i].drawframe = entities[_i].tile;
entities[_i].drawframe += entities[_i].walkingframe;
break;
case 6:
//Normal Loop (four frames, double sized)
entities[_i].framedelay--;
if(entities[_i].framedelay<=0)
{
entities[_i].framedelay = 4;
entities[_i].walkingframe++;
if (entities[_i].walkingframe == 4)
{
entities[_i].walkingframe = 0;
}
}
entities[_i].drawframe = entities[_i].tile;
entities[_i].drawframe += (entities[_i].walkingframe*2);
break;
case 7:
//Simpler Loop (just two frames) (slower) (with directions!)
entities[_i].framedelay--;
if(entities[_i].framedelay<=0)
{
entities[_i].framedelay = 6;
entities[_i].walkingframe++;
if (entities[_i].walkingframe == 2)
{
entities[_i].walkingframe = 0;
}
}
entities[_i].drawframe = entities[_i].tile;
entities[_i].drawframe += entities[_i].walkingframe;
if (entities[_i].vx > 0.000f ) entities[_i].drawframe += 2;
break;
case 10:
case EntityAnimationType_CONVEYOR_LEFT:
//Threadmill left
entities[_i].framedelay--;
if(entities[_i].framedelay<=0)
if (entities[_i].framedelay <= 0)
{
entities[_i].framedelay = 3;//(6-entities[_i].para);
entities[_i].walkingframe--;
@ -3961,10 +3878,10 @@ void entityclass::animateentities( int _i )
entities[_i].drawframe = entities[_i].tile;
entities[_i].drawframe += entities[_i].walkingframe;
break;
case 11:
case EntityAnimationType_CONVEYOR_RIGHT:
//Threadmill right
entities[_i].framedelay--;
if(entities[_i].framedelay<=0)
if (entities[_i].framedelay <= 0)
{
entities[_i].framedelay = 3;//(6-entities[_i].para);
entities[_i].walkingframe++;
@ -3977,37 +3894,35 @@ void entityclass::animateentities( int _i )
entities[_i].drawframe = entities[_i].tile;
entities[_i].drawframe += entities[_i].walkingframe;
break;
case 100:
//Simple case for no animation (platforms, etc)
entities[_i].drawframe = entities[_i].tile;
break;
case EntityAnimationType_STILL:
default:
entities[_i].drawframe = entities[_i].tile;
break;
}
break;
}
case EntityType_DISAPPEARING_PLATFORM: //Disappearing platforms
entities[_i].drawframe = entities[_i].tile + entities[_i].walkingframe;
break;
case EntityType_WARP_TOKEN:
entities[_i].drawframe = entities[_i].tile;
if(entities[_i].animate==2)
{
//Simpler Loop (just two frames)
entities[_i].framedelay--;
if(entities[_i].framedelay<=0)
{
entities[_i].framedelay = 10;
entities[_i].walkingframe++;
if (entities[_i].walkingframe == 2)
{
entities[_i].walkingframe = 0;
}
}
entities[_i].drawframe = entities[_i].tile;
entities[_i].drawframe += entities[_i].walkingframe;
// Two frame loop
entities[_i].framedelay--;
if (entities[_i].framedelay <= 0)
{
entities[_i].framedelay = 10;
entities[_i].walkingframe++;
if (entities[_i].walkingframe == 2)
{
entities[_i].walkingframe = 0;
}
}
entities[_i].drawframe = entities[_i].tile;
entities[_i].drawframe += entities[_i].walkingframe;
break;
case EntityType_CREWMATE:
case EntityType_COLLECTABLE_CREWMATE:

View file

@ -37,7 +37,9 @@ struct EnemyType
{
int tile;
int colour;
int animate;
int animation_frames;
EntityAnimationTypes animation_type;
int animation_speed;
int width;
int height;
int harmful;
@ -65,7 +67,12 @@ class entityclass
public:
void init(void);
EnemyType* create_type(const char* type, int tile, int colour, int animate, int width, int height);
EnemyType* create_type(
const char* type, int tile, int colour,
EntityAnimationTypes animation_type, int animation_frames, int animation_speed,
int width, int height
);
void add_default_types(void);
const char* legacy_id_to_entity(int id);
void set_enemy_type(entclass* entity, const char* type);

View file

@ -521,21 +521,25 @@ void mapclass::changefinalcol(int t)
{
if (obj.entities[i].type == EntityType_MOVING)
{
if (obj.entities[i].animate == 10 || obj.entities[i].animate == 11) //treadmill
if (obj.entities[i].animation_type == EntityAnimationType_CONVEYOR_LEFT || obj.entities[i].animation_type == EntityAnimationType_CONVEYOR_RIGHT) //treadmill
{
if(temp<3)
if (temp < 3)
{
obj.entities[i].tile = 907 + (temp * 80);
}
else
{
obj.entities[i].tile = 911 + ((temp-3) * 80);
obj.entities[i].tile = 911 + ((temp - 3) * 80);
}
if (obj.entities[i].animation_type == EntityAnimationType_CONVEYOR_LEFT)
{
obj.entities[i].tile += 40;
}
if(obj.entities[i].animate == 10) obj.entities[i].tile += 40;
}
else if (obj.entities[i].isplatform)
{
obj.entities[i].tile = 915+(temp*40);
obj.entities[i].tile = 915 + (temp * 40);
}
else //just an enemy
{

View file

@ -314,13 +314,17 @@ void scriptclass::run(void)
}
else if (words[1] == "platforms" || words[1] == "moving")
{
const bool fixed = words[1] == "moving";
for (size_t edi = 0; edi < obj.entities.size(); edi++)
{
if (obj.entities[edi].rule == 2 && obj.entities[edi].animate == 100)
if (obj.entities[edi].type == EntityType_DISAPPEARING_PLATFORM)
{
if (fixed)
if (obj.entities[edi].behave >= 8 && obj.entities[edi].behave < 10)
{
// We don't want conveyors, moving platforms only
continue;
}
if (words[1] == "moving")
{
obj.disableblockat(obj.entities[edi].xp, obj.entities[edi].yp);
}