NPC::NPC() : Entity() , name("") , gfx("") , pos() , level(1) , direction(0) , talker(false) , vendor(false) , stock() , stock_count(0) , vox_intro() , vox_quests() , dialog() { stock.init(NPC_VENDOR_MAX_STOCK); }
NPC::NPC(MapRenderer *_map, ItemManager *_items) : Entity(_map) , items(_items) , name("") , gfx("") , pos(Point()) , level(1) , direction(0) , portrait(NULL) , talker(false) , vendor(false) , stock(ItemStorage()) , stock_count(0) , vox_intro(vector<SoundManager::SoundID>()) , vox_quests(vector<SoundManager::SoundID>()) , dialog(vector<vector<Event_Component> >()) { stock.init(NPC_VENDOR_MAX_STOCK, _items); }
/** * NPCs are stored in simple config files * * @param npc_id Config file loaded at npcs/[npc_id].txt */ void NPC::load(const string& npc_id, int hero_level) { FileParser infile; ItemStack stack; string filename_portrait = ""; if (infile.open("npcs/" + npc_id + ".txt")) { while (infile.next()) { if (infile.section == "dialog") { if (infile.new_section) { dialog.push_back(vector<Event_Component>()); } Event_Component e; e.type = infile.key; if (infile.key == "requires_status") e.s = infile.val; else if (infile.key == "requires_not") e.s = infile.val; else if (infile.key == "requires_level") e.x = toInt(infile.val); else if (infile.key == "requires_not_level") e.x = toInt(infile.val); else if (infile.key == "requires_item") e.x = toInt(infile.val); else if (infile.key == "him" || infile.key == "her") e.s = msg->get(infile.val); else if (infile.key == "you") e.s = msg->get(infile.val); else if (infile.key == "reward_item") { // id,count e.x = toInt(infile.nextValue()); e.y = toInt(infile.val); } else if (infile.key == "reward_xp") e.x = toInt(infile.val); else if (infile.key == "restore") e.s = infile.val; else if (infile.key == "reward_currency") e.x = toInt(infile.val); else if (infile.key == "remove_item") e.x = toInt(infile.val); else if (infile.key == "set_status") e.s = infile.val; else if (infile.key == "unset_status") e.s = infile.val; else if (infile.key == "voice") { e.x = loadSound(infile.val, NPC_VOX_QUEST); } else if (infile.key == "topic") { e.s = msg->get(infile.val); } else if (infile.key == "group") { e.s = infile.val; } dialog.back().push_back(e); } else { filename = npc_id; if (infile.key == "name") { name = msg->get(infile.val); } else if (infile.key == "level") { if (infile.val == "hero") level = hero_level; else level = toInt(infile.val); } else if (infile.key == "gfx") { gfx = infile.val; } // handle talkers else if (infile.key == "talker") { if (infile.val == "true") talker = true; } else if (infile.key == "portrait") { filename_portrait = infile.val; } // handle vendors else if (infile.key == "vendor") { if (infile.val == "true") vendor = true; } else if (infile.key == "constant_stock") { stack.quantity = 1; while (infile.val != "") { stack.item = toInt(infile.nextValue()); stock.add(stack); } } else if (infile.key == "status_stock") { if (camp->checkStatus(infile.nextValue())) { stack.quantity = 1; while (infile.val != "") { stack.item = toInt(infile.nextValue()); stock.add(stack); } } } // handle vocals else if (infile.key == "vox_intro") { loadSound(infile.val, NPC_VOX_INTRO); } } } infile.close(); } loadGraphics(filename_portrait); }