Revise EVENT_CHANGEWEAPON so that RETURN has no effect except for two values. -1 will cancel the weapon switch. -2 will override the switch to whatever value p->curr_weapon is set in the course of the event.

While we're at it, factor out duplicate code into P_ChangeWeapon().

git-svn-id: https://svn.eduke32.com/eduke32@3015 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
hendricks266 2012-09-13 07:06:11 +00:00
parent a7688523a1
commit 74c00dbbd6

View file

@ -3365,18 +3365,22 @@ void P_AddWeaponNoSwitch(DukePlayer_t *p, int32_t weapon)
A_PlaySound(aplWeaponSelectSound[weapon][snum],p->i); A_PlaySound(aplWeaponSelectSound[weapon][snum],p->i);
} }
void P_AddWeapon(DukePlayer_t *p,int32_t weapon) void P_ChangeWeapon(DukePlayer_t *p,int32_t weapon)
{ {
int32_t snum = sprite[p->i].yvel; int32_t i = 0, snum = sprite[p->i].yvel;
int8_t curr_weapon = p->curr_weapon;
P_AddWeaponNoSwitch(p, weapon);
if (p->reloading) return; if (p->reloading) return;
if (p->curr_weapon != weapon && apScriptGameEvent[EVENT_CHANGEWEAPON]) if (p->curr_weapon != weapon && apScriptGameEvent[EVENT_CHANGEWEAPON])
weapon = VM_OnEvent(EVENT_CHANGEWEAPON,p->i, snum, -1, weapon); i = VM_OnEvent(EVENT_CHANGEWEAPON,p->i, snum, -1, weapon);
if (weapon < 0)
if (i == -1)
return; return;
else if (i != -2)
p->curr_weapon = weapon;
p->last_weapon = curr_weapon;
p->random_club_frame = 0; p->random_club_frame = 0;
@ -3384,8 +3388,6 @@ void P_AddWeapon(DukePlayer_t *p,int32_t weapon)
p->weapon_pos = -1; p->weapon_pos = -1;
else p->weapon_pos = -9; else p->weapon_pos = -9;
p->last_weapon = p->curr_weapon;
if (p->holster_weapon) if (p->holster_weapon)
{ {
p->weapon_pos = 10; p->weapon_pos = 10;
@ -3395,14 +3397,18 @@ void P_AddWeapon(DukePlayer_t *p,int32_t weapon)
p->kickback_pic = 0; p->kickback_pic = 0;
p->curr_weapon = weapon; Gv_SetVar(g_iWeaponVarID, p->curr_weapon, p->i, snum);
Gv_SetVar(g_iWeaponVarID,p->curr_weapon, p->i, snum);
Gv_SetVar(g_iWorksLikeVarID, Gv_SetVar(g_iWorksLikeVarID,
(unsigned)p->curr_weapon < MAX_WEAPONS ? aplWeaponWorksLike[p->curr_weapon][snum] : -1, (unsigned)p->curr_weapon < MAX_WEAPONS ? aplWeaponWorksLike[p->curr_weapon][snum] : -1,
p->i, snum); p->i, snum);
} }
void P_AddWeapon(DukePlayer_t *p,int32_t weapon)
{
P_AddWeaponNoSwitch(p, weapon);
P_ChangeWeapon(p, weapon);
}
void P_SelectNextInvItem(DukePlayer_t *p) void P_SelectNextInvItem(DukePlayer_t *p)
{ {
if (p->inv_amount[GET_FIRSTAID] > 0) if (p->inv_amount[GET_FIRSTAID] > 0)
@ -3424,64 +3430,47 @@ void P_SelectNextInvItem(DukePlayer_t *p)
void P_CheckWeapon(DukePlayer_t *p) void P_CheckWeapon(DukePlayer_t *p)
{ {
int32_t i, snum, weap; int32_t i, snum, weapon;
if (p->reloading) return; if (p->reloading) return;
if (p->wantweaponfire >= 0) if (p->wantweaponfire >= 0)
{ {
weap = p->wantweaponfire; weapon = p->wantweaponfire;
p->wantweaponfire = -1; p->wantweaponfire = -1;
if (weap == p->curr_weapon) return; if (weapon == p->curr_weapon) return;
if ((p->gotweapon & (1<<weap)) && p->ammo_amount[weap] > 0) if ((p->gotweapon & (1<<weapon)) && p->ammo_amount[weapon] > 0)
{ {
P_AddWeapon(p,weap); P_AddWeapon(p,weapon);
return; return;
} }
} }
weap = p->curr_weapon; weapon = p->curr_weapon;
if ((p->gotweapon & (1<<weap)) && (p->ammo_amount[weap] > 0 || !(p->weaponswitch & 2))) if ((p->gotweapon & (1<<weapon)) && (p->ammo_amount[weapon] > 0 || !(p->weaponswitch & 2)))
return; return;
snum = sprite[p->i].yvel; snum = sprite[p->i].yvel;
for (i=0; i<10; i++) for (i=0; i<10; i++)
{ {
weap = g_player[snum].wchoice[i]; weapon = g_player[snum].wchoice[i];
if (VOLUMEONE && weap > 6) continue; if (VOLUMEONE && weapon > 6) continue;
if (weap == 0) weap = 9; if (weapon == 0) weapon = 9;
else weap--; else weapon--;
if (weap == 0 || ((p->gotweapon & (1<<weap)) && p->ammo_amount[weap] > 0)) if (weapon == 0 || ((p->gotweapon & (1<<weapon)) && p->ammo_amount[weapon] > 0))
break; break;
} }
if (i == 10) weap = 0; if (i == 10) weapon = 0;
// Found the weapon // Found the weapon
if (apScriptGameEvent[EVENT_CHANGEWEAPON]) P_ChangeWeapon(p, weapon);
weap = VM_OnEvent(EVENT_CHANGEWEAPON,p->i, snum, -1, weap);
if (weap < 0)
return;
p->last_weapon = p->curr_weapon;
p->random_club_frame = 0;
p->curr_weapon = weap;
Gv_SetVar(g_iWeaponVarID,p->curr_weapon, p->i, snum);
Gv_SetVar(g_iWorksLikeVarID, (unsigned)p->curr_weapon < MAX_WEAPONS ? aplWeaponWorksLike[p->curr_weapon][snum] : -1, p->i, snum);
p->kickback_pic = 0;
if (p->holster_weapon == 1)
{
p->holster_weapon = 0;
p->weapon_pos = 10;
}
else p->weapon_pos = -1;
} }
void P_CheckTouchDamage(DukePlayer_t *p, int32_t obj) void P_CheckTouchDamage(DukePlayer_t *p, int32_t obj)