-/* dunbash.h
+/* cavechop.h
*
- * Copyright 2005 Martin Read
+ * Copyright 2005-2012 Martin Read
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef DUNBASH_H
-#define DUNBASH_H
+#ifndef CAVECHOP_H
+#define CAVECHOP_H
#include <stdlib.h>
#include <stdint.h>
+#include <stdbool.h>
#include <stdio.h>
/* change WIZARD_MODE to 1 if you want the wizard mode commands. */
/* XXX enum game_cmd - player actions. */
enum game_cmd {
- DROP_ITEM, SAVE_GAME, SHOW_INVENTORY, MOVE_WEST, MOVE_SOUTH,
- MOVE_NORTH, MOVE_EAST, MOVE_NW, MOVE_NE, MOVE_SW, MOVE_SE,
- QUAFF_POTION, READ_SCROLL, WIELD_WEAPON, WEAR_ARMOUR,
- TAKE_OFF_ARMOUR, PUT_ON_RING, REMOVE_RING, GIVE_HELP,
- ATTACK, GET_ITEM, QUIT, GO_DOWN_STAIRS, STAND_STILL, EAT_FOOD,
- DUMP_CHARA, INSPECT_ITEM, EXAMINE_MONSTER, RNG_TEST, SHOW_TERRAIN,
+ DROP_ITEM, SAVE_GAME, SHOW_INVENTORY,
+ MOVE_WEST, MOVE_SOUTH, MOVE_NORTH, MOVE_EAST,
+ MOVE_NW, MOVE_NE, MOVE_SW, MOVE_SE,
+ WIELD_WEAPON, WEAR_ARMOUR, TAKE_OFF_ARMOUR, PUT_ON_RING, REMOVE_RING,
+ QUAFF_POTION, READ_SCROLL, THROW_FLASK,
+ EMANATE_ARMOUR, ZAP_WEAPON, MAGIC_RING, ATTACK,
+ GET_ITEM, QUIT, GO_DOWN_STAIRS, STAND_STILL, EAT_FOOD, DUMP_CHARA,
+ GIVE_HELP, INSPECT_ITEM, EXAMINE_MONSTER, RNG_TEST, SHOW_TERRAIN,
WIZARD_LEVELUP, WIZARD_DESCEND
};
/* XXX enum terrain_num */
-/* To start with, only four types of terrain: Wall, Floor, Door, Stairs. */
enum terrain_num {
- WALL = 0, FLOOR = 1, DOOR = 2, STAIRS = 3
+ WALL = 0, FLOOR, DOOR, STAIRS, LAVA, WATER
};
/* XXX enum death */
/* XXX enum poclass_num */
/* Categories of permanent object. */
enum poclass_num {
- POCLASS_NONE = 0, POCLASS_WEAPON = 1, POCLASS_POTION = 2,
- POCLASS_SCROLL = 3, POCLASS_ARMOUR = 4, POCLASS_RING = 5,
- POCLASS_FOOD = 6
+ POCLASS_NONE = 0, POCLASS_WEAPON, POCLASS_POTION,
+ POCLASS_SCROLL, POCLASS_FLASK, POCLASS_ARMOUR, POCLASS_RING,
+ POCLASS_FOOD
};
#define RESIST_MASK_TEMPORARY 0x0000FFFFu
uint32_t resistances[DT_COUNT]; /* Resistances to damage types. */
int level; /* Each level gets you +1 body, +1 agility, +1 random
point, and +(10+body/10) hit points */
- int gold;
int inventory[19]; /* 19 inventory slots, leaving room for a prompt */
int weapon; /* For now, you can only wield one weapon. */
int armour; /* For now, you can only wear one item of armour. */
#define DBCLR_L_CYAN 14
/* XXX struct permon */
-#define PM_NEWT 0
-#define PM_RAT (PM_NEWT + 1)
-#define PM_WOLF (PM_RAT + 1)
-#define PM_SNAKE (PM_WOLF + 1)
-#define PM_THUG (PM_SNAKE + 1)
-#define PM_GOON (PM_THUG + 1)
-#define PM_HUNTER (PM_GOON + 1)
-#define PM_DUELLIST (PM_HUNTER + 1)
-#define PM_WARLORD (PM_DUELLIST + 1)
-#define PM_WIZARD (PM_WARLORD + 1)
-#define PM_ARCHMAGE (PM_WIZARD + 1)
-#define PM_GOBLIN (PM_ARCHMAGE + 1)
-#define PM_BAD_ELF (PM_GOBLIN + 1)
-#define PM_TROLL (PM_BAD_ELF + 1)
-#define PM_GIANT (PM_TROLL + 1)
-#define PM_GIANT_JARL (PM_GIANT + 1)
-#define PM_ZOMBIE (PM_GIANT_JARL + 1)
-#define PM_WRAITH (PM_ZOMBIE + 1)
-#define PM_LICH (PM_WRAITH + 1)
-#define PM_VAMPIRE (PM_LICH + 1)
-#define PM_MASTER_LICH (PM_VAMPIRE + 1)
-#define PM_DEMON (PM_MASTER_LICH + 1)
-#define PM_DEFILER (PM_DEMON + 1)
-#define PM_ICE_MONSTER (PM_DEFILER + 1)
-#define PM_CENTAUR (PM_ICE_MONSTER + 1)
-#define PM_DRAGON (PM_CENTAUR + 1)
-#define PM_REAL_COUNT ((PM_DRAGON) + 1)
+enum Permon_num
+{
+ PM_NEWT = 0, PM_RAT, PM_WOLF, PM_SNAKE, PM_THUG, PM_GOON, PM_HUNTER,
+ PM_DUELLIST, PM_WARLORD, PM_WIZARD, PM_ARCHMAGE, PM_GOBLIN, PM_BAD_ELF,
+ PM_TROLL, PM_GIANT, PM_GIANT_JARL, PM_ZOMBIE, PM_WRAITH, PM_LICH,
+ PM_VAMPIRE, PM_MASTER_LICH, PM_DEMON, PM_DEFILER, PM_ICE_MONSTER,
+ PM_CENTAUR, PM_DRAGON
+};
+#define NUM_OF_PERMONS (1 + PM_DRAGON)
#define PMF_RESIST_FIRE 0x00000001
#define PMF_RESIST_COLD 0x00000002
#define PMF_RESIST_ELEC 0x00000004
+#define PMF_RESIST_POIS 0x00000008
+#define PMF_RESIST_NECR 0x00000010
#define PMF_UNDEAD 0x00010000
#define PMF_DEMONIC 0x00020000
#define PMF_MAGICIAN 0x00040000
int speed; /* 0 = slow; 1 = normal; 2 = quick */
int flags; /* resistances, AI settings, etc. */
};
+extern struct permon permons[NUM_OF_PERMONS];
/* XXX struct permobj */
-#define PO_DAGGER 0
+enum Permobj_nums
+{
+ // weapons
+ PO_DAGGER=0, PO_LONG_SWORD, PO_MACE, PO_RUNESWORD, PO_BOW, PO_CROSSBOW,
+ // potions
+ PO_POT_HEAL, PO_POT_BODY, PO_POT_AGILITY, PO_POT_RESTORATION,
+ // flasks
+ PO_FLASK_POISON, PO_FLASK_FIRE, PO_FLASK_WEAKNESS,
+ // scrolls
+ PO_SCR_TELEPORT, PO_SCR_FIRE, PO_SCR_PROTECTION,
+ // armour
+ PO_LEATHER_ARMOUR, PO_CHAINMAIL, PO_PLATE_ARMOUR, PO_MAGE_ARMOUR, PO_ROBE,
+ PO_ROBE_SWIFTNESS, PO_ROBE_SHADOWS, PO_DRAGON_ARMOUR, PO_METEOR_ARMOUR,
+ PO_SACRED_MAIL, PO_BATTLE_BALLGOWN, PO_RIBBONS,
+ // rings
+ PO_RING_REGEN, PO_RING_FIRE, PO_RING_VAMPIRE, PO_RING_FROST,
+ PO_RING_TELEPORT,
+ // food
+ PO_IRON_RATION, PO_DRIED_FRUIT, PO_ELVEN_BREAD
+};
#define PO_FIRST_WEAPON PO_DAGGER
-#define PO_LONG_SWORD (PO_FIRST_WEAPON + 1)
-#define PO_MACE (PO_FIRST_WEAPON + 2)
-#define PO_RUNESWORD (PO_FIRST_WEAPON + 3)
-#define PO_BOW (PO_FIRST_WEAPON + 4)
-#define PO_CROSSBOW (PO_FIRST_WEAPON + 5)
#define PO_LAST_WEAPON PO_CROSSBOW
-#define PO_POT_HEAL (PO_LAST_WEAPON + 1)
#define PO_FIRST_POTION PO_POT_HEAL
-#define PO_POT_POISON (PO_FIRST_POTION + 1)
-#define PO_POT_BODY (PO_FIRST_POTION + 2)
-#define PO_POT_AGILITY (PO_FIRST_POTION + 3)
-#define PO_POT_WEAKNESS (PO_FIRST_POTION + 4)
-#define PO_POT_RESTORATION (PO_FIRST_POTION + 5)
#define PO_LAST_POTION PO_POT_RESTORATION
-#define PO_SCR_TELEPORT (PO_LAST_POTION + 1)
+#define PO_FIRST_FLASK PO_FLASK_POISON
+#define PO_LAST_FLASK PO_FLASK_WEAKNESS
#define PO_FIRST_SCROLL PO_SCR_TELEPORT
-#define PO_SCR_FIRE (PO_FIRST_SCROLL + 1)
-#define PO_SCR_MONSTERS (PO_FIRST_SCROLL + 2)
-#define PO_SCR_IDENTIFY (PO_FIRST_SCROLL + 3)
-#define PO_SCR_AGGRAVATE (PO_FIRST_SCROLL + 4)
-#define PO_SCR_PROTECTION (PO_FIRST_SCROLL + 5)
#define PO_LAST_SCROLL PO_SCR_PROTECTION
-#define PO_LEATHER_ARMOUR (PO_LAST_SCROLL + 1)
#define PO_FIRST_ARMOUR PO_LEATHER_ARMOUR
-#define PO_CHAINMAIL (PO_FIRST_ARMOUR + 1)
-#define PO_PLATE_ARMOUR (PO_FIRST_ARMOUR + 2)
-#define PO_MAGE_ARMOUR (PO_FIRST_ARMOUR + 3)
-#define PO_ROBE (PO_FIRST_ARMOUR + 4)
-#define PO_ROBE_SWIFTNESS (PO_FIRST_ARMOUR + 5)
-#define PO_ROBE_SHADOWS (PO_FIRST_ARMOUR + 6)
-#define PO_DRAGON_ARMOUR (PO_FIRST_ARMOUR + 7)
-#define PO_METEOR_ARMOUR (PO_FIRST_ARMOUR + 8)
-#define PO_SACRED_MAIL (PO_FIRST_ARMOUR + 9)
-#define PO_BATTLE_BALLGOWN (PO_FIRST_ARMOUR + 10)
-#define PO_RIBBONS (PO_FIRST_ARMOUR + 11)
#define PO_LAST_ARMOUR PO_RIBBONS
-#define PO_RING_REGEN (PO_LAST_ARMOUR + 1)
#define PO_FIRST_RING PO_RING_REGEN
-#define PO_RING_FIRE (PO_FIRST_RING + 1)
-#define PO_RING_WEDDING (PO_FIRST_RING + 2)
-#define PO_RING_VAMPIRE (PO_FIRST_RING + 3)
-#define PO_RING_FROST (PO_FIRST_RING + 4)
-#define PO_RING_DOOM (PO_FIRST_RING + 5)
-#define PO_RING_TELEPORT (PO_FIRST_RING + 6)
#define PO_LAST_RING PO_RING_TELEPORT
-#define PO_IRON_RATION (PO_LAST_RING + 1)
#define PO_FIRST_FOOD PO_IRON_RATION
-#define PO_DRIED_FRUIT (PO_FIRST_FOOD + 1)
-#define PO_ELVEN_BREAD (PO_FIRST_FOOD + 2)
#define PO_LAST_FOOD PO_ELVEN_BREAD
-#define PO_GOLD (PO_LAST_FOOD + 1)
-#define PO_REAL_COUNT ((PO_GOLD) + 1)
+#define NUM_OF_PERMOBJS ((PO_LAST_FOOD) + 1)
struct permobj {
const char name[48];
const char plural[48];
- const char description[160];
+ const char *description;
enum poclass_num poclass;
int rarity; /* Chance in 100 of being thrown away and regen'd. */
int sym;
int depth; /* If greater than 1, this item cannot be given out
* by get_random_pobj() before the specified depth. */
};
+extern struct permobj permobjs[NUM_OF_PERMOBJS];
/* XXX struct mon */
+#define MONSTERS_IN_PLAY 100
struct mon {
int mon_id;
int y;
int awake;
int next_summon;
};
+extern struct mon monsters[MONSTERS_IN_PLAY];
/* XXX struct obj */
+#define OBJ_MAX_DUR 100
+#define OBJECTS_IN_PLAY 100
struct obj {
int obj_id;
int quan;
int used; /* Entry is occupied. */
int durability; /* Weapons and armour degrade with use. */
};
-
-#define OBJ_MAX_DUR 100
-/* XXX Object/monster arrays */
-#define NUM_OF_PERMOBJS 300
-extern struct permobj permobjs[NUM_OF_PERMOBJS];
-
-#define MONSTERS_IN_PLAY 100
-extern struct mon monsters[MONSTERS_IN_PLAY];
+extern struct obj objects[OBJECTS_IN_PLAY];
/* XXX display.c data and funcs */
extern int read_input(char *buffer, int length);
extern void press_enter(void);
extern void pressanykey(void);
extern void show_discoveries(void);
+extern void touch_one_screen(int y, int x);
/* "I've changed things that need to be redisplayed" flags. */
extern int hard_redraw;
extern void build_level(void);
extern void populate_level(void);
extern void inject_player(void);
-extern int get_room_x(int room);
-extern int get_room_y(int room);
-extern void room_reset(void);
+extern void explore_around(int y, int x);
/* For now, I can't be arsed with a mapcell structure */
+#define LEVGEN_WALK_STEPS 600
#define DUN_WIDTH 42
#define DUN_HEIGHT 42
#define ROOM_HT_DELTA 4
extern enum terrain_num terrain[DUN_HEIGHT][DUN_WIDTH];
#define MAPFLAG_EXPLORED 0x00000001
extern int mapflags[DUN_HEIGHT][DUN_WIDTH];
-extern int roomnums[DUN_HEIGHT][DUN_WIDTH];
-extern int roombounds[MAX_ROOMS][4];
-extern int roomlinkage[MAX_ROOMS][MAX_ROOMS];
extern int depth;
/* XXX misc.c data and funcs */
extern void describe_object(int obj);
extern int create_obj(int po_idx, int quantity, int with_you, int y, int x);
extern int drop_obj(int inv_idx);
+extern int consume_obj(int obj);
extern int create_obj_class(enum poclass_num pocl, int quantity, int with_you, int y, int x);
extern int create_obj_random(int y, int x);
-#define OBJECTS_IN_PLAY 100
-extern struct obj objects[OBJECTS_IN_PLAY];
extern int read_scroll(int obj);
extern int quaff_potion(int obj);
extern int eat_food(int obj);
extern void damage_obj(int obj);
extern int evasion_penalty(int obj);
-/* XXX permons.c data */
-#define NUM_OF_PERMONS 300
-/* I don't intend to start with anything like this many monsters, but,
- * it gives me headroom. */
-extern struct permon permons[NUM_OF_PERMONS];
/* XXX rng.c data and funcs */
#define RNG_MAX 0xFFFFFFFFu
extern int player_resists_dtype(enum damtyp dtype);
extern struct player u;
-
-#define inyourroom(my, mx) ((roomnums[u.y][u.x] != -1) && (roomnums[u.y][u.x] == roomnums[(my)][(mx)]))
#endif
-/* dunbash.h */
+/* cavechop.h */