void Opcode80D0::_run() { Logger::debug("SCRIPT") << "[80D0] [=] void attack_complex(ObjectPtr who, int called_shot, int num_attacks, int bonus" ", int min_damage, int max_damage, int attacker_results, int target_results)" << std::endl; auto dataStack = _script->dataStack(); dataStack->popInteger(); dataStack->popInteger(); dataStack->popInteger(); dataStack->popInteger(); dataStack->popInteger(); dataStack->popInteger(); dataStack->popInteger(); dataStack->popObject(); }
AOContainer::AOContainer(char *pRaw, unsigned int size) : AOMessageBase(pRaw, size) { skip(4); // 0x01000000 object type? m_slots = popChar(); // 0x15 for backpacks skip(4); // 0x00000003 ??? introduced after 16.1 or so.. m_itemCount = (popInteger() - 1009)/1009; // mass? seems related to number of items in backpack. 1009 + 1009*numitems for (unsigned int i = 0; i < m_itemCount; ++i) { m_items.push_back(AOContainerItem(*this)); } m_containerId = AOObjectId(*this); m_counter = popInteger(); // Number of times this message has been received? skip(4); }
void Opcode80AE::_run() { Logger::debug("SCRIPT") << "[80AE] [=] int do_check(ObjectPtr who, int check, int modifier)" << std::endl; auto dataStack = _script->dataStack(); dataStack->popInteger(); dataStack->popInteger(); dataStack->popObject(); dataStack->push(2); }
void Opcode80AC::_run() { Logger::debug("SCRIPT") << "[80AC] [=] int roll_vs_skill(ObjectPtr who, int skill, int modifier)" << std::endl; auto dataStack = _script->dataStack(); dataStack->popInteger(); dataStack->popInteger(); dataStack->popObject(); dataStack->push(2); }
void Opcode80A9::_run() { Logger::debug("SCRIPT") << "[80A9] [+] void override_map_start(int x, int y, int elevation, int orientation)" << std::endl; auto dataStack = _script->dataStack(); auto orientation = dataStack->popInteger(); auto elevation = dataStack->popInteger(); auto y = dataStack->popInteger(); auto x = dataStack->popInteger(); auto position = y*200 + x; auto game = Game::Game::getInstance(); auto player = game->player(); auto hexagon = game->locationState()->hexagonGrid()->at(position); Game::getInstance()->locationState()->moveObjectToHexagon(player, hexagon); //player->setPosition(position); player->setOrientation(orientation); player->setElevation(elevation); Game::Game::getInstance()->locationState()->centerCameraAtHexagon(player->hexagon()); }
void Opcode80E1::_run() { // @TODO: add implementation Logger::debug("SCRIPT") << "[80E1] [*] int metarule3(int meta, int p1, int p2, int p3)" << std::endl; auto dataStack = _script->dataStack(); auto arg3 = dataStack->pop(); auto arg2 = dataStack->pop(); auto arg1 = dataStack->pop(); auto meta = dataStack->popInteger(); int result = 0; switch(meta) { case 100: // rm_fixed_timer_event(object, fixed_param, 0) { auto state = Game::Game::getInstance()->locationState(); if (state) { state->removeTimerEvent(arg1.objectValue(), arg2.integerValue()); } break; } case 101: // mark subtile visited on worldmap - mark_world_subtile_visited(x, y, radius) break; case 102: // METARULE3_SET_WM_MUSIC - (map index, ACM file name) break; case 103: // player_kill_count(critterType) break; case 104: // int mark_map_entrance_state(int map_idx, int state, int elev); elev -1 means for all elevations break; case 105: // int wm_get_subtile_state(int xPos, int yPos) (0 - unknown, 1 - known, 2 - visited) break; case 106: // ObjectPtr tile_get_next_critter(int tile_num, int elev, ObjectPtr last_critter) break; case 107: // int art_change_fid_num(ObjectPtr who, int fid) - change base FID num for object break; case 108: // void tile_set_center(int tileNum) - center camera on given tile { auto state = Game::Game::getInstance()->locationState(); if (state) { state->centerCameraAtHexagon(arg1.integerValue()); } break; } default: _error("metarule3 - unknown meta: " + std::to_string(meta)); break; } dataStack->push(result); }
AOFullCharacterMessage::AOFullCharacterMessage(char *pRaw, unsigned int size) : AOMessageBase(pRaw, size) { popChar(); // padding? popInteger(); // version field (0x19) // Read inventory and equip unsigned int count = pop3F1Count(); for (unsigned int i = 0; i < count; ++i) { m_inventory.push_back(AOContainerItemPtr(new AOContainerItem(*this))); } // Read uploaded nano programs count = pop3F1Count(); for (unsigned int i = 0; i < count; ++i) { m_nanos.push_back(popInteger()); } // Unknown (but empty) collection count = pop3F1Count(); assert(count == 0); // unknown ints (perk timers?) for (unsigned int i = 0; i < 3; ++i) { unsigned int key = popInteger(); unsigned int val = popInteger(); for (unsigned int j = 0; j < val; ++j) { //00 00 00 01 00 00 d6 f3 00 00 01 cd 00 00 00 5a //00 00 00 50 00 00 00 01 00 00 d6 f3 00 00 01 91 //00 00 00 f0 00 00 00 ed skip(sizeof(unsigned int) * 5); } } // Stats map (32 bit id, 32 bit value) count = pop3F1Count(); for (unsigned int i = 0; i < count; ++i) { unsigned int key = popInteger(); unsigned int val = popInteger(); m_stats[key] = val; } // Stats map (32 bit id, 32 bit value) count = pop3F1Count(); for (unsigned int i = 0; i < count; ++i) { unsigned int key = popInteger(); unsigned int val = popInteger(); m_stats[key] = val; } // Stats map (8 bit id, 8 bit value) count = pop3F1Count(); for (unsigned int i = 0; i < count; ++i) { unsigned char key = popChar(); unsigned char val = popChar(); m_stats[key] = val; } // Stats map (8 bit id, 16 bit value) count = pop3F1Count(); for (unsigned int i = 0; i < count; ++i) { unsigned char key = popChar(); unsigned short val = popShort(); m_stats[key] = val; } // Unknown array (resetting absorb AC?) count = popInteger(); for (unsigned int i = 0; i < count; ++i) { unsigned int key = popInteger(); unsigned int val = popInteger(); } // unknown int skip(sizeof(unsigned int)); // Unknown (but previously empty) collection count = pop3F1Count(); //assert(count == 0); // Unknown (but previously empty) collection count = pop3F1Count(); //assert(count == 0); // Unknown collection of 16 byte structs. // Probably perk information of some sort? count = pop3F1Count(); skip(count * 16); // Assertion no longer valid //assert(pos() == end()); }