【问题标题】:How do you find values like 0x000000 for definitions in C++?如何在 C++ 中为定义找到像 0x000000 这样的值?
【发布时间】:2020-08-17 12:30:55
【问题描述】:

我正在编辑视频游戏的一些文件,并且有一个名为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**

玩家、敌人、你的公会、你的队伍等

游戏中还有一个称为氏族的系统,其运作方式类似于公会和派对。氏族有氏族成员和氏族盟友,就像公会一样。他们不能互相攻击,这就是为什么我想像这样添加氏族定义:

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 位类型的值,它决定了鼠标玩家的鼠标悬停在什么地方?此代码是服务器端的,因此它会向客户端发送关于如何制作鼠标光标等的响应。

我的问题是如何找出这些值是什么?它是您在 .exe 中寻找的东西吗?我检查了所有其他 .cpp 和 .hpp 文件,并且能够在任何地方找到该值。有人知道我应该去哪里看吗?

【问题讨论】:

  • “我的问题是如何找出这些值是什么?” - 你的意思是值的类型吗?我不明白你的问题是什么。
  • 那些看起来像面具。如果是这种情况,你不能使用0x300000,它会搞砸一切。
  • 是的,值的类型。
  • 您显示的第一个代码块似乎是一个长变量声明语句,分成几行,类型只是battle_check_target。 0x000000 等值是 int 字面量。
  • 我知道这是一个很长的镜头,但你知道我在哪里可以找到与部落有关的地方吗? "BCT_SAMEGUILD = 0x200000, ///

标签: c++ definition game-development


【解决方案1】:

跳过尾随 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 让我觉得额外的位已经用于其他事情......所以没有必要添加新属性。

您还必须正确地将这些标志设置为变量...

【讨论】:

    猜你喜欢
    • 2021-07-24
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    • 2017-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    相关资源
    最近更新 更多