X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;ds=sidebyside;f=qcsrc%2Fcommon%2Fweapons%2Fweapons.qc;h=2f9dd2c92eb3714beb25cfcb8df950db0ab5cad4;hb=680a2f11618558901cddf9fc74b15ef07db66e55;hp=4ed0549b53d8b949a744edd6b6b2b6b0b795c4d3;hpb=6b7f6568458d842f2416c8fb0d6b5127a478cb44;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/weapons/weapons.qc b/qcsrc/common/weapons/weapons.qc index 4ed0549b5..2f9dd2c92 100644 --- a/qcsrc/common/weapons/weapons.qc +++ b/qcsrc/common/weapons/weapons.qc @@ -7,13 +7,80 @@ entity weapon_info[WEP_MAXCOUNT]; entity dummy_weapon_info; -void register_weapon(float id, float(float) func, float ammotype, float i, float weapontype, float pickupbasevalue, string modelname, string shortname, string wname) +#if WEP_MAXCOUNT > 72 +# error Kein Weltraum links auf dem Gerät +#endif + +WepSet WepSet_FromWeapon(float a) { + a -= WEP_FIRST; +#if WEP_MAXCOUNT > 24 + if(a >= 24) { + a -= 24; +#if WEP_MAXCOUNT > 48 + if(a >= 24) { + a -= 24; + return '0 0 1' * power2of(a); + } +#endif + return '0 1 0' * power2of(a); + } +#endif + return '1 0 0' * power2of(a); +} +#ifdef SVQC +void WepSet_AddStat() +{ + addstat(STAT_WEAPONS, AS_INT, weapons_x); +#if WEP_MAXCOUNT > 24 + addstat(STAT_WEAPONS2, AS_INT, weapons_y); +#if WEP_MAXCOUNT > 48 + addstat(STAT_WEAPONS3, AS_INT, weapons_z); +#endif +#endif +} +void WriteWepSet(float dst, WepSet w) +{ +#if WEP_MAXCOUNT > 48 + WriteInt72_t(dst, w); +#elif WEP_MAXCOUNT > 24 + WriteInt48_t(dst, w); +#else + WriteInt24_t(dst, w_x); +#endif +} +#endif +#ifdef CSQC +WepSet WepSet_GetFromStat() +{ + WepSet w = '0 0 0'; + w_x = getstati(STAT_WEAPONS); +#if WEP_MAXCOUNT > 24 + w_y = getstati(STAT_WEAPONS2); +#if WEP_MAXCOUNT > 48 + w_z = getstati(STAT_WEAPONS3); +#endif +#endif + return w; +} +WepSet ReadWepSet() +{ +#if WEP_MAXCOUNT > 48 + return ReadInt72_t(); +#elif WEP_MAXCOUNT > 24 + return ReadInt48_t(); +#else + return ReadInt24_t() * '1 0 0'; +#endif +} +#endif + +void register_weapon(float id, WepSet bit, float(float) func, float ammotype, float i, float weapontype, float pickupbasevalue, string modelname, string shortname, string wname) { entity e; weapon_info[id - 1] = e = spawn(); e.classname = "weapon_info"; e.weapon = id; - WEPSET_COPY_EW(e, id); + e.weapons = bit; e.netname = shortname; e.message = wname; e.items = ammotype; @@ -38,7 +105,7 @@ void register_weapon(float id, float(float) func, float ammotype, float i, float e.ammo_field = ammo_batteries; #ifndef MENUQC - func(WR_PRECACHE); + func(WR_INIT); #endif } float w_null(float dummy) @@ -50,7 +117,7 @@ void register_weapons_done() dummy_weapon_info = spawn(); dummy_weapon_info.classname = "weapon_info"; dummy_weapon_info.weapon = 0; // you can recognize dummies by this - WEPSET_CLEAR_E(dummy_weapon_info); + dummy_weapon_info.weapons = '0 0 0'; dummy_weapon_info.netname = ""; dummy_weapon_info.message = "AOL CD Thrower"; dummy_weapon_info.items = 0; @@ -166,20 +233,20 @@ string W_FixWeaponOrder_ForceComplete(string order) void W_RandomWeapons(entity e, float n) { float i, j; - WEPSET_DECLARE_A(remaining); - WEPSET_DECLARE_A(result); - WEPSET_COPY_AE(remaining, e); - WEPSET_CLEAR_A(result); + WepSet remaining; + WepSet result; + remaining = e.weapons; + result = '0 0 0'; for(i = 0; i < n; ++i) { RandomSelection_Init(); for(j = WEP_FIRST; j <= WEP_LAST; ++j) - if(WEPSET_CONTAINS_AW(remaining, j)) + if(remaining & WepSet_FromWeapon(j)) RandomSelection_Add(world, j, string_null, 1, 1); - WEPSET_OR_AW(result, RandomSelection_chosen_float); - WEPSET_ANDNOT_AW(remaining, RandomSelection_chosen_float); + result |= WepSet_FromWeapon(RandomSelection_chosen_float); + remaining &= ~WepSet_FromWeapon(RandomSelection_chosen_float); } - WEPSET_COPY_EA(e, result); + e.weapons = result; } string W_Name(float weaponid)