summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKisuka <kisuka@kisuka.com>2013-10-28 00:42:23 -0700
committerKisuka <kisuka@kisuka.com>2013-10-28 00:42:23 -0700
commit124ab2a1cdb344f24170a4d91f7000ebabf39b40 (patch)
treeebc5aeee49da96f88e55358c184d69d90eae9289 /src
parente7efdfe96e1b4c288bca845c03512da6842d6425 (diff)
downloadhercules-124ab2a1cdb344f24170a4d91f7000ebabf39b40.tar.gz
hercules-124ab2a1cdb344f24170a4d91f7000ebabf39b40.tar.bz2
hercules-124ab2a1cdb344f24170a4d91f7000ebabf39b40.tar.xz
hercules-124ab2a1cdb344f24170a4d91f7000ebabf39b40.zip
Added ability to use constants instead of sprite IDs for NPCs. Converted all npcs to use this.
Diffstat (limited to 'src')
-rw-r--r--src/map/npc.c72
-rw-r--r--src/map/npc.h4
2 files changed, 70 insertions, 6 deletions
diff --git a/src/map/npc.c b/src/map/npc.c
index ff95cf82d..e5a72df83 100644
--- a/src/map/npc.c
+++ b/src/map/npc.c
@@ -2013,6 +2013,67 @@ void npc_parsename(struct npc_data* nd, const char* name, const char* start, con
}
}
+// Parse View
+// Support for using Constants in place of NPC View IDs.
+int npc_parseview(const char* w4, const char* start, const char* buffer, const char* filepath) {
+ int num, val, i = 0;
+ char viewid[1024];
+
+ // Check if view (w4) has a comma (Work around for Duplicate types).
+ if(strstr(w4, ",") != NULL) {
+ num = strstr(w4, ",") - w4;
+ strncpy(viewid, w4, num); // Strip view from w4.
+ viewid[num] = 0;
+ }else{
+ strcpy(viewid, w4);
+ }
+
+ // Remove any in-line whitspacing / comments
+ while (viewid[i] != '\0') {
+ if (isspace(viewid[i]))
+ {
+ viewid[i] = 0;
+ break;
+ }
+
+ viewid[i] = viewid[i];
+ i++;
+ }
+
+ // Check if view is not an ID (only numbers).
+ if(!npc->viewisid(viewid))
+ {
+ // Check if constant exists and get its value.
+ if(!script->get_constant(viewid, &val)) {
+ ShowWarning("npc_parseview: Invalid NPC constant '%s' specified in file '%s', line'%d'. Defaulting to INVISIBLE_CLASS. \n", viewid, filepath, strline(buffer,start-buffer));
+ val = INVISIBLE_CLASS;
+ }
+ } else {
+ // NPC has ID specified for view.
+ val = atoi(w4);
+ }
+
+ if(val == -1)
+ val = INVISIBLE_CLASS;
+
+ return val;
+}
+
+// View is ID
+// Checks if given view is an ID or constant.
+bool npc_viewisid(const char * viewid)
+{
+ if(atoi(viewid) != -1)
+ {
+ // Loop through view, looking for non-numeric character.
+ while (*viewid) {
+ if (isdigit(*viewid++) == 0) return false;
+ }
+ }
+
+ return true;
+}
+
//Add then display an npc warp on map
struct npc_data* npc_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) {
int i, flag = 0;
@@ -2220,7 +2281,7 @@ const char* npc_parse_shop(char* w1, char* w2, char* w3, char* w4, const char* s
nd->bl.y = y;
nd->bl.id = npc->get_new_npc_id();
npc->parsename(nd, w3, start, buffer, filepath);
- nd->class_ = m==-1?-1:atoi(w4);
+ nd->class_ = m == -1 ? -1 : npc->parseview(w4, start, buffer, filepath);
nd->speed = 200;
++npc_shop;
@@ -2383,14 +2444,13 @@ const char* npc_parse_script(char* w1, char* w2, char* w3, char* w4, const char*
CREATE(nd, struct npc_data, 1);
- if( sscanf(w4, "%d,%d,%d", &class_, &xs, &ys) == 3 )
+ if( sscanf(w4, "%*[^,],%d,%d", &xs, &ys) == 2 )
{// OnTouch area defined
nd->u.scr.xs = xs;
nd->u.scr.ys = ys;
}
else
{// no OnTouch area
- class_ = atoi(w4);
nd->u.scr.xs = -1;
nd->u.scr.ys = -1;
}
@@ -2401,7 +2461,7 @@ const char* npc_parse_script(char* w1, char* w2, char* w3, char* w4, const char*
nd->bl.y = y;
npc->parsename(nd, w3, start, buffer, filepath);
nd->bl.id = npc->get_new_npc_id();
- nd->class_ = class_;
+ nd->class_ = m == -1 ? -1 : npc->parseview(w4, start, buffer, filepath);
nd->speed = 200;
nd->u.scr.script = scriptroot;
nd->u.scr.label_list = label_list;
@@ -2530,7 +2590,7 @@ const char* npc_parse_duplicate(char* w1, char* w2, char* w3, char* w4, const ch
nd->bl.y = y;
npc->parsename(nd, w3, start, buffer, filepath);
nd->bl.id = npc->get_new_npc_id();
- nd->class_ = class_;
+ nd->class_ = m == -1 ? -1 : npc->parseview(w4, start, buffer, filepath);
nd->speed = 200;
nd->src_id = src_id;
nd->bl.type = BL_NPC;
@@ -4045,6 +4105,8 @@ void npc_defaults(void) {
npc->addsrcfile = npc_addsrcfile;
npc->delsrcfile = npc_delsrcfile;
npc->parsename = npc_parsename;
+ npc->parseview = npc_parseview;
+ npc->viewisid = npc_viewisid;
npc->add_warp = npc_add_warp;
npc->parse_warp = npc_parse_warp;
npc->parse_shop = npc_parse_shop;
diff --git a/src/map/npc.h b/src/map/npc.h
index e1ec6e5e4..5ec201e55 100644
--- a/src/map/npc.h
+++ b/src/map/npc.h
@@ -92,7 +92,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)
@@ -197,6 +197,8 @@ 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);