fix header and height for generator level1

This commit is contained in:
Yann MAGNIN 2023-05-24 18:42:51 +02:00
parent 19caa845de
commit f8a0544b87
3 changed files with 58 additions and 40 deletions

View File

@ -11,79 +11,80 @@ using namespace libnum;
produces a random traversable path. */
struct path_carver
{
/* Start a path on the provided face. */
path_carver(int initial_face);
/* Advance by one platform of the specified length and generate the
associated platform data. A platform might not be generated if the path
decides to skip for a jump! Returns true if a platform was generated in
*p, false otherwise (in that case don't use *p). If force is set, always
generates a platform. */
bool next(num length, struct platform *p, bool force=false);
/* Teleport to the specified z. */
void teleport(num z);
/* Start a path on the provided face. */
path_carver(int initial_face);
/* Advance by one platform of the specified length and generate the
associated platform data. A platform might not be generated if the path
decides to skip for a jump! Returns true if a platform was generated in
*p, false otherwise (in that case don't use *p). If force is set, always
generates a platform. */
bool next(num length, struct platform *p, bool force=false);
/* Teleport to the specified z. */
void teleport(num z);
private:
/* Face where the next platform will be generated */
int m_face;
/* Current z position */
num m_z;
/* Whether last face was skipped */
bool m_last_skipped;
/* Face where the next platform will be generated */
int m_face;
/* Current z position */
num m_z;
/* Whether last face was skipped */
bool m_last_skipped;
};
static inline int add_to_face(int face, int how_much)
{
int f = (face + how_much) % PLATFORM_COUNT;
return (f < 0) ? f + PLATFORM_COUNT : f;
int f = (face + how_much) % PLATFORM_COUNT;
return (f < 0) ? f + PLATFORM_COUNT : f;
}
static inline int next_face(int face)
{
return add_to_face(face, 1);
return add_to_face(face, 1);
}
static inline int prev_face(int face)
{
return add_to_face(face, -1);
return add_to_face(face, -1);
}
//======= Level generator API =======//
struct Generator
{
/* Generate more stuff. */
virtual void generate(struct level *) = 0;
virtual ~Generator() = default;
/* Generate more stuff. */
virtual void generate(struct level *) = 0;
virtual ~Generator() = default;
};
struct gen1: public Generator
{
gen1();
void generate(struct level *) override;
~gen1() override = default;
gen1();
void generate(struct level *) override;
~gen1() override = default;
num m_last_z;
path_carver m_path_carvers[3];
num m_z;
bool m_initial;
path_carver m_path_carver;
};
struct AcceleronGenerator: public Generator
{
AcceleronGenerator();
void generate(struct level *) override;
~AcceleronGenerator() override = default;
AcceleronGenerator();
void generate(struct level *) override;
~AcceleronGenerator() override = default;
num m_z;
bool m_initial;
path_carver m_path_carver;
num m_z;
bool m_initial;
path_carver m_path_carver;
};
struct gen3: public Generator
{
gen3();
void generate(struct level *) override;
~gen3() override = default;
gen3();
void generate(struct level *) override;
~gen3() override = default;
path_carver m_path_carvers[3];
path_carver m_path_carvers[3];
};
#endif /* GENERATOR_H */

View File

@ -1,12 +1,13 @@
#include "../generator.h"
#include "../level.h"
#define N PLATFORM_COUNT
#define PLATFORM_LEN_INITIAL num(6.0)
gen1::gen1(): m_path_carver{0}
{
m_last_z = 0;
srand(0xc0ffee);
m_initial = true;
m_z = 0.0;
}
void gen1::generate(struct level *level)
@ -21,6 +22,20 @@ void gen1::generate(struct level *level)
5, 5, 5,
};
/* Friendly platform at start of level */
if(m_initial) {
struct platform p;
p.type = PLATFORM_WHITE;
p.face = 0;
p.z = m_z;
p.length = PLATFORM_LEN_INITIAL;
p.height = 0;
level->platform_buffer.push_back(p);
m_z += p.length;
m_initial = false;
}
m_path_carver.next(
(rand() % 2) ? PLATFORM_LEN_LONG : PLATFORM_LEN_SHORT,
&p1,
@ -79,6 +94,7 @@ void gen1::generate(struct level *level)
/* foce 1 face */
default:
p1.length = PLATFORM_LEN_LONG;
level->platform_buffer.push_back(p1);
}
}

View File

@ -22,6 +22,7 @@ bool path_carver::next(num length, struct platform *p, bool force)
p->z = m_z;
p->length = length;
p->type = PLATFORM_WHITE;
p->height = 0;
int diff = rand() % 3 - 1;
m_face = (m_face + PLATFORM_COUNT + diff) % PLATFORM_COUNT;