#include "../generator.h" #include "../level.h" #define N PLATFORM_COUNT gen1::gen1(): m_path_carver{0} { m_last_z = 0; srand(0xc0ffee); } void gen1::generate(struct level *level) { struct platform p1; struct platform p2; static const int freq[] = { 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 5, 5, 5, }; m_path_carver.next( (rand() % 2) ? PLATFORM_LEN_LONG : PLATFORM_LEN_SHORT, &p1, true ); p2 = p1; switch (freq[rand() % (sizeof(freq) / sizeof(freq[0]))]) { /* full circle */ case 1: for (int i = 0 ; i < 10 ; i++) { p2.face = i; p2.length = (rand() % 2) ? PLATFORM_LEN_LONG : PLATFORM_LEN_SHORT; level->platform_buffer.push_back(p2); } break; /* full circle 1/2 */ case 2: { int kind = rand() % 2; for (int i = 0 ; i < 10 ; i++) { if ((i & 1) == kind) { continue; } p2.face = i; level->platform_buffer.push_back(p2); } break; } /* 3 faces, 1 empty, 5 faces */ case 3: { int toggle_len = rand() % 2; p2.face = p1.face; for (int i = 0 ; i < 3 ; i++) { p2.length = (toggle_len) ? PLATFORM_LEN_LONG : PLATFORM_LEN_SHORT; level->platform_buffer.push_back(p2); p2.face = (p2.face + 1) % PLATFORM_COUNT; } p2.face = (p2.face + 1) % PLATFORM_COUNT; for (int i = 0 ; i < 5 ; i++) { level->platform_buffer.push_back(p2); p2.face = (p2.face + 1) % PLATFORM_COUNT; } break; } /* 1 face, 1 empty, 1 face, 1 emtpy, 1 face */ case 4: //TODO : height level->platform_buffer.push_back(p2); p2.face = add_to_face(p2.face, -2); level->platform_buffer.push_back(p2); p2.face = add_to_face(p2.face, 4); level->platform_buffer.push_back(p2); break; /* foce 1 face */ default: level->platform_buffer.push_back(p1); } }