summaryrefslogtreecommitdiff
path: root/src/map/npc.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/map/npc.h')
-rw-r--r--src/map/npc.h109
1 files changed, 84 insertions, 25 deletions
diff --git a/src/map/npc.h b/src/map/npc.h
index f809cb19c..346a9f8c0 100644
--- a/src/map/npc.h
+++ b/src/map/npc.h
@@ -2,16 +2,33 @@
// See the LICENSE file
// Portions Copyright (c) Athena Dev Teams
-#ifndef _NPC_H_
-#define _NPC_H_
+#ifndef _MAP_NPC_H_
+#define _MAP_NPC_H_
#include "map.h" // struct block_list
#include "status.h" // struct status_change
#include "unit.h" // struct unit_data
+
+struct HPluginData;
struct block_list;
struct npc_data;
struct view_data;
+enum npc_parse_options {
+ NPO_NONE = 0x0,
+ NPO_ONINIT = 0x1,
+ NPO_TRADER = 0x2,
+};
+
+enum npc_shop_types {
+ NST_ZENY,/* default */
+ NST_CASH,/* official npc cash shop */
+ NST_MARKET,/* official npc market type */
+ NST_CUSTOM,
+ /* */
+ NST_MAX,
+};
+
struct npc_timerevent_list {
int timer,pos;
};
@@ -20,9 +37,16 @@ struct npc_label_list {
int pos;
};
struct npc_item_list {
- unsigned int nameid,value;
+ unsigned short nameid;
+ unsigned int value;
+ unsigned int qty;
};
-
+struct npc_shop_data {
+ unsigned char type;/* what am i */
+ struct npc_item_list *item;/* list */
+ unsigned short items;/* total */
+};
+struct npc_parse;
struct npc_data {
struct block_list bl;
struct unit_data *ud;
@@ -35,7 +59,7 @@ struct npc_data {
char exname[NAME_LENGTH+1];// unique npc name
int chat_id;
int touching_id;
- unsigned int next_walktime;
+ int64 next_walktime;
uint8 dir;
unsigned size : 2;
@@ -44,7 +68,7 @@ struct npc_data {
unsigned short level;
unsigned short stat_point;
- void* chatdb; // pointer to a npc_parse struct (see npc_chat.c)
+ struct npc_parse *chatdb;
char* path;/* path dir */
enum npc_subtype subtype;
int src_id;
@@ -54,14 +78,17 @@ struct npc_data {
short xs,ys; // OnTouch area radius
int guild_id;
int timer,timerid,timeramount,rid;
- unsigned int timertick;
+ int64 timertick;
struct npc_timerevent_list *timer_event;
int label_list_num;
struct npc_label_list *label_list;
+ /* */
+ struct npc_shop_data *shop;
+ bool trader;
} scr;
- struct {
+ struct { /* TODO duck this as soon as the new shop formatting is deemed stable */
struct npc_item_list* shop_item;
- int count;
+ unsigned short count;
} shop;
struct {
short xs,ys; // OnTouch area radius
@@ -74,10 +101,12 @@ struct npc_data {
char killer_name[NAME_LENGTH];
} tomb;
} u;
+ /* HPData Support for npc_data */
+ struct HPluginData **hdata;
+ unsigned int hdatac;
};
-
#define START_NPC_NUM 110000000
enum actor_classes {
@@ -92,7 +121,7 @@ enum actor_classes {
#define MAX_NPC_CLASS 1000
// New NPC range
#define MAX_NPC_CLASS2_START 10000
-#define MAX_NPC_CLASS2_END 10049
+#define MAX_NPC_CLASS2_END 10070
//Checks if a given id is a valid npc id. [Skotlex]
//Since new npcs are added all the time, the max valid value is the one before the first mob (Scorpion = 1001)
@@ -139,8 +168,11 @@ struct npc_interface {
struct npc_data *fake_nd;
struct npc_src_list *src_files;
struct unit_data base_ud;
+ /* npc trader global data, for ease of transition between the script, cleared on every usage */
+ bool trader_ok;
+ int trader_funds[2];
/* */
- int (*init) (void);
+ int (*init) (bool minimal);
int (*final) (void);
/* */
int (*get_new_npc_id) (void);
@@ -160,14 +192,14 @@ struct npc_interface {
int (*event_do) (const char *name);
int (*event_doall_id) (const char *name, int rid);
int (*event_doall) (const char *name);
- int (*event_do_clock) (int tid, unsigned int tick, int id, intptr_t data);
+ int (*event_do_clock) (int tid, int64 tick, int id, intptr_t data);
void (*event_do_oninit) (void);
int (*timerevent_export) (struct npc_data *nd, int i);
- int (*timerevent) (int tid, unsigned int tick, int id, intptr_t data);
+ int (*timerevent) (int tid, int64 tick, int id, intptr_t data);
int (*timerevent_start) (struct npc_data *nd, int rid);
int (*timerevent_stop) (struct npc_data *nd);
void (*timerevent_quit) (struct map_session_data *sd);
- int (*gettimerevent_tick) (struct npc_data *nd);
+ int64 (*gettimerevent_tick) (struct npc_data *nd);
int (*settimerevent_tick) (struct npc_data *nd, int newtimer);
int (*event) (struct map_session_data *sd, const char *eventname, int ontouch);
int (*touch_areanpc_sub) (struct block_list *bl, va_list ap);
@@ -197,12 +229,14 @@ struct npc_interface {
void (*addsrcfile) (const char *name);
void (*delsrcfile) (const char *name);
void (*parsename) (struct npc_data *nd, const char *name, const char *start, const char *buffer, const char *filepath);
+ int (*parseview) (const char *w4, const char *start, const char *buffer, const char *filepath);
+ bool (*viewisid) (const char *viewid);
struct npc_data* (*add_warp) (char *name, short from_mapid, short from_x, short from_y, short xs, short ys, unsigned short to_mapindex, short to_x, short to_y);
const char* (*parse_warp) (char *w1, char *w2, char *w3, char *w4, const char *start, const char *buffer, const char *filepath);
const char* (*parse_shop) (char *w1, char *w2, char *w3, char *w4, const char *start, const char *buffer, const char *filepath);
void (*convertlabel_db) (struct npc_label_list *label_list, const char *filepath);
const char* (*skip_script) (const char *start, const char *buffer, const char *filepath);
- const char* (*parse_script) (char *w1, char *w2, char *w3, char *w4, const char *start, const char *buffer, const char *filepath, bool runOnInit);
+ const char* (*parse_script) (char *w1, char *w2, char *w3, char *w4, const char *start, const char *buffer, const char *filepath, int options);
const char* (*parse_duplicate) (char *w1, char *w2, char *w3, char *w4, const char *start, const char *buffer, const char *filepath);
int (*duplicate4instance) (struct npc_data *snd, int16 m);
void (*setcells) (struct npc_data *nd);
@@ -216,7 +250,7 @@ struct npc_interface {
void (*parse_mob2) (struct spawn_data *mobspawn);
const char* (*parse_mob) (char *w1, char *w2, char *w3, char *w4, const char *start, const char *buffer, const char *filepath);
const char* (*parse_mapflag) (char *w1, char *w2, char *w3, char *w4, const char *start, const char *buffer, const char *filepath);
- void (*parsesrcfile) (const char *filepath, bool runOnInit);
+ int (*parsesrcfile) (const char *filepath, bool runOnInit);
int (*script_event) (struct map_session_data *sd, enum npce_event type);
void (*read_event_script) (void);
int (*path_db_clear_sub) (DBKey key, DBData *data, va_list args);
@@ -226,10 +260,20 @@ struct npc_interface {
void (*do_clear_npc) (void);
void (*debug_warps_sub) (struct npc_data *nd);
void (*debug_warps) (void);
+ /* */
+ void (*trader_count_funds) (struct npc_data *nd, struct map_session_data *sd);
+ bool (*trader_pay) (struct npc_data *nd, struct map_session_data *sd, int price, int points);
+ void (*trader_update) (int master);
+ int (*market_buylist) (struct map_session_data* sd, unsigned short list_size, struct packet_npc_market_purchase *p);
+ bool (*trader_open) (struct map_session_data *sd, struct npc_data *nd);
+ void (*market_fromsql) (void);
+ void (*market_tosql) (struct npc_data *nd, unsigned short index);
+ void (*market_delfromsql) (struct npc_data *nd, unsigned short index);
+ void (*market_delfromsql_sub) (const char *npcname, unsigned short index);
/**
* For the Secure NPC Timeout option (check config/Secure.h) [RR]
**/
- int (*secure_timeout_timer) (int tid, unsigned int tick, int id, intptr_t data);
+ int (*secure_timeout_timer) (int tid, int64 tick, int id, intptr_t data);
};
struct npc_interface *npc;
@@ -259,12 +303,6 @@ struct pcrematch_set {
/*
* Entire data structure hung off a NPC
- *
- * The reason I have done it this way (a void * in npc_data and then
- * this) was to reduce the number of patches that needed to be applied
- * to a ragnarok distribution to bring this code online. I
- * also wanted people to be able to grab this one file to get updates
- * without having to do a large number of changes.
*/
struct npc_parse {
struct pcrematch_set* active;
@@ -285,7 +323,28 @@ struct npc_chat_interface {
struct npc_chat_interface *npc_chat;
+/**
+ * pcre interface (libpcre)
+ * so that plugins may share and take advantage of the core's pcre
+ * should be moved into core/perhaps its own file once hpm is enhanced for login/char
+ **/
+struct pcre_interface {
+ pcre *(*compile) (const char *pattern, int options, const char **errptr, int *erroffset, const unsigned char *tableptr);
+ pcre_extra *(*study) (const pcre *code, int options, const char **errptr);
+ int (*exec) (const pcre *code, const pcre_extra *extra, PCRE_SPTR subject, int length, int startoffset, int options, int *ovector, int ovecsize);
+ void (*free) (void *ptr);
+ int (*copy_substring) (const char *subject, int *ovector, int stringcount, int stringnumber, char *buffer, int buffersize);
+ void (*free_substring) (const char *stringptr);
+ int (*copy_named_substring) (const pcre *code, const char *subject, int *ovector, int stringcount, const char *stringname, char *buffer, int buffersize);
+ int (*get_substring) (const char *subject, int *ovector, int stringcount, int stringnumber, const char **stringptr);
+};
+
+struct pcre_interface *libpcre;
+
+/**
+ * Also defaults libpcre
+ **/
void npc_chat_defaults(void);
#endif
-#endif /* _NPC_H_ */
+#endif /* _MAP_NPC_H_ */