1 #include <QtConcurrent/QtConcurrent> 57 Q_ASSERT(messageManager != NULL);
58 Q_ASSERT(questManager != NULL);
59 Q_ASSERT(scriptManager != NULL);
114 QFileInfo info(tmppath);
122 if (!information->
mapTime().isNull() && information->
mapTime() >= info.lastModified())
124 foreach(QString exit, information->
exitsTo())
164 for (
int x = 0; x < 4; x++)
168 if (!QFileInfo(tmppath).exists()) {
169 printf(
" map %s doesn't exist in map %s, for tile %d.\n", exit_path, m->
path, x);
172 QString exit = exit_path;
182 for (
int x =
MAP_WIDTH(m)-1; x >= 0; x--)
202 if (!item->slaying) {
208 if (strcmp(item->slaying,
"/!"))
215 start = strstr(item->msg,
"\nfinal_map ");
216 if (!start && strncmp(item->msg,
"final_map", strlen(
"final_map")) == 0)
220 const char *end = strchr(start+1,
'\n');
222 start += strlen(
"final_map")+2;
223 strncpy(ep, start, end-start);
233 if (!QFileInfo(tmppath).exists()) {
234 printf(
" map %s doesn't exist in map %s, at %d, %d.\n", ep, m->
path, item->x, item->y);
236 QString exit = exit_path;
247 add_map(link, &info->exits_from);
248 add_map(info, &link->exits_to);
253 if (link && link != m) {
274 exp += item->stats.exp;
281 QMutexLocker lock(&
myLock);
283 qDebug() <<
"map without region" << m->
name << m->
path;
314 if (QFileInfo(path).exists()) {
335 qDebug() <<
"experience repartition:";
341 qDebug() <<
myToProcess.size() <<
"maps processed";
352 QMutexLocker lock(&
myLock);
358 QMutexLocker lock(&
myLock);
367 QFile file(settings.mapCacheDirectory() + QDir::separator() +
"maps_cache.xml");
368 file.open(QFile::ReadOnly);
370 QXmlStreamReader reader(&file);
371 bool hasMaps =
false;
374 while (!reader.atEnd())
378 if (reader.isStartElement() && reader.name() ==
"maps")
380 int version = reader.attributes().value(
"version").toString().toInt();
390 if (reader.isStartElement() && reader.name() ==
"map")
395 if (reader.isStartElement() && reader.name() ==
"path")
397 QString path = reader.readElementText();
403 if (reader.isStartElement() && reader.name() ==
"name")
405 map->
setName(reader.readElementText());
408 if (reader.isStartElement() && reader.name() ==
"lastModified")
410 QString date = reader.readElementText();
411 map->
setMapTime(QDateTime::fromString(date, Qt::ISODate));
414 if (reader.isStartElement() && reader.name() ==
"level")
416 map->
setLevel(reader.readElementText().toInt());
418 if (reader.isStartElement() && reader.name() ==
"experience")
422 if (reader.isStartElement() && reader.name() ==
"region")
424 map->
setRegion(reader.readElementText());
426 if (reader.isStartElement() && reader.name() ==
"arch")
428 QString arch = reader.readElementText();
433 if (reader.isStartElement() && reader.name() ==
"exitTo")
435 QString path = reader.readElementText();
439 if (reader.isStartElement() && reader.name() ==
"accessedFrom")
441 QString path = reader.readElementText();
445 if (reader.isStartElement() && reader.name() ==
"messageFile")
447 QString file = reader.readElementText();
451 message->
maps().append(map);
454 if (reader.isStartElement() && reader.name() ==
"quest")
456 QString code = reader.readElementText();
460 quest->
maps().append(map);
463 if (reader.isStartElement() && reader.name() ==
"shopItem")
465 QString item = reader.attributes().value(
"name").toString();
466 int strength = reader.readElementText().toInt();
469 if (reader.isStartElement() && reader.name() ==
"shopGreed")
471 double greed = reader.readElementText().toDouble();
474 if (reader.isStartElement() && reader.name() ==
"shopRace")
478 if (reader.isStartElement() && reader.name() ==
"shopMin")
480 quint64 min = reader.readElementText().toULongLong();
483 if (reader.isStartElement() && reader.name() ==
"shopMax")
485 quint64 max = reader.readElementText().toULongLong();
488 if (reader.isStartElement() && reader.name() ==
"script")
490 int x = reader.attributes().value(
"x").toString().toInt();
491 int y = reader.attributes().value(
"x").toString().toInt();
492 QString item = reader.attributes().value(
"itemName").toString();
493 QString plugin = reader.attributes().value(
"pluginName").toString();
494 QString
event = reader.attributes().value(
"eventName").toString();
495 QString script = reader.readElementText();
498 if (reader.isStartElement() && reader.name() ==
"random_map")
500 int x = reader.attributes().value(
"x").toString().toInt();
501 int y = reader.attributes().value(
"y").toString().toInt();
502 QString params = reader.attributes().value(
"params").toString();
505 if (reader.isStartElement() && reader.name() ==
"background_music")
511 if (reader.isEndElement() && reader.name() ==
"map")
525 file.open(QFile::WriteOnly | QFile::Truncate);
527 QXmlStreamWriter writer(&file);
529 writer.setAutoFormatting(
true);
530 writer.writeStartDocument();
532 writer.writeStartElement(
"maps");
533 writer.writeAttribute(
"version",
"1");
538 writer.writeStartElement(
"map");
539 writer.writeTextElement(
"path", map->
path());
540 writer.writeTextElement(
"name", map->
name());
541 writer.writeTextElement(
"lastModified", map->
mapTime().toString(Qt::ISODate));
542 writer.writeTextElement(
"level", QString::number(map->
level()));
543 writer.writeTextElement(
"experience", QString::number(map->
experience()));
544 writer.writeTextElement(
"region", map->
region());
547 writer.writeTextElement(
"arch", arch);
549 foreach(QString path, map->
exitsTo())
551 writer.writeTextElement(
"exitTo", path);
555 writer.writeTextElement(
"accessedFrom", path);
557 foreach(QString file, map->
messages())
559 writer.writeTextElement(
"messageFile", file);
561 foreach(QString code, map->
quests())
563 writer.writeTextElement(
"quest", code);
565 foreach(QString item, map->
shopItems().keys())
567 writer.writeStartElement(
"shopItem");
568 writer.writeAttribute(
"name", item);
569 writer.writeCharacters(QString::number(map->
shopItems()[item]));
570 writer.writeEndElement();
574 writer.writeTextElement(
"shopGreed", QString::number(map->
shopGreed()));
578 writer.writeTextElement(
"shopRace", map->
shopRace());
582 writer.writeTextElement(
"shopMin", QString::number(map->
shopMin()));
586 writer.writeTextElement(
"shopMax", QString::number(map->
shopMax()));
594 if (hook->
map() == map)
596 writer.writeStartElement(
"script");
597 writer.writeAttribute(
"x", QString::number(hook->
x()));
598 writer.writeAttribute(
"y", QString::number(hook->
y()));
599 writer.writeAttribute(
"itemName", hook->
itemName());
600 writer.writeAttribute(
"pluginName", hook->
pluginName());
601 writer.writeAttribute(
"eventName", hook->
eventName());
602 writer.writeCharacters(script->
path());
603 writer.writeEndElement();
610 writer.writeStartElement(
"random_map");
611 writer.writeAttribute(
"x", QString::number(random->
x()));
612 writer.writeAttribute(
"y", QString::number(random->
y()));
615 writer.writeAttribute(
"params", params);
617 writer.writeEndElement();
625 writer.writeEndElement();
628 writer.writeEndElement();
630 writer.writeEndDocument();
645 QMutexLocker lock(&
myLock);
652 const QString slaying =
"/python/dialog/npc_dialog.py";
653 const QString python =
"Python";
664 if (python != item->
title)
670 QString path = item->
name;
671 if (!path.startsWith(
'/'))
677 if (!message->
maps().contains(map))
678 message->
maps().append(map);
681 qDebug() <<
"missing message file" << path <<
"in" << map->
path();
684 if (QString(item->
slaying).startsWith(
"/python/quests/"))
687 QStringList split = QString(item->
name).split(
' ', QString::SkipEmptyParts);
688 if (split.length() > 1)
695 if (!quest->
maps().contains(map))
696 quest->
maps().append(map);
698 qDebug() <<
"missing quest" << split[0] <<
"in" << map->
path();
705 QList<CREMapInformation*> list;
720 QFile::remove(settings.
mapCacheDirectory() + QDir::separator() +
"maps_cache.xml");
725 QList<CRERandomMap*> maps;
archetype * find_archetype(const char *name)
const QString & path() const
char * create_pathname(const char *name, char *buf, size_t size)
mapstruct * ready_map_name(const char *name, int flags)
EXTERN char first_map_ext_path[MAX_BUF]
MessageFile * findMessage(const QString &path)
void addHook(HookInformation *hook)
Quest * findByCode(const QString &code)
QString mapCacheDirectory() const
char * path_combine_and_normalize(const char *src, const char *dst, char *path, size_t size)
const RMParms * parameters() const
#define QUERY_FLAG(xyz, p)
StringBuffer * write_map_parameters_to_string(const RMParms *RP)
QList< HookInformation * > hooks() const
static void add_region_link(mapstruct *source, mapstruct *dest, const char *linkname)
QList< ScriptFile * > scriptsForMap(CREMapInformation *map)
void removeMap(CREMapInformation *map)
static int do_regions_link
void delete_map(mapstruct *m)
EXTERN char first_map_path[MAX_BUF]
ScriptFile * getFile(const QString &path)
QList< CREMapInformation * > & maps()
#define FOR_MAP_PREPARE(map_, mx_, my_, it_)
struct shopitem * shopitems
static struct_map_info * get_map_info(const char *path)
struct regiondef * region
EXTERN archetype * first_archetype
static void add_map(struct_map_info *info, struct_map_list *list)
char * stringbuffer_finish(StringBuffer *sb)
#define FOR_INV_PREPARE(op_, it_)
QList< CREMapInformation * > & maps()