Exemplo n.º 1
0
            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();
            }
Exemplo n.º 2
0
    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);
    }
Exemplo n.º 3
0
 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);
 }
Exemplo n.º 4
0
 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);
 }
Exemplo n.º 5
0
            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());
            }
Exemplo n.º 6
0
            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);
            }
Exemplo n.º 7
0
    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());
    }