1
0
Fork 0
mirror of https://codeberg.org/noisytoot/notnotdnethack.git synced 2025-08-07 21:25:26 +01:00

Merge pull request #1834 from NeroOneTrueKing/patch-returning-artis

Make 'returns when thrown' an ARTA property
This commit is contained in:
Chris-plus-alphanumericgibberish 2022-01-09 21:06:40 -05:00 committed by GitHub
commit 6eb7cef805
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 33 additions and 20 deletions

View file

@ -54,6 +54,7 @@
#define ARTA_EXPLCOLDX 0x01000000L /* cold explosion; 100% chance*/
#define ARTA_EXPLELECX 0x02000000L /* elec explosion; 100% chance*/
#define ARTA_KNOCKBACKX 0x04000000L /* knockback; 100% chance*/
#define ARTA_RETURNING 0x08000000L /* returns to the hand when thrown */
#define ARTP_SEEK 0x0001L /* helps you search, ie, adds enhancement bonus to attempts -- only coded for mainhand weapons */
#define ARTP_NOCALL 0x0002L /* prevents demons from being gated in */

View file

@ -618,7 +618,7 @@ A("Windrider", BOOMERANG, "winged %s",
4000L, MT_DEFAULT, MZ_DEFAULT, WT_DEFAULT,
A_NONE, NON_PM, NON_PM, TIER_C, NOFLAG,
NO_MONS(),
ATTK(AD_PHYS, 1, 0), NOFLAG,
ATTK(AD_PHYS, 1, 0), ARTA_RETURNING,
PROPS(), NOFLAG,
PROPS(), NOFLAG,
NOINVOKE, NOFLAG
@ -1746,7 +1746,7 @@ A("Amhimitl", JAVELIN, (const char *)0,
3000L, BONE, MZ_DEFAULT, WT_DEFAULT,
A_NEUTRAL, PM_ARCHEOLOGIST, NON_PM, TIER_D, (ARTG_NOGEN|ARTG_NOWISH|ARTG_FXALGN),
NO_MONS(),
ATTK(AD_FIRE, 5, 8), NOFLAG,
ATTK(AD_FIRE, 5, 8), ARTA_RETURNING,
PROPS(), NOFLAG,
PROPS(), NOFLAG,
NOINVOKE, NOFLAG
@ -1788,7 +1788,7 @@ A("The Annulus", CHAKRAM, "intricately-featured %s",
3000L, SILVER, MZ_DEFAULT, WT_SPECIAL,
A_CHAOTIC, PM_ANACHRONONAUT, NON_PM, TIER_S, (ARTG_NOGEN|ARTG_NOWISH|ARTG_MAJOR),
NO_MONS(),
ATTK(AD_PHYS, 5, 1), NOFLAG, /*Actually Phys(5,0) if not a lightsaber*/
ATTK(AD_PHYS, 5, 1), ARTA_RETURNING, /*Actually Phys(5,0) if not a lightsaber*/
PROPS(), NOFLAG,
PROPS(ANTIMAGIC, HALF_SPDAM), NOFLAG,
ANNUL, NOFLAG
@ -2005,7 +2005,7 @@ A("Sickle Moon", ELVEN_SICKLE, (const char *)0,
4000L, SILVER, MZ_DEFAULT, WT_DEFAULT,
A_LAWFUL, NON_PM, NON_PM, TIER_B, (ARTG_NOWISH|ARTG_FXALGN), /* may randomly generate */
NO_MONS(),
ATTK(AD_PHYS, 1, 0), NOFLAG,
ATTK(AD_PHYS, 1, 0), ARTA_RETURNING,
PROPS(), NOFLAG,
PROPS(), NOFLAG,
NOINVOKE, NOFLAG
@ -3218,7 +3218,7 @@ A("The Khakkhara of the Monkey", KHAKKHARA, (const char *)0,
0L, MT_DEFAULT, MZ_DEFAULT, WT_DEFAULT,
A_NONE, PM_MONK, NON_PM, NO_TIER, (ARTG_NOGEN|ARTG_NOWISH),
NO_MONS(),
NO_ATTK(), NOFLAG,
NO_ATTK(), ARTA_RETURNING,
PROPS(), NOFLAG,
PROPS(), NOFLAG,
NOINVOKE, NOFLAG
@ -3287,7 +3287,7 @@ A("The Dart of the Assassin", DART, (const char *)0,
0L, MT_DEFAULT, MZ_DEFAULT, WT_DEFAULT,
A_NONE, PM_ROGUE, NON_PM, NO_TIER, (ARTG_NOGEN|ARTG_NOWISH),
NO_MONS(),
NO_ATTK(), NOFLAG,
NO_ATTK(), ARTA_RETURNING,
PROPS(), NOFLAG,
PROPS(), NOFLAG,
SELF_POISON, NOFLAG

View file

@ -126,6 +126,7 @@ E boolean FDECL(arti_blindres, (struct obj *, boolean));
E boolean FDECL(arti_plussev, (struct obj *));
E boolean FDECL(arti_plusten, (struct obj *));
E boolean FDECL(arti_silvered, (struct obj *));
E boolean FDECL(arti_returning, (struct obj *));
E boolean FDECL(arti_reflects, (struct obj *));
E int FDECL(artifact_weight, (struct obj *));
E boolean FDECL(arti_light, (struct obj *));

View file

@ -1845,6 +1845,14 @@ struct obj *obj;
);
}
/* used so that callers don't need to known about SPFX_ codes */
boolean
arti_returning(obj)
struct obj *obj;
{
return (obj && obj->oartifact && (arti_attack_prop(obj, ARTA_RETURNING)));
}
/* used so that callers don't need to known about SPFX_ codes */
boolean
arti_bright(obj)

View file

@ -3010,9 +3010,11 @@ winid *datawin;
ADDCLASSPROP((check_oprop(obj, OPROP_VORPW)), "is vorpal");
ADDCLASSPROP((check_oprop(obj, OPROP_MORGW)), "inflicts unhealing wounds while cursed");
ADDCLASSPROP((check_oprop(obj, OPROP_FLAYW)), "destroys armor");
ADDCLASSPROP((check_oprop(obj, OPROP_RETRW)), "returns when thrown");
if (buf[0] != '\0')
{
Sprintf(buf2, "It %s.", buf);
buf[0] = buf[0] + 'A' - 'a';
Sprintf(buf2, "%s.", buf);
OBJPUTSTR(buf2);
}
}
@ -3034,7 +3036,6 @@ winid *datawin;
ADDCLASSPROP((oart->aflags&ARTA_SHATTER), "shattering");
ADDCLASSPROP((oart->aflags&ARTA_DISARM), "disarming");
ADDCLASSPROP((oart->aflags&ARTA_STEAL), "theiving");
//ADDCLASSPROP((oart->aflags&ARTA_HASTE), " /* hitting defender grants movement to attacker */");
ADDCLASSPROP((oart->aflags&(ARTA_EXPLFIRE|ARTA_EXPLFIREX)), " fire exploding");
ADDCLASSPROP((oart->aflags&(ARTA_EXPLCOLD|ARTA_EXPLCOLDX)), " cold exploding");
ADDCLASSPROP((oart->aflags&(ARTA_EXPLELEC|ARTA_EXPLELECX)), " shock exploding");
@ -3044,6 +3045,17 @@ winid *datawin;
Sprintf(buf2, "Attacks are %s.", buf);
OBJPUTSTR(buf2);
}
/* other stuff
*/
buf[0] = '\0';
ADDCLASSPROP((oart->aflags&ARTA_RETURNING), "returns when thrown");
ADDCLASSPROP((oart->aflags&ARTA_HASTE), "hastens the wielder's attacks");
if (buf[0] != '\0')
{
buf[0] = buf[0] + 'A' - 'a';
Sprintf(buf2, "%s.", buf);
OBJPUTSTR(buf2);
}
}
/* other weapon special effects */
if(obj){

View file

@ -195,13 +195,8 @@ boolean impaired; /* TRUE if throwing/firing slipped OR magr is confused/stun
if(magr && !(hmoncode & HMON_KICKED)){
if ((thrownobj->oartifact == ART_MJOLLNIR && (youagr ? (Role_if(PM_VALKYRIE)) : magr ? (magr->mtyp == PM_VALKYRIE) : FALSE)) ||
(thrownobj->oartifact == ART_AXE_OF_THE_DWARVISH_LORDS && (youagr ? (Race_if(PM_DWARF)) : magr ? (is_dwarf(magr->data)) : FALSE)) ||
thrownobj->oartifact == ART_SICKLE_MOON ||
thrownobj->oartifact == ART_ANNULUS ||
thrownobj->oartifact == ART_KHAKKHARA_OF_THE_MONKEY ||
thrownobj->oartifact == ART_DART_OF_THE_ASSASSIN ||
thrownobj->oartifact == ART_WINDRIDER ||
check_oprop(thrownobj, OPROP_RETRW) ||
thrownobj->oartifact == ART_AMHIMITL
arti_returning(thrownobj) ||
check_oprop(thrownobj, OPROP_RETRW)
) {
returning = TRUE;
if(uandroid && youagr && impaired){
@ -1828,12 +1823,8 @@ int shotlimit;
/* For most things, limit multishot to ammo supply */
if ((long)multishot > ammo->quan && !(
ammo->oartifact == ART_WINDRIDER ||
check_oprop(ammo, OPROP_RETRW) ||
ammo->oartifact == ART_SICKLE_MOON ||
ammo->oartifact == ART_ANNULUS ||
ammo->oartifact == ART_AMHIMITL ||
ammo->oartifact == ART_DART_OF_THE_ASSASSIN ||
(arti_returning(ammo) && objects[ammo->otyp].oc_merge) ||
(launcher && is_blaster(launcher))
))
multishot = (int)ammo->quan;