File indexing completed on 2024-05-05 05:40:41

0001 /***************************************************************************
0002  *  Copyright (C) 2020 by Renaud Guezennec                               *
0003  *   http://www.rolisteam.org/contact                                      *
0004  *                                                                         *
0005  *   This software is free software; you can redistribute it and/or modify *
0006  *   it under the terms of the GNU General Public License as published by  *
0007  *   the Free Software Foundation; either version 2 of the License, or     *
0008  *   (at your option) any later version.                                   *
0009  *                                                                         *
0010  *   This program is distributed in the hope that it will be useful,       *
0011  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
0012  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
0013  *   GNU General Public License for more details.                          *
0014  *                                                                         *
0015  *   You should have received a copy of the GNU General Public License     *
0016  *   along with this program; if not, write to the                         *
0017  *   Free Software Foundation, Inc.,                                       *
0018  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
0019  ***************************************************************************/
0020 #include "worker/vectorialmapmessagehelper.h"
0021 
0022 #include <QByteArray>
0023 #include <QDataStream>
0024 #include <QJsonArray>
0025 #include <QJsonObject>
0026 #include <QPointF>
0027 #include <QRectF>
0028 
0029 #include "network/networkmessagereader.h"
0030 #include "network/networkmessagewriter.h"
0031 
0032 #include "controller/item_controllers/characteritemcontroller.h"
0033 #include "controller/item_controllers/ellipsecontroller.h"
0034 #include "controller/item_controllers/imageitemcontroller.h"
0035 #include "controller/item_controllers/linecontroller.h"
0036 #include "controller/item_controllers/pathcontroller.h"
0037 #include "controller/item_controllers/rectcontroller.h"
0038 #include "controller/item_controllers/sightcontroller.h"
0039 #include "controller/item_controllers/textcontroller.h"
0040 #include "controller/item_controllers/visualitemcontroller.h"
0041 #include "controller/view_controller/vectorialmapcontroller.h"
0042 #include "data/character.h"
0043 #include "data/charactervision.h"
0044 #include "model/vmapitemmodel.h"
0045 #include "worker/characterfinder.h"
0046 #include "worker/iohelper.h"
0047 #include "worker/utilshelper.h"
0048 
0049 VectorialMapMessageHelper::VectorialMapMessageHelper() {}
0050 
0051 void VectorialMapMessageHelper::sendOffNewItem(const std::map<QString, QVariant>& args, const QString& mapId)
0052 {
0053     NetworkMessageWriter msg(NetMsg::VMapCategory, NetMsg::AddItem);
0054     msg.string8(mapId);
0055     QByteArray array;
0056     QDataStream stream(&array, QIODevice::WriteOnly);
0057     stream.setVersion(QDataStream::Qt_5_12);
0058     for(const auto& pair : args)
0059     {
0060         stream << pair.first << pair.second;
0061     }
0062     Q_ASSERT(!array.isEmpty());
0063     msg.byteArray32(array);
0064     msg.sendToServer();
0065 }
0066 
0067 void VectorialMapMessageHelper::sendOffHighLight(const QPointF& p, const qreal& penSize, const QColor& color,
0068                                                  const QString& mapId)
0069 {
0070     NetworkMessageWriter msg(NetMsg::VMapCategory, NetMsg::HighLightPosition);
0071     msg.string8(mapId);
0072     msg.real(p.x());
0073     msg.real(p.y());
0074     msg.real(penSize);
0075     msg.string8(color.name());
0076 
0077     msg.sendToServer();
0078 }
0079 
0080 void VectorialMapMessageHelper::sendOffRemoveItems(const QStringList ids, const QString& mapId)
0081 {
0082     NetworkMessageWriter msg(NetMsg::VMapCategory, NetMsg::DeleteItem);
0083     msg.string8(mapId);
0084     msg.uint64(ids.size());
0085     for(auto const& id : ids)
0086     {
0087         msg.string8(id);
0088     }
0089     msg.sendToServer();
0090 }
0091 
0092 QStringList VectorialMapMessageHelper::readRemoveItems(NetworkMessageReader* msg)
0093 {
0094     auto size= msg->uint64();
0095     QStringList res;
0096     for(unsigned int i= 0; i < size; ++i)
0097     {
0098         res << msg->string8();
0099     }
0100     return res;
0101 }
0102 
0103 void VectorialMapMessageHelper::readHighLight(VectorialMapController* ctrl, NetworkMessageReader* msg)
0104 {
0105     // msg->resetToData();
0106     auto x= msg->real();
0107     auto y= msg->real();
0108 
0109     auto size= msg->real();
0110     QColor c(msg->string8());
0111 
0112     ctrl->showHightLighter({x, y}, size, c);
0113 }
0114 
0115 void saveVisualItemController(const vmap::VisualItemController* ctrl, QJsonObject& obj)
0116 {
0117     if(!ctrl)
0118         return;
0119 
0120     obj[Core::jsonctrl::vmap::vitem::JSON_ITEM_TYPE]= ctrl->itemType();
0121     obj[Core::jsonctrl::vmap::vitem::JSON_SELECTED]= ctrl->selected();
0122     obj[Core::jsonctrl::vmap::vitem::JSON_VISIBLE]= ctrl->visible();
0123     obj[Core::jsonctrl::vmap::vitem::JSON_OPACITY]= ctrl->opacity();
0124     obj[Core::jsonctrl::vmap::vitem::JSON_ROTATION]= ctrl->rotation();
0125     obj[Core::jsonctrl::vmap::vitem::JSON_LAYER]= static_cast<quint8>(ctrl->layer());
0126     obj[Core::jsonctrl::vmap::vitem::JSON_POSITION_X]= ctrl->pos().x();
0127     obj[Core::jsonctrl::vmap::vitem::JSON_POSITION_Y]= ctrl->pos().y();
0128     obj[Core::jsonctrl::vmap::vitem::JSON_UUID]= ctrl->uuid();
0129     obj[Core::jsonctrl::vmap::vitem::JSON_COLOR]= ctrl->color().name();
0130     obj[Core::jsonctrl::vmap::vitem::JSON_LOCKED]= ctrl->locked();
0131     obj[Core::jsonctrl::vmap::vitem::JSON_TOOL]= ctrl->tool();
0132     obj[Core::jsonctrl::vmap::vitem::JSON_INITIALIZED]= ctrl->initialized();
0133 }
0134 
0135 vmap::VisualItemController::ItemType readVisualItemController(std::map<QString, QVariant>& map, const QJsonObject& obj)
0136 {
0137     auto res
0138         = static_cast<vmap::VisualItemController::ItemType>(obj[Core::jsonctrl::vmap::vitem::JSON_ITEM_TYPE].toInt());
0139     map.insert({Core::vmapkeys::KEY_ITEMTYPE, obj[Core::jsonctrl::vmap::vitem::JSON_ITEM_TYPE].toInt()});
0140     map.insert({Core::vmapkeys::KEY_SELECTED, obj[Core::jsonctrl::vmap::vitem::JSON_SELECTED].toBool()});
0141     map.insert({Core::vmapkeys::KEY_VISIBLE, obj[Core::jsonctrl::vmap::vitem::JSON_VISIBLE].toBool()});
0142     map.insert({Core::vmapkeys::KEY_OPACITY, obj[Core::jsonctrl::vmap::vitem::JSON_OPACITY].toDouble()});
0143     map.insert({Core::vmapkeys::KEY_ROTATION, obj[Core::jsonctrl::vmap::vitem::JSON_ROTATION].toDouble()});
0144     map.insert({Core::vmapkeys::KEY_LAYER,
0145                 QVariant::fromValue(static_cast<Core::Layer>(obj[Core::jsonctrl::vmap::vitem::JSON_LAYER].toInt()))});
0146     map.insert({Core::vmapkeys::KEY_POS, QPointF{obj[Core::jsonctrl::vmap::vitem::JSON_POSITION_X].toDouble(),
0147                                                  obj[Core::jsonctrl::vmap::vitem::JSON_POSITION_Y].toDouble()}});
0148     map.insert({Core::vmapkeys::KEY_UUID, obj[Core::jsonctrl::vmap::vitem::JSON_UUID].toString()});
0149     map.insert({Core::vmapkeys::KEY_COLOR, QColor(obj[Core::jsonctrl::vmap::vitem::JSON_COLOR].toString())});
0150     map.insert({Core::vmapkeys::KEY_LOCKED, obj[Core::jsonctrl::vmap::vitem::JSON_LOCKED].toBool()});
0151     map.insert({Core::vmapkeys::KEY_TOOL, obj[Core::jsonctrl::vmap::vitem::JSON_TOOL].toInt()});
0152     map.insert({Core::vmapkeys::KEY_INITIALIZED, obj[Core::jsonctrl::vmap::vitem::JSON_INITIALIZED].toBool()});
0153 
0154     return res;
0155 }
0156 
0157 template <class T>
0158 QString convertToBase64(const T& data)
0159 {
0160     QByteArray res;
0161     {
0162         QDataStream writer(res);
0163         writer << data;
0164     }
0165     return res.toBase64();
0166 }
0167 
0168 template <class T>
0169 T convertFromBase64(const QString& data)
0170 {
0171     T res;
0172     {
0173         auto bytes= QByteArray::fromBase64(data.toLocal8Bit());
0174         QDataStream out(bytes);
0175         out >> res;
0176     }
0177     return res;
0178 }
0179 
0180 QJsonObject saveVmapSightController(const vmap::SightController* ctrl)
0181 {
0182     QJsonObject obj;
0183     if(!ctrl)
0184         return obj;
0185 
0186     saveVisualItemController(ctrl, obj);
0187 
0188     obj[Core::jsonctrl::vmap::sight::JSON_CHARACTER_SIHT]= ctrl->characterSight();
0189     obj[Core::jsonctrl::vmap::sight::JSON_FOW_PATH]= convertToBase64<QPainterPath>(ctrl->fowPath());
0190     obj[Core::jsonctrl::vmap::sight::JSON_RECT_X]= ctrl->rect().x();
0191     obj[Core::jsonctrl::vmap::sight::JSON_RECT_Y]= ctrl->rect().y();
0192     obj[Core::jsonctrl::vmap::sight::JSON_RECT_W]= ctrl->rect().width();
0193     obj[Core::jsonctrl::vmap::sight::JSON_RECT_H]= ctrl->rect().height();
0194     obj[Core::jsonctrl::vmap::sight::JSON_CHARACTER_COUNT]= ctrl->characterCount();
0195 
0196     QJsonArray array;
0197     auto singus= ctrl->singularityList();
0198 
0199     std::for_each(singus.begin(), singus.end(),
0200                   [&array](const std::pair<QPolygonF, bool>& singu)
0201                   {
0202                       QJsonObject obj;
0203                       obj[Core::jsonctrl::vmap::sight::JSON_SING_POINTS]= convertToBase64<QPolygonF>(singu.first);
0204                       obj[Core::jsonctrl::vmap::sight::JSON_SING_ADD]= singu.second;
0205                       array.append(obj);
0206                   });
0207 
0208     obj[Core::jsonctrl::vmap::sight::JSON_SINGULARITIES]= array;
0209     return obj;
0210 }
0211 
0212 QJsonObject saveVMapRectItemController(const vmap::RectController* ctrl)
0213 {
0214     QJsonObject obj;
0215     if(!ctrl)
0216         return obj;
0217 
0218     saveVisualItemController(ctrl, obj);
0219 
0220     obj[Core::jsonctrl::vmap::rect::JSON_RECT_X]= ctrl->rect().x();
0221     obj[Core::jsonctrl::vmap::rect::JSON_RECT_Y]= ctrl->rect().y();
0222     obj[Core::jsonctrl::vmap::rect::JSON_RECT_W]= ctrl->rect().width();
0223     obj[Core::jsonctrl::vmap::rect::JSON_RECT_H]= ctrl->rect().height();
0224     obj[Core::jsonctrl::vmap::rect::JSON_FILLED]= ctrl->filled();
0225     obj[Core::jsonctrl::vmap::rect::JSON_PEN_WIDTH]= ctrl->penWidth();
0226 
0227     return obj;
0228 }
0229 
0230 void readRectController(std::map<QString, QVariant>& maps, const QJsonObject& obj)
0231 {
0232     maps.insert({Core::vmapkeys::KEY_RECT, QRectF{obj[Core::jsonctrl::vmap::rect::JSON_RECT_X].toDouble(),
0233                                                   obj[Core::jsonctrl::vmap::rect::JSON_RECT_Y].toDouble(),
0234                                                   obj[Core::jsonctrl::vmap::rect::JSON_RECT_W].toDouble(),
0235                                                   obj[Core::jsonctrl::vmap::rect::JSON_RECT_H].toDouble()}});
0236     maps.insert({Core::vmapkeys::KEY_FILLED, obj[Core::jsonctrl::vmap::rect::JSON_FILLED].toBool()});
0237     maps.insert({Core::vmapkeys::KEY_PENWIDTH, obj[Core::jsonctrl::vmap::rect::JSON_PEN_WIDTH].toInt()});
0238 }
0239 
0240 QJsonObject saveVMapEllipseItemController(const vmap::EllipseController* ctrl)
0241 {
0242     QJsonObject obj;
0243     if(!ctrl)
0244         return obj;
0245 
0246     saveVisualItemController(ctrl, obj);
0247 
0248     obj[Core::jsonctrl::vmap::ellipse::JSON_R_X]= ctrl->rx();
0249     obj[Core::jsonctrl::vmap::ellipse::JSON_R_Y]= ctrl->ry();
0250     obj[Core::jsonctrl::vmap::ellipse::JSON_FILLED]= ctrl->filled();
0251     obj[Core::jsonctrl::vmap::ellipse::JSON_PEN_WIDTH]= ctrl->penWidth();
0252     return obj;
0253 }
0254 
0255 void readEllipseController(std::map<QString, QVariant>& maps, const QJsonObject& obj)
0256 {
0257     maps.insert({Core::vmapkeys::KEY_RX, obj[Core::jsonctrl::vmap::ellipse::JSON_R_X].toDouble()});
0258     maps.insert({Core::vmapkeys::KEY_RY, obj[Core::jsonctrl::vmap::ellipse::JSON_R_Y].toDouble()});
0259     maps.insert({Core::vmapkeys::KEY_FILLED, obj[Core::jsonctrl::vmap::ellipse::JSON_FILLED].toBool()});
0260     maps.insert({Core::vmapkeys::KEY_PENWIDTH, obj[Core::jsonctrl::vmap::ellipse::JSON_PEN_WIDTH].toDouble()});
0261 }
0262 
0263 QJsonObject saveVMapImageItemController(const vmap::ImageItemController* ctrl)
0264 {
0265     QJsonObject obj;
0266     if(!ctrl)
0267         return obj;
0268 
0269     saveVisualItemController(ctrl, obj);
0270 
0271     obj[Core::jsonctrl::vmap::image::JSON_PIXMAP]= convertToBase64<QPixmap>(ctrl->pixmap());
0272     obj[Core::jsonctrl::vmap::image::JSON_DATA]= QString(ctrl->data().toBase64());
0273     obj[Core::jsonctrl::vmap::image::JSON_RECT_X]= ctrl->rect().x();
0274     obj[Core::jsonctrl::vmap::image::JSON_RECT_Y]= ctrl->rect().y();
0275     obj[Core::jsonctrl::vmap::image::JSON_RECT_W]= ctrl->rect().width();
0276     obj[Core::jsonctrl::vmap::image::JSON_RECT_H]= ctrl->rect().height();
0277     obj[Core::jsonctrl::vmap::image::JSON_PATH]= ctrl->path();
0278     obj[Core::jsonctrl::vmap::image::JSON_RATIO]= ctrl->ratio();
0279     return obj;
0280 }
0281 
0282 void readImageController(std::map<QString, QVariant>& maps, const QJsonObject& obj)
0283 {
0284     maps.insert({Core::vmapkeys::KEY_PIXMAP,
0285                  convertFromBase64<QPixmap>(obj[Core::jsonctrl::vmap::image::JSON_PIXMAP].toString())});
0286     maps.insert({Core::vmapkeys::KEY_DATA,
0287                  QByteArray::fromBase64(obj[Core::jsonctrl::vmap::image::JSON_DATA].toString().toLocal8Bit())});
0288     maps.insert({Core::vmapkeys::KEY_RECT, QRectF{obj[Core::jsonctrl::vmap::image::JSON_RECT_X].toDouble(),
0289                                                   obj[Core::jsonctrl::vmap::image::JSON_RECT_Y].toDouble(),
0290                                                   obj[Core::jsonctrl::vmap::image::JSON_RECT_W].toDouble(),
0291                                                   obj[Core::jsonctrl::vmap::image::JSON_RECT_H].toDouble()}});
0292     maps.insert({Core::vmapkeys::KEY_PATH, obj[Core::jsonctrl::vmap::image::JSON_PATH].toString()});
0293     maps.insert({Core::vmapkeys::KEY_RATIO, obj[Core::jsonctrl::vmap::image::JSON_RATIO].toDouble()});
0294 }
0295 
0296 QJsonObject saveVMapLineItemController(const vmap::LineController* ctrl)
0297 {
0298     QJsonObject obj;
0299 
0300     if(!ctrl)
0301         return obj;
0302 
0303     saveVisualItemController(ctrl, obj);
0304 
0305     obj[Core::jsonctrl::vmap::line::JSON_START_X]= ctrl->startPoint().x();
0306     obj[Core::jsonctrl::vmap::line::JSON_START_Y]= ctrl->startPoint().y();
0307     obj[Core::jsonctrl::vmap::line::JSON_END_X]= ctrl->endPoint().x();
0308     obj[Core::jsonctrl::vmap::line::JSON_END_Y]= ctrl->endPoint().y();
0309     obj[Core::jsonctrl::vmap::line::JSON_PEN_WIDTH]= ctrl->penWidth();
0310     return obj;
0311 }
0312 
0313 void readLineController(std::map<QString, QVariant>& maps, const QJsonObject& obj)
0314 {
0315     maps.insert({Core::vmapkeys::KEY_STARTPOINT, QPointF{obj[Core::jsonctrl::vmap::line::JSON_START_X].toDouble(),
0316                                                          obj[Core::jsonctrl::vmap::line::JSON_START_Y].toDouble()}});
0317     maps.insert({Core::vmapkeys::KEY_ENDPOINT, QPointF{obj[Core::jsonctrl::vmap::line::JSON_END_X].toDouble(),
0318                                                        obj[Core::jsonctrl::vmap::line::JSON_END_Y].toDouble()}});
0319     maps.insert({Core::vmapkeys::KEY_PENWIDTH, obj[Core::jsonctrl::vmap::line::JSON_PEN_WIDTH].toInt()});
0320 }
0321 
0322 QJsonObject saveVMapPathItemController(const vmap::PathController* ctrl)
0323 {
0324     QJsonObject obj;
0325 
0326     if(!ctrl)
0327         return obj;
0328 
0329     saveVisualItemController(ctrl, obj);
0330 
0331     QJsonArray points;
0332     auto ps= ctrl->points();
0333     std::for_each(ps.begin(), ps.end(),
0334                   [&points](const QPointF& p)
0335                   {
0336                       QJsonObject point;
0337                       point[Core::jsonctrl::vmap::path::JSON_POINT_X]= p.x();
0338                       point[Core::jsonctrl::vmap::path::JSON_POINT_Y]= p.y();
0339                       points.append(point);
0340                   });
0341 
0342     obj[Core::jsonctrl::vmap::path::JSON_POINTS]= points;
0343     obj[Core::jsonctrl::vmap::path::JSON_PEN_WIDTH]= ctrl->penWidth();
0344     obj[Core::jsonctrl::vmap::path::JSON_CLOSED]= ctrl->closed();
0345     obj[Core::jsonctrl::vmap::path::JSON_FILLED]= ctrl->filled();
0346     obj[Core::jsonctrl::vmap::path::JSON_PEN_LINE]= ctrl->penLine();
0347     return obj;
0348 }
0349 
0350 void readPathController(std::map<QString, QVariant>& maps, const QJsonObject& obj)
0351 {
0352     auto points= obj[Core::jsonctrl::vmap::path::JSON_POINTS].toArray();
0353     maps.insert({Core::vmapkeys::KEY_POINTCOUNT, points.size()});
0354 
0355     std::vector<QPointF> vec;
0356     vec.reserve(static_cast<std::size_t>(points.size()));
0357     std::transform(std::begin(points), std::end(points), std::back_inserter(vec),
0358                    [](const QJsonValue& value)
0359                    {
0360                        auto obj= value.toObject();
0361                        return QPointF{obj[Core::jsonctrl::vmap::path::JSON_POINT_X].toDouble(),
0362                                       obj[Core::jsonctrl::vmap::path::JSON_POINT_Y].toDouble()};
0363                    });
0364 
0365     maps.insert({Core::vmapkeys::KEY_POINTS, QVariant::fromValue(vec)});
0366     maps.insert({Core::vmapkeys::KEY_PENWIDTH, obj[Core::jsonctrl::vmap::path::JSON_PEN_WIDTH].toInt()});
0367     maps.insert({Core::vmapkeys::KEY_CLOSED, obj[Core::jsonctrl::vmap::path::JSON_CLOSED].toBool()});
0368     maps.insert({Core::vmapkeys::KEY_FILLED, obj[Core::jsonctrl::vmap::path::JSON_FILLED].toBool()});
0369     maps.insert({Core::vmapkeys::KEY_PENLINE, obj[Core::jsonctrl::vmap::path::JSON_PEN_LINE].toBool()});
0370 }
0371 
0372 QJsonObject saveVMapTextItemController(const vmap::TextController* ctrl)
0373 {
0374     QJsonObject obj;
0375 
0376     if(!ctrl)
0377         return obj;
0378 
0379     saveVisualItemController(ctrl, obj);
0380 
0381     obj[Core::jsonctrl::vmap::text::JSON_TEXT]= ctrl->text();
0382 
0383     obj[Core::jsonctrl::vmap::text::JSON_TEXT_RECT_X]= ctrl->textRect().x();
0384     obj[Core::jsonctrl::vmap::text::JSON_TEXT_RECT_Y]= ctrl->textRect().y();
0385     obj[Core::jsonctrl::vmap::text::JSON_TEXT_RECT_W]= ctrl->textRect().width();
0386     obj[Core::jsonctrl::vmap::text::JSON_TEXT_RECT_H]= ctrl->textRect().height();
0387 
0388     obj[Core::jsonctrl::vmap::text::JSON_BORDER_RECT_X]= ctrl->borderRect().x();
0389     obj[Core::jsonctrl::vmap::text::JSON_BORDER_RECT_Y]= ctrl->borderRect().y();
0390     obj[Core::jsonctrl::vmap::text::JSON_BORDER_RECT_W]= ctrl->borderRect().width();
0391     obj[Core::jsonctrl::vmap::text::JSON_BORDER_RECT_H]= ctrl->borderRect().height();
0392 
0393     obj[Core::jsonctrl::vmap::text::JSON_BORDER]= ctrl->border();
0394     obj[Core::jsonctrl::vmap::text::JSON_FONT]= convertToBase64<QFont>(ctrl->font());
0395     obj[Core::jsonctrl::vmap::text::JSON_PEN_WIDTH]= ctrl->penWidth();
0396 
0397     obj[Core::jsonctrl::vmap::text::JSON_POS_X]= ctrl->textPos().x();
0398     obj[Core::jsonctrl::vmap::text::JSON_POS_Y]= ctrl->textPos().y();
0399     return obj;
0400 }
0401 
0402 void readVmapSightController(vmap::SightController* sight, const QJsonObject& obj)
0403 {
0404     sight->setCharacterSight(obj[Core::jsonctrl::vmap::sight::JSON_CHARACTER_SIHT].toBool());
0405     sight->setRect(QRectF{obj[Core::jsonctrl::vmap::sight::JSON_RECT_X].toDouble(),
0406                           obj[Core::jsonctrl::vmap::sight::JSON_RECT_Y].toDouble(),
0407                           obj[Core::jsonctrl::vmap::sight::JSON_RECT_W].toDouble(),
0408                           obj[Core::jsonctrl::vmap::sight::JSON_RECT_H].toDouble()});
0409     auto sings= obj[Core::jsonctrl::vmap::sight::JSON_SINGULARITIES].toArray();
0410 
0411     for(auto const& ref : sings)
0412     {
0413         auto const& obj= ref.toObject();
0414         sight->addPolygon(
0415             convertFromBase64<QPolygonF>(obj[Core::jsonctrl::vmap::sight::JSON_SING_POINTS].toString().toLocal8Bit()),
0416             obj[Core::jsonctrl::vmap::sight::JSON_SING_ADD].toBool());
0417     }
0418 }
0419 
0420 void readTextController(std::map<QString, QVariant>& maps, const QJsonObject& obj)
0421 {
0422     maps.insert({Core::vmapkeys::KEY_TEXT, obj[Core::jsonctrl::vmap::text::JSON_TEXT].toString()});
0423     maps.insert({Core::vmapkeys::KEY_TEXTRECT, QRectF{obj[Core::jsonctrl::vmap::text::JSON_TEXT_RECT_X].toDouble(),
0424                                                       obj[Core::jsonctrl::vmap::text::JSON_TEXT_RECT_Y].toDouble(),
0425                                                       obj[Core::jsonctrl::vmap::text::JSON_TEXT_RECT_W].toDouble(),
0426                                                       obj[Core::jsonctrl::vmap::text::JSON_TEXT_RECT_H].toDouble()}});
0427     maps.insert(
0428         {Core::vmapkeys::KEY_BORDERRECT, QRectF{obj[Core::jsonctrl::vmap::text::JSON_BORDER_RECT_X].toDouble(),
0429                                                 obj[Core::jsonctrl::vmap::text::JSON_BORDER_RECT_Y].toDouble(),
0430                                                 obj[Core::jsonctrl::vmap::text::JSON_BORDER_RECT_W].toDouble(),
0431                                                 obj[Core::jsonctrl::vmap::text::JSON_BORDER_RECT_H].toDouble()}});
0432     maps.insert({Core::vmapkeys::KEY_BORDER, obj[Core::jsonctrl::vmap::text::JSON_BORDER].toBool()});
0433     maps.insert(
0434         {Core::vmapkeys::KEY_FONT, convertFromBase64<QFont>(obj[Core::jsonctrl::vmap::text::JSON_FONT].toString())});
0435     maps.insert({Core::vmapkeys::KEY_TEXTPOS, QPointF{obj[Core::jsonctrl::vmap::text::JSON_POS_X].toDouble(),
0436                                                       obj[Core::jsonctrl::vmap::text::JSON_POS_Y].toDouble()}});
0437     maps.insert({Core::vmapkeys::KEY_PENWIDTH, obj[Core::jsonctrl::vmap::text::JSON_PEN_WIDTH].toInt()});
0438 }
0439 
0440 QJsonObject saveCharacter(Character* c)
0441 {
0442 
0443     QJsonObject obj;
0444 
0445     if(!c)
0446         return obj;
0447 
0448     obj[Core::jsonctrl::vmap::character::JSON_CHAR_NPC]= c->isNpc();
0449     obj[Core::jsonctrl::vmap::character::JSON_CHAR_ID]= c->uuid();
0450     obj[Core::jsonctrl::vmap::character::JSON_CHAR_NAME]= c->name();
0451     obj[Core::jsonctrl::vmap::character::JSON_CHAR_AVATAR]= QString(c->avatar().toBase64());
0452     obj[Core::jsonctrl::vmap::character::JSON_CHAR_HEALT_CURRENT]= c->getHealthPointsCurrent();
0453     obj[Core::jsonctrl::vmap::character::JSON_CHAR_HEALT_MAX]= c->getHealthPointsMax();
0454     obj[Core::jsonctrl::vmap::character::JSON_CHAR_HEALT_MIN]= c->getHealthPointsMin();
0455 
0456     obj[Core::jsonctrl::vmap::character::JSON_CHAR_INIT_SCORE]= c->getInitiativeScore();
0457     obj[Core::jsonctrl::vmap::character::JSON_CHAR_DISTANCE_TURN]= c->getDistancePerTurn();
0458     obj[Core::jsonctrl::vmap::character::JSON_CHAR_STATE_ID]= c->stateId();
0459     obj[Core::jsonctrl::vmap::character::JSON_CHAR_LIFE_COLOR]= c->getLifeColor().name();
0460     obj[Core::jsonctrl::vmap::character::JSON_CHAR_INIT_CMD]= c->initCommand();
0461     obj[Core::jsonctrl::vmap::character::JSON_CHAR_INIT_SCORE_DEFINED]= c->hasInitScore();
0462 
0463     return obj;
0464 }
0465 
0466 void readCharacter(std::map<QString, QVariant>& map, const QJsonObject& obj)
0467 {
0468     map.insert({Core::vmapkeys::KEY_CHARAC_NPC, obj[Core::jsonctrl::vmap::character::JSON_CHAR_NPC].toBool()});
0469     map.insert({Core::vmapkeys::KEY_CHARAC_ID, obj[Core::jsonctrl::vmap::character::JSON_CHAR_ID].toString()});
0470     map.insert({Core::vmapkeys::KEY_CHARAC_NAME, obj[Core::jsonctrl::vmap::character::JSON_CHAR_NAME].toString()});
0471     map.insert(
0472         {Core::vmapkeys::KEY_CHARAC_AVATAR,
0473          QByteArray::fromBase64(obj[Core::jsonctrl::vmap::character::JSON_CHAR_AVATAR].toString().toLocal8Bit())});
0474     map.insert(
0475         {Core::vmapkeys::KEY_CHARAC_HPCURRENT, obj[Core::jsonctrl::vmap::character::JSON_CHAR_HEALT_CURRENT].toInt()});
0476     map.insert({Core::vmapkeys::KEY_CHARAC_HPMAX, obj[Core::jsonctrl::vmap::character::JSON_CHAR_HEALT_MAX].toInt()});
0477     map.insert({Core::vmapkeys::KEY_CHARAC_HPMIN, obj[Core::jsonctrl::vmap::character::JSON_CHAR_HEALT_MIN].toInt()});
0478     map.insert(
0479         {Core::vmapkeys::KEY_CHARAC_INITSCORE, obj[Core::jsonctrl::vmap::character::JSON_CHAR_INIT_SCORE].toInt()});
0480     map.insert({Core::vmapkeys::KEY_CHARAC_DISTANCEPERTURN,
0481                 obj[Core::jsonctrl::vmap::character::JSON_CHAR_DISTANCE_TURN].toDouble()});
0482     map.insert(
0483         {Core::vmapkeys::KEY_CHARAC_STATEID, obj[Core::jsonctrl::vmap::character::JSON_CHAR_STATE_ID].toString()});
0484     map.insert({Core::vmapkeys::KEY_CHARAC_LIFECOLOR,
0485                 QColor(obj[Core::jsonctrl::vmap::character::JSON_CHAR_LIFE_COLOR].toString())});
0486     map.insert(
0487         {Core::vmapkeys::KEY_CHARAC_INITCMD, obj[Core::jsonctrl::vmap::character::JSON_CHAR_INIT_CMD].toString()});
0488     map.insert({Core::vmapkeys::KEY_CHARAC_HASINIT,
0489                 obj[Core::jsonctrl::vmap::character::JSON_CHAR_INIT_SCORE_DEFINED].toBool()});
0490 }
0491 
0492 void VectorialMapMessageHelper::fetchCharacter(const std::map<QString, QVariant>& params, Character* character)
0493 {
0494     namespace hu= helper::utils;
0495     namespace cv= Core::vmapkeys;
0496     using std::placeholders::_1;
0497 
0498     // clang-format off
0499     hu::setParamIfAny<bool>(cv::KEY_CHARAC_NPC, params, std::bind(&Character::setNpc, character, _1));
0500     hu::setParamIfAny<QString>(cv::KEY_CHARAC_ID, params, std::bind(&Character::setUuid, character, _1));
0501     hu::setParamIfAny<QString>(cv::KEY_CHARAC_NAME, params, std::bind(&Character::setName, character, _1));
0502     hu::setParamIfAny<QByteArray>(cv::KEY_CHARAC_AVATAR, params, std::bind(&Character::setAvatar, character, _1));
0503     hu::setParamIfAny<int>(cv::KEY_CHARAC_HPCURRENT, params, std::bind(&Character::setHealthPointsCurrent, character, _1));
0504     hu::setParamIfAny<int>(cv::KEY_CHARAC_HPMAX, params, std::bind(&Character::setHealthPointsMax, character, _1));
0505     hu::setParamIfAny<int>(cv::KEY_CHARAC_HPMIN, params, std::bind(&Character::setHealthPointsMin, character, _1));
0506     hu::setParamIfAny<int>(cv::KEY_CHARAC_INITSCORE, params, std::bind(&Character::setInitiativeScore, character, _1));
0507     hu::setParamIfAny<qreal>(cv::KEY_CHARAC_DISTANCEPERTURN, params,std::bind(&Character::setDistancePerTurn, character, _1));
0508     hu::setParamIfAny<QString>(cv::KEY_CHARAC_STATEID, params, std::bind(&Character::setStateId, character, _1));
0509     hu::setParamIfAny<QColor>(cv::KEY_CHARAC_LIFECOLOR, params, std::bind(&Character::setLifeColor, character, _1));
0510     hu::setParamIfAny<QString>(cv::KEY_CHARAC_INITCMD, params, std::bind(&Character::setInitCommand, character, _1));
0511     hu::setParamIfAny<bool>(cv::KEY_CHARAC_HASINIT, params, std::bind(&Character::setHasInitiative, character, _1));
0512     // clang-format on
0513 }
0514 
0515 QJsonObject saveVMapCharacterItemController(const vmap::CharacterItemController* ctrl)
0516 {
0517 
0518     QJsonObject obj;
0519 
0520     if(!ctrl)
0521         return obj;
0522 
0523     auto c= ctrl->character();
0524     auto vision= ctrl->vision();
0525 
0526     auto chacObj= saveCharacter(c);
0527 
0528     saveVisualItemController(ctrl, obj);
0529 
0530     obj[Core::jsonctrl::vmap::character::JSON_CHARACTER]= chacObj;
0531     obj[Core::jsonctrl::vmap::character::JSON_SIDE]= ctrl->side();
0532     obj[Core::jsonctrl::vmap::character::JSON_STATE_COLOR]= ctrl->stateColor().name();
0533     obj[Core::jsonctrl::vmap::character::JSON_NUMBER]= ctrl->number();
0534     obj[Core::jsonctrl::vmap::character::JSON_TEXT_RECT_X]= ctrl->textRect().x();
0535     obj[Core::jsonctrl::vmap::character::JSON_TEXT_RECT_Y]= ctrl->textRect().y();
0536     obj[Core::jsonctrl::vmap::character::JSON_TEXT_RECT_W]= ctrl->textRect().width();
0537     obj[Core::jsonctrl::vmap::character::JSON_TEXT_RECT_H]= ctrl->textRect().height();
0538 
0539     obj[Core::jsonctrl::vmap::character::JSON_FONT]= convertToBase64<QFont>(ctrl->font());
0540     obj[Core::jsonctrl::vmap::character::JSON_RADIUS]= ctrl->radius();
0541     obj[Core::jsonctrl::vmap::character::JSON_VIS_POS_X]= vision->position().x();
0542     obj[Core::jsonctrl::vmap::character::JSON_VIS_POS_Y]= vision->position().y();
0543     obj[Core::jsonctrl::vmap::character::JSON_VIS_ANGLE]= vision->angle();
0544     obj[Core::jsonctrl::vmap::character::JSON_VIS_SHAPE]= vision->shape();
0545     obj[Core::jsonctrl::vmap::character::JSON_VIS_ROTATION]= vision->rotation();
0546     obj[Core::jsonctrl::vmap::character::JSON_VIS_VISIBLE]= vision->visible();
0547     obj[Core::jsonctrl::vmap::character::JSON_VIS_RADIUS]= vision->radius();
0548 
0549     return obj;
0550 }
0551 
0552 void VectorialMapMessageHelper::fetchCharacterItem(const std::map<QString, QVariant>& params,
0553                                                    vmap::CharacterItemController* ctrl)
0554 {
0555     namespace hu= helper::utils;
0556     namespace cv= Core::vmapkeys;
0557     using std::placeholders::_1;
0558 
0559     // clang-format off
0560     hu::setParamIfAny<qreal>(cv::KEY_SIDE, params, std::bind(&vmap::CharacterItemController::setSide, ctrl, _1));
0561     hu::setParamIfAny<QColor>(cv::KEY_STATECOLOR, params,std::bind(&vmap::CharacterItemController::setStateColor, ctrl, _1));
0562     hu::setParamIfAny<int>(cv::KEY_NUMBER, params, std::bind(&vmap::CharacterItemController::setNumber, ctrl, _1));
0563     hu::setParamIfAny<QRectF>(cv::KEY_TEXTRECT, params, std::bind(&vmap::CharacterItemController::setTextRect, ctrl, _1));
0564     hu::setParamIfAny<qreal>(cv::KEY_RADIUS, params, std::bind(&vmap::CharacterItemController::setRadius, ctrl, _1));
0565     hu::setParamIfAny<QFont>(cv::KEY_FONT, params, std::bind(&vmap::CharacterItemController::setFont, ctrl, _1));
0566     hu::setParamIfAny<bool>(cv::KEY_PLAYABLECHARACTER, params, std::bind(&vmap::CharacterItemController::setPlayableCharacter, ctrl, _1));
0567     // clang-format on
0568 }
0569 
0570 void readCharacterItemController(std::map<QString, QVariant>& maps, const QJsonObject& obj)
0571 {
0572     readCharacter(maps, obj[Core::jsonctrl::vmap::character::JSON_CHARACTER].toObject());
0573 
0574     maps.insert({Core::vmapkeys::KEY_SIDE, obj[Core::jsonctrl::vmap::character::JSON_SIDE].toDouble()});
0575     maps.insert(
0576         {Core::vmapkeys::KEY_STATECOLOR, QColor(obj[Core::jsonctrl::vmap::character::JSON_STATE_COLOR].toString())});
0577     maps.insert({Core::vmapkeys::KEY_NUMBER, obj[Core::jsonctrl::vmap::character::JSON_NUMBER].toInt()});
0578     maps.insert(
0579         {Core::vmapkeys::KEY_TEXTRECT, QRectF{obj[Core::jsonctrl::vmap::character::JSON_TEXT_RECT_X].toDouble(),
0580                                               obj[Core::jsonctrl::vmap::character::JSON_TEXT_RECT_Y].toDouble(),
0581                                               obj[Core::jsonctrl::vmap::character::JSON_TEXT_RECT_W].toDouble(),
0582                                               obj[Core::jsonctrl::vmap::character::JSON_TEXT_RECT_H].toDouble()}});
0583     maps.insert({Core::vmapkeys::KEY_RADIUS, obj[Core::jsonctrl::vmap::character::JSON_RADIUS]});
0584     maps.insert({Core::vmapkeys::KEY_FONT,
0585                  convertFromBase64<QFont>(obj[Core::jsonctrl::vmap::character::JSON_FONT].toString())});
0586 
0587     maps.insert(
0588         {Core::vmapkeys::KEY_VIS_POS, QPointF{obj[Core::jsonctrl::vmap::character::JSON_VIS_POS_X].toDouble(),
0589                                               obj[Core::jsonctrl::vmap::character::JSON_VIS_POS_Y].toDouble()}});
0590     maps.insert({Core::vmapkeys::KEY_VIS_ANGLE, obj[Core::jsonctrl::vmap::character::JSON_VIS_ANGLE].toDouble()});
0591     maps.insert({Core::vmapkeys::KEY_VIS_SHAPE,
0592                  static_cast<CharacterVision::SHAPE>(obj[Core::jsonctrl::vmap::character::JSON_VIS_SHAPE].toInt())});
0593     maps.insert({Core::vmapkeys::KEY_VIS_VISIBLE, obj[Core::jsonctrl::vmap::character::JSON_VIS_VISIBLE].toBool()});
0594     maps.insert({Core::vmapkeys::KEY_VIS_RADIUS, obj[Core::jsonctrl::vmap::character::JSON_VIS_RADIUS].toDouble()});
0595     maps.insert({Core::vmapkeys::KEY_VIS_ROTATION, obj[Core::jsonctrl::vmap::character::JSON_VIS_ROTATION].toDouble()});
0596 
0597     if(maps.end() != maps.find(Core::vmapkeys::KEY_CHARAC_ID))
0598     {
0599         CharacterFinder finder;
0600         auto c= finder.find(maps.at(Core::vmapkeys::KEY_CHARAC_ID).value<QString>());
0601         if(c)
0602         {
0603             maps.insert({Core::vmapkeys::KEY_CHARACTER, QVariant::fromValue(c)});
0604         }
0605     }
0606 }
0607 
0608 void VectorialMapMessageHelper::fetchCharacterVision(const std::map<QString, QVariant>& params, CharacterVision* vision)
0609 {
0610     namespace hu= helper::utils;
0611     namespace cv= Core::vmapkeys;
0612     using std::placeholders::_1;
0613 
0614     // clang-format off
0615     hu::setParamIfAny<QPointF>(cv::KEY_VIS_POS, params, std::bind(&CharacterVision::setPosition, vision, _1));
0616     hu::setParamIfAny<qreal>(cv::KEY_VIS_ANGLE, params, std::bind(&CharacterVision::setAngle, vision, _1));
0617     hu::setParamIfAny<CharacterVision::SHAPE>(cv::KEY_VIS_SHAPE, params, std::bind(&CharacterVision::setShape, vision, _1));
0618     hu::setParamIfAny<bool>(cv::KEY_VIS_VISIBLE, params, std::bind(&CharacterVision::setVisible, vision, _1));
0619     hu::setParamIfAny<qreal>(cv::KEY_VIS_RADIUS, params, std::bind(&CharacterVision::setRadius, vision, _1));
0620     // clang-format on
0621 }
0622 
0623 std::map<QString, QVariant> readItemController(const QJsonObject& input)
0624 {
0625     std::map<QString, QVariant> maps;
0626 
0627     vmap::VisualItemController::ItemType type= readVisualItemController(maps, input);
0628 
0629     switch(type)
0630     {
0631     case vmap::VisualItemController::ELLIPSE:
0632         readEllipseController(maps, input);
0633         break;
0634     case vmap::VisualItemController::PATH:
0635         readPathController(maps, input);
0636         break;
0637     case vmap::VisualItemController::RECT:
0638         readRectController(maps, input);
0639         break;
0640     case vmap::VisualItemController::TEXT:
0641         readTextController(maps, input);
0642         break;
0643     case vmap::VisualItemController::CHARACTER:
0644         readCharacterItemController(maps, input);
0645         break;
0646     case vmap::VisualItemController::LINE:
0647         readLineController(maps, input);
0648         break;
0649     case vmap::VisualItemController::IMAGE:
0650         readImageController(maps, input);
0651         break;
0652     default:
0653         break;
0654     }
0655 
0656     return maps;
0657 }
0658 
0659 void readModel(VectorialMapController* ctrl, const QJsonArray& items)
0660 {
0661     for(auto ref : items)
0662     {
0663         ctrl->addItemController(readItemController(ref.toObject()));
0664     }
0665 }
0666 
0667 QJsonObject saveItemController(vmap::VisualItemController* itemCtrl)
0668 {
0669     using vv= vmap::VisualItemController;
0670     if(itemCtrl->removed())
0671         return {};
0672 
0673     QJsonObject res;
0674 
0675     switch(itemCtrl->itemType())
0676     {
0677     case vv::RECT:
0678         res= saveVMapRectItemController(dynamic_cast<vmap::RectController*>(itemCtrl));
0679         break;
0680     case vv::PATH:
0681         res= saveVMapPathItemController(dynamic_cast<vmap::PathController*>(itemCtrl));
0682         break;
0683     case vv::LINE:
0684         res= saveVMapLineItemController(dynamic_cast<vmap::LineController*>(itemCtrl));
0685         break;
0686     case vv::ELLIPSE:
0687         res= saveVMapEllipseItemController(dynamic_cast<vmap::EllipseController*>(itemCtrl));
0688         break;
0689     case vv::CHARACTER:
0690         res= saveVMapCharacterItemController(dynamic_cast<vmap::CharacterItemController*>(itemCtrl));
0691         break;
0692     case vv::TEXT:
0693         res= saveVMapTextItemController(dynamic_cast<vmap::TextController*>(itemCtrl));
0694         break;
0695     case vv::IMAGE:
0696         res= saveVMapImageItemController(dynamic_cast<vmap::ImageItemController*>(itemCtrl));
0697         break;
0698     case vv::RULE:
0699     case vv::SIGHT:
0700     case vv::ANCHOR:
0701     case vv::GRID:
0702     case vv::HIGHLIGHTER:
0703         break;
0704     }
0705 
0706     return res;
0707 }
0708 
0709 QByteArray VectorialMapMessageHelper::saveVectorialMap(VectorialMapController* ctrl)
0710 {
0711     if(!ctrl)
0712         return {};
0713 
0714     QJsonObject obj;
0715     // QDataStream output(&data, QIODevice::WriteOnly);
0716     IOHelper::saveMediaBaseIntoJSon(ctrl, obj);
0717 
0718     // properties
0719     obj[Core::jsonctrl::vmap::JSON_NPC_NAME_VISIBLE]= ctrl->npcNameVisible();
0720     obj[Core::jsonctrl::vmap::JSON_PC_NAME_VISIBLE]= ctrl->pcNameVisible();
0721     obj[Core::jsonctrl::vmap::JSON_NPC_NUMBER_VISIBLE]= ctrl->npcNumberVisible();
0722     obj[Core::jsonctrl::vmap::JSON_HEALTH_BAR_VISIBLE]= ctrl->healthBarVisible();
0723     obj[Core::jsonctrl::vmap::JSON_INIT_SCORE_VISIBLE]= ctrl->initScoreVisible();
0724     obj[Core::jsonctrl::vmap::JSON_STATE_LABEL_VISIBLE]= ctrl->stateLabelVisible();
0725     obj[Core::jsonctrl::vmap::JSON_COLLISION]= ctrl->collision();
0726     obj[Core::jsonctrl::vmap::JSON_CHARACTER_VISION]= ctrl->characterVision();
0727     obj[Core::jsonctrl::vmap::JSON_GRID_COLOR]= ctrl->gridColor().name();
0728     obj[Core::jsonctrl::vmap::JSON_GRID_SCALE]= ctrl->gridScale();
0729     obj[Core::jsonctrl::vmap::JSON_GRID_SIZE]= ctrl->gridSize();
0730     obj[Core::jsonctrl::vmap::JSON_GRID_VISIBLE]= ctrl->gridVisibility();
0731     obj[Core::jsonctrl::vmap::JSON_GRID_ABOVE]= ctrl->gridAbove();
0732     obj[Core::jsonctrl::vmap::JSON_SCALE_UNIT]= ctrl->scaleUnit();
0733     obj[Core::jsonctrl::vmap::JSON_NPC_NAME]= ctrl->npcName();
0734     obj[Core::jsonctrl::vmap::JSON_PERMISSION]= ctrl->permission();
0735     obj[Core::jsonctrl::vmap::JSON_GRID_PATTERN]= static_cast<quint8>(ctrl->gridPattern());
0736     obj[Core::jsonctrl::vmap::JSON_VISIBILITY]= ctrl->visibility();
0737     obj[Core::jsonctrl::vmap::JSON_BACKGROUND_COLOR]= ctrl->backgroundColor().name();
0738     obj[Core::jsonctrl::vmap::JSON_TOOL_COLOR]= ctrl->toolColor().name();
0739     obj[Core::jsonctrl::vmap::JSON_PEN_SIZE]= ctrl->penSize();
0740     obj[Core::jsonctrl::vmap::JSON_NPC_NUMBER]= ctrl->npcNumber();
0741     obj[Core::jsonctrl::vmap::JSON_ZOOM_LEVEL]= ctrl->zoomLevel();
0742     obj[Core::jsonctrl::vmap::JSON_Layer]= static_cast<quint8>(ctrl->layer());
0743     obj[Core::jsonctrl::vmap::JSON_OPACITY]= ctrl->opacity();
0744     auto r= ctrl->visualRect();
0745     obj[Core::jsonctrl::vmap::JSON_VISUAL_RECT_X]= r.x();
0746     obj[Core::jsonctrl::vmap::JSON_VISUAL_RECT_Y]= r.y();
0747     obj[Core::jsonctrl::vmap::JSON_VISUAL_RECT_W]= r.width();
0748     obj[Core::jsonctrl::vmap::JSON_VISUAL_RECT_H]= r.height();
0749     obj[Core::jsonctrl::vmap::JSON_IDLE]= ctrl->idle();
0750     obj[Core::jsonctrl::vmap::JSON_Z_INDEX]= ctrl->zIndex();
0751 
0752     auto sight= ctrl->sightController();
0753 
0754     obj[Core::jsonctrl::vmap::JSON_SIGHT_CTRL]= saveVmapSightController(sight);
0755 
0756     auto model= ctrl->model();
0757     auto vec= model->items();
0758     QJsonArray items;
0759     for(auto itemCtrl : vec)
0760     {
0761         if(itemCtrl->removed())
0762             continue;
0763         auto item= saveItemController(itemCtrl);
0764         if(item.isEmpty())
0765             continue;
0766 
0767         items.append(item);
0768     }
0769 
0770     obj[Core::jsonctrl::vmap::JSON_ITEMS]= items;
0771 
0772     QJsonDocument doc;
0773     doc.setObject(obj);
0774 
0775     return doc.toJson();
0776 }
0777 
0778 void VectorialMapMessageHelper::fetchModelFromMap(const QHash<QString, QVariant>& params, VectorialMapController* ctrl,
0779                                                   bool isRemote)
0780 {
0781     auto s= params.size();
0782     for(int i= 0; i < s; ++i)
0783     {
0784         auto const& item= params.value(QString("Item_%1").arg(i));
0785         auto const maps= item.toMap().toStdMap();
0786         if(!maps.empty())
0787             ctrl->addItemController(maps, isRemote);
0788     }
0789 }
0790 
0791 QHash<QString, QVariant> VectorialMapMessageHelper::itemsToHash(const QList<vmap::VisualItemController*>& ctrls)
0792 {
0793     QHash<QString, QVariant> items;
0794 
0795     int i= 0;
0796     for(auto const& ctrl : ctrls)
0797     {
0798         auto item= saveItemController(ctrl);
0799         items.insert(QString("Item_%1").arg(i), QVariant::fromValue(readItemController(item)));
0800         ++i;
0801     }
0802 
0803     return items;
0804 }
0805 
0806 void VectorialMapMessageHelper::fetchSightController(vmap::SightController* ctrl,
0807                                                      const QHash<QString, QVariant>& params)
0808 {
0809     if(!ctrl)
0810         return;
0811 
0812     namespace ck= Core::vmapkeys;
0813     namespace hu= helper::utils;
0814     using std::placeholders::_1;
0815 
0816     auto x= params.value(ck::KEY_SIGHT_X).value<qreal>();
0817     auto y= params.value(ck::KEY_SIGHT_Y).value<qreal>();
0818     auto w= params.value(ck::KEY_SIGHT_W).value<qreal>();
0819     auto h= params.value(ck::KEY_SIGHT_H).value<qreal>();
0820 
0821     ctrl->setRect(QRectF{x, y, w, h});
0822 
0823     auto posx= params.value(ck::KEY_SIGHT_POSX).value<qreal>();
0824     auto posy= params.value(ck::KEY_SIGHT_POSY).value<qreal>();
0825 
0826     ctrl->setPos(QPointF{posx, posy});
0827 
0828     ctrl->setFowPath(params.value(ck::KEY_SIGHT_PATH).value<QPainterPath>());
0829 }
0830 
0831 void VectorialMapMessageHelper::readVectorialMapController(VectorialMapController* ctrl, const QByteArray& array)
0832 {
0833     if(!ctrl)
0834         return;
0835 
0836     QJsonDocument doc= QJsonDocument::fromJson(array);
0837 
0838     auto obj= doc.object();
0839 
0840     IOHelper::readBaseFromJson(ctrl, obj);
0841 
0842     auto itemArray= obj[Core::jsonctrl::vmap::JSON_ITEMS].toArray();
0843 
0844     ctrl->setNpcNameVisible(obj[Core::jsonctrl::vmap::JSON_NPC_NAME_VISIBLE].toBool());
0845     ctrl->setPcNameVisible(obj[Core::jsonctrl::vmap::JSON_PC_NAME_VISIBLE].toBool());
0846     ctrl->setNpcNumberVisible(obj[Core::jsonctrl::vmap::JSON_NPC_NUMBER_VISIBLE].toBool());
0847     ctrl->setHealthBarVisible(obj[Core::jsonctrl::vmap::JSON_HEALTH_BAR_VISIBLE].toBool());
0848     ctrl->setInitScoreVisible(obj[Core::jsonctrl::vmap::JSON_INIT_SCORE_VISIBLE].toBool());
0849     ctrl->setStateLabelVisible(obj[Core::jsonctrl::vmap::JSON_STATE_LABEL_VISIBLE].toBool());
0850     ctrl->setCollision(obj[Core::jsonctrl::vmap::JSON_COLLISION].toBool());
0851     ctrl->setCharacterVision(obj[Core::jsonctrl::vmap::JSON_CHARACTER_VISION].toBool());
0852     ctrl->setGridColor(QColor(obj[Core::jsonctrl::vmap::JSON_GRID_COLOR].toString()));
0853     ctrl->setGridScale(obj[Core::jsonctrl::vmap::JSON_GRID_SCALE].toDouble());
0854     ctrl->setGridSize(obj[Core::jsonctrl::vmap::JSON_GRID_SIZE].toInt());
0855     ctrl->setGridVisibility(obj[Core::jsonctrl::vmap::JSON_GRID_VISIBLE].toBool());
0856     ctrl->setGridAbove(obj[Core::jsonctrl::vmap::JSON_GRID_ABOVE].toBool());
0857     ctrl->setScaleUnit(static_cast<Core::ScaleUnit>(obj[Core::jsonctrl::vmap::JSON_SCALE_UNIT].toInt()));
0858     ctrl->setNpcName(obj[Core::jsonctrl::vmap::JSON_NPC_NAME].toString());
0859     ctrl->setPermission(static_cast<Core::PermissionMode>(obj[Core::jsonctrl::vmap::JSON_PERMISSION].toInt()));
0860     ctrl->setGridPattern(static_cast<Core::GridPattern>(obj[Core::jsonctrl::vmap::JSON_GRID_PATTERN].toInt()));
0861     ctrl->setVisibility(static_cast<Core::VisibilityMode>(obj[Core::jsonctrl::vmap::JSON_VISIBILITY].toInt()));
0862     ctrl->setBackgroundColor(QColor(obj[Core::jsonctrl::vmap::JSON_BACKGROUND_COLOR].toString()));
0863     ctrl->setToolColor(QColor(obj[Core::jsonctrl::vmap::JSON_TOOL_COLOR].toString()));
0864     ctrl->setPenSize(obj[Core::jsonctrl::vmap::JSON_PEN_SIZE].toInt());
0865     ctrl->setNpcNumber(obj[Core::jsonctrl::vmap::JSON_NPC_NUMBER].toInt());
0866     ctrl->setZoomLevel(obj[Core::jsonctrl::vmap::JSON_ZOOM_LEVEL].toDouble());
0867     ctrl->setLayer(static_cast<Core::Layer>(obj[Core::jsonctrl::vmap::JSON_Layer].toInt()));
0868     ctrl->setOpacity(obj[Core::jsonctrl::vmap::JSON_OPACITY].toDouble());
0869     ctrl->setVisualRect(QRectF{obj[Core::jsonctrl::vmap::JSON_VISUAL_RECT_X].toDouble(),
0870                                obj[Core::jsonctrl::vmap::JSON_VISUAL_RECT_Y].toDouble(),
0871                                obj[Core::jsonctrl::vmap::JSON_VISUAL_RECT_W].toDouble(),
0872                                obj[Core::jsonctrl::vmap::JSON_VISUAL_RECT_H].toDouble()});
0873     ctrl->setIdle(obj[Core::jsonctrl::vmap::JSON_IDLE].toBool());
0874     ctrl->setZindex(obj[Core::jsonctrl::vmap::JSON_Z_INDEX].toDouble());
0875 
0876     // fog singularies
0877     auto sight= ctrl->sightController();
0878 
0879     readVmapSightController(sight, obj[Core::jsonctrl::vmap::JSON_SIGHT_CTRL].toObject());
0880 
0881     readModel(ctrl, itemArray);
0882 }