RogueLife/src/level.h

90 lines
2.0 KiB
C

//---
// level: Static level model
//
// This module provides representations for read-only data structures
// describing levels, from which dynamic maps can be built. The only role of
// models is that we can import them into the game and then load them into
// maps. This is a convenience to abstract away the storage format of levels.
//---
#pragma once
#include "fixed.h"
#include "map.h"
#include "item.h"
#include <stdint.h>
#include <stdbool.h>
#include <gint/display.h>
/* A level wave is a list of pairs (enemy identity, amount) pairs which
indicate how many enemies to spawn. The order might be random and another
dynamically-allocated structure is used in game_t to keep track of this
assignment. */
typedef struct {
int entry_count;
struct {
uint8_t identity;
uint8_t amount;
} *entries;
} level_wave_t;
enum {
/* Nothing happens for a short while */
LEVEL_EVENT_DELAY = 0,
/* A wave of monster spawns! */
LEVEL_EVENT_WAVE = 1,
/* An item is dropped at a random position */
LEVEL_EVENT_ITEM = 2,
};
/* Levels are made of a sequence of simple events. */
typedef struct {
int type;
fixed_t duration;
union {
/* LEVEL_EVENT_DELAY: Nothing */
/* LEVEL_EVENT_WAVE */
level_wave_t *wave;
/* LEVEL_EVENT_ITEM */
int item;
};
} level_event_t;
typedef struct {
char const *name;
map_t const *map;
/* Player spawn location */
uint8_t player_spawn_x;
uint8_t player_spawn_y;
/* Spawner positions */
int spawner_count;
uint8_t *spawner_x;
uint8_t *spawner_y;
/* List of events (the array is not terminated) */
int event_count;
level_event_t *events;
} level_t;
/* Get the number of waves in a level */
int level_wave_count(level_t const *lv);
/* List of levels */
extern level_t level_lv1;
extern level_t level_lv2;
extern level_t level_lv3;
extern level_t level_lv4;
extern level_t level_lv5;
extern level_t level_lvsandbox;
#define LEVEL_COUNT 6
extern level_t const *level_all[LEVEL_COUNT];