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

145 lines
5.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 FLOORS_HH_INCLUDED
#define FLOORS_HH_INCLUDED
namespace world
{
enum FloorFlags {
flf_default = 0,
flf_indestructible = 0x01,
flf_no_items = 0x02,
flf_norespawn = 0x04,
};
enum FloorID {
fl_abyss,
fl_water,
fl_swamp,
fl_space,
fl_thief
};
enum FloorFireType {
flft_default = 0,
flft_burnable = 0x01, // Floor behaves as if it-burnable lies on it.
flft_ignitable = 0x02, // Ignite on bomb explosions. Not used.
flft_noash = 0x04, // Don't leave ash behind; floor might burn again.
flft_burnagain = 0x08, // Not used yet, nor implemented; see flft_noash.
flft_eternal = 0x10, // Fire doesn't stop burning by itself.
flft_secure = 0x20, // Secures fire and heat-effects when neighbors burn.
flft_fastfire = 0x40, // Suppress use of fire_countdown, resulting in faster fire.
flft_initfire = 0x80 // Start burning (forcefire on init-message).
// Note that only flft_burnable and flft_noash are really used as traits.
// The others are 0 by default for all floors, but used as selectors
// for has_firetype. (Future use for special floors not excluded.)
};
struct FloorTraits {
// Variables
string name;
double friction;
double mousefactor;
FloorFlags flags;
FloorFireType firetype;
string firetransform; // fire on the same tile
string heattransform; // fire on neighboring tile
// Constructor
FloorTraits (const char *n, double f, double m,
FloorFlags flags_, FloorFireType flft = flft_default,
const char *ft = "", const char *ht = "")
: name(n), friction(f), mousefactor(m), flags(flags_),
firetype(flft), firetransform(ft), heattransform(ht)
{}
};
enum FloorHeatFlags {
// These are used as second argument to try_heating and try_ignite,
// they contain the context of a call.
flhf_message = 0, // Source is a user-message.
flhf_fire = 0x01, // Source is fire.
flhf_first = 0x02, // First heat message from a burning site.
flhf_last = 0x04 // Last heat message from a burning site.
};
class Floor : public GridObject {
public:
Floor (const FloorTraits &tr);
Floor (const char *kind, double friction_, double mfactor,
FloorFlags flags=flf_default, FloorFireType flft = flft_default,
const char *firetransform_ = "", const char *heattransform_ = "");
// Object interface
Floor *clone();
void dispose();
virtual Value message(const string& msg, const Value &val);
// Floor interface
virtual ecl::V2 process_mouseforce (Actor *a, ecl::V2 force);
virtual void add_force(Actor *, ecl::V2 &); // Note: actor = 0 must be allowed!
virtual void on_drop (Item *) {}
virtual void on_pickup (Item *) {}
virtual void stone_change(Stone *) {}
virtual void actor_contact (Actor *) {}
virtual double friction() const;
virtual double mousefactor() const;
virtual void get_sink_speed (double &sinkspeed, double &raisespeed) const;
virtual bool is_destructible() const;
virtual void animcb();
void on_burnable_animcb(bool justIgnited); // Called by burnable-items on it.
protected:
// GridObject interface
void set_model (const std::string &mname);
display::Model *get_model ();
void kill_model (GridPos p);
// Fire interface
virtual bool has_firetype(FloorFireType selector);
virtual string get_firetransform();
virtual string get_heattransform(bool override_mode);
void heat_neighbor(Direction dir, FloorHeatFlags flhf);
int get_fire_countdown();
virtual bool on_heattransform(Direction sourcedir, FloorHeatFlags flhf);
private:
virtual void on_actorhit(Actor * /*a*/) {}
// Fire logic
Value try_heating(Direction sourcedir, FloorHeatFlags flhf);
Value try_ignite(Direction sourcedir, FloorHeatFlags flhf);
Value force_fire();
Value stop_fire(bool is_message);
FloorTraits traits;
bool heating_animation;
int fire_countdown; // used to delay ignition, default is 1.
};
void InitFloors();
}
#endif