/* ScummVM - Graphic Adventure Engine * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT * file distributed with this source distribution. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #include "ultima/ultima8/misc/common_types.h" #include "ultima/ultima8/world/item_factory.h" #include "ultima/ultima8/games/game_data.h" #include "ultima/ultima8/gfx/main_shape_archive.h" #include "ultima/ultima8/world/actors/main_actor.h" #include "ultima/ultima8/world/glob_egg.h" #include "ultima/ultima8/world/monster_egg.h" #include "ultima/ultima8/world/teleport_egg.h" #include "ultima/ultima8/ultima8.h" namespace Ultima { namespace Ultima8 { static Item *getItemForFamily(uint32 family) { switch (family) { case ShapeInfo::SF_GENERIC: case ShapeInfo::SF_QUALITY: case ShapeInfo::SF_QUANTITY: case ShapeInfo::SF_BREAKABLE: case ShapeInfo::SF_REAGENT: // reagents need special handling too case ShapeInfo::SF_CRUWEAPON: case ShapeInfo::SF_CRUAMMO: case ShapeInfo::SF_CRUBOMB: case ShapeInfo::SF_CRUINVITEM: case ShapeInfo::SF_15: // what's this? // 'simple' item return new Item(); case ShapeInfo::SF_CONTAINER: return new Container(); case ShapeInfo::SF_GLOBEGG: return new GlobEgg(); case ShapeInfo::SF_UNKEGG: return new Egg(); case ShapeInfo::SF_MONSTEREGG: // FIXME: For crusader, item family 7 is also treated like a container // (it can have contents, and the contents can be destroyed. // Is it not the same as monster egg? return new MonsterEgg(); case ShapeInfo::SF_TELEPORTEGG: return new TeleportEgg(); } return nullptr; } Item *ItemFactory::createItem(uint32 shape, uint32 frame, uint16 quality, uint16 flags, uint16 npcnum, uint16 mapnum, uint32 extendedflags, bool objId) { // check what class to create const ShapeInfo *info = GameData::get_instance()->getMainShapes()-> getShapeInfo(shape); if (info == nullptr) return nullptr; // New item, no lerping extendedflags |= Item::EXT_LERP_NOPREV; uint32 family = info->_family; Item *item = getItemForFamily(family); if (item) { item->setShape(shape); item->_frame = frame; item->_quality = quality; item->_flags = flags; item->_npcNum = npcnum; item->_mapNum = mapnum; item->_extendedFlags = extendedflags; if (objId) item->assignObjId(); if (GAME_IS_CRUSADER) { if (info->_damageInfo && info->_damageInfo->takesDamage()) { item->setDamagePoints(info->_damageInfo->damagePoints()); } // else damage points is default 1 (set in Item constructor) if (info->_family == ShapeInfo::SF_CRUWEAPON && info->_weaponInfo && info->_weaponInfo->_clipSize) { item->setQuality(info->_weaponInfo->_clipSize); } if (info->_family == ShapeInfo::SF_CRUAMMO || info->_family == ShapeInfo::SF_CRUBOMB) { item->setQuality(1); } } } return item; } static Actor *getActorForNpcNum(uint32 npcnum) { if (npcnum == kMainActorId) return new MainActor(); // 'normal' Actor/NPC return new Actor(); } Actor *ItemFactory::createActor(uint32 shape, uint32 frame, uint16 quality, uint16 flags, uint16 npcnum, uint16 mapnum, uint32 extendedflags, bool objId) { // New actor, no lerping extendedflags |= Item::EXT_LERP_NOPREV; Actor *actor = getActorForNpcNum(npcnum); actor->setShape(shape); actor->_frame = frame; actor->_quality = quality; actor->_flags = flags; actor->_npcNum = npcnum; actor->_mapNum = mapnum; if (npcnum != 0) { actor->_objId = static_cast(npcnum); } else if (objId) { actor->assignObjId(); } actor->_extendedFlags = extendedflags; return actor; } } // End of namespace Ultima8 } // End of namespace Ultima