Skip to content

Commit

Permalink
[Jul 30 2024] - Gicker
Browse files Browse the repository at this point in the history
  Fixed a bug with the spells command not working right in some situations.
  Some healing spells cast on undead will now harm them. Conversely, some cause X wounds spells cast on undead will heal them.
  Fixed weapon specialization feat prerequisites
  Hints have been updated to coincide with Chronicles of Krynn specifics.
  Fixed a bug allowing eidolons to see in dark in order to allow them to follow orders given by their masters.
[Jul 29 2024] - Gicker
  Fixed shop sell rates to prevent money gain loopholes
  grapple should now show in maneuvers list for both pcs and npcs
  Shadow body psionic power should now properly bestow immune to critical hits.
  Fixed an error where max augment psp was being displayed incorrectly in score.
  Fixed master of the mind feat to work with most psionic powers now.
  Wildshaping into a fire elemental now provides light in the room you occupy.
  • Loading branch information
GickerLDS committed Jul 30, 2024
1 parent e84523f commit 3560f84
Show file tree
Hide file tree
Showing 23 changed files with 304 additions and 102 deletions.
1 change: 1 addition & 0 deletions act.h
Original file line number Diff line number Diff line change
Expand Up @@ -545,6 +545,7 @@ ACMD_DECL(do_faeriefire);
ACMDCHECK(can_faeriefire);
ACMD_DECL(do_kick);
ACMDCHECK(can_kick);
ACMDCHECK(can_grapple);
ACMD_DECL(do_slam);
ACMDCHECK(can_slam);
ACMD_DECL(do_blood_drain);
Expand Down
2 changes: 1 addition & 1 deletion act.informative.c
Original file line number Diff line number Diff line change
Expand Up @@ -3344,7 +3344,7 @@ ACMD(do_score)
GET_PSP(ch), GET_MAX_PSP(ch),
GET_PSIONIC_LEVEL(ch),
damtypes[GET_PSIONIC_ENERGY_TYPE(ch)],
GET_PSIONIC_LEVEL(ch));
base_augment_psp_allowed(ch));
}

text_line(ch, "\tyQuest Info\tC", line_length, '-', '-');
Expand Down
13 changes: 13 additions & 0 deletions act.offensive.c
Original file line number Diff line number Diff line change
Expand Up @@ -6018,6 +6018,11 @@ ACMDCHECK(can_kick)
return CAN_CMD;
}

ACMDCHECK(can_grapple)
{
return CAN_CMD;
}

ACMDCHECK(can_slam)
{
return CAN_CMD;
Expand Down Expand Up @@ -7062,6 +7067,14 @@ ACMD(do_bodyslam)
return;
}

#if defined(CAMPAIGN_DL)
if (GET_SIZE(vict) >= GET_SIZE(ch))
{
send_to_char(ch, "You can only bodyslam targets smaller than yourself.\r\n");
return;
}
#endif

perform_knockdown(ch, vict, SKILL_BODYSLAM, true, true);
}

Expand Down
125 changes: 95 additions & 30 deletions act.other.c

Large diffs are not rendered by default.

7 changes: 7 additions & 0 deletions class.c
Original file line number Diff line number Diff line change
Expand Up @@ -3506,6 +3506,11 @@ void advance_level(struct char_data *ch, int class)
class_feats++;
}

if (class == CLASS_NECROMANCER && CLASS_LEVEL(ch, CLASS_NECROMANCER) == 7)
{
class_feats++;
}

if (class == CLASS_BARD)
{
if (CLASS_LEVEL(ch, CLASS_BARD) <= 20 && !(CLASS_LEVEL(ch, CLASS_BARD) % 3))
Expand Down Expand Up @@ -8854,6 +8859,8 @@ void load_class_list(void)
feat_assignment(CLASS_NECROMANCER, FEAT_ESSENCE_OF_UNDEATH, Y, 10, Y);
feat_assignment(CLASS_NECROMANCER, FEAT_DEATHLESS_TOUCH, Y, 10, Y);

feat_assignment(CLASS_NECROMANCER, FEAT_WEAPON_SPECIALIZATION, Y, NOASSIGN_FEAT, N);

/* pre reqs to take assassin class */
class_prereq_ability(CLASS_NECROMANCER, ABILITY_LORE, 8);
class_prereq_spellcasting(CLASS_NECROMANCER, CASTING_TYPE_ANY, PREP_TYPE_ANY, 4 /*circle*/);
Expand Down
12 changes: 6 additions & 6 deletions constants.c
Original file line number Diff line number Diff line change
Expand Up @@ -1085,9 +1085,9 @@ const char *damtype_display[] = {
"Damage Holy",
"Damage Electric",
"Damage Unholy",
"Damage Slice",
"Damage Puncture",
"Damage Force",
"Damage Slashing",
"Damage Piercing",
"Damage Bludgeoning",
"Damage Sound",
"Damage Poison",
"Damage Disease",
Expand Down Expand Up @@ -2499,9 +2499,9 @@ const char *apply_types[] = {
"Resist-Holy",
"Resist-Electric",
"Resist-Unholy", /*35*/
"Resist-Slice",
"Resist-Puncture",
"Resist-Force",
"Resist-Slashing",
"Resist-Piercing",
"Resist-Bludgeoning",
"Resist-Sound",
"Resist-Poison", /*40*/
"Resist-Disease",
Expand Down
10 changes: 9 additions & 1 deletion db.c
Original file line number Diff line number Diff line change
Expand Up @@ -2931,7 +2931,8 @@ const char *parse_object(FILE *obj_f, int nr)
[2] = 0;
GET_OBJ_PERM(obj_proto + i)
[3] = 0;



if (bitsavetodisk)
{
add_to_save_list(zone_table[real_zone_by_thing(nr)].number, 1);
Expand Down Expand Up @@ -2981,6 +2982,13 @@ const char *parse_object(FILE *obj_f, int nr)
/* Object flags checked in check_object(). */
GET_OBJ_TYPE(obj_proto + i) = t[0];

// Weapons must be wielded. Cannot use the hold command on them.
// We'll remove any hold wear flags to ensure this isn't possible
if (GET_OBJ_TYPE(obj_proto + i) == ITEM_WEAPON)
{
REMOVE_BIT_AR(GET_OBJ_WEAR(obj_proto + i), ITEM_WEAR_HOLD);
}

if (!get_line(obj_f, line))
{
log("SYSERR: Expecting second numeric line of %s, but file ended!", buf2);
Expand Down
6 changes: 4 additions & 2 deletions feats.c
Original file line number Diff line number Diff line change
Expand Up @@ -1240,8 +1240,6 @@ feato(FEAT_MOON_ELF_RACIAL_ADJUSTMENT, "moon elf racial adjustment", TRUE, FALSE
"using the selected weapon.");
feat_prereq_weapon_proficiency(FEAT_WEAPON_SPECIALIZATION);
feat_prereq_cfeat(FEAT_WEAPON_SPECIALIZATION, FEAT_WEAPON_FOCUS);
feat_prereq_class_level(FEAT_WEAPON_SPECIALIZATION, CLASS_WARRIOR, 4);
feat_prereq_class_level(FEAT_WEAPON_SPECIALIZATION, CLASS_NECROMANCER, 7);
feato(FEAT_GREATER_WEAPON_SPECIALIZATION, "greater weapon specialization", TRUE, TRUE, FALSE, FEAT_TYPE_COMBAT,
"+4 damage with weapon",
"Choose one type of weapon, such as halberd, for which you have already "
Expand Down Expand Up @@ -5223,6 +5221,10 @@ feato(FEAT_MOON_ELF_RACIAL_ADJUSTMENT, "moon elf racial adjustment", TRUE, FALSE
"This is a teamwork feat. Teamworks feats only work if you and at least one other member of the party has the same feat.");
teamworkfeat(FEAT_TANDEM_TRIP);

feato(FEAT_AURA_OF_LIGHT, "aura of light", TRUE, FALSE, FALSE, FEAT_TYPE_INNATE_ABILITY,
"You emit an aura of light, illuminating your location.",
"You emit an aura of light, illuminating your location.");

/* self explanatory */
feato(FEAT_LAST_FEAT, "do not take me", FALSE, FALSE, FALSE, FEAT_TYPE_NONE, "placeholder feat", "placeholder feat");

Expand Down
14 changes: 8 additions & 6 deletions fight.c
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,9 @@ static void perform_group_gain(struct char_data *ch, int base,
static void dam_message(int dam, struct char_data *ch, struct char_data *victim,
int w_type, int offhand);
static void make_corpse(struct char_data *ch);
#if !defined(CAMPAIGN_FR) && !defined(CAMPAIGN_DL)
static void change_alignment(struct char_data *ch, struct char_data *victim);
#endif
static void group_gain(struct char_data *ch, struct char_data *victim);
static void solo_gain(struct char_data *ch, struct char_data *victim);
/** @todo refactor this function name */
Expand Down Expand Up @@ -1780,26 +1782,26 @@ static void make_corpse(struct char_data *ch)
obj_to_room(corpse, IN_ROOM(ch));
}

#if !defined(CAMPAIGN_FR) && !defined(CAMPAIGN_DL)
/* When ch kills victim */
static void change_alignment(struct char_data *ch, struct char_data *victim)
{
if (GET_ALIGNMENT(victim) < GET_ALIGNMENT(ch) && !rand_number(0, 19))
{
if (GET_ALIGNMENT(ch) < 1000)
GET_ALIGNMENT(ch)
++;
GET_ALIGNMENT(ch)++;
}
else if (GET_ALIGNMENT(victim) > GET_ALIGNMENT(ch) && !rand_number(0, 19))
{
if (GET_ALIGNMENT(ch) > -1000)
GET_ALIGNMENT(ch)
--;
GET_ALIGNMENT(ch)--;
}

/* new alignment change algorithm: if you kill a monster with alignment A,
* you move 1/16th of the way to having alignment -A. Simple and fast. */
// GET_ALIGNMENT(ch) += (-GET_ALIGNMENT(victim) - GET_ALIGNMENT(ch)) / 16;
}
#endif

/* a function for 'audio' effect of killing, notifies neighboring
room of a nearby death */
Expand Down Expand Up @@ -2322,7 +2324,7 @@ static void perform_group_gain(struct char_data *ch, int base,
gain_exp(ch, share, GAIN_EXP_MODE_GROUP);
}

#if !defined(CAMPAIGN_FR) && !defined(CAMAPIGN_DL)
#if !defined(CAMPAIGN_FR) && !defined(CAMPAIGN_DL)
change_alignment(ch, victim);
#endif
}
Expand Down Expand Up @@ -2456,7 +2458,7 @@ static void solo_gain(struct char_data *ch, struct char_data *victim)
gain_exp(ch, exp, GAIN_EXP_MODE_SOLO);
}

#if !defined(CAMPAIGN_FR) && !defined(CAMAPIGN_DL)
#if !defined(CAMPAIGN_FR) && !defined(CAMPAIGN_DL)
change_alignment(ch, victim);
#endif
}
Expand Down
2 changes: 1 addition & 1 deletion interpreter.c
Original file line number Diff line number Diff line change
Expand Up @@ -435,7 +435,7 @@ cpp_extern const struct command_info cmd_info[] = {
{"gain", "gain", POS_RECLINING, do_gain, 1, 0, FALSE, ACTION_NONE, {0, 0}, NULL},
{"gaseousform", "gaseous", POS_FIGHTING, do_vampiric_gaseous_form, 1, 0, FALSE, ACTION_STANDARD, {0, 0}, can_vampiric_gaseous_form},
{"guard", "guard", POS_FIGHTING, do_guard, 1, 0, FALSE, ACTION_NONE, {0, 0}, can_guard},
{"grapple", "grapple", POS_RECLINING, do_grapple, 1, 0, FALSE, ACTION_STANDARD, {6, 0}, NULL},
{"grapple", "grapple", POS_RECLINING, do_grapple, 1, 0, FALSE, ACTION_STANDARD, {6, 0}, can_grapple},
{"gravemagic", "grave", POS_FIGHTING, do_grave_magic, 1, 0, FALSE, ACTION_MOVE, {6, 0}, NULL},
{"goodlance", "goodlance", POS_STANDING, do_goodlance, 0, 0, FALSE, ACTION_STANDARD, {6, 0}, NULL},
{"goodtouch", "goodtouch", POS_STANDING, do_goodtouch, 0, 0, FALSE, ACTION_STANDARD, {6, 0}, NULL},
Expand Down
24 changes: 17 additions & 7 deletions magic.c
Original file line number Diff line number Diff line change
Expand Up @@ -3367,7 +3367,7 @@ void mag_affects(int level, struct char_data *ch, struct char_data *victim,
break;

case PSIONIC_FORCE_SCREEN:
if (affected_by_spell(ch, PSIONIC_FORCE_SCREEN))
if (affected_by_spell(ch, PSIONIC_FORCE_SCREEN) && ch == victim)
{
send_to_char(ch, "This power can't stack. Use the revoke command if you wish to replace it.\r\n");
return;
Expand Down Expand Up @@ -3409,7 +3409,7 @@ void mag_affects(int level, struct char_data *ch, struct char_data *victim,
break;

case PSIONIC_INERTIAL_ARMOR:
if (affected_by_spell(ch, PSIONIC_INERTIAL_ARMOR))
if (affected_by_spell(ch, PSIONIC_INERTIAL_ARMOR) && ch == victim)
{
send_to_char(ch, "This power can't stack. Use the revoke command if you wish to replace it.\r\n");
return;
Expand Down Expand Up @@ -3551,7 +3551,7 @@ void mag_affects(int level, struct char_data *ch, struct char_data *victim,
break;

case PSIONIC_VIGOR:
if (affected_by_spell(ch, PSIONIC_VIGOR))
if (affected_by_spell(ch, PSIONIC_VIGOR) && ch == victim)
{
send_to_char(ch, "This power can't stack. Use the revoke command if you wish to replace it.\r\n");
return;
Expand All @@ -3571,7 +3571,7 @@ void mag_affects(int level, struct char_data *ch, struct char_data *victim,

case PSIONIC_BIOFEEDBACK:

if (affected_by_spell(ch, PSIONIC_BIOFEEDBACK))
if (affected_by_spell(ch, PSIONIC_BIOFEEDBACK) && ch == victim)
{
send_to_char(ch, "This power can't stack. Use the revoke command if you wish to replace it.\r\n");
return;
Expand Down Expand Up @@ -10306,7 +10306,7 @@ void mag_summons(int level, struct char_data *ch, struct obj_data *obj,
act(mag_summon_to_msgs[msg], FALSE, ch, 0, mob, TO_CHAR);
load_mtrigger(mob);
add_follower(mob, ch);
if (GROUP(ch) && GROUP_LEADER(GROUP(ch)) == ch)
if (!GROUP(mob) && GROUP(ch) && GROUP_LEADER(GROUP(ch)) == ch)
join_group(mob, GROUP(ch));
}

Expand Down Expand Up @@ -10644,10 +10644,20 @@ void mag_points(int level, struct char_data *ch, struct char_data *victim,
// we need to correct the psp cost below, because the power only benefits from 2 augment points at a time.

healing = dice(1 + (GET_AUGMENT_PSP(ch) / 2), 12);
to_notvict = "$n concentrates and some of $s wounds close.";
to_char = "You concentrate and some of your wounds close.";
if (ch == victim)
{
to_char = "You concentrate and some of your wounds close.";
to_notvict = "$n concentrates and some of $s wounds close.";
}
else
{
to_char = "You concentrate and some of $N's wounds close.";
to_vict = "$n concentrates and some of Your wounds close.";
to_notvict = "$n concentrates and some of $N's wounds close.";
}

break;

case PSIONIC_BESTOW_POWER:
if (IS_NPC(victim) || !IS_PSIONIC(victim))
{
Expand Down
34 changes: 21 additions & 13 deletions medit.c
Original file line number Diff line number Diff line change
Expand Up @@ -756,7 +756,8 @@ static void medit_disp_menu(struct descriptor_data *d)
"%sJ%s) Walk-In : %s%s\r\n"
"%sK%s) Walk-Out : %s%s\r\n"
"%sL%s) Echo Menu...\r\n"
"%sM%s) Create Plot Mob (Shopkeepers, Questmasters, Etc.)\r\n"
"%sM%s) Set Plot Mob Flags & Settings (Shopkeepers, Questmasters, Etc.)\r\n"
"%sO%s) Set Random Descriptions (Shopkeepers, Questmasters, Etc.)\r\n"
// "%s-%s) Echo Menu : IS ZONE: %d FREQ: %d%% COUNT: %d Echo: %s\r\n"
"%sA%s) NPC Flags : %s%s\r\n"
"%sB%s) AFF Flags : %s%s\r\n"
Expand Down Expand Up @@ -784,6 +785,7 @@ static void medit_disp_menu(struct descriptor_data *d)
grn, nrm, yel, GET_WALKOUT(mob) ? GET_WALKOUT(mob) : "Default.",
grn, nrm,
grn, nrm,
grn, nrm,
// grn, nrm, ECHO_IS_ZONE(mob), ECHO_FREQ(mob), ECHO_AMOUNT(mob),
// (ECHO_ENTRIES(mob)[0] ? ECHO_ENTRIES(mob)[0] : "None."),
grn, nrm, cyn, flags,
Expand Down Expand Up @@ -848,16 +850,16 @@ static void medit_disp_resistances_menu(struct descriptor_data *d)

write_to_output(d,
"-- RESISTANCES -- Mob Number: %s[%s%d%s]%s\r\n"
"(%sA%s) Fire: %s[%s%4d%s]%s (%sK%s) Force: %s[%s%4d%s]%s\r\n"
"(%sA%s) Fire: %s[%s%4d%s]%s (%sK%s) Bludgeon: %s[%s%4d%s]%s\r\n"
"(%sB%s) Cold: %s[%s%4d%s]%s (%sL%s) Sound: %s[%s%4d%s]%s\r\n"
"(%sC%s) Air: %s[%s%4d%s]%s (%sM%s) Poison: %s[%s%4d%s]%s\r\n"
"(%sD%s) Earth: %s[%s%4d%s]%s (%sN%s) Disease: %s[%s%4d%s]%s\r\n"
"(%sE%s) Acid: %s[%s%4d%s]%s (%sO%s) Negative: %s[%s%4d%s]%s\r\n"
"(%sF%s) Holy: %s[%s%4d%s]%s (%sP%s) Illusion: %s[%s%4d%s]%s\r\n"
"(%sG%s) Electric: %s[%s%4d%s]%s (%sR%s) Mental: %s[%s%4d%s]%s\r\n"
"(%sH%s) Unholy: %s[%s%4d%s]%s (%sS%s) Light: %s[%s%4d%s]%s\r\n"
"(%sI%s) Slice: %s[%s%4d%s]%s (%sT%s) Energy: %s[%s%4d%s]%s\r\n"
"(%sJ%s) Puncture: %s[%s%4d%s]%s (%sU%s) Water: %s[%s%4d%s]%s\r\n\r\n",
"(%sI%s) Slash: %s[%s%4d%s]%s (%sT%s) Energy: %s[%s%4d%s]%s\r\n"
"(%sJ%s) Piercing: %s[%s%4d%s]%s (%sU%s) Water: %s[%s%4d%s]%s\r\n\r\n",
cyn, yel, OLC_NUM(d), cyn, nrm,
cyn, nrm, cyn, yel, GET_RESISTANCES(mob, 1), cyn, nrm, cyn, nrm,
cyn, yel, GET_RESISTANCES(mob, 11), cyn, nrm,
Expand Down Expand Up @@ -1160,14 +1162,6 @@ void medit_parse(struct descriptor_data *d, char *arg)
case 'M':
// We're setting this mob up with random descs/name and the right mob flags
GET_REAL_RACE(OLC_MOB(d)) = RACE_TYPE_HUMANOID;
GET_SEX(OLC_MOB(d)) = dice(1, 2);
snprintf(t_buf, sizeof(t_buf), "%s %s", GET_SEX(OLC_MOB(d)) == SEX_MALE ? random_male_names[dice(1, NUM_MALE_NAMES) - 1] : random_female_names[dice(1, NUM_FEMALE_NAMES) - 1], random_surnames[dice(1, NUM_SURNAMES) - 1]);
OLC_MOB(d)->player.name = strdup(t_buf);
OLC_MOB(d)->player.short_descr = strdup(t_buf);
snprintf(t_buf, sizeof(t_buf), "%s is here before you.", OLC_MOB(d)->player.short_descr);
OLC_MOB(d)->player.long_descr = strdup(t_buf);
snprintf(t_buf, sizeof(t_buf), "%s is a %s %s.\n", OLC_MOB(d)->player.short_descr, genders[GET_SEX(OLC_MOB(d))], race_list[dice(1, NUM_RACES) - 1].name);
OLC_MOB(d)->player.description = strdup(t_buf);
GET_CLASS(OLC_MOB(d)) = CLASS_WARRIOR;
GET_LEVEL(OLC_MOB(d)) = 10;
medit_autoroll_stats(d);
Expand All @@ -1190,7 +1184,21 @@ void medit_parse(struct descriptor_data *d, char *arg)
(OLC_MOB(d))->points.size = GET_REAL_SIZE(OLC_MOB(d));
OLC_VAL(d) = TRUE;
medit_disp_menu(d);
write_to_output(d, "\r\nThe mob has been set with appropriate flags and a random name/description.\r\n\r\n");
write_to_output(d, "\r\nThe mob has been set with appropriate flags and settings for a plot mob.\r\n\r\n");
return;
case 'o':
case 'O':
GET_SEX(OLC_MOB(d)) = dice(1, 2);
snprintf(t_buf, sizeof(t_buf), "%s %s", GET_SEX(OLC_MOB(d)) == SEX_MALE ? random_male_names[dice(1, NUM_MALE_NAMES) - 1] : random_female_names[dice(1, NUM_FEMALE_NAMES) - 1], random_surnames[dice(1, NUM_SURNAMES) - 1]);
OLC_MOB(d)->player.name = strdup(t_buf);
OLC_MOB(d)->player.short_descr = strdup(t_buf);
snprintf(t_buf, sizeof(t_buf), "%s is here before you.", OLC_MOB(d)->player.short_descr);
OLC_MOB(d)->player.long_descr = strdup(t_buf);
snprintf(t_buf, sizeof(t_buf), "%s is a %s %s.\n", OLC_MOB(d)->player.short_descr, genders[GET_SEX(OLC_MOB(d))], race_list[dice(1, NUM_RACES) - 1].name);
OLC_MOB(d)->player.description = strdup(t_buf);
OLC_VAL(d) = TRUE;
medit_disp_menu(d);
write_to_output(d, "\r\nThe mob has been set with a random gender/name/description.\r\n\r\n");
return;
case 'v':
case 'V':
Expand Down
2 changes: 1 addition & 1 deletion players.c
Original file line number Diff line number Diff line change
Expand Up @@ -3835,7 +3835,7 @@ void load_char_pets(struct char_data *ch)
affect_total(mob);
load_mtrigger(mob);
add_follower(mob, ch);
if (GROUP(ch) && GROUP_LEADER(GROUP(ch)) == ch)
if (!GROUP(mob) && GROUP(ch) && GROUP_LEADER(GROUP(ch)) == ch)
join_group(mob, GROUP(ch));
act("$N appears beside you.", true, ch, 0, mob, TO_CHAR);
act("$N appears beside $n.", true, ch, 0, mob, TO_ROOM);
Expand Down
14 changes: 12 additions & 2 deletions psionics.c
Original file line number Diff line number Diff line change
Expand Up @@ -265,10 +265,10 @@ ACMD(do_manifest)

#undef MANIFEST_NO_ARG

int max_augment_psp_allowed(struct char_data *ch, int spellnum)
int base_augment_psp_allowed(struct char_data *ch)
{

int limit = GET_PSIONIC_LEVEL(ch);
limit -= psionic_powers[spellnum].psp_cost;
if (affected_by_spell(ch, PSIONIC_ABILITY_PSIONIC_FOCUS))
{
if (HAS_REAL_FEAT(ch, FEAT_PROFICIENT_AUGMENTING))
Expand All @@ -281,6 +281,14 @@ int max_augment_psp_allowed(struct char_data *ch, int spellnum)

limit += HAS_FEAT(ch, FEAT_EPIC_AUGMENTING) * 5;

limit = MAX(limit, 0);
return limit;
}

int max_augment_psp_allowed(struct char_data *ch, int spellnum)
{
int limit = base_augment_psp_allowed(ch);
limit -= psionic_powers[spellnum].psp_cost;
limit = MIN(limit, psionic_powers[spellnum].max_augment);
limit = MAX(limit, 0);
return limit;
Expand Down Expand Up @@ -447,6 +455,8 @@ ACMD(do_psionic_focus)

start_daily_use_cooldown(ch, FEAT_PSIONIC_FOCUS);

af.spell = PSIONIC_ABILITY_PSIONIC_FOCUS;
af.location = APPLY_SPECIAL;
af.duration = 12;

affect_to_char(ch, &af);
Expand Down
Loading

0 comments on commit 3560f84

Please sign in to comment.