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 }