Как вы находите значения, такие как 0x000000 для определений в C ++? - PullRequest
0 голосов
/ 03 мая 2020

Я редактирую некоторые файлы видеоигры, и есть функция под названием battle_check_target, которая определяет, на кого игрок может атаковать.

battle_check_target

//which has these definitions set for it

    BCT_NOONE       = 0x000000, ///< No one
    BCT_SELF        = 0x010000, ///< Self
    BCT_ENEMY       = 0x020000, ///< Enemy
    BCT_PARTY       = 0x040000, ///< Party members
    BCT_GUILDALLY   = 0x080000, ///< Only allies, NOT guildmates
    BCT_NEUTRAL     = 0x100000, ///< Neutral target
    BCT_SAMEGUILD   = 0x200000, ///< Guildmates, No Guild Allies

    BCT_ALL         = 0x3F0000, ///< All targets

    BCT_WOS         = 0x400000, ///< Except self (currently used for skipping if src == bl in skill_area_sub)
    BCT_GUILD       = BCT_SAMEGUILD|BCT_GUILDALLY,  ///< Guild AND Allies (BCT_SAMEGUILD|BCT_GUILDALLY)
    BCT_NOGUILD     = BCT_ALL&~BCT_GUILD,           ///< Except guildmates
    BCT_NOPARTY     = BCT_ALL&~BCT_PARTY,           ///< Except party members
    BCT_NOENEMY     = BCT_ALL&~BCT_ENEMY,           ///< Except enemy
    BCT_ALLY        = BCT_PARTY|BCT_GUILD,
    BCT_FRIEND      = BCT_NOENEMY,
    BCT_CLAN        = BCT_SAMECLAN|BCT_CLANALLY ///< **What I added**

Игрок, враг, ваша гильдия, ваша группа и т. Д. c.

В игре также есть система, называемая кланами, которая работает как гильдии и партии. У кланов есть кланы и союзники по кланам, как в гильдиях. Они не могут атаковать друг друга, хотя именно поэтому я хочу добавить определения клана следующим образом:

BCT_SAMECLAN    = 0x300000, ///< Clanmates
BCT_CLANALLY    = 0x280000, ///< Clan allies

, а затем поместить их в условное выражение, определяющее, кто может атаковать:

if( !state ) //If not an enemy, nor a guild, nor party, nor yourself, it's neutral.
        state = BCT_NEUTRAL;
    //Alliance state takes precedence over enemy one.
    else if( state&BCT_ENEMY && strip_enemy && state&(BCT_SELF|BCT_PARTY|BCT_GUILD|**BCT_CLAN**) )
        state&=~BCT_ENEMY;

    return (flag&state)?1:-1;
}

///> I also added the **BCT_CLAN**

Я полагаю, что эти значения, например, 0x000000, представляют собой 32-битные значения, которые определяют, на что наведен курсор мыши? Этот код на стороне сервера, поэтому он посылает ответ клиенту о том, что сделать курсор мыши и т. Д. c.

Мой вопрос: как мне go узнать, что это за значения? Это то, что вы ищете в .exe? Я проверил все остальные. cpp и .hpp файл и смог найти это значение где угодно. У кого-нибудь есть идеи, где мне искать?

1 Ответ

0 голосов
/ 03 мая 2020

Пропуск концевого 0 для объяснения.

Эти значения являются флагами для бита:

Name            | hex  | binary
BCT_NOONE       | 0x00 | 0b0000'0000 ///< No one
BCT_SELF        | 0x01 | 0b0000'0001 ///< Self
BCT_ENEMY       | 0x02 | 0b0000'0010 ///< Enemy
BCT_PARTY       | 0x04 | 0b0000'0100 ///< Party members
BCT_GUILDALLY   | 0x08 | 0b0000'1000 ///< Only allies, NOT guildmates
BCT_NEUTRAL     | 0x10 | 0b0001'0000 ///< Neutral target
BCT_SAMEGUILD   | 0x20 | 0b0010'0000 ///< Guildmates, No Guild Allies
BCT_ALL         | 0x3F | 0b0011'1111 ///< All targets
BCT_WOS         | 0x40 | 0b0100'0000 ///< Except self (currently used for skipping if src == bl in skill_area_sub)

// Dependent values
BCT_GUILD       | 0x28 | 0b0010'1000 // BCT_SAMEGUILD|BCT_GUILDALLY,  ///< Guild AND Allies
BCT_NOGUILD     | 0x17 | 0b0001'0111 // BCT_ALL&~BCT_GUILD, ///< Except guildmates
BCT_NOPARTY     | 0x3B | 0b0011'1011 // BCT_ALL&~BCT_PARTY, ///< Except party members
BCT_NOENEMY     | 0x3D | 0b0011'1101 // BCT_ALL&~BCT_ENEMY, ///< Except enemy
BCT_ALLY        | 0x2C | 0b0010'1100 // BCT_PARTY|BCT_GUILD,
BCT_FRIEND      | 0x3D | 0b0011'1011 // BCT_NOENEMY,

Вы добавляете:

BCT_SAMECLAN    | 0x30 | 0b0011'0000 ///< Expected Clanmates, but same as Same guild or neutral
BCT_CLANALLY    | 0x28 | 0b0010'1000 ///< Expected Clan allies, but same as Same guild or guild ally
BCT_CLAN        | 0x38 | 0b0011'1000 // BCT_SAMECLAN|BCT_CLANALLY ///< -> Guild or Neutral

Что круче не то, что вы хочу

и с примером в коде:

if (!state) //If not an enemy, nor a guild, nor party, nor yourself, it's neutral.
    state = BCT_NEUTRAL;
    //Alliance state takes precedence over enemy one.
else if ( (state & BCT_ENEMY) // Has ENEMY flag
       && strip_enemy
       && state & (BCT_SELF    // Is self
                  | BCT_PARTY  // or party member
                  | BCT_GUILD  // or same guild or ally guild
                  | BCT_CLAN /*Added*/) // or guild(same as above) or neutral
    )
    state &= ~BCT_ENEMY; // Remove ENEMY flag
return (flag & state) ? 1 : -1; // Do they share at least one common "property"?

Идея заключалась в том, чтобы добавить / изменить:

BCT_ALL         | 0x01BF | 0b0000'0001'1011'1111 ///< All targets including clans
BCT_SAME_CLAN   | 0x0080 | 0b0000'0000'1000'0000 
BCT_CLAN_ALLY   | 0x0100 | 0b0000'0001'0000'0000 

Но, в вашем случае, конечные 0 делают меня таким, что дополнительные биты уже используются для других целей ... Поэтому нет необходимости добавлять новые свойства.

Вы также должны правильно установить эти флаги для переменных ...

...