Files
commandergenius/project/jni/application/enigma/src/items.hh
2010-10-13 17:30:44 +03:00

260 lines
7.3 KiB
C++

/*
* Copyright (C) 2002,2003,2004 Daniel Heck
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#ifndef ITEMS_HH_INCLUDED
#define ITEMS_HH_INCLUDED
#include "objects_decl.hh"
namespace world
{
enum ItemID {
it_INVALID = -1,
it_FIRST = 0,
it_none = 0,
it_1pkillstone,
it_2pkillstone,
it_abyss,
it_bag,
it_banana,
it_blackbomb,
it_blackbomb_burning,
it_blocker,
it_booze,
it_brake,
it_bridge_oxyd,
it_bridge_oxyd_active,
it_booze_broken,
it_brush,
it_burnable,
it_burnable_fireproof,
it_burnable_ignited,
it_burnable_burning,
it_burnable_ash,
it_burnable_oil,
it_changefloor,
it_cherry,
it_cherry_crushed,
it_coffee,
it_coin1,
it_coin2,
it_coin4,
it_crack0,
it_crack1,
it_crack2,
it_crack3,
it_cross,
it_death,
it_debris,
it_document,
it_drop,
it_dynamite,
it_dummy,
it_easykeepstone,
it_easykillstone,
it_explosion1,
it_explosion2,
it_explosion3,
it_extinguisher,
it_extinguisher_medium,
it_extinguisher_empty,
it_extralife,
it_flagblack,
it_flagwhite,
it_floppy,
it_glasses,
it_glasses_broken,
it_hammer,
it_hill,
it_hollow,
it_hstrip,
it_inversesensor,
it_key_a,
it_key_b,
it_key_c,
it_landmine,
it_laserbeam,
it_magicwand,
it_magnet_off,
it_magnet_on,
it_odometer,
it_oxyd5f,
it_pencil,
it_pin,
it_pipe_e, it_pipe_w, it_pipe_s, it_pipe_n,
it_pipe_es, it_pipe_ne, it_pipe_sw, it_pipe_wn,
it_pipe_h, it_pipe_v,
it_puller_n,
it_puller_e,
it_puller_s,
it_puller_w,
it_ring,
it_rubberband,
it_seed,
it_seed_nowood,
it_seed_volcano,
it_sensor,
it_shogun_s,
it_shogun_m,
it_shogun_l,
it_signalfilter0,
it_signalfilter1,
it_spade,
it_spoon,
it_spring1,
it_spring2,
it_springboard,
it_squashed,
it_surprise,
it_sword,
it_tinyhill,
it_tinyhollow,
it_trigger,
it_umbrella,
it_vortex_open,
it_vortex_closed,
it_vstrip,
it_weight,
it_whitebomb,
it_wormhole_off,
it_wormhole_on,
it_wrench,
it_yinyang,
it_LAST,
it_COUNT
};
/*! What may happen to an item _after_ it was activated? */
enum ItemAction {
ITEM_DROP, //!< Drop it to the floor
ITEM_KILL, //!< Remove it from the inventory and dispose it
ITEM_KEEP, //!< Keep it in the inventory; do nothing further
};
enum ItemFlags {
itf_none = 0,
itf_static = 1, //!< Cannot be picked up
itf_indestructible = 2, //!< Cannot be destroyed by explosions etc.
itf_animation = 4, //!< Use set_anim() instead of set_model()
itf_invisible = 8, //!< Item has no visible model
itf_inflammable = 16, //!< Burns when hit by laser beam
itf_norespawn = 32, //!< Don't respawn balls on top of this item
itf_fireproof = 64, //!< This item can't burn by fire
};
struct ItemTraits {
const char *name; //!< Name of the item, e.g., "it-hammer"
ItemID id;
int flags; //!< Combination of ItemFlags
float radius; //!< Radius, 0.0 = default
};
class Item : public GridObject {
public:
Item();
/* ---------- Public methods ---------- */
void kill();
void replace (ItemID id);
/* ---------- Virtual functions ---------- */
const char *get_kind() const;
void init_model();
void on_laserhit(Direction);
/* ---------- Item interface ---------- */
virtual Item *clone() = 0;
virtual const ItemTraits &get_traits() const = 0;
/*! Return true if item completely covers the floor. In this
case the Floor::actor_contact() will not be called
automatically; this must be done from `Item::actor_hit' (if
at all). */
virtual bool covers_floor(ecl::V2 pos) const { return false; }
/*! Return the force an item exerts on actor `a'. This is
used by sloped and hills for force fields that are local to
the current field. For global force fields you have to
register a ForceField in the world. */
virtual void add_force(Actor *a, ecl::V2 &f);
virtual bool can_drop_at (GridPos p);
virtual void drop (Actor *a, GridPos p);
/*! Called when item is dropped by actor `a' */
virtual void on_drop(Actor *a);
/*! Called when item is picked up by actor `a' */
virtual void on_pickup(Actor *a);
/*! Called when stone above item changes. */
virtual void stone_change(Stone *st);
/*! Called when item is ``hit'' by a moving stone. */
virtual void on_stonehit(Stone *st);
/*! Called when item is ``hit'' by an actor. Return true if
the item should be picked up. */
virtual bool actor_hit(Actor *a);
/*! The model used for displaying this item in an
inventory. */
virtual string get_inventory_model();
/* Called when item is activated by the owner of `a'. */
virtual ItemAction activate(Actor* a, GridPos p);
protected:
// GridObject interface
virtual void set_model (const std::string &mname) {
display::SetModel(GridLoc(GRID_ITEMS, get_pos()), mname);
}
virtual display::Model *get_model () {
return display::GetModel(GridLoc(GRID_ITEMS, get_pos()));
}
virtual void kill_model (GridPos p) {
display::KillModel (GridLoc (GRID_ITEMS, p));
}
// replace template method hook
virtual void setup_successor(Item *newitem) {}
};
/* -------------------- Inline functions -------------------- */
/*! Return unique item type identifier. */
inline ItemID get_id (Item *it) {
if (it)
return it->get_traits().id;
return it_none;
}
inline bool has_flags (Item *it, ItemFlags flags) {
return (it->get_traits().flags & flags) == flags;
}
/* -------------------- Functions -------------------- */
void InitItems();
}
#endif