Alignment update 1

This commit is contained in:
kinther 2025-12-30 10:11:20 -08:00
parent b186c7e87c
commit 59a38beb3d
26 changed files with 252 additions and 466 deletions

View file

@ -60,13 +60,18 @@ Changes in v1.1.0-alpha:
* "audit ac" command for immortals (formerly "acaudit"), allowing for further audit commands in the future
* Minor score output change to only show quest status while on a quest, PC/NPC name, sdesc, and current ldesc
* Added ability to reroll initial stats if they are not to player's liking, and undo reroll if needed
* Removed alignment from game - no more GOOD/EVIL flags and restrictions on items/shops
Features to be implemented in the next few releases:
* Updated door code so that it can be closed/locked/saved with rsave code
* SECTOR/ROOM type changes to make terrain movement easier or more difficult
* Subclass selection to personalize character further
* Combat is slowed down so it isn't over in < 15 seconds (unless you're far outmatched)
* Mounts added to help with long trips
* Wagons added to help with caravans
* BUILDING object type created to allow enter/leave
* Updated BUILDING object type so that it can be damaged and no longer enterable (but someone can leave at cost to health)
* Plantlife introduced
* Updated lockpicking skill
* Trap as a skill - one focused on city and one focused on desert
@ -81,7 +86,7 @@ Features to be implemented in the next few releases:
* Haggling and bartering system
* New calendar and moon cycles
* Heat based on time of day increases/decreases, changing hunger/thirst levels
* Sandstorms limiting visibility
* Weather updates and sandstorms limiting visibility
* Shaded rooms providing bonuses to regeneration
* Criminal system for cities and jails
* Basic Psionics

View file

@ -632,7 +632,7 @@ The format of a mobile is:
~
<detailed description>
~
<mob flags> <affect flags> <alignment> <type flag>
<mob flags> <affect flags> <reserved> <type flag>
{type-specific information; see below for details}
Virtual Number This number is critical; it is the identity of the mobile within
@ -687,9 +687,9 @@ L) NPC Flags : ISNPC
its hit points. If the WIMPY bit is set in conjunction with
any of the forms of the AGGRESSIVE bit, the mob will only
attack mobs that are unconscious (sleeping or incapacitated).
9) AGGR_EVIL Mob will attack players that are evil-aligned.
10) AGGR_GOOD Mob will attack players that are good-aligned.
11) AGGR_NEU Mob will attack players that are neutrally aligned.
9) RESERVED Not used.
10) RESERVED Not used.
11) RESERVED Not used.
12) MEMORY Mob will remember players that initiate attacks on it, and will
attack that player if it ever runs into him again.
13) HELPER The mob will attack any player it sees in the room that is
@ -710,7 +710,7 @@ following values:
M) AFF Flags : NOBITS
1) BLIND Mob is blind.
2) INVIS Mob is invisible.
3) DET-ALIGN NOT USED.
3) RESERVED NOT USED.
4) DET-INVIS Mob can see invisible characters and objects.
5) DET-MAGIC Mob is sensitive to magical presence.
6) SENSE-LIFE Mob can sense hidden life.
@ -721,23 +721,17 @@ M) AFF Flags : NOBITS
10) CURSE Mob is cursed.
11) INFRA Mob can see in dark.
12) POISON Reserved for internal use. Do not set.
13) PROT-EVIL Mob is protected from evil characters.
14) PROT-GOOD Mob is protected from good characters.
13) RESERVED NOT USED.
14) RESERVED NOT USED.
15) SLEEP Reserved for internal use. Do not set.
16) NO_TRACK Mob cannot be tracked.
17) UNUSED Unused (room for future expansion).
18) UNUSED Unused (room for future expansion).
17) FLY Mob is flying.
18) SCUBA Mob can breathe underwater.
19) SNEAK Mob can move quietly without room being informed.
20) HIDE Mob is hidden; can only be seen with sense life.
21) UNUSED Unused (room for future expansion).
21) SCAN Actively scanning for hidden threats.
22) CHARM Reserved for internal use. Do not set.
Alignment A number from -1000 to 1000 representing the mobs initial alignment.
-1000.....-350 Evil
-349......349 Neutral
350.....1000 Good
Type Flag This flag is a single letter which indicates what type of mobile is
currently being defined, and controls what information tbaMUD expects to find
next (i.e., in the file from the current point to the end of the current
@ -748,7 +742,7 @@ Standard tbaMUD supports two types of mobiles: S (for Simple), and E (for Enhanc
4.2 Type S Mobiles
For type S mobs, the type-specific information should be in the following format:
<mob flags> <affect flags> <alignment> S
<mob flags> <affect flags> <reserved> S
<level> <thaco> <armor class> <hitpoints> <damage>
<coins> <experience points>
<load position> <default position> <sex>
@ -840,13 +834,13 @@ A beastly fido is mucking through the garbage looking for food here.
The fido is a small dog that has a foul smell and pieces of rotted meat
hanging around his teeth.
~
65738 0 0 0 65536 0 0 0 -200 S
65738 0 0 0 65536 0 0 0 0 S
1 20 9 0d0+10 1d2+0
10 100
8 8 1
This is mobile vnum 3062. The Fido has mob and affect flags set and has an
initial alignment of -200. After the S flag we see that the Fido is level 1,
This is mobile vnum 3062. The Fido has mob and affect flags set and has a
reserved value of 0. After the S flag we see that the Fido is level 1,
has a THAC0 of 20, an Armor Class of 9, 0d0+10 hit points (10 hitpoints), and
will do 1d2 hit points of bare hand damage per round. The Fido has 10 coins
and 100 experience points, has a load position and default position of
@ -865,7 +859,7 @@ literal letter Emust then come after all E-specs to signal the end of the mob.
The format of an E mobile is as follows:
<mob flags> <affect flags> <alignment> E
<mob flags> <affect flags> <reserved> E
<level> <hitroll> <armor class> <hitpoints> <damage>
<coins> <experience points>
<load position> <default position> <sex>
@ -886,7 +880,7 @@ A beastly fido is mucking through the garbage looking for food here.
The fido is a small dog that has a foul smell and pieces of rotted meat
hanging around his teeth.
~
65738 0 0 0 65536 0 0 0 -200 E
65738 0 0 0 65536 0 0 0 0 E
1 20 9 0d0+10 1d2+0
10 100
8 8 1
@ -1026,16 +1020,16 @@ but has no substantive effect otherwise. The flags have the following values:
1) GLOW Item is glowing (cosmetic).
2) HUM Item is humming (cosmetic).
3) UNUSED Reserved (unused).
3) RESERVED Reserved (unused).
4) NODONATE Item cannot be donated.
5) NOINVIS Item cannot be made invisible.
6) INVISIBLE Item is invisible.
7) MAGIC Item has a magical aura and cannot be enchanted.
8) NODROP Item is cursed and cannot be removed or dropped.
9) BLESS Item is blessed (cosmetic).
10) ANTI_GOOD Item cannot be used by good-aligned characters.
11) ANTI_EVIL Item cannot be used by evil-aligned characters.
12) ANTI_NEUTRAL Item cannot be used by neutral align characters.
10) RESERVED Not used.
11) RESERVED Not used.
12) RESERVED Not used.
13) ANTI_MAGIC_USER Item cannot be used by the Mage class.
14) ANTI_CLERIC Item cannot be used by the Cleric class.
15) ANTI_THIEF Item cannot be used by the Thief class.
@ -1611,16 +1605,16 @@ monty-haul campaigns.
Shop Keeper Mobile Number Virtual number of the shopkeeper mobile.
With Who Bitvector A bitvector (see section 2.4 on Using Bitvectors) used to
designate certain alignments or classes that the shop will not trade with, with
designate certain classes that the shop will not trade with, with
the following values:
E) No Trade With : NOBITS
Designates certain alignments or classes that the shop will not trade with:
Designates certain classes that the shop will not trade with:
1) Good 2) Evil
3) Neutral 4) Magic User
5) Cleric 6) Thief
7) Warrior
1) Sorceror 2) Cleric
3) Rogue 4) Fighter
5) Barbarian 6) Ranger
7) Bard 8) Druid
Shop Room 1...Shop Room n The virtual numbers the mobile must be in for the
shop to be effective. (So transferred shopkeepers cant sell in the desert).
@ -1737,15 +1731,16 @@ Shop Keeper Mobile Number Virtual number of the shopkeeper mobile.
With Who Bitvector
A bitvector (see section Using Bitvectors) used to designate certain
alignments or classes that the shop will not trade with, with the following
classes that the shop will not trade with, with the following
values:
1 a NOGOOD Keeper wont trade with positively-aligned players.
2 b NOEVIL Keeper wont trade with evilly-aligned players.
4 c NONEUTRAL Keeper wont trade with neutrally-aligned players.
8 d NOMAGIC_USER Keeper wont trade with the Mage class.
8 d NOSORCEROR Keeper wont trade with the Sorceror class.
16 e NOCLERIC Keeper wont trade with the Cleric class.
32 f NOTHIEF Keeper wont trade with the Thief class.
64 g NOWARRIOR Keeper wont trade with the Warrior class.
32 f NOROGUE Keeper wont trade with the Rogue class.
64 g NOFIGHTER Keeper wont trade with the Fighter class.
128 h NOBARBARIAN Keeper wont trade with the Barbarian class.
256 i NORANGER Keeper wont trade with the Ranger class.
512 j NOBARD Keeper wont trade with the Bard class.
1024 k NODRUID Keeper wont trade with the Druid class.
Shop Room Number
The virtual number the mobile must be in for the shop to be effective. (So
@ -1848,18 +1843,18 @@ particular MUD. Check with your implementor for details.
7) charm person 8) chill touch 9) clone
10) color spray 11) control weather 12) create food
13) create water 14) cure blind 15) cure critic
16) cure light 17) curse 18) detect alignment
16) cure light 17) curse 18) reserved
19) detect invisibility 20) detect magic 21) detect poison
22) dispel evil 23) earthquake 24) enchant weapon
22) reserved 23) earthquake 24) enchant weapon
25) energy drain 26) fireball 27) harm
28) heal 29) invisibility 30) lightning bolt
31) locate object 32) magic missile 33) poison
34) protection from evil 35) remove curse 36) sanctuary
34) reserved 35) remove curse 36) sanctuary
37) shocking grasp 38) sleep 39) strength
40) summon 41) !UNUSED! 42) word of recall
40) summon 41) !RESERVED! 42) word of recall
43) remove poison 44) sense life 45) animate dead
46) dispel good 47) group armor 48) group heal
49) !UNUSED! 50) infravision 51) waterwalk
46) reserved 47) group armor 48) group heal
49) !RESERVED! 50) infravision 51) waterwalk
B Item Values for Drink Containers

View file

@ -813,7 +813,7 @@ equips it to the character for the specified location. unequip_char() does the
opposite; it removes the object from the characters equipment list and returns it
as a free-floating object. The object being unequipped must be placed elsewhere or
destroyed. Note that some objects may not be equipped by characters of certain
classes and/or alignments.
classes.
void obj_to_char (struct obj_data *object, struct char_data *ch)
@ -1427,9 +1427,9 @@ search it for "ITEM_x (extra bits)". Add a string giving a short name for the ne
ITEM_ANTI_xxx flag, in the appropriate order, before the "\n" entry near the
bottom.
The shops have a similar "dont trade" setup, so search shop.hfor "TRADE_NOGOOD"
The shops have a similar "dont trade" setup, so search shop.h for "TRADE_NOSORCEROR"
to add a new TRADE_NOxxx item to the list for the class to be added. Below that
(near "NOTRADE_GOOD"), a line will need to be added for each new class so the no
(near "NOTRADE_SORCEROR"), a line will need to be added for each new class so the no
trade status of a shop can be tested for the class.
With the definitions in shop.h, the shop code in shop.c can then be modified to

View file

@ -16,11 +16,11 @@ Message List:
0 ) [5 ] 1, burning hands 30) [314] 2, Unknown
1 ) [6 ] 1, call lightning 31) [399] 2, Unknown
2 ) [8 ] 1, chill touch 32) [33 ] 1, poison
3 ) [10 ] 1, color spray 33) [202] 1, !UNUSED!
4 ) [22 ] 1, dispel evil 34) [203] 1, !UNUSED!
5 ) [23 ] 1, earthquake 35) [204] 1, !UNUSED!
6 ) [25 ] 1, energy drain 36) [205] 1, !UNUSED!
7 ) [26 ] 1, fireball 37) [206] 1, !UNUSED!
3 ) [10 ] 1, color spray 33) [202] 1, !RESERVED!
4 ) [22 ] 1, dispel 34) [203] 1, !RESERVED!
5 ) [23 ] 1, earthquake 35) [204] 1, !RESERVED!
6 ) [25 ] 1, energy drain 36) [205] 1, !RESERVED!
7 ) [26 ] 1, fireball 37) [206] 1, !RESERVED!
=========================================

View file

@ -9,17 +9,16 @@ rumble@tbamud.com -- Rumble
1. Errant Rooms (show error command)
2. SYSERR: Object # (oedit-s-desc) doesn't have drink type as last alias.
3. SYSERR: Mob # both Aggressive and Aggressive_to_Alignment.
4. SYSERR: Object # (oedit-s-desc) has out of range level #.
5. SYSERR: Object # (oedit-s-desc) has negative weight (-2147483644).
3. SYSERR: Object # (oedit-s-desc) has out of range level #.
4. SYSERR: Object # (oedit-s-desc) has negative weight (-2147483644).
SYSERR: Object # (oedit-s-desc) has out of range level #2147483647.
6. SYSERR: Object # (oedit-s-desc) uses 'UNDEFINED' spell #.
7. SYSERR: Object # (oedit-s-desc) contains (5) more than maximum (3).
8. Char is already equipped: (medit-s-desc), (oedit-s-desc)
9. SYSERR: Attempt to assign spec to non-existant mob #
10. No associated object exists when attempting to create a board [vnum #].
11. SYSERR: Mob using >'((ch)-)player_specials....
12: SYSERR: Object # (keyword) is type NOTE and has extra description with
5. SYSERR: Object # (oedit-s-desc) uses 'UNDEFINED' spell #.
6. SYSERR: Object # (oedit-s-desc) contains (5) more than maximum (3).
7. Char is already equipped: (medit-s-desc), (oedit-s-desc)
8. SYSERR: Attempt to assign spec to non-existant mob #
9. No associated object exists when attempting to create a board [vnum #].
10. SYSERR: Mob using >'((ch)-)player_specials....
11. SYSERR: Object # (keyword) is type NOTE and has extra description with
same name (keyword)
1: Errant Rooms
@ -44,30 +43,23 @@ the drink aliases).
i.e. a shot of whisky should have the namelist: whisky shot whisky
a cup of slime mold juice namelist should be: juice cup slime juice
3: SYSERR: Mob # both Aggressive and Aggressive_to_Alignment.
Another harmless error. If your mob is aggressive there is no need to also
make it aggressive to certain alignments since AGGR means it will attack any
player it can see. Choose to make it aggressive to an alignment or aggressive
to all.
4: SYSERR: Object # (oedit-s-desc) has out of range level #.
3: SYSERR: Object # (oedit-s-desc) has out of range level #.
A simple one. Limit spell levels to the levels available, on tbaMUD that
would be 1-34.
5: SYSERR: Object # (oedit-s-desc) has negative weight (-2147483644).
4: SYSERR: Object # (oedit-s-desc) has negative weight (-2147483644).
SYSERR: Object # (oedit-s-desc) has out of range level #2147483647.
These are really annoying. This happens on older versions of CircleMUD when
you use numbers larger than necessary. This will actually crash many older
versions of CircleMUD. Just do not do it. Use realistic numbers.
6: SYSERR: Object # (oedit-s-desc) uses 'UNDEFINED' spell #.
5: SYSERR: Object # (oedit-s-desc) uses 'UNDEFINED' spell #.
There is no spell zero. Either select a spell or put -1 for none.
7: SYSERR: Object # (oedit-s-desc) contains (#) more than maximum (#).
6: SYSERR: Object # (oedit-s-desc) contains (#) more than maximum (#).
When making a drink container you will set how much it initially contains
on creation and the max it can hold if a player were to fill it. Common sense
@ -75,24 +67,24 @@ tells us that you can not create a container that initially holds more than
the max you set. To simplify the max must always be greater than or equal to
the initial amount.
8: Char is already equipped: (medit-s-desc), (oedit-s-desc)
7: Char is already equipped: (medit-s-desc), (oedit-s-desc)
This happens when someone tries to equip a mob with one or more object in
a single location. HELP ZEDIT-EQUIP for all the possible object equipping
locations. All you have to do to fix this is pick a different equip location
that is not used.
9: SYSERR: Attempt to assign spec to non-existant mob #
8: SYSERR: Attempt to assign spec to non-existant mob #
To get rid of this "grep # spec_assign.c" and remove this assignment.
10: No associated object exists when attempting to create a board [vnum #].
9: No associated object exists when attempting to create a board [vnum #].
You need to delete this board from lib/etc/boards/ and modify boards.c and
boards.h. Again "grep #" *.[ch] to search for this vnum in all of your .c and
.h files to remove the reference.
11: SYSERR: Mob using >'((ch)-)player_specials....
10: SYSERR: Mob using >'((ch)-)player_specials....
Players and mobs (NPC's) share many of the same data fields, but not all.
So when a mob tries to access player data it gives a SYSERR like this:
@ -110,7 +102,7 @@ know this is confusing, but just copy the example below.
The changed line now will not just check for a flag, instead it will check if
it is a player (not an NPC) and it is flagged then continue.
12: SYSERR: Object # (keyword) is type NOTE and has extra description with
11: SYSERR: Object # (keyword) is type NOTE and has extra description with
same name (keyword)
Object type NOTE is meant to be written on using the action-description. So if

View file

@ -474,7 +474,7 @@ set one of these:
P) Perm Affects: @cNOBITS@n
1) BLIND DO NOT USE.
2) INVIS The wearer becomes invisible.
3) DET-ALIGN The wearer detects alignments.
3) RESERVED DO NOT USE.
4) DET-INVIS The wearer sees invisible objects and players.
5) DET-MAGIC The wearer sees a magic flag on magical objects.
6) SENSE-LIFE The wearer sees hidden mobs/players.
@ -484,15 +484,15 @@ P) Perm Affects: @cNOBITS@n
10) CURSE DO NOT USE.
11) INFRA The wearer sees in the dark.
12) POISON The wearer is poisoned.
13) PROT-EVIL The wearer is protected from evil.
14) PROT-GOOD The wearer is protected from good.
13) RESERVED DO NOT USE.
14) RESERVED DO NOT USE.
15) SLEEP DO NOT USE.
16) NO_TRACK DO NOT USE.
17) FLYING The wearer can travel through room sector type IN FLIGHT.
18) SCUBA The wearer can travel through room sector type UNDERWATER.
19) SNEAK DO NOT USE.
20) HIDE DO NOT USE.
21) UNUSED DO NOT USE.
21) SCAN Actively scanning for hidden threats.
22) CHARM DO NOT USE.
#2
@ -572,45 +572,6 @@ I would type "all 13" to list everything in zone 13. I use this to check what
people have done with their zone.
See also: ^, RUMBLE-ALIASES
#0
ALIGNMENT GOOD NEUTRAL EVIL %ACTOR.ALIGN% %ALIGN% %ALIGNMENT%
Different characters and mobs have different alignments depending upon their
way of life. Because of this, they may be aggressive or friendly depending on
the mix. Some objects cannot be used by certain alignments. For mobs alignment
ranges from:
-1000 to -350 Evil
-350 to 350 Neutral
350 to 1000 Good
See also: ALIGNMENTS
#2
ALIGNMENTS
Many good areas stick to a defined level range, such as 10-20 or 25-30. Do
not try and make your new area cover the entire range of levels. Every area
should have its moment in the sun. Conversely, it would be nice if there were
something really unique and challenging to do at every stage in a characters
history. Your area might be the most successful if you can gear it for a range
of levels that people believe is otherwise boring or neglected.
You should always try to match your mobiles to the area and the players you
want to play there. For example, you should make the mobs in the area a
similar level to the players you want to play there since a level X warrior
should be able to kill a level X mobile if the warrior is at full health. Also,
the quality of objects or mobiles should be matched with their level.
Will your area be mostly good, neutral, or evil. If it is mostly good or
mostly evil, is it strongly good or evil or just weakly aligned? In any case
try not to make your area completely homogenous (equal). In neutral
communities there is going to be some evil and good elements, and likewise with
other communities. To some extent this goes along with the question about zone
level, consider what seem to be "gaps" among the zones in the world as far as
good or evil aligned areas for a particular level range, and try to fill those
needs. Everyone's first tendency is to make extremists--The ultimate evil hell
area, or the blindingly good paladin fortress. Keep in mind that there are
many layers in between, and these are often more interesting.
See also: ALIGN
#2
ANIMATE-DEAD
@ -1650,7 +1611,6 @@ Excluding the subfield () returns the value. Adding a subfield adjusts it.
cha/con/dex/int - Checks the stat. @RHELP TRIG-STAT@n. Subfield adjusts.
str/wis() () is a subfield and allows a change to the variable.
alias - The list of aliases of the mob or the player name.
align() - The actor's alignment @RHELP ALIGN@n. Subfield adjusts.
affect() - Checks the actor for the affect. @RHELP AFFECT@n
armor - Checks the actor's armor class.
canbeseen - Checks if the the mob can see the actor. @RHELP CANBESEEN@n
@ -2366,18 +2326,6 @@ detach obj sword 1300 - You guessed it - same as above.
detach sword all - detach all triggers from the sword.
See also: ATTACH, TRIG-DETACH, TRIG-ATTACH, OLC, TRIGEDIT, TSTAT, STAT, ROOMFLAGS
#2
DETECT-ALIGNMENT
Usage : cast 'detect alignment'
Accumulative: Yes (Duration)
Duration : 12 hours + level
Level : Cleric level 4.
Allows the caster to detect the alignment of those around them.
Evil will show as a red aura, good in a blue aura.
See also: "DETECT INVISIBILITY"
#0
DETECT-INVISIBILITY
@ -2530,38 +2478,6 @@ when done type /fi to format with indent.
See also: TEXT-EDITOR
#2
DISPEL-EVIL
Usage : cast 'dispel evil' <victim>
Accumulative: -
Duration : Instantaneous
Level : Cleric level 14.
Save : Special
This spell will only affect evil creatures. An evil person of level
equal or less than caster will suffer 100 damage points.
If the victim is higher level than caster, the spell will inflict
(caster_level)d4 damage points, saving throw versus half damage.
See also: DISPEL-GOOD
#0
DISPEL-GOOD
Usage : cast 'dispel good' <victim>
Accumulative: -
Duration : Instantaneous
Level : Cleric level 14.
Save : Special
This spell will only affect good creatures. A good person of level
equal or less than caster will suffer 100 damage points.
If the victim is higher level than caster, the spell will inflict
(caster_level)d4 damage points, saving throw versus half damage.
See also: DISPEL-EVIL
#0
DISPLAYS PROMPTS HIT-PNT-DISPLAY
@ -2825,30 +2741,23 @@ of CircleMUD expect it first).
i.e. a shot of whisky should have the keyword: whisky shot whisky
a cup of slime mold juice keyword should be: juice cup slime juice
3: SYSERR: Mob #5 both Aggressive and Aggressive_to_Alignment.
Another harmless error. If your mob is aggressive there is no need to also
make it aggressive to certain alignments since AGGR means it will attack any
player it can see. Choose to make it aggressive to an alignment or aggressive
to all.
4: SYSERR: Object # (oedit-s-desc) has out of range level #.
3: SYSERR: Object # (oedit-s-desc) has out of range level #.
A simple one. Limit spell levels to the levels available, on TBA that would
be 1-30.
5: SYSERR: Object # (oedit-s-desc) has negative weight (-2147483644).
4: SYSERR: Object # (oedit-s-desc) has negative weight (-2147483644).
SYSERR: Object # (oedit-s-desc) has out of range level #2147483647.
These are really annoying. This happens when you use numbers larger than
necessary. This will actually crash many older versions of CircleMUD. Just do
not do it. Use realistic numbers.
6: SYSERR: Object # (oedit-s-desc) uses 'UNDEFINED' spell #.
5: SYSERR: Object # (oedit-s-desc) uses 'UNDEFINED' spell #.
There is no spell zero. Either select a spell or put -1 for none.
7: SYSERR: Object # (oedit-s-desc) contains (5) more than maximum (3).
6: SYSERR: Object # (oedit-s-desc) contains (5) more than maximum (3).
When making a drink container you will set how much it initially contains
on creation and the max it can hold if a player were to fill it. Common sense
@ -2930,7 +2839,7 @@ Objects : 42
Triggers : 129
Theme : Its purpose, hack & slash, quest, rescue princess, kill ogre...
Completion : When do you expect to finish it, how is the progress going?
Notes : Such things as zone alignment, economy, quests, special mobs and
Notes : Such things as zone economy, quests, special mobs and
objs, and anything else I should know about your zone. What
makes it unique?
@ -2985,8 +2894,8 @@ right. Parenthesis can be used to create priority.
| | | (if actor age is not equal to 1)
| < | less than | if %actor.dex% < 16
| | | (if actor dexterity is less than 16)
| > | greater than | if %actor.align% > 349
| | | (if actor alignment is greater than 349)
| > | greater than | if %actor.level% > 30
| | | (if actor level is greater than 30)
| <= | less than or equal | if %actor.exp% <= 2
| | | (if actor experience is less than or equal to 1)
| >= | greater than or equal | if %actor.mana% >= 1
@ -4852,7 +4761,7 @@ MEDIT-AFF-FLAGS AFFECTIONS AFFECTS
M) AFF Flags : @cNOBITS@n
1) BLIND Mob is blind.
2) INVIS Mob is invisible.
3) DET-ALIGN NOT USED.
3) RESERVED NOT USED.
4) DET-INVIS Mob can see invisible characters and objects.
5) DET-MAGIC Mob is sensitive to magical presence.
6) SENSE-LIFE Mob can sense hidden life.
@ -4863,15 +4772,15 @@ M) AFF Flags : @cNOBITS@n
10) CURSE Mob is cursed.
11) INFRA Mob can see in dark.
12) POISON Reserved for internal use. Do not set.
13) PROT-EVIL Mob is protected from evil characters.
14) PROT-GOOD Mob is protected from good characters.
13) RESERVED NOT USED.
14) RESERVED NOT USED.
15) SLEEP Reserved for internal use. Do not set.
16) NO_TRACK Mob cannot be tracked.
17) FLY Mob is flying.
18) SCUBA Mob can breathe underwater.
19) SNEAK Mob can move quietly without room being informed.
20) HIDE Mob is hidden; can only be seen with sense life.
21) UNUSED Unused (room for future expansion).
21) SCAN Actively scanning for hidden threats.
22) CHARM Reserved for internal use. Do not set.
See also: INVIS, MEDIT-NPC-FLAGS, DG_AFFECT, TRIG-AFFECT
@ -4903,20 +4812,9 @@ should be one of the following numbers:
5) bludgeon
#2
MEDIT-EXPERIENCE MEDIT-XP MEDIT-ALIGNMENT
MEDIT-EXPERIENCE MEDIT-XP
(B) Exp Points: [ 115600] (E) Alignment: [ 1000]
Alignment
A number from -1000 to 1000 representing the mobs initial alignment.
Evil -1000 to -350
Neutral -349 to 349
Good 350 to 1000
The alignment of a mobile is determined entirely by you, depending on
the type of area you are creating. The alignment can be from -1000
(extremely evil) to +1000 (divinely good).
(B) Exp Points: [ 115600]
Experience is simply the number of experience points the mobile is born
with. This is not the exact number of experience points the player will get
@ -5019,7 +4917,7 @@ X) Delete Mob @RHELP MEDIT-DELETE@n
Q) Quit
Enter choice :
#2
MEDIT-NPC-FLAGS MEDIT-FLAGS SPEC STAYZONE AGGRESSIVE AGGR_GOOD AGGR_NEU AGGR_EVIL STAY-ZONE STAY_ZONE SCAVENGER NPCFLAGS NPC-FLAGS MOBFLAGS MOB-FLAGS SENTINEL AWARE NOCHARM MOB-NPC NPC_FLAGS HELPER
MEDIT-NPC-FLAGS MEDIT-FLAGS SPEC STAYZONE AGGRESSIVE STAY-ZONE STAY_ZONE SCAVENGER NPCFLAGS NPC-FLAGS MOBFLAGS MOB-FLAGS SENTINEL AWARE NOCHARM MOB-NPC NPC_FLAGS HELPER
NPC stands for non-player-character (mob)
@ -5042,9 +4940,9 @@ L) NPC Flags : @cISNPC@n
its hit points. If the WIMPY bit is set in conjunction with
any of the forms of the AGGRESSIVE bit, the mob will only
attack mobs that are unconscious (sleeping or incapacitated).
8) AGGR_EVIL Mob will attack players that are evil-aligned.
9) AGGR_GOOD Mob will attack players that are good-aligned.
10) AGGR_NEU Mob will attack players that are neutrally aligned.
8) RESERVED Not used.
9) RESERVED Not used.
10) RESERVED Not used.
11) MEMORY Mob will remember players that initiate attacks on it, and will
attack that player if it ever runs into him again.
12) HELPER The mob will attack any player it sees in the room that is
@ -5332,7 +5230,7 @@ MOBILE-FORMATS MOB-FORMATS MOB-FILES
~
<detailed description>
~
<mob flags> <affect flags> <alignment> <type flag>
<mob flags> <affect flags> <reserved> <type flag>
<level> <thaco> <armor class> <hitpoints> <damage>
<coins> <experience points>
<load position> <default position> <sex>
@ -5382,11 +5280,11 @@ Message List:
0 ) [5 ] 1, burning hands 30) [314] 2, Unknown
1 ) [6 ] 1, call lightning 31) [399] 2, Unknown
2 ) [8 ] 1, chill touch 32) [33 ] 1, poison
3 ) [10 ] 1, color spray 33) [202] 1, !UNUSED!
4 ) [22 ] 1, dispel evil 34) [203] 1, !UNUSED!
5 ) [23 ] 1, earthquake 35) [204] 1, !UNUSED!
6 ) [25 ] 1, energy drain 36) [205] 1, !UNUSED!
7 ) [26 ] 1, fireball 37) [206] 1, !UNUSED!
3 ) [10 ] 1, color spray 33) [202] 1, !RESERVED!
4 ) [22 ] 1, dispel 34) [203] 1, !RESERVED!
5 ) [23 ] 1, earthquake 35) [204] 1, !RESERVED!
6 ) [25 ] 1, energy drain 36) [205] 1, !RESERVED!
7 ) [26 ] 1, fireball 37) [206] 1, !RESERVED!
=========================================
MSG #, SKILL NUMBER, NUMBER OF ENTRIES, NAME (if applicable)
0 ) [5 ] 1, burning hands
@ -5901,9 +5799,9 @@ OEDIT-EXTRA-FLAGS OEDIT-FLAGS OBJECT-FLAGS OBJECTFLAGS GLOW HUM NODROP NO_DROP O
7) MAGIC Item has a magical aura and cannot be enchanted.
8) NODROP Item is cursed and cannot be removed or dropped.
9) BLESS Item is blessed (cosmetic).
10) ANTI_GOOD Item cannot be used by good-aligned characters.
11) ANTI_EVIL Item cannot be used by evil-aligned characters.
12) ANTI_NEUTRAL Item cannot be used by neutral align characters.
10) RESERVED Not used.
11) RESERVED Not used.
12) RESERVED Not used.
13) ANTI_MAGIC_USER Item cannot be used by the Mage class.
14) ANTI_CLERIC Item cannot be used by the Cleric class.
15) ANTI_THIEF Item cannot be used by the Thief class.
@ -6516,7 +6414,7 @@ this method is that if you accidentally wipe out your work on the MUD you will
have a ready backup. Be careful cutting and pasting to the MUD; if you send too
much text at once you will be disconnected.
See also: WORK, CARTOGRAPHY, LOCATION, THEME, PLOT, SIZE, ALIGN, BIAS
See also: WORK, CARTOGRAPHY, LOCATION, THEME, PLOT, SIZE, BIAS
#2
PLAYER-SHOPS PLAYER-OWNED-SHOPS
@ -7079,7 +6977,7 @@ what it takes to properly plan out your first zone. It is extremely important
that you put some forethought into what you will be creating. Remember, zones
are built for others to play. Be sure to make it something a player will enjoy.
A zone proposal consists of an informal MUDmail to your Head Builder. It should
contain: the location, level, alignment, theme, plot, size, and any other
contain: the location, level, theme, plot, size, and any other
important notes about the zone. Detailed descriptions and help files are
available in the hallways starting from room 14 and 15.
@ -7089,15 +6987,6 @@ deadlines, so take the time to give your zone character.
Required Reading: @RHELP PLANNING, HELP STYLISTICS@n
See also: EXAMPLE-PROPOSAL
#2
PROTECTION-FROM-EVIL PROT-EVIL
Usage : cast 'protection from evil' [self]
Accumulative: Yes (Duration)
Duration : 24 hours
Level : Cleric level 8.
The meaning of this spell is not yet fully defined.
#0
PURGE DESTROY UNLOAD DELETE-MOBILE DISINTEGRATE DECOMPOSE CLEANUP
@ -8396,12 +8285,12 @@ Enter choice :
SEDIT-TRADE
E) No Trade With : @cNOBITS@n
Designates certain alignments or classes that the shop will not trade with:
Designates certain classes that the shop will not trade with:
1) Good 2) Evil
3) Neutral 4) Magic User
5) Cleric 6) Thief
7) Warrior
1) Sorceror 2) Cleric
3) Rogue 4) Fighter
5) Barbarian 6) Ranger
7) Bard 8) Druid
Currently will not trade with: @cNOBITS@n
Enter choice (-1 for none):
@ -8700,11 +8589,11 @@ The following room flags can be selected:
16) * - DO NOT USE. Breadth-first search mark used by track and hunt.
17) WORLDMAP - DO NOT USE. World Map style maps.
Never set UNUSED or DO NOT USE bits, if you find them anywhere. If you
Never set RESERVED or DO NOT USE bits, if you find them anywhere. If you
do not know what a flag does, DO NOT SET IT!
This requires repeating since it is so often ignored:
@YIf a flag says UNUSED; DO NOT SET IT. If you do not know what it does; DO NOT SET IT!@n
@YIf a flag says RESERVED; DO NOT SET IT. If you do not know what it does; DO NOT SET IT!@n
See Also: TOGGLE
#2
@ -8973,18 +8862,18 @@ SPELLS
7) charm person 8) chill touch 9) clone
10) color spray 11) control weather 12) create food
13) create water 14) cure blind 15) cure critic
16) cure light 17) curse 18) detect alignment
16) cure light 17) curse 18) reserved
19) detect invisibility 20) detect magic 21) detect poison
22) dispel evil 23) earthquake 24) enchant weapon
22) reserved 23) earthquake 24) enchant weapon
25) energy drain 26) fireball 27) harm
28) heal 29) invisibility 30) lightning bolt
31) locate object 32) magic missile 33) poison
34) protection from evil 35) remove curse 36) sanctuary
34) reserved 35) remove curse 36) sanctuary
37) shocking grasp 38) sleep 39) strength
40) summon 41) !UNUSED! 42) word of recall
40) summon 41) !RESERVED! 42) word of recall
43) remove poison 44) sense life 45) animate dead
46) dispel good 47) group armor 48) group heal
49) !UNUSED! 50) infravision 51) waterwalk
46) reserved 47) group armor 48) group heal
49) !RESERVED! 50) infravision 51) waterwalk
52) identify
#2
@ -8997,13 +8886,13 @@ SPELLS MAGICS SPELLBOOKS TOMBS SPELL-LEVELS SPELLS-STOCK SPELLLIST
| Detect Magic 2 | Create Food 2 |
| Chill Touch 3 | Create Water 2 |
| Infravision 3 | Detect Poison 3 |
| Invisibility 4 | Detect Alignment 4 |
| Invisibility 4 | Reserved 4 |
| Armor 4 | Cure Blind 4 |
| Burning Hands 5 | Bless 5 |
| Locate Object 6 | Detect Invisibility 6 |
| Strength 6 | Blindness 6 |
| Shocking Grasp 7 | Infravision 7 |
| Sleep 8 | Protection from Evil 8 |
| Sleep 8 | Reserved 8 |
| Lightning Bolt 9 | Poison 8 |
| Blindness 9 | Group Armor 9 |
| Detect Poison 10 | Cure Crit 9 |
@ -9013,8 +8902,8 @@ SPELLS MAGICS SPELLBOOKS TOMBS SPELL-LEVELS SPELLS-STOCK SPELLLIST
| Poison 14 | Word of Recall 12 |
| Fireball 15 | Earthquake 12 |
| Charm 16 | Darkness 13 |
| Identify 20 | Dispel Evil 14 |
| Enchant Weapon 26 | Dispel Good 14 |
| Identify 20 | Reserved 14 |
| Enchant Weapon 26 | Reserved 14 |
| Clone 30 | Sanctuary 15 |
| | Call Lightning 15 |
| | Heal 16 |

View file

@ -574,13 +574,6 @@ static void list_one_char(struct char_data *i, struct char_data *ch)
if (AFF_FLAGGED(i, AFF_INVISIBLE))
send_to_char(ch, "*");
if (AFF_FLAGGED(ch, AFF_DETECT_ALIGN)) {
if (IS_EVIL(i))
send_to_char(ch, "(Red Aura) ");
else if (IS_GOOD(i))
send_to_char(ch, "(Blue Aura) ");
}
send_to_char(ch, "%s", i->player.long_descr);
if (AFF_FLAGGED(i, AFF_SANCTUARY))
@ -596,13 +589,6 @@ static void list_one_char(struct char_data *i, struct char_data *ch)
if (AFF_FLAGGED(i, AFF_INVISIBLE))
send_to_char(ch, "*");
if (AFF_FLAGGED(ch, AFF_DETECT_ALIGN)) {
if (IS_EVIL(i))
send_to_char(ch, "(Red Aura) ");
else if (IS_GOOD(i))
send_to_char(ch, "(Blue Aura) ");
}
send_to_char(ch, "%s", i->player.long_descr);
if (AFF_FLAGGED(i, AFF_SANCTUARY))
@ -661,13 +647,6 @@ static void list_one_char(struct char_data *i, struct char_data *ch)
send_to_char(ch, " is here struggling with thin air.");
}
if (AFF_FLAGGED(ch, AFF_DETECT_ALIGN)) {
if (IS_EVIL(i))
send_to_char(ch, " (Red Aura)");
else if (IS_GOOD(i))
send_to_char(ch, " (Blue Aura)");
}
send_to_char(ch, "\r\n");
if (AFF_FLAGGED(i, AFF_SANCTUARY))

View file

@ -3564,9 +3564,8 @@ ACMD(do_show)
send_to_char(ch, "Player: %-12s (%s) [%2d %s]\r\n", GET_NAME(vict),
genders[(int) GET_SEX(vict)], GET_LEVEL(vict), CLASS_ABBR(vict));
send_to_char(ch, "Coins: %-8d Bal: %-8d Exp: %-8d Align: %-5d\r\n",
GET_COINS(vict), GET_BANK_COINS(vict), GET_EXP(vict),
GET_ALIGNMENT(vict));
send_to_char(ch, "Coins: %-8d Bal: %-8d Exp: %-8d\r\n",
GET_COINS(vict), GET_BANK_COINS(vict), GET_EXP(vict));
send_to_char(ch, "Started: %-25.25s Last: %-25.25s\r\n", buf1, buf2);
send_to_char(ch, "Played: %dh %dm\r\n",
(int) (vict->player.time.played / 3600),
@ -3761,9 +3760,8 @@ static struct set_struct {
{ "ac", LVL_BUILDER, BOTH, NUMBER }, /* 0 */
{ "afk", LVL_BUILDER, PC, BINARY }, /* 1 */
{ "age", LVL_GOD, BOTH, NUMBER },
{ "align", LVL_BUILDER, BOTH, NUMBER },
{ "bank", LVL_BUILDER, PC, NUMBER },
{ "brief", LVL_GOD, PC, BINARY }, /* 5 */
{ "brief", LVL_GOD, PC, BINARY }, /* 4 */
{ "cha", LVL_BUILDER, BOTH, NUMBER },
{ "class", LVL_BUILDER, BOTH, MISC },
{ "color", LVL_GOD, PC, BINARY },
@ -3772,20 +3770,20 @@ static struct set_struct {
{ "dex", LVL_BUILDER, BOTH, NUMBER },
{ "drunk", LVL_BUILDER, BOTH, MISC },
{ "exp", LVL_GOD, BOTH, NUMBER },
{ "frozen", LVL_GRGOD, PC, BINARY }, /* 14 */
{ "frozen", LVL_GRGOD, PC, BINARY }, /* 13 */
{ "coins", LVL_BUILDER, BOTH, NUMBER },
{ "height", LVL_BUILDER, BOTH, NUMBER },
{ "hitpoints", LVL_BUILDER, BOTH, NUMBER },
{ "hunger", LVL_BUILDER, BOTH, MISC }, /* 18 */
{ "hunger", LVL_BUILDER, BOTH, MISC }, /* 17 */
{ "int", LVL_BUILDER, BOTH, NUMBER },
{ "invis", LVL_GOD, PC, NUMBER },
{ "invstart", LVL_BUILDER, PC, BINARY },
{ "level", LVL_GRGOD, BOTH, NUMBER }, /* 22 */
{ "level", LVL_GRGOD, BOTH, NUMBER }, /* 21 */
{ "loadroom", LVL_BUILDER, PC, MISC },
{ "mana", LVL_BUILDER, BOTH, NUMBER },
{ "maxhit", LVL_BUILDER, BOTH, NUMBER },
{ "maxmana", LVL_BUILDER, BOTH, NUMBER },
{ "maxstam", LVL_BUILDER, BOTH, NUMBER }, /* 27 */
{ "maxstam", LVL_BUILDER, BOTH, NUMBER }, /* 26 */
{ "name", LVL_IMMORT, PC, MISC },
{ "nodelete", LVL_GOD, PC, BINARY },
{ "nohassle", LVL_GOD, PC, BINARY },
@ -3797,18 +3795,18 @@ static struct set_struct {
{ "poofout", LVL_IMMORT, PC, MISC },
{ "quest", LVL_GOD, PC, BINARY },
{ "room", LVL_BUILDER, BOTH, NUMBER },
{ "screenwidth", LVL_GOD, PC, NUMBER }, /* 39 */
{ "screenwidth", LVL_GOD, PC, NUMBER }, /* 38 */
{ "sex", LVL_GOD, BOTH, MISC },
{ "showvnums", LVL_BUILDER, PC, BINARY },
{ "siteok", LVL_GOD, PC, BINARY },
{ "skill", LVL_GOD, BOTH, NUMBER },
{ "stam", LVL_BUILDER, BOTH, NUMBER }, /* 44 */
{ "stam", LVL_BUILDER, BOTH, NUMBER }, /* 43 */
{ "str", LVL_BUILDER, BOTH, NUMBER },
{ "thirst", LVL_BUILDER, BOTH, MISC },
{ "variable", LVL_GRGOD, PC, MISC },
{ "weight", LVL_BUILDER, BOTH, NUMBER },
{ "wis", LVL_BUILDER, BOTH, NUMBER },
{ "questpoints", LVL_GOD, PC, NUMBER }, /* 50 */
{ "questpoints", LVL_GOD, PC, NUMBER }, /* 49 */
{ "questhistory", LVL_GOD, PC, NUMBER },
{ "species", LVL_BUILDER, BOTH, MISC },
{ "\n", 0, BOTH, MISC }
@ -3870,17 +3868,13 @@ static int perform_set(struct char_data *ch, struct char_data *vict, int mode, c
GET_ROLEPLAY_AGE(vict) = LIMIT(value, MIN_CHAR_AGE, MAX_CHAR_AGE);
GET_ROLEPLAY_AGE_YEAR(vict) = time_info.year;
break;
case 3: /* align */
GET_ALIGNMENT(vict) = RANGE(-1000, 1000);
affect_total(vict);
break;
case 4: /* bank */
case 3: /* bank */
GET_BANK_COINS(vict) = RANGE(0, 100000000);
break;
case 5: /* brief */
case 4: /* brief */
SET_OR_REMOVE(PRF_FLAGS(vict), PRF_BRIEF);
break;
case 6: /* cha */
case 5: /* cha */
if (IS_NPC(vict) || GET_LEVEL(vict) >= LVL_GRGOD)
RANGE(3, 25);
else
@ -3888,18 +3882,18 @@ static int perform_set(struct char_data *ch, struct char_data *vict, int mode, c
vict->real_abils.cha = value;
affect_total(vict);
break;
case 7: /* class */
case 6: /* class */
if ((i = parse_class(*val_arg)) == CLASS_UNDEFINED) {
send_to_char(ch, "That is not a class.\r\n");
return (0);
}
GET_CLASS(vict) = i;
break;
case 8: /* color */
case 7: /* color */
SET_OR_REMOVE(PRF_FLAGS(vict), (PRF_COLOR_1));
SET_OR_REMOVE(PRF_FLAGS(vict), (PRF_COLOR_2));
break;
case 9: /* con */
case 8: /* con */
if (IS_NPC(vict) || GET_LEVEL(vict) >= LVL_GRGOD)
RANGE(3, 25);
else
@ -3907,10 +3901,10 @@ static int perform_set(struct char_data *ch, struct char_data *vict, int mode, c
vict->real_abils.con = value;
affect_total(vict);
break;
case 10: /* delete */
case 9: /* delete */
SET_OR_REMOVE(PLR_FLAGS(vict), PLR_DELETED);
break;
case 11: /* dex */
case 10: /* dex */
if (IS_NPC(vict) || GET_LEVEL(vict) >= LVL_GRGOD)
RANGE(3, 25);
else
@ -3918,7 +3912,7 @@ static int perform_set(struct char_data *ch, struct char_data *vict, int mode, c
vict->real_abils.dex = value;
affect_total(vict);
break;
case 12: /* drunk */
case 11: /* drunk */
if (!str_cmp(val_arg, "off")) {
GET_COND(vict, DRUNK) = -1;
send_to_char(ch, "%s's drunkenness is now off.\r\n", GET_NAME(vict));
@ -3932,17 +3926,17 @@ static int perform_set(struct char_data *ch, struct char_data *vict, int mode, c
return (0);
}
break;
case 13: /* exp */
case 12: /* exp */
vict->points.exp = RANGE(0, 50000000);
break;
case 14: /* frozen */
case 13: /* frozen */
if (ch == vict && on) {
send_to_char(ch, "Better not -- could be a long winter!\r\n");
return (0);
}
SET_OR_REMOVE(PLR_FLAGS(vict), PLR_FROZEN);
break;
case 15: { /* coins */
case 14: { /* coins */
struct obj_data *coin_obj;
int i;
@ -3978,15 +3972,15 @@ static int perform_set(struct char_data *ch, struct char_data *vict, int mode, c
send_to_char(ch, "Ok.\r\n");
return (1);
}
case 16: /* height */
case 15: /* height */
GET_HEIGHT(vict) = value;
affect_total(vict);
break;
case 17: /* hit */
case 16: /* hit */
vict->points.hit = RANGE(-9, vict->points.max_hit);
affect_total(vict);
break;
case 18: /* hunger */
case 17: /* hunger */
if (!str_cmp(val_arg, "off")) {
GET_COND(vict, HUNGER) = -1;
send_to_char(ch, "%s's hunger is now off.\r\n", GET_NAME(vict));
@ -4000,7 +3994,7 @@ static int perform_set(struct char_data *ch, struct char_data *vict, int mode, c
return (0);
}
break;
case 19: /* int */
case 18: /* int */
if (IS_NPC(vict) || GET_LEVEL(vict) >= LVL_GRGOD)
RANGE(3, 25);
else
@ -4008,17 +4002,17 @@ static int perform_set(struct char_data *ch, struct char_data *vict, int mode, c
vict->real_abils.intel = value;
affect_total(vict);
break;
case 20: /* invis */
case 19: /* invis */
if (GET_LEVEL(ch) < LVL_IMPL && ch != vict) {
send_to_char(ch, "You aren't godly enough for that!\r\n");
return (0);
}
GET_INVIS_LEV(vict) = RANGE(0, GET_LEVEL(vict));
break;
case 21: /* invistart */
case 20: /* invistart */
SET_OR_REMOVE(PLR_FLAGS(vict), PLR_INVSTART);
break;
case 22: /* level */
case 21: /* level */
if ((!IS_NPC(vict) && value > GET_LEVEL(ch)) || value > LVL_IMPL) {
send_to_char(ch, "You can't do that.\r\n");
return (0);
@ -4026,7 +4020,7 @@ static int perform_set(struct char_data *ch, struct char_data *vict, int mode, c
RANGE(1, LVL_IMPL);
vict->player.level = value;
break;
case 23: /* loadroom */
case 22: /* loadroom */
if (!str_cmp(val_arg, "off")) {
REMOVE_BIT_AR(PLR_FLAGS(vict), PLR_LOADROOM);
} else if (is_number(val_arg)) {
@ -4044,23 +4038,23 @@ static int perform_set(struct char_data *ch, struct char_data *vict, int mode, c
return (0);
}
break;
case 24: /* mana */
case 23: /* mana */
vict->points.mana = RANGE(0, vict->points.max_mana);
affect_total(vict);
break;
case 25: /* maxhit */
case 24: /* maxhit */
vict->points.max_hit = RANGE(1, 5000);
affect_total(vict);
break;
case 26: /* maxmana */
case 25: /* maxmana */
vict->points.max_mana = RANGE(1, 5000);
affect_total(vict);
break;
case 27: /* maxstam */
case 26: /* maxstam */
vict->points.max_stamina = RANGE(1, 5000);
affect_total(vict);
break;
case 28: /* name */
case 27: /* name */
if (ch != vict && GET_LEVEL(ch) < LVL_IMPL) {
send_to_char(ch, "Only Imps can change the name of other players.\r\n");
return (0);
@ -4070,24 +4064,24 @@ static int perform_set(struct char_data *ch, struct char_data *vict, int mode, c
return (0);
}
break;
case 29: /* nodelete */
case 28: /* nodelete */
SET_OR_REMOVE(PLR_FLAGS(vict), PLR_NODELETE);
break;
case 30: /* nohassle */
case 29: /* nohassle */
if (GET_LEVEL(ch) < LVL_GOD && ch != vict) {
send_to_char(ch, "You aren't godly enough for that!\r\n");
return (0);
}
SET_OR_REMOVE(PRF_FLAGS(vict), PRF_NOHASSLE);
break;
case 31: /* nosummon */
case 30: /* nosummon */
SET_OR_REMOVE(PRF_FLAGS(vict), PRF_SUMMONABLE);
send_to_char(ch, "Nosummon %s for %s.\r\n", ONOFF(!on), GET_NAME(vict));
break;
case 32: /* nowiz */
case 31: /* nowiz */
SET_OR_REMOVE(PLR_FLAGS(vict), PLR_NOWIZLIST);
break;
case 33: /* olc */
case 32: /* olc */
if (is_abbrev(val_arg, "socials") || is_abbrev(val_arg, "actions") || is_abbrev(val_arg, "aedit"))
GET_OLC_ZONE(vict) = AEDIT_PERMISSION;
else if (is_abbrev(val_arg, "hedit") || is_abbrev(val_arg, "help"))
@ -4102,7 +4096,7 @@ static int perform_set(struct char_data *ch, struct char_data *vict, int mode, c
} else
GET_OLC_ZONE(vict) = atoi(val_arg);
break;
case 34: /* password */
case 33: /* password */
if (GET_LEVEL(vict) >= LVL_GRGOD) {
send_to_char(ch, "You cannot change that.\r\n");
return (0);
@ -4111,7 +4105,7 @@ static int perform_set(struct char_data *ch, struct char_data *vict, int mode, c
*(GET_PASSWD(vict) + MAX_PWD_LENGTH) = '\0';
send_to_char(ch, "Password changed to '%s'.\r\n", val_arg);
break;
case 35: /* poofin */
case 34: /* poofin */
if ((vict == ch) || (GET_LEVEL(ch) == LVL_IMPL)) {
skip_spaces(&val_arg);
parse_at(val_arg);
@ -4125,7 +4119,7 @@ static int perform_set(struct char_data *ch, struct char_data *vict, int mode, c
POOFIN(vict) = strdup(val_arg);
}
break;
case 36: /* poofout */
case 35: /* poofout */
if ((vict == ch) || (GET_LEVEL(ch) == LVL_IMPL)) {
skip_spaces(&val_arg);
parse_at(val_arg);
@ -4139,10 +4133,10 @@ static int perform_set(struct char_data *ch, struct char_data *vict, int mode, c
POOFOUT(vict) = strdup(val_arg);
}
break;
case 37: /* quest */
case 36: /* quest */
SET_OR_REMOVE(PRF_FLAGS(vict), PRF_QUEST);
break;
case 38: /* room */
case 37: /* room */
if ((rnum = real_room(value)) == NOWHERE) {
send_to_char(ch, "No room exists with that number.\r\n");
return (0);
@ -4151,23 +4145,23 @@ static int perform_set(struct char_data *ch, struct char_data *vict, int mode, c
char_from_room(vict);
char_to_room(vict, rnum);
break;
case 39: /* screenwidth */
case 38: /* screenwidth */
GET_SCREEN_WIDTH(vict) = RANGE(40, 200);
break;
case 40: /* sex */
case 39: /* sex */
if ((i = search_block(val_arg, genders, FALSE)) < 0) {
send_to_char(ch, "Must be 'male', 'female', or 'neutral'.\r\n");
return (0);
}
GET_SEX(vict) = i;
break;
case 41: /* showvnums */
case 40: /* showvnums */
SET_OR_REMOVE(PRF_FLAGS(vict), PRF_SHOWVNUMS);
break;
case 42: /* siteok */
case 41: /* siteok */
SET_OR_REMOVE(PLR_FLAGS(vict), PLR_SITEOK);
break;
case 43: /* skills/spells */
case 42: /* skills/spells */
{
char local_buf[MAX_INPUT_LENGTH], *value_arg, *name_end;
char skill_name[MAX_INPUT_LENGTH];
@ -4252,12 +4246,12 @@ static int perform_set(struct char_data *ch, struct char_data *vict, int mode, c
}
break;
case 44: /* stam */
case 43: /* stam */
vict->points.stamina = RANGE(0, vict->points.max_stamina);
affect_total(vict);
break;
case 45: /* str */
case 44: /* str */
if (IS_NPC(vict) || GET_LEVEL(vict) >= LVL_GRGOD)
RANGE(3, 25);
else
@ -4265,7 +4259,7 @@ static int perform_set(struct char_data *ch, struct char_data *vict, int mode, c
vict->real_abils.str = value;
affect_total(vict);
break;
case 46: /* thirst */
case 45: /* thirst */
if (!str_cmp(val_arg, "off")) {
GET_COND(vict, THIRST) = -1;
send_to_char(ch, "%s's thirst is now off.\r\n", GET_NAME(vict));
@ -4279,13 +4273,13 @@ static int perform_set(struct char_data *ch, struct char_data *vict, int mode, c
return (0);
}
break;
case 47: /* variable */
case 46: /* variable */
return perform_set_dg_var(ch, vict, val_arg);
case 48: /* weight */
case 47: /* weight */
GET_WEIGHT(vict) = value;
affect_total(vict);
break;
case 49: /* wis */
case 48: /* wis */
if (IS_NPC(vict) || GET_LEVEL(vict) >= LVL_GRGOD)
RANGE(3, 25);
else
@ -4293,10 +4287,10 @@ static int perform_set(struct char_data *ch, struct char_data *vict, int mode, c
vict->real_abils.wis = value;
affect_total(vict);
break;
case 50: /* questpoints */
case 49: /* questpoints */
GET_QUESTPOINTS(vict) = RANGE(0, 100000000);
break;
case 51: /* questhistory */
case 50: /* questhistory */
qvnum = atoi(val_arg);
if (real_quest(qvnum) == NOTHING) {
send_to_char(ch, "That quest doesn't exist.\r\n");
@ -4313,7 +4307,7 @@ static int perform_set(struct char_data *ch, struct char_data *vict, int mode, c
}
break;
}
case 52: /* species */
case 51: /* species */
if ((i = parse_species(val_arg)) == SPECIES_UNDEFINED) {
send_to_char(ch, "That is not a species.\r\n");
return (0);
@ -4718,10 +4712,6 @@ ACMD (do_zcheck)
"- No unarmed combat proficiency set (add skill or weapon)\r\n");
}
if (MOB_FLAGGED(mob, MOB_AGGRESSIVE) && (MOB_FLAGGED(mob, MOB_AGGR_GOOD) || MOB_FLAGGED(mob, MOB_AGGR_EVIL) || MOB_FLAGGED(mob, MOB_AGGR_NEUTRAL)) && (found=1))
len += snprintf(buf + len, sizeof(buf) - len,
"- Both aggresive and agressive to align.\r\n");
if (GET_EXP(mob)>MAX_EXP_ALLOWED && (found=1))
len += snprintf(buf + len, sizeof(buf) - len,
"- Has %d experience (limit: %d)\r\n",

View file

@ -228,9 +228,9 @@ const char *action_bits[] = {
"AGGR",
"STAY-ZONE",
"WIMPY",
"AGGR_EVIL",
"AGGR_GOOD",
"AGGR_NEUTRAL",
"RESERVED",
"RESERVED",
"RESERVED",
"MEMORY",
"HELPER",
"NO_CHARM",
@ -299,8 +299,8 @@ const char *affected_bits[] =
"CURSE",
"INFRA",
"POISON",
"PROT-EVIL",
"PROT-GOOD",
"RESERVED",
"RESERVED",
"SLEEP",
"NO_TRACK",
"FLY",
@ -485,9 +485,9 @@ const char *extra_bits[] = {
"MAGIC",
"NO_DROP",
"BLESS",
"ANTI_GOOD",
"ANTI_EVIL",
"ANTI_NEUTRAL",
"RESERVED",
"RESERVED",
"RESERVED",
"ANTI_SORCEROR",
"ANTI_CLERIC",
"ANTI_ROGUE",

View file

@ -1902,13 +1902,6 @@ void parse_mobile(FILE *mob_f, int nr)
REMOVE_BIT_AR(AFF_FLAGS(mob_proto + i), AFF_CHARM);
REMOVE_BIT_AR(AFF_FLAGS(mob_proto + i), AFF_POISON);
REMOVE_BIT_AR(AFF_FLAGS(mob_proto + i), AFF_SLEEP);
if (MOB_FLAGGED(mob_proto + i, MOB_AGGRESSIVE) && MOB_FLAGGED(mob_proto + i, MOB_AGGR_GOOD))
REMOVE_BIT_AR(MOB_FLAGS(mob_proto + i), MOB_AGGR_GOOD);
if (MOB_FLAGGED(mob_proto + i, MOB_AGGRESSIVE) && MOB_FLAGGED(mob_proto + i, MOB_AGGR_NEUTRAL))
REMOVE_BIT_AR(MOB_FLAGS(mob_proto + i), MOB_AGGR_NEUTRAL);
if (MOB_FLAGGED(mob_proto + i, MOB_AGGRESSIVE) && MOB_FLAGGED(mob_proto + i, MOB_AGGR_EVIL))
REMOVE_BIT_AR(MOB_FLAGS(mob_proto + i), MOB_AGGR_EVIL);
check_bitvector_names(AFF_FLAGS(mob_proto + i)[0], affected_bits_count, buf2, "mobile affect");
/* This is necessary, since if we have conventional world files, &letter is

View file

@ -57,7 +57,6 @@ static struct char_data *next_combat_list = NULL;
static void perform_group_gain(struct char_data *ch, int base, struct char_data *victim);
static void dam_message(int dam, struct char_data *ch, struct char_data *victim, int w_type);
static void make_corpse(struct char_data *ch);
static void change_alignment(struct char_data *ch, struct char_data *victim);
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 */
@ -281,14 +280,6 @@ static void make_corpse(struct char_data *ch)
obj_to_room(corpse, IN_ROOM(ch));
}
/* When ch kills victim */
static void change_alignment(struct char_data *ch, struct char_data *victim)
{
/* 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;
}
void death_cry(struct char_data *ch)
{
int door;
@ -354,11 +345,9 @@ void die(struct char_data * ch, struct char_data * killer)
static void perform_group_gain(struct char_data *ch, int base,
struct char_data *victim)
{
int share;
share = MIN(CONFIG_MAX_EXP_GAIN, MAX(1, base));
change_alignment(ch, victim);
(void)ch;
(void)base;
(void)victim;
}
static void group_gain(struct char_data *ch, struct char_data *victim)
@ -400,8 +389,6 @@ static void solo_gain(struct char_data *ch, struct char_data *victim)
exp += MAX(0, (exp * MIN(8, (GET_LEVEL(victim) - GET_LEVEL(ch)))) / 8);
exp = MAX(exp, 1);
change_alignment(ch, victim);
}
static char *replace_string(const char *str, const char *weapon_singular, const char *weapon_plural)

View file

@ -525,17 +525,6 @@ static int apply_ac(struct char_data *ch, int eq_pos)
return (factor * GET_OBJ_VAL(GET_EQ(ch, eq_pos), 0));
}
int invalid_align(struct char_data *ch, struct obj_data *obj)
{
if (OBJ_FLAGGED(obj, ITEM_ANTI_EVIL) && IS_EVIL(ch))
return TRUE;
if (OBJ_FLAGGED(obj, ITEM_ANTI_GOOD) && IS_GOOD(ch))
return TRUE;
if (OBJ_FLAGGED(obj, ITEM_ANTI_NEUTRAL) && IS_NEUTRAL(ch))
return TRUE;
return FALSE;
}
void equip_char(struct char_data *ch, struct obj_data *obj, int pos)
{
int j;
@ -558,7 +547,7 @@ void equip_char(struct char_data *ch, struct obj_data *obj, int pos)
log("SYSERR: EQUIP: Obj is in_room when equip.");
return;
}
if (invalid_align(ch, obj) || invalid_class(ch, obj)) {
if (invalid_class(ch, obj)) {
act("You are zapped by $p and instantly let go of it.", FALSE, ch, obj, 0, TO_CHAR);
act("$n is zapped by $p and instantly lets go of it.", FALSE, ch, obj, 0, TO_ROOM);
/* Changed to drop in inventory instead of the ground. */

View file

@ -40,7 +40,6 @@ void obj_from_char(struct obj_data *object);
void equip_char(struct char_data *ch, struct obj_data *obj, int pos);
struct obj_data *unequip_char(struct char_data *ch, int pos);
int invalid_align(struct char_data *ch, struct obj_data *obj);
void obj_to_room(struct obj_data *object, room_rnum room);
void obj_from_room(struct obj_data *object);

View file

@ -237,23 +237,9 @@ int mag_damage(int level, struct char_data *ch, struct char_data *victim,
/* Mostly clerics */
case SPELL_DISPEL_EVIL:
dam = dice(6, 8) + 6;
if (IS_EVIL(ch)) {
victim = ch;
dam = GET_HIT(ch) - 1;
} else if (IS_GOOD(victim)) {
act("The gods protect $N.", FALSE, ch, 0, victim, TO_CHAR);
return (0);
}
break;
case SPELL_DISPEL_GOOD:
dam = dice(6, 8) + 6;
if (IS_GOOD(ch)) {
victim = ch;
dam = GET_HIT(ch) - 1;
} else if (IS_EVIL(victim)) {
act("The gods protect $N.", FALSE, ch, 0, victim, TO_CHAR);
return (0);
}
break;
@ -461,13 +447,6 @@ void mag_affects(int level, struct char_data *ch, struct char_data *victim,
to_room = "$n gets violently ill!";
break;
case SPELL_PROT_FROM_EVIL:
af[0].duration = 24;
SET_BIT_AR(af[0].bitvector, AFF_PROTECT_EVIL);
accum_duration = TRUE;
to_vict = "You feel invulnerable!";
break;
case SPELL_SANCTUARY:
af[0].duration = 4;
SET_BIT_AR(af[0].bitvector, AFF_SANCTUARY);

View file

@ -99,10 +99,7 @@ void mobile_activity(void)
if (MOB_FLAGGED(ch, MOB_WIMPY) && AWAKE(vict))
continue;
if (MOB_FLAGGED(ch, MOB_AGGRESSIVE ) ||
(MOB_FLAGGED(ch, MOB_AGGR_EVIL ) && IS_EVIL(vict)) ||
(MOB_FLAGGED(ch, MOB_AGGR_NEUTRAL) && IS_NEUTRAL(vict)) ||
(MOB_FLAGGED(ch, MOB_AGGR_GOOD ) && IS_GOOD(vict))) {
if (MOB_FLAGGED(ch, MOB_AGGRESSIVE)) {
/* Can a master successfully control the charmed monster? */
if (aggressive_mob_on_a_leash(ch, ch->master, vict))
@ -267,4 +264,3 @@ static bool aggressive_mob_on_a_leash(struct char_data *slave, struct char_data
/* So sorry, now you're a player killer... Tsk tsk. */
return (FALSE);
}

View file

@ -226,9 +226,7 @@ static void auto_equip(struct char_data *ch, struct obj_data *obj, int location)
if (location > 0) { /* Wearable. */
if (!GET_EQ(ch,j)) {
/* Check the characters's alignment to prevent them from being zapped
* through the auto-equipping. */
if (invalid_align(ch, obj) || invalid_class(ch, obj))
if (invalid_class(ch, obj))
location = LOC_INVENTORY;
else
equip_char(ch, obj, j);

View file

@ -19,7 +19,6 @@
#define PFDEF_LEVEL 0
#define PFDEF_HEIGHT 0
#define PFDEF_WEIGHT 0
#define PFDEF_ALIGNMENT 0
#define PFDEF_PLRFLAGS 0
#define PFDEF_AFFFLAGS 0
#define PFDEF_SAVETHROW 0

View file

@ -276,7 +276,6 @@ int load_char(const char *name, struct char_data *ch)
GET_WEIGHT(ch) = PFDEF_WEIGHT;
GET_ROLEPLAY_AGE(ch) = 0;
GET_ROLEPLAY_AGE_YEAR(ch) = 0;
GET_ALIGNMENT(ch) = PFDEF_ALIGNMENT;
for (i = 0; i < NUM_OF_SAVING_THROWS; i++)
GET_SAVE(ch, i) = PFDEF_SAVETHROW;
GET_LOADROOM(ch) = PFDEF_LOADROOM;
@ -361,7 +360,6 @@ int load_char(const char *name, struct char_data *ch)
AFF_FLAGS(ch)[0] = asciiflag_conv(line);
}
if (!strcmp(tag, "Affs")) load_affects(fl, ch);
else if (!strcmp(tag, "Alin")) GET_ALIGNMENT(ch) = atoi(line);
else if (!strcmp(tag, "Alis")) read_aliases_ascii(fl, ch, atoi(line));
break;
@ -696,7 +694,6 @@ void save_char(struct char_data * ch)
if (GET_HOST(ch)) fprintf(fl, "Host: %s\n", GET_HOST(ch));
if (GET_HEIGHT(ch) != PFDEF_HEIGHT) fprintf(fl, "Hite: %d\n", GET_HEIGHT(ch));
if (GET_WEIGHT(ch) != PFDEF_WEIGHT) fprintf(fl, "Wate: %d\n", GET_WEIGHT(ch));
if (GET_ALIGNMENT(ch) != PFDEF_ALIGNMENT) fprintf(fl, "Alin: %d\n", GET_ALIGNMENT(ch));
sprintascii(bits, PLR_FLAGS(ch)[0]);

View file

@ -31,6 +31,7 @@ static void sedit_shop_flags_menu(struct descriptor_data *d);
static void sedit_no_trade_menu(struct descriptor_data *d);
static void sedit_types_menu(struct descriptor_data *d);
static void sedit_disp_menu(struct descriptor_data *d);
static void format_notrade_classes(bitvector_t flags, char *out, size_t outsz);
void sedit_save_internally(struct descriptor_data *d)
@ -44,6 +45,34 @@ static void sedit_save_to_disk(int num)
save_shops(num);
}
static void format_notrade_classes(bitvector_t flags, char *out, size_t outsz)
{
size_t len = 0;
int i, found = 0;
if (!out || outsz == 0)
return;
out[0] = '\0';
for (i = TRADE_CLASS_START; i < NUM_TRADERS; i++) {
if (IS_SET(flags, 1 << i)) {
int n = snprintf(out + len, outsz - len, "%s%s", found ? " " : "", trade_letters[i]);
if (n < 0 || (size_t)n >= outsz - len) {
out[outsz - 1] = '\0';
return;
}
len += (size_t)n;
found = 1;
}
}
if (!found)
strlcpy(out, "NOBITS", outsz);
}
/* utility functions */
ACMD(do_oasis_sedit)
{
@ -346,11 +375,12 @@ static void sedit_no_trade_menu(struct descriptor_data *d)
get_char_colors(d->character);
clear_screen(d);
for (i = 0; i < NUM_TRADERS; i++) {
write_to_output(d, "%s%2d%s) %-20.20s %s", grn, i + 1, nrm, trade_letters[i],
for (i = 0; i < NUM_TRADE_CLASSES; i++) {
write_to_output(d, "%s%2d%s) %-20.20s %s", grn, i + 1, nrm,
trade_letters[TRADE_CLASS_START + i],
!(++count % 2) ? "\r\n" : "");
}
sprintbit(S_NOTRADE(OLC_SHOP(d)), trade_letters, bits, sizeof(bits));
format_notrade_classes(S_NOTRADE(OLC_SHOP(d)), bits, sizeof(bits));
write_to_output(d, "\r\nCurrently won't trade with: %s%s%s\r\n"
"Enter choice : ", cyn, bits, nrm);
OLC_MODE(d) = SEDIT_NOTRADE;
@ -382,7 +412,7 @@ static void sedit_disp_menu(struct descriptor_data *d)
get_char_colors(d->character);
clear_screen(d);
sprintbit(S_NOTRADE(shop), trade_letters, buf1, sizeof(buf1));
format_notrade_classes(S_NOTRADE(shop), buf1, sizeof(buf1));
sprintbit(S_BITVECTOR(shop), shop_bits, buf2, sizeof(buf2));
write_to_output(d,
"-- Shop Number : [%s%d%s]\r\n"
@ -756,8 +786,8 @@ void sedit_parse(struct descriptor_data *d, char *arg)
}
break;
case SEDIT_NOTRADE:
if ((i = LIMIT(atoi(arg), 0, NUM_TRADERS)) > 0) {
TOGGLE_BIT(S_NOTRADE(OLC_SHOP(d)), 1 << (i - 1));
if ((i = LIMIT(atoi(arg), 0, NUM_TRADE_CLASSES)) > 0) {
TOGGLE_BIT(S_NOTRADE(OLC_SHOP(d)), 1 << (TRADE_CLASS_START + i - 1));
sedit_no_trade_menu(d);
return;
}

View file

@ -29,9 +29,9 @@
/* Global variables definitions used externally */
/* Constant list for printing out who we sell to */
const char *trade_letters[] = {
"Good", /* First, the alignment based ones */
"Evil",
"Neutral",
"RESERVED1",
"RESERVED2",
"RESERVED3",
"Sorceror", /* Then the class based ones */
"Cleric",
"Rogue",
@ -119,13 +119,6 @@ static int is_ok_char(struct char_data *keeper, struct char_data *ch, int shop_n
if (IS_GOD(ch))
return (TRUE);
if ((IS_GOOD(ch) && NOTRADE_GOOD(shop_nr)) ||
(IS_EVIL(ch) && NOTRADE_EVIL(shop_nr)) ||
(IS_NEUTRAL(ch) && NOTRADE_NEUTRAL(shop_nr))) {
snprintf(buf, sizeof(buf), "%s %s", GET_NAME(ch), MSG_NO_SELL_ALIGN);
do_tell(keeper, buf, cmd_tell, 0);
return (FALSE);
}
if (IS_NPC(ch))
return (TRUE);
@ -1361,7 +1354,7 @@ void assign_the_shopkeepers(void)
static char *customer_string(int shop_nr, int detailed)
{
int sindex = 0, flag = 1, nlen;
int sindex = TRADE_CLASS_START, flag = (1 << TRADE_CLASS_START), nlen;
size_t len = 0;
static char buf[256];
@ -1433,7 +1426,7 @@ static void list_all_shops(struct char_data *ch)
static void list_detailed_shop(struct char_data *ch, int shop_nr)
{
struct char_data *k;
int sindex, column, flag = 1, found = 0;
int sindex, column, flag = (1 << TRADE_CLASS_START), found = 0;
/* char *ptrsave; */
send_to_char(ch, "Vnum: [%5d], Rnum: [%5d]\r\n", SHOP_NUM(shop_nr), shop_nr + 1);
@ -1484,7 +1477,7 @@ static void list_detailed_shop(struct char_data *ch, int shop_nr)
/* send_to_char(ch, "Customers: %s\r\n", (ptrsave = customer_string(shop_nr, TRUE)) ? ptrsave : "None"); */
send_to_char(ch, "Customers: ");
column = 12; /* ^^^ strlen ^^^ */
for (sindex = 0; *trade_letters[sindex] != '\n'; sindex++) {
for (sindex = TRADE_CLASS_START; *trade_letters[sindex] != '\n'; sindex++) {
char buf1[128];
int linelen;

View file

@ -74,9 +74,9 @@ struct shop_data {
#define LIST_ROOM 2
/* Whom will we not trade with (bitvector for SHOP_TRADE_WITH()) */
#define TRADE_NOGOOD (1 << 0)
#define TRADE_NOEVIL (1 << 1)
#define TRADE_NONEUTRAL (1 << 2)
#define TRADE_RESERVED1 (1 << 0)
#define TRADE_RESERVED2 (1 << 1)
#define TRADE_RESERVED3 (1 << 2)
#define TRADE_NOSORCEROR (1 << 3)
#define TRADE_NOCLERIC (1 << 4)
#define TRADE_NOROGUE (1 << 5)
@ -87,6 +87,9 @@ struct shop_data {
#define TRADE_NODRUID (1 << 10)
/** Total number of trade types */
#define NUM_TRADERS 11
#define TRADE_RESERVED_COUNT 3
#define TRADE_CLASS_START TRADE_RESERVED_COUNT
#define NUM_TRADE_CLASSES (NUM_TRADERS - TRADE_RESERVED_COUNT)
struct stack_data {
int data[100];
@ -123,9 +126,6 @@ struct stack_data {
#define SHOP_SELLPROFIT(i) (shop_index[(i)].profit_sell)
#define SHOP_FUNC(i) (shop_index[(i)].func)
#define NOTRADE_GOOD(i) (IS_SET(SHOP_TRADE_WITH((i)), TRADE_NOGOOD))
#define NOTRADE_EVIL(i) (IS_SET(SHOP_TRADE_WITH((i)), TRADE_NOEVIL))
#define NOTRADE_NEUTRAL(i) (IS_SET(SHOP_TRADE_WITH((i)), TRADE_NONEUTRAL))
#define NOTRADE_SORCEROR(i) (IS_SET(SHOP_TRADE_WITH((i)), TRADE_NOSORCEROR))
#define NOTRADE_CLERIC(i) (IS_SET(SHOP_TRADE_WITH((i)), TRADE_NOCLERIC))
#define NOTRADE_ROGUE(i) (IS_SET(SHOP_TRADE_WITH((i)), TRADE_NOROGUE))
@ -153,7 +153,6 @@ struct stack_data {
#define MSG_CLOSED_FOR_DAY "Sorry, come back tomorrow."
#define MSG_NO_STEAL_HERE "$n is a bloody thief!"
#define MSG_NO_SEE_CHAR "I don't trade with someone I can't see!"
#define MSG_NO_SELL_ALIGN "Get out of here before I call the guards!"
#define MSG_NO_SELL_CLASS "We don't serve your kind here!"
#define MSG_NO_USED_WANDSTAFF "I don't buy used up wands or staves!"
#define MSG_CANT_KILL_KEEPER "Get out of here before I call the guards!"

View file

@ -319,13 +319,6 @@ SPECIAL(sorceror)
if (GET_LEVEL(ch) > 7 && rand_number(0, 8) == 0)
cast_spell(ch, vict, NULL, SPELL_BLINDNESS);
if (GET_LEVEL(ch) > 12 && rand_number(0, 12) == 0) {
if (IS_EVIL(ch))
cast_spell(ch, vict, NULL, SPELL_ENERGY_DRAIN);
else if (IS_GOOD(ch))
cast_spell(ch, vict, NULL, SPELL_DISPEL_EVIL);
}
if (rand_number(0, 4))
return (TRUE);

View file

@ -388,14 +388,7 @@ ASPELL(spell_enchant_weapon)
obj->affected[1].location = APPLY_PROFICIENCY;
obj->affected[1].modifier = 1 + (level >= 20);
if (IS_GOOD(ch)) {
SET_BIT_AR(GET_OBJ_EXTRA(obj), ITEM_ANTI_EVIL);
act("$p glows blue.", FALSE, ch, obj, 0, TO_CHAR);
} else if (IS_EVIL(ch)) {
SET_BIT_AR(GET_OBJ_EXTRA(obj), ITEM_ANTI_GOOD);
act("$p glows red.", FALSE, ch, obj, 0, TO_CHAR);
} else
act("$p glows yellow.", FALSE, ch, obj, 0, TO_CHAR);
act("$p glows yellow.", FALSE, ch, obj, 0, TO_CHAR);
}
ASPELL(spell_detect_poison)

View file

@ -255,9 +255,9 @@
#define MOB_AGGRESSIVE 5 /**< Mob auto-attacks everybody nearby */
#define MOB_STAY_ZONE 6 /**< Mob shouldn't wander out of zone */
#define MOB_WIMPY 7 /**< Mob flees if severely injured */
#define MOB_AGGR_EVIL 8 /**< Auto-attack any evil PC's */
#define MOB_AGGR_GOOD 9 /**< Auto-attack any good PC's */
#define MOB_AGGR_NEUTRAL 10 /**< Auto-attack any neutral PC's */
#define MOB_AGGR_RESERVED1 8 /**< Reserved (unused) */
#define MOB_AGGR_RESERVED2 9 /**< Reserved (unused) */
#define MOB_AGGR_RESERVED3 10 /**< Reserved (unused) */
#define MOB_MEMORY 11 /**< remember attackers if attacked */
#define MOB_HELPER 12 /**< attack PCs fighting other NPCs */
#define MOB_NOCHARM 13 /**< Mob can't be charmed */
@ -321,8 +321,8 @@
#define AFF_CURSE 10 /**< Char is cursed */
#define AFF_INFRAVISION 11 /**< Char can see in dark */
#define AFF_POISON 12 /**< (R) Char is poisoned */
#define AFF_PROTECT_EVIL 13 /**< Char protected from evil */
#define AFF_PROTECT_GOOD 14 /**< Char protected from good */
#define AFF_RESERVED13 13 /**< Reserved (unused) */
#define AFF_RESERVED14 14 /**< Reserved (unused) */
#define AFF_SLEEP 15 /**< (R) Char magically asleep */
#define AFF_NOTRACK 16 /**< Char can't be tracked */
#define AFF_FLYING 17 /**< Char is flying */
@ -474,9 +474,9 @@
#define ITEM_MAGIC 6 /**< Item is magical */
#define ITEM_NODROP 7 /**< Item is cursed: can't drop */
#define ITEM_BLESS 8 /**< Item is blessed */
#define ITEM_ANTI_GOOD 9 /**< Not usable by good people */
#define ITEM_ANTI_EVIL 10 /**< Not usable by evil people */
#define ITEM_ANTI_NEUTRAL 11 /**< Not usable by neutral people */
#define ITEM_RESERVED9 9 /**< Reserved (unused) */
#define ITEM_RESERVED10 10 /**< Reserved (unused) */
#define ITEM_RESERVED11 11 /**< Reserved (unused) */
#define ITEM_ANTI_SORCEROR 12 /**< Not usable by sorcerors */
#define ITEM_ANTI_CLERIC 13 /**< Not usable by clerics */
#define ITEM_ANTI_ROGUE 14 /**< Not usable by rogues */

View file

@ -59,7 +59,7 @@ struct char_point_data_plrtoascii {
* in player_special_data.
*/
struct char_special_data_saved_plrtoascii {
int alignment; /* +-1000 for alignments */
int alignment;
long idnum; /* player's idnum; -1 for mobiles */
long /*bitvector_t*/ act; /* act flag for NPC's; player flag for PC's */
@ -212,8 +212,6 @@ void convert(char *filename)
/* char_special_data_saved */
csds = &(player.char_specials_saved);
if (csds->alignment != PFDEF_ALIGNMENT)
fprintf(outfile, "Alin: %d\n", csds->alignment);
fprintf(outfile, "Id : %d\n", (int)csds->idnum);
if (csds->act != PFDEF_PLRFLAGS)
fprintf(outfile, "Act : %d\n", (int)csds->act);

View file

@ -749,13 +749,6 @@ do \
#define CAN_SEE_IN_DARK(ch) \
(AFF_FLAGGED(ch, AFF_INFRAVISION) || (!IS_NPC(ch) && PRF_FLAGGED(ch, PRF_HOLYLIGHT)))
/** Defines if ch is good. */
#define IS_GOOD(ch) (GET_ALIGNMENT(ch) >= 350)
/** Defines if ch is evil. */
#define IS_EVIL(ch) (GET_ALIGNMENT(ch) <= -350)
/** Defines if ch is neither good nor evil. */
#define IS_NEUTRAL(ch) (!IS_GOOD(ch) && !IS_EVIL(ch))
/** Old wait state function.
* @deprecated Use GET_WAIT_STATE */
#define WAIT_STATE(ch, cycle) do { GET_WAIT_STATE(ch) = (cycle); } while(0)