summaryrefslogtreecommitdiff
path: root/src/map
diff options
context:
space:
mode:
Diffstat (limited to 'src/map')
-rw-r--r--src/map/clif.c14
-rw-r--r--src/map/clif.h2
-rw-r--r--src/map/intif.c12
-rw-r--r--src/map/pc.h1
-rw-r--r--src/map/quest.c53
-rw-r--r--src/map/quest.h12
6 files changed, 52 insertions, 42 deletions
diff --git a/src/map/clif.c b/src/map/clif.c
index 06a51354f..515d7642a 100644
--- a/src/map/clif.c
+++ b/src/map/clif.c
@@ -12626,12 +12626,12 @@ void clif_send_questlog_info(struct map_session_data * sd)
{
WFIFOL(fd, i*104+8) = sd->quest_log[i].quest_id;
WFIFOL(fd, i*104+16) = sd->quest_log[i].time;
- WFIFOW(fd, i*104+20) = sd->quest_log[i].num_objectives;
+ WFIFOW(fd, i*104+20) = quest_db[sd->quest_index[i]].num_objectives;
- for( j = 0 ; j < sd->quest_log[i].num_objectives; j++ )
+ for( j = 0 ; j < quest_db[sd->quest_index[i]].num_objectives; j++ )
{
WFIFOW(fd, i*104+26+j*30) = sd->quest_log[i].count[j];
- mob = mob_db(sd->quest_log[i].mob[j]);
+ mob = mob_db(quest_db[sd->quest_index[i]].mob[j]);
memcpy(WFIFOP(fd, i*104+28+j*30), mob?mob->jname:"NULL", NAME_LENGTH);
}
}
@@ -12641,7 +12641,7 @@ void clif_send_questlog_info(struct map_session_data * sd)
//Send info when objective info needs an update
//* 02B3 <quest_id>.L <state>.B <ignored>.L <time>.L <num mobs>.W {<ignored>.L <mob count>.W <Mob Name>.24B}.30B[3]
-void clif_send_quest_info(struct map_session_data * sd, struct quest * qd)
+void clif_send_quest_info(struct map_session_data * sd, struct quest * qd, int index)
{
int fd = sd->fd;
int i;
@@ -12653,12 +12653,12 @@ void clif_send_quest_info(struct map_session_data * sd, struct quest * qd)
WFIFOL(fd, 2) = qd->quest_id;
WFIFOB(fd, 6) = qd->state;
WFIFOL(fd, 11) = qd->time;
- WFIFOW(fd, 15) = qd->num_objectives;
+ WFIFOW(fd, 15) = quest_db[index].num_objectives;
- for( i = 0; i < qd->num_objectives; i++ )
+ for( i = 0; i < quest_db[index].num_objectives; i++ )
{
WFIFOW(fd, i*30+21) = qd->count[i];
- mob = mob_db(qd->mob[i]);
+ mob = mob_db(quest_db[index].mob[i]);
memcpy(WFIFOP(fd, i*30+23), mob?mob->jname:"NULL", NAME_LENGTH);
}
diff --git a/src/map/clif.h b/src/map/clif.h
index 30491ec4c..18ab320ef 100644
--- a/src/map/clif.h
+++ b/src/map/clif.h
@@ -434,7 +434,7 @@ void clif_equipcheckbox(struct map_session_data* sd);
//quest system [Kevin] [Inkfish]
void clif_send_questlog(struct map_session_data * sd);
void clif_send_questlog_info(struct map_session_data * sd);
-void clif_send_quest_info(struct map_session_data * sd, struct quest * qd);
+void clif_send_quest_info(struct map_session_data * sd, struct quest * qd, int index);
void clif_send_quest_delete(struct map_session_data * sd, int quest_id);
void clif_send_quest_status(struct map_session_data * sd, int quest_id, bool active);
diff --git a/src/map/intif.c b/src/map/intif.c
index 204fbe497..9643338fa 100644
--- a/src/map/intif.c
+++ b/src/map/intif.c
@@ -1354,6 +1354,18 @@ int intif_parse_questlog(int fd)
for( i = 0; i < sd->num_quests; i++ )
{
memcpy(&sd->quest_log[i], RFIFOP(fd, i*sizeof(struct quest)+8), sizeof(struct quest));
+
+ sd->quest_index[i] = quest_search_db(sd->quest_log[i].quest_id);
+
+ if( sd->quest_index[i] < 0 )
+ {
+ ShowError("intif_parse_questlog: quest %d not found in DB.\n",sd->quest_log[i].quest_id);
+ sd->avail_quests--;
+ sd->num_quests--;
+ i--;
+ continue;
+ }
+
if( sd->quest_log[i].state == Q_COMPLETE )
sd->avail_quests--;
}
diff --git a/src/map/pc.h b/src/map/pc.h
index 18f8f978e..8695d78b2 100644
--- a/src/map/pc.h
+++ b/src/map/pc.h
@@ -385,6 +385,7 @@ struct map_session_data {
//Quest log system [Kevin] [Inkfish]
int num_quests;
int avail_quests;
+ int quest_index[MAX_QUEST_DB];
struct quest quest_log[MAX_QUEST_DB];
// temporary debug [flaviojs]
diff --git a/src/map/quest.c b/src/map/quest.c
index 386a030b9..fa417d614 100644
--- a/src/map/quest.c
+++ b/src/map/quest.c
@@ -33,15 +33,6 @@
#include <stdarg.h>
#include <time.h>
-struct s_quest_db {
- int id;
- unsigned int time;
- int mob[MAX_QUEST_OBJECTIVES];
- int count[MAX_QUEST_OBJECTIVES];
- //char name[NAME_LENGTH];
-};
-struct s_quest_db quest_db[MAX_QUEST_DB];
-
int quest_search_db(int quest_id)
{
int i;
@@ -68,7 +59,7 @@ int quest_pc_login(TBL_PC * sd)
int quest_add(TBL_PC * sd, int quest_id)
{
- int i, j, count;
+ int i, j;
if( sd->num_quests >= MAX_QUEST_DB )
{
@@ -96,14 +87,12 @@ int quest_add(TBL_PC * sd, int quest_id)
if( quest_db[j].time )
sd->quest_log[i].time = (unsigned int)(time(NULL) + quest_db[j].time);
sd->quest_log[i].state = Q_ACTIVE;
- for( count = 0; count < MAX_QUEST_OBJECTIVES && quest_db[j].mob[count]; count++ )
- sd->quest_log[i].mob[count] = quest_db[j].mob[count];
- sd->quest_log[i].num_objectives = count;
+ sd->quest_index[i] = j;
sd->num_quests++;
sd->avail_quests++;
- clif_send_quest_info(sd, &sd->quest_log[i]);
+ clif_send_quest_info(sd, &sd->quest_log[i], sd->quest_index[i]);
if( save_settings&64 )
chrif_save(sd,0);
@@ -114,7 +103,7 @@ int quest_add(TBL_PC * sd, int quest_id)
int quest_change(TBL_PC * sd, int qid1, int qid2)
{
- int i, j, count;
+ int i, j;
if( quest_check(sd, qid2, HAVEQUEST) >= 0 )
{
@@ -146,12 +135,11 @@ int quest_change(TBL_PC * sd, int qid1, int qid2)
if( quest_db[j].time )
sd->quest_log[i].time = (unsigned int)(time(NULL) + quest_db[j].time);
sd->quest_log[i].state = Q_ACTIVE;
- for( count = 0; count < MAX_QUEST_OBJECTIVES && quest_db[j].mob[count]; count++ )
- sd->quest_log[i].mob[count] = quest_db[j].mob[count];
- sd->quest_log[i].num_objectives = count;
+
+ sd->quest_index[i] = j;
clif_send_quest_delete(sd, qid1);
- clif_send_quest_info(sd, &sd->quest_log[i]);
+ clif_send_quest_info(sd, &sd->quest_log[i], sd->quest_index[i]);
if( save_settings&64 )
chrif_save(sd,0);
@@ -195,7 +183,7 @@ void quest_update_objective(TBL_PC * sd, int mob)
continue;
for( j = 0; j < MAX_QUEST_OBJECTIVES; j++ )
- if( sd->quest_log[i].mob[j] == mob )
+ if( quest_db[sd->quest_index[i]].mob[j] == mob && sd->quest_log[i].count[j] < quest_db[sd->quest_index[i]].count[j] )
{
sd->quest_log[i].count[j]++;
@@ -259,13 +247,7 @@ int quest_check(TBL_PC * sd, int quest_id, quest_check_type type)
return (sd->quest_log[i].time < (unsigned int)time(NULL) ? 2 : sd->quest_log[i].state == Q_COMPLETE ? 1 : 0);
case HUNTING:
{
- int j = quest_search_db(quest_id);
-
- if( j < 0 )
- {
- ShowError("quest_check_quest: quest %d not found in DB.\n",quest_id);
- return -1;
- }
+ int j = sd->quest_index[i];
if( sd->quest_log[i].count[0] < quest_db[j].count[0] || sd->quest_log[i].count[1] < quest_db[j].count[1] || sd->quest_log[i].count[2] < quest_db[j].count[2] )
{
@@ -289,7 +271,7 @@ int quest_read_db(void)
{
FILE *fp;
char line[1024];
- int j,k = 0;
+ int i,j,k = 0;
char *str[20],*p,*np;
sprintf(line, "%s/quest_db.txt", db_path);
@@ -325,12 +307,15 @@ int quest_read_db(void)
quest_db[k].id = atoi(str[0]);
quest_db[k].time = atoi(str[1]);
- quest_db[k].mob[0] = atoi(str[2]);
- quest_db[k].count[0] = atoi(str[3]);
- quest_db[k].mob[1] = atoi(str[4]);
- quest_db[k].count[1] = atoi(str[5]);
- quest_db[k].mob[2] = atoi(str[6]);
- quest_db[k].count[2] = atoi(str[7]);
+ for( i = 0; i < MAX_QUEST_OBJECTIVES; i++ )
+ {
+ quest_db[k].mob[i] = atoi(str[2*i+2]);
+ quest_db[k].count[i] = atoi(str[2*i+3]);
+
+ if( !quest_db[k].mob[i] || !quest_db[k].count[i] )
+ break;
+ }
+ quest_db[k].num_objectives = i;
//memcpy(quest_db[k].name, str[8], sizeof(str[8]));
k++;
}
diff --git a/src/map/quest.h b/src/map/quest.h
index 8d76a40a4..505d2047b 100644
--- a/src/map/quest.h
+++ b/src/map/quest.h
@@ -4,6 +4,16 @@
#ifndef _QUEST_H_
#define _QUEST_H_
+struct s_quest_db {
+ int id;
+ unsigned int time;
+ int mob[MAX_QUEST_OBJECTIVES];
+ int count[MAX_QUEST_OBJECTIVES];
+ int num_objectives;
+ //char name[NAME_LENGTH];
+};
+struct s_quest_db quest_db[MAX_QUEST_DB];
+
typedef enum quest_check_type { HAVEQUEST, PLAYTIME, HUNTING } quest_check_type;
int quest_pc_login(TBL_PC * sd);
@@ -15,6 +25,8 @@ void quest_update_objective(TBL_PC * sd, int mob);
int quest_update_status(TBL_PC * sd, int quest_id, quest_state status);
int quest_check(TBL_PC * sd, int quest_id, quest_check_type type);
+int quest_search_db(int quest_id);
+
void do_init_quest();
#endif