aboutsummaryrefslogblamecommitdiffstats
path: root/oldrunner.h
blob: 14f4a3ef032209dd91777733fd1ecb0f8b8b9d7a (plain) (tree)
1
2
3
                                                              

                              






































































                                                                        
 

                                 
 

















                                        
                           


















                                                  
                          

                          
                          
                  

                  
































































































































































                                                                                
/*  $Id: oldrunner.h,v 1.2 2012/01/06 10:11:30 culot Exp $  */
/* vim: et ai sts=2 ts=2 sw=2:
 * */

/*
 * Copyright (c) 2010, 2012 Frederic Culot <frederic@culot.org>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *      - Redistributions of source code must retain the above
 *        copyright notice, this list of conditions and the
 *        following disclaimer.
 *
 *      - Redistributions in binary form must reproduce the above
 *        copyright notice, this list of conditions and the
 *        following disclaimer in the documentation and/or other
 *        materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef OLDRUNNER_H
#define OLDRUNNER_H

#include <stdlib.h>
#include <stdio.h>

#include "config.h"
#include "compat.h"
#include "cfg.h"

/* Option to set auto-center mode on/off */
#define AUTO_CENTER_MODE  0

/* Game level screen properties. */
#define LEVEL_DEFAULT_WIDTH     26
#define LEVEL_DEFAULT_HEIGHT    16
#define LEVEL_MAX_WIDTH         128
#define LEVEL_MAX_HEIGHT        128
#define VIEWPORT_WIDTH          80
#define VIEWPORT_HEIGHT         24

/* Possible characters states. */
#define   STATE_ALIVE     0x01
#define   STATE_FALLING   0x02
#define   STATE_DIGGING   0x04
#define   STATE_TRAPPED   0x08

/* Game sprites. */
enum sprite {
  /* Sprites used to draw a level. */
  SP_NONE,
  SP_BRICK,
  SP_BRICK_SCRACK,
  SP_BRICK_LCRACK,
  SP_BRICK_BROKEN,
  SP_CIMENT,
  SP_FAKE_BRICK,
  SP_LADDER,
  SP_ROPE,
  SP_ESCAPE_LADDER,

  /* Sprites used for objects. */
  SP_MONEY,

  /* Sprites used to draw characters. */
  SP_HERO,
  SP_FOE,
  SP_INVALID,
  SPRITES
};

enum move {
  MOV_UP,
  MOV_DOWN,
  MOV_LEFT,
  MOV_RIGHT,
  MOV_FALL,
  MOV_NONE,
  MOVES
};

struct size {
  unsigned  h; /* height */
  unsigned  w; /* width */
};

struct coord {
  int  y;  /* Position on the vertical axis. */
  int  x;  /* Position on the horizontal axis. */
};

struct timer {
  double  time;    /* time in usec. */
  double  elapsed;
};

/* Structure defining all possible user inputs. */
struct usr_input {
  int key;
};

struct game_info {
#define  NO_CHANGE     0x0
#define  LEVEL_CHANGE  0x1
#define  SCORE_CHANGE  0x2
#define  LIVES_CHANGE  0x4
  int       state;

  unsigned  level;
  unsigned  score;
  unsigned  lives;
};

#define STRINGIFY(x)  #x
#define TOSTRING(x)   STRINGIFY(x)
#define __FILE_POS__   __FILE__ ":" TOSTRING(__LINE__)

#define ERROR_MSG(...) do {                                             \
  char msg[BUFSIZ];                                                     \
  int len;                                                              \
                                                                        \
  len = snprintf (msg, BUFSIZ, "%s: %d: ", __FILE__, __LINE__);         \
  (void)snprintf (msg + len, BUFSIZ - len, __VA_ARGS__);                \
  (void)fprintf (stderr, "%s\n", msg);                                  \
} while (0)

#define EXIT(...) do {                                                  \
          ERROR_MSG(__VA_ARGS__);                                       \
          exit (1);                                                     \
} while (0)

#define EXIT_IF(cond, ...) do {                                         \
  if ((cond))                                                           \
    EXIT(__VA_ARGS__);                                                  \
} while (0)

/* bricks.c */
#define   BRICK_COMEBACK_TIME  (OLDRUNNER_TIMEOUT * 80)
void      bricks_init (void);
void      bricks_free (void);
void      bricks_break (const struct coord *);
void      bricks_draw (void);
void      bricks_update (void);
unsigned  bricks_broken_at (const struct coord *);

/* coord.c */
void       coord_copy (const struct coord *, struct coord *);
void       coord_below (const struct coord *, struct coord *);
void       coord_above (const struct coord *, struct coord *);
enum move  coord_opposite_dir (enum move);
void       coord_compute (const struct coord *, enum move, struct coord *);
void       coord_set_yx (struct coord *, int, int);
unsigned   coord_equal (const struct coord *, const struct coord *);
void       coord_diff (const struct coord *, const struct coord *,
                       struct coord *);

/* foes.c */
void      foes_init (void);
void      foes_free (void);
void      foes_add (const struct coord *);
void      foes_draw (void);
unsigned  foes_at_pos (const struct coord *);
void      foes_update_pos (void);
unsigned  foes_wallup_at (const struct coord *);

/* game.c */
void      game_won (void);
void      game_init (int);
void      game_end (void);
void      game_update (void);
unsigned  game_load (const char *);
void      game_score_inc (void);
int       game_level_num (void);
void      game_level_inc (void);
void      game_level_dec (void);
void      game_lives_inc (void);
void      game_lives_dec (void);

/* gfx.c */
void  gfx_init (void);
void  gfx_end (void);
void  gfx_alert (void);
void  gfx_center_at (struct coord *);
void  gfx_update (void);
void  gfx_get_input (struct usr_input *);
void  gfx_show_sprite (enum sprite, const struct coord *);
void  gfx_move_sprite (enum sprite, const struct coord *, const struct coord *);
void  gfx_update_info (const struct game_info *);
void  gfx_popup (const char *, const char *);
void  gfx_game_over (void);
void  gfx_game_won (void);

/* hero.c */
void      hero_init (void);
void      hero_draw (void);
void      hero_set_pos (const struct coord *);
void      hero_set_initpos (const struct coord *);
void      hero_get_pos (struct coord *);
void      hero_get_initpos (struct coord *);
unsigned  hero_at_pos (const struct coord *);
void      hero_move (enum move);
void      hero_dig (enum move);
void      hero_dig_done (void);
void      hero_trapped (void);
void      hero_die (void);
unsigned  hero_wallup_at (const struct coord *);

/* io.c */
FILE  *io_fopen (const char *);
void   io_fclose (FILE *);
char  *io_getln (FILE *);

/* lvl.c */
void         lvl_started (void);
enum sprite  lvl_decor_at_pos (const struct coord *);
void         lvl_init (void);
unsigned     lvl_load (int);
unsigned     lvl_load_next (void);
unsigned     lvl_load_prev (void);
void         lvl_won (void);
void         lvl_lost (void);
void         lvl_draw_escape_ladder (void);
unsigned     lvl_set_name (const char *);
unsigned     lvl_set_author (const char *);
unsigned     lvl_set_size (char *);
unsigned     lvl_set_row (int, int, const char *);
unsigned     lvl_width (void);
unsigned     lvl_height (void);
unsigned     lvl_add_new (void);
unsigned     lvl_valid_move (const struct coord *, enum move, struct coord *,
                             enum sprite);
unsigned     lvl_valid_dig (const struct coord *);
unsigned     lvl_nothing_below (const struct coord *);
unsigned     lvl_obstacle_at (const struct coord *);
void         lvl_objects_update (void);
unsigned     lvl_got_hole_below (const struct coord *);
enum move    lvl_shortest_way (const struct coord *, enum move, enum move);
int          lvl_random_xpos (void);
enum move    lvl_random_hdir (void);

/* mem.c */
void  *xmalloc (size_t);
void  *xcalloc (size_t, size_t);
void  *xrealloc (void *, size_t, size_t);
char  *xstrdup (const char *);
void   xfree (void *);

/* money.c */
void      money_init (void);
void      money_free (void);
void      money_add (const struct coord *);
void      money_draw (void);
void      money_check_at (const struct coord *);
unsigned  money_all_collected (void);

/* timer.c */
void      timer_get_time (struct timer *);
void      timer_start (struct timer *);
void      timer_stop (struct timer *);
double    timer_diff (const struct timer *, const struct timer *);
double    timer_elapsed (const struct timer *);
void      timer_set (const struct timer *, struct timer *);
void      timer_add (struct timer *, double);
unsigned  timer_delay_elapsed (struct timer *, double);

/* usr.c */
void  usr_input (void);
void  usr_reset_input (void);

#endif /* OLDRUNNER_H */
Un proyecto texto-plano.xyz