00001 #ifndef CRONOUS_ENV_HH_
00002 # define CRONOUS_ENV_HH_
00003
00004 # include <map>
00005 # include <list>
00006
00007 # include "infos_fwd.hh"
00008 # include "objects_fwd.hh"
00009 # include "packets_fwd.hh"
00010 # include "connection_fwd.hh"
00011 # include "environment_fwd.hh"
00012 # include "rxtools_fwd.hh"
00013 # include "characters_available.hh"
00014 # include "items.hh"
00015 # include "tasks_fwd.hh"
00016 # include "skills.hh"
00017 # include "events.hh"
00018
00019 # define DEST_RANGE_X 10
00020 # define DEST_RANGE_Y 10
00021 # define DEST_RANGE_Z 1
00022 # define MOTION_RANGE_X 3
00023 # define MOTION_RANGE_Y 3
00024 # define MOTION_RANGE_Z 1
00025
00026 namespace environment
00027 {
00028 class CronousEnv : public events::EventManager
00029 {
00030 public:
00031 enum EventID
00032 {
00033 event_chat = 0x00,
00034 event_motion = 0x01
00035 };
00036
00037 public:
00038 enum State
00039 {
00040 state_news,
00041 state_login,
00042 state_select_character,
00043 state_start_character,
00044 state_game
00045 };
00046 typedef std::map<int, objects::Character *> IntToCharacterMap;
00047 typedef std::map<std::string, objects::Character *> StringToCharacterMap;
00048 typedef std::list<int> IntList;
00049 typedef std::set<int> IntSet;
00050 typedef std::set<const objects::HealingItem *> HealingItemSet;
00051
00052 public:
00053 CronousEnv();
00054 ~CronousEnv();
00055
00056 static CronousEnv &get_instance();
00057 static bool initialized();
00058 static void restart();
00059
00060
00061 void process_read(connection::ServerConnection &sc);
00062 void report_packet_sent(connection::ServerConnection &sc,
00063 packets::DataPacket &p);
00064 void report_packet_received(connection::ServerConnection &sc,
00065 packets::DataPacket &p);
00066
00067 const infos::CharactersAvailable *get_characters_available() const;
00068 const infos::CharactersAvailable::CharactersType &get_characters() const;
00069 void set_characters_available(infos::CharactersAvailable &);
00070
00071 int get_state() const;
00072 void change_state(int state);
00073 int get_substate() const;
00074 void set_substate(int s);
00075
00076 protected:
00077 int _state;
00078 int _substate;
00079 infos::CharactersAvailable *_characters_available;
00080 infos::CharactersAvailable::CharactersType *_characters;
00081 void time_report();
00082
00083 public:
00084 int get_pos_x() const;
00085 int get_pos_y() const;
00086 int get_pos_z() const;
00087 void set_pos_x(int x);
00088 void set_pos_y(int y);
00089 void set_pos_z(int z);
00090 int get_dest_x() const;
00091 int get_dest_y() const;
00092 int get_dest_z() const;
00093 void set_dest_x(int x);
00094 void set_dest_y(int y);
00095 void set_dest_z(int z);
00096 void start_pos_report();
00097 bool is_moving() const;
00098 int get_angle() const;
00099 void set_angle(int degrees);
00100
00101
00102 const objects::DefMap *get_current_map() const;
00103 void set_current_map(const objects::DefMap &map);
00104 const objects::DefMap *get_scroll_map() const;
00105 void set_scroll_map(const objects::DefMap &map);
00106 const objects::DefMap *get_home_map() const;
00107 void set_home_map(const objects::DefMap &map);
00108 bool is_warping() const;
00109 void set_warping(bool b);
00110
00111
00112 void set_dest_node(const objects::MapNode &n);
00113 int calculate_distance(const objects::MapNode &mn) const;
00114
00115 protected:
00116 int _pos_x;
00117 int _pos_y;
00118 int _pos_z;
00119 int _dest_x;
00120 int _dest_y;
00121 int _dest_z;
00122 int _angle;
00123 rxtimer::RxTimer *_pos_report_timer;
00124 const objects::DefMap *_current_map;
00125 const objects::DefMap *_scroll_map;
00126 const objects::DefMap *_home_map;
00127 bool _warping;
00128
00129 public:
00130 objects::Character *get_character(int id);
00131 objects::Character *get_character(std::string name);
00132 objects::Character *get_screen_character(int id);
00133 void add_character(objects::Character *c);
00134 void add_character_to_screen(objects::Character *c);
00135 void remove_character_from_screen(int id);
00136 const IntToCharacterMap &get_id_map() const;
00137 const IntToCharacterMap &get_screen_id_map() const;
00138 const StringToCharacterMap &get_name_map() const;
00139 objects::Character *get_player_character() const;
00140
00141 int calculate_distance(const objects::Character &c) const;
00142 objects::Character *get_closest_npc();
00143
00144 protected:
00145 IntToCharacterMap _id_map;
00146 IntToCharacterMap _screen_id_map;
00147 StringToCharacterMap _name_map;
00148 objects::Character *_player_character;
00149
00150 public:
00151 int get_status_flag() const;
00152 void set_status_flag(int i);
00153 bool get_can_attack() const;
00154 void set_can_attack(bool can);
00155 const std::string &get_name() const;
00156 int get_class() const;
00157 int get_level() const;
00158 int get_str_status_points() const;
00159 int get_sta_status_points() const;
00160 int get_dex_status_points() const;
00161 int get_int_status_points() const;
00162 int get_fame() const;
00163 int get_free_status_points() const;
00164 int get_free_skill_points() const;
00165 int get_money_in_hand() const;
00166 int get_money_in_bank() const;
00167 void set_name(const std::string &s);
00168 void set_class(int i);
00169 void set_level(int i);
00170 void set_str_status_points(int i);
00171 void set_sta_status_points(int i);
00172 void set_dex_status_points(int i);
00173 void set_int_status_points(int i);
00174 void set_fame(int i);
00175 void set_free_status_points(int i);
00176 void set_free_skill_points(int i);
00177 void set_money_in_hand(int i);
00178 void set_money_in_bank(int i);
00179
00180 void push_assigned_status(int status_id);
00181 void report_status_assigning(int code);
00182 void check_support_skills();
00183
00184 bool get_alive() const;
00185 void set_alive(bool alive);
00186
00187 protected:
00188 int _status_flag;
00189 bool _can_attack;
00190 bool _alive;
00191
00192 std::string _name;
00193 int _class;
00194 int _level;
00195 int _str_status_points;
00196 int _sta_status_points;
00197 int _dex_status_points;
00198 int _int_status_points;
00199 int _fame;
00200 int _free_status_points;
00201 int _free_skill_points;
00202 int _money_in_hand;
00203 int _money_in_bank;
00204
00205 IntList _assigned_status;
00206
00207 public:
00208 int get_hp() const;
00209 int get_mp() const;
00210 int get_weight() const;
00211 void set_hp(int i);
00212 void set_mp(int i);
00213 void set_weight(int i);
00214 int get_hp_max() const;
00215 int get_mp_max() const;
00216 void set_hp_max(int i);
00217 void set_mp_max(int i);
00218 int get_weight_max() const;
00219 void set_weight_max(int i);
00220
00221 double get_experience() const;
00222 void set_experience(double d);
00223
00224 protected:
00225 int _hp;
00226 int _mp;
00227 int _weight;
00228 int _hp_max;
00229 int _mp_max;
00230 int _weight_max;
00231 double _experience;
00232
00233 public:
00234 objects::Skills &get_skills();
00235
00236 void push_skill_id(int id);
00237 void assign_skill_level(int level);
00238
00239 void push_assigned_skill(int skill_id);
00240 void report_skill_assigning(int code);
00241
00242 bool can_use_skill() const;
00243 void report_skill_using(int skill_id, objects::Character &c);
00244 void push_auto_skill(int skill_id);
00245 void use_auto_skill();
00246
00247 protected:
00248 objects::Skills _skills;
00249 IntList _skill_list;
00250 IntList _assigned_skill;
00251 IntSet _auto_skills;
00252
00253 public:
00254 const objects::Items &get_items() const;
00255 objects::Items &get_items();
00256 int calculate_distance(const objects::ItemInScreen &iis) const;
00257 int get_last_item_info() const;
00258 void set_last_item_info(int id);
00259
00260
00261 void push_sold_item(int item_id);
00262 void report_selling(int code);
00263 int count_sold_items_in_queue();
00264 void push_used_item(int item_id);
00265 void report_using(int code);
00266 int count_used_items_in_queue();
00267 void push_repaired_item(int item_id);
00268 void report_repairing(int code);
00269 int count_repaired_items_in_queue();
00270 void push_traded_item(int item_id);
00271 void report_trading(int code);
00272 int count_traded_items_in_queue();
00273 void push_picked_item(int item_id);
00274 void report_picking(int code);
00275 int count_picked_items_in_queue();
00276
00277
00278 int get_amount_of_hp_healed() const;
00279 int get_amount_of_mp_healed() const;
00280 void reset_healing_stats();
00281 void report_healing(const objects::HealingItem &hi);
00282
00283
00284 const objects::HealingItem &get_hp_healing_item() const;
00285 const objects::HealingItem &get_mp_healing_item() const;
00286 objects::PossessedItem *get_best_hp_healing_item_in_hand(bool force);
00287 objects::PossessedItem *get_best_mp_healing_item_in_hand(bool force);
00288 void warp();
00289
00290 protected:
00291 objects::Items _items;
00292 IntList _sold_items;
00293 IntList _used_items;
00294 IntList _repaired_items;
00295 IntList _traded_items;
00296 IntList _picked_items;
00297 int _amount_of_hp_healed;
00298 int _amount_of_mp_healed;
00299 int _last_item_info;
00300
00301 public:
00302 const std::string &get_last_chat_message() const;
00303 const std::string &get_last_chat_character() const;
00304 void set_last_chat_message(const std::string &message);
00305 void set_last_chat_character(const std::string &character);
00306 void trim_chat_message(std::string &message);
00307
00308 protected:
00309 std::string _last_chat_message;
00310 std::string _last_chat_character;
00311
00312 public:
00313 void push_shop_item(int item_id);
00314 int count_shop_item_in_queue() const;
00315 void report_shop_item(int code);
00316
00317 protected:
00318 IntList _shop_items;
00319
00320 public:
00321 const tasks::Activity &get_current_activity() const;
00322 bool start_activity(tasks::Activity &activity);
00323
00324 protected:
00325 tasks::Activity *_current_activity;
00326
00327 public:
00328 void add_possessed_item_to_gui(objects::PossessedItem &pi);
00329 void add_possessed_item_to_gui(objects::PossessedItem &pi, int proto_id);
00330 };
00331 }
00332
00333 # include "cronous-env.hxx"
00334
00335 #endif