37 Commits

Author SHA1 Message Date
Rumble
5024dd8e66 Updated for 2025 release 2025-01-09 23:57:59 +00:00
Thomas Arp
69888a5d89 Update aedit.c (#145)
fixes #144 

Thanks to @gbstott for the bug report
2025-01-08 22:57:39 +01:00
haloway13
1ccb6adaee Update dg_olc.c (#143)
Better auto-formatting of dg_scripts. Thanks to haloway13 for the patch.
2025-01-01 11:05:54 +01:00
Thomas Arp
d3227f1300 Fix bug in process_output (#140)
Based on error report from JTP in the tbamud forums. If an attacker was able to start a session and then break the connection, the  process_output function would fail. This would trigger two calls to close_socket on the same descriptor. This in turn results in a double free on the character struct.

https://www.tbamud.com/kunena/4-development/5617-another-core-dump-not-long-after-the-one-earlier
Thanks to JTP for the bug report.
2024-12-30 12:30:29 +01:00
Thomas Arp
88b3027ec6 Bugfix/135 while freezes the mud (#138)
* Added loop counter per while instead of global. fixes #135

* Revert "Added loop counter per while instead of global. fixes #135"

This reverts commit 59cf6a1fb2.

* Remove extraneous reset of loop var.

Fixes #135

Thanks to bylins for the fix - https://github.com/bylins
2024-09-28 20:29:11 +02:00
Victor Augusto Borges Dias de Almeida
7036a15782 Changes to make the code compile normally on macOS. (#137)
Changes in configure to set crypt lib dynamically depending on the OS
2024-09-22 11:15:28 +02:00
welcor
e59420363a Merge branch 'master' of git@github.com:tbamud/tbamud.git 2024-09-16 22:26:44 +02:00
Thomas Arp
c838a513dd Added loop counter per while instead of global. fixes #135 (#136) 2024-09-16 22:25:29 +02:00
welcor
ed9e5e1c5a Merge branch 'master' of github.com:tbamud/tbamud 2024-06-20 22:48:59 +02:00
Dan Danese
762cb77c60 Fix a bug with the prior commit for handling triggers. It should have (#132)
continued the loop, not returned since it isn't likely to be the end of
the wld file.

Added the ability to specify multiple files on the command line. This
will load all files passed before processing into html files. This is to
fix the 'missing exits' from the output html files. The prior version
only worked on a single zone or wld file and generated incomplete
output. The record count was moved global to enable proper tracking of
the entire world. The index_boot function was modified to scan the files
first, get a record count, then start over and load the room records.

example usage: wld2html *.wld

This command will generate the entire world as one html file per room.

Fixed room number roll over. The original was using a short int which is
a 16bit int and rolls at 32k.

Fixed an issue where the html files would get negative names due to
integer rollover. It had something to do with sprintf an int using %d,
but only if you passed that to fopen. Casting the int (room number) to
a long before using sprintf with %ld fixed the issue.

Added the missing four directions from the dir_names array and defines.

Co-authored-by: Dan Danese <biouxtia@danese.us>
2024-06-20 19:56:51 +02:00
Thomas Arp
317286d051 Ignore project files on commit, and fix the automap bug showing two (#133)
descriptions
2024-06-20 19:31:20 +02:00
Dan Danese
ac711ffff8 Update wld2html.c (#131)
Triggers on elements of the room break this utility. Added code to toss them since we don't need them. Can add handling that pulls the trigger info later if desired, but too time consuming to index them before building the room for this simple tool.
2024-06-18 20:56:13 +02:00
Thomas Arp
cde4b84be1 Update FAQ.txt (#130)
Added info about generated maps for the areas on tbaMUD
2024-06-08 12:12:54 +02:00
Nick Schmoyer
5da67ddc6a Add missing lookup for flags in read_ibt (#128) 2024-03-02 23:11:28 +01:00
Roman Shapiro
b2d38522e0 Added new easy way of building TbaMUD in the Visual Studio through the CMake (#127)
* Added new experimental MSVC build way through CMake

* Small build/README.md fix
2023-11-19 04:04:39 +01:00
Serge
498b652546 fixed small bug in toggle showvnum (#125)
Thanks, @prool
2023-01-07 15:43:06 +01:00
Rumble
213e52d255 Updated for 2023 release 2023-01-02 14:23:51 +00:00
Steaphan Greene
79e2f91894 Fix (remove) rogue non-ascii character from socials.new. (#123)
This character isn't ascii, nor even utf8.  It doesn't serve any real
textual purpose either, so, just delete it.
2022-12-05 12:53:37 +01:00
Thomas Arp
7f495670f2 Bugfix: the "rest" is added but was never subtracted. (#120) 2022-11-16 23:08:51 +01:00
tjr1974
e9c9808a24 Update act.informative.c (#119)
Fixed formatting for readability.
Indentations should be correct.
Tested on fresh install. 
It does compile. 
Room descriptions display properly.
2022-11-16 23:08:33 +01:00
Thomas Arp
c9ebc7174c Create build.yml (#117)
Support for building pull requests with github actions
2022-11-06 23:41:31 +01:00
Thomas Arp
bde600051d Merge pull request #114 from Vatiken/master
Replaced missing semi-colon. -No Compile
2022-11-05 12:53:30 +01:00
Thomas Arp
a745935421 Merge pull request #113 from tbamud/zusuk-patch-1
Added check for NOTHING key in has_key()
2022-11-05 12:53:05 +01:00
Joseph
0ee3aac10d Replaced missing semi-colon. -No Compile 2022-11-04 21:02:35 -03:00
Thomas Arp
15074b1d93 Added check for NOTHING key in has_key() 2022-11-02 22:31:56 +01:00
Thomas Arp
8f67dd880c Merge pull request #110 from tjr1974/master
Fixes & Code Quality
2022-10-25 00:36:18 +02:00
tjr1974
34aca229df Update act.informative.c
Used code formatter to correct indentations and align all {} in lACMD(do_exits)
Checked for unmactched braces and found none.
My code editor shows all {} are matched.
2022-10-24 17:07:54 -05:00
tjr1974
041765438a Update act.informative.c
Used code formatter to correct indentations and align all {} in the look_at_room()
Checked for unmactched braces and found none.
My code editor shows all {} are matched.
2022-10-24 16:38:11 -05:00
tjr1974
59398b2fdc Update handler.c
Fixes indentations in obj_to_room()
2022-10-24 16:07:49 -05:00
tjr1974
97bd28ffd3 Update act.informative.c
Fixes unguarded blocks of code in ACMD(do_exits) that could cause the server to report scripted trigger events (mob movements, exit links to rooms being reassigned, and doors being opened or closed) as script errors. Particularly, if this code is copy and pasted into the do_auto_exits().
2022-10-23 15:29:43 -05:00
tjr1974
7039f9c402 Update act.informative.c
Fixes unguarded else clauses due to inconsistent use of {} in look_at_room().
2022-10-23 15:12:57 -05:00
tjr1974
3635026433 Update handler.c
Fixes the display order of objects in obj_to_room().
Objects are now displayed in the order they are placed/dropped. This prevents fountains, boards, etcetera from "moving" around the room.
2022-10-23 14:57:14 -05:00
Thomas Arp
16a46903e4 Merge pull request #103 from mackerel3/antipattern
use strncat(sizeof(...) - strlen(...) - 1)
2022-09-03 12:33:01 +02:00
Mackerel
2d8c05b4ed use strncat(sizeof(...) - strlen(...) - 1) 2022-09-03 00:11:03 -04:00
Thomas Arp
95d4da4972 Merge pull request #101 from ktpx/recent
inc size of name, max length names crash on addrecent due to buffer o…
2022-03-25 00:03:13 +01:00
Thomas
9c801f9ab6 inc size of name, max length names crash on addrecent due to buffer overflow 2022-03-24 22:46:43 +01:00
Rumble
5305783e1b Fixed World file errors 2021-03-06 19:29:28 +00:00
38 changed files with 1130 additions and 425 deletions

19
.github/workflows/build.yml vendored Normal file
View File

@@ -0,0 +1,19 @@
name: C/C++ CI
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: configure
run: ./configure
- name: build
run: cd src && touch .accepted && make

83
.gitignore vendored
View File

@@ -10,3 +10,86 @@ src/util/Makefile
src/.accepted src/.accepted
src/depend src/depend
src/util/depend src/util/depend
build/*
!build/create_solution.bat
!build/README.md
# Do not commit files from players
lib/plrfiles/A-E/*
lib/plrfiles/F-J/*
lib/plrfiles/K-O/*
lib/plrfiles/P-T/*
lib/plrfiles/U-Z/*
lib/plrfiles/ZZZ/*
lib/plrfiles/index
# but do commit the placeholders
!lib/plrfiles/A-E/00
!lib/plrfiles/F-J/00
!lib/plrfiles/K-O/00
!lib/plrfiles/P-T/00
!lib/plrfiles/U-Z/00
!lib/plrfiles/ZZZ/00
# or vars
lib/plrvars/A-E/*
lib/plrvars/F-J/*
lib/plrvars/K-O/*
lib/plrvars/P-T/*
lib/plrvars/U-Z/*
lib/plrvars/ZZZ/*
lib/plrvars/index
# except the placeholders
!lib/plrvars/A-E/00
!lib/plrvars/F-J/00
!lib/plrvars/K-O/00
!lib/plrvars/P-T/00
!lib/plrvars/U-Z/00
!lib/plrvars/ZZZ/00
# or objects
lib/plrobjs/A-E/*
lib/plrobjs/F-J/*
lib/plrobjs/K-O/*
lib/plrobjs/P-T/*
lib/plrobjs/U-Z/*
lib/plrobjs/ZZZ/*
lib/plrobjs/index
# except the placeholders
!lib/plrobjs/A-E/00
!lib/plrobjs/F-J/00
!lib/plrobjs/K-O/00
!lib/plrobjs/P-T/00
!lib/plrobjs/U-Z/00
!lib/plrobjs/ZZZ/00
# also not autogenerated config file
/lib/etc/config
# or the list of last logins
/lib/etc/last
# or mail
lib/etc/plrmail
# test object files, etc
src/test/depend
src/test/*.o
src/test/testfile
# ide etc.
.vscode
.project
.settings
.cproject
# macOS generated files
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db

15
build/README.md Normal file
View File

@@ -0,0 +1,15 @@
### Overview
This guide describes how to build TbaMUD in the Visual Studio through the new experimental CMake environment.
### Prerequisites
* [Visual Studio 2022+](https://visualstudio.microsoft.com/ru/vs/)
* [CMake 3.27+](https://cmake.org/)
### Build Steps
1. Goto the folder `src` and copy `conf.h.win` to `conf.h`.
2. Goto the folder `build` and execute `create_solution.bat`.
3. Open `build/circle.sln` in Visual Studio.
4. Compile and run.

View File

@@ -0,0 +1 @@
cmake -B . -S ..\src -G "Visual Studio 17 2022"

71
configure vendored
View File

@@ -1227,18 +1227,28 @@ if eval "test \"`echo '$ac_cv_func_'crypt`\" = yes"; then
cat >> confdefs.h <<\EOF cat >> confdefs.h <<\EOF
#define CIRCLE_CRYPT 1 #define CIRCLE_CRYPT 1
EOF EOF
CRYPTLIB="-lcrypt"
echo "CRYPTLIB set to: $CRYPTLIB" 1>&6
else else
echo "$ac_t""no" 1>&6 echo "$ac_t""no" 1>&6
echo $ac_n "checking for crypt in -lcrypt""... $ac_c" 1>&6 echo $ac_n "checking for crypt in -lcrypt""... $ac_c" 1>&6
echo "configure:1235: checking for crypt in -lcrypt" >&5 echo "configure:1235: checking for crypt in -lcrypt" >&5
ac_lib_var=`echo crypt'_'crypt | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then OS_NAME=$(uname)
echo $ac_n "(cached) $ac_c" 1>&6 if [ "$OS_NAME" = "Darwin" ]; then
else # macOS: No need for -lcrypt
ac_save_LIBS="$LIBS" CRYPTLIB=""
LIBS="-lcrypt $LIBS" echo "CRYPTLIB not needed on macOS" 1>&6
cat > conftest.$ac_ext <<EOF else
# Other systems (Linux): Use -lcrypt
ac_lib_var=`echo crypt'_'crypt | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_save_LIBS="$LIBS"
LIBS="-lcrypt $LIBS"
cat > conftest.$ac_ext <<EOF
#line 1243 "configure" #line 1243 "configure"
#include "confdefs.h" #include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */ /* Override any gcc2 internal prototype to avoid an error. */
@@ -1250,30 +1260,29 @@ int main() {
crypt() crypt()
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:1254: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then if { (eval echo configure:1254: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest* rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes" eval "ac_cv_lib_$ac_lib_var=yes"
else else
echo "configure: failed program was:" >&5 echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5 cat conftest.$ac_ext >&5
rm -rf conftest* rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=no" eval "ac_cv_lib_$ac_lib_var=no"
fi fi
rm -f conftest* rm -f conftest*
LIBS="$ac_save_LIBS" LIBS="$ac_save_LIBS"
fi
fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6
echo "$ac_t""yes" 1>&6 cat >> confdefs.h <<\EOF
cat >> confdefs.h <<\EOF
#define CIRCLE_CRYPT 1 #define CIRCLE_CRYPT 1
EOF EOF
CRYPTLIB="-lcrypt" CRYPTLIB="-lcrypt"
else echo "CRYPTLIB set to: $CRYPTLIB on Linux" 1>&6
echo "$ac_t""no" 1>&6 else
fi echo "$ac_t""no" 1>&6
fi
fi
fi fi

View File

@@ -257,6 +257,9 @@ http://tbamud.com
All donated areas have been added to the latest version of tbaMUD. If you All donated areas have been added to the latest version of tbaMUD. If you
wish to donate some of your own work stop by the Builder Academy. wish to donate some of your own work stop by the Builder Academy.
https://github.com/rds1983 has generated maps of all the existing areas,
and they can be found here: https://mudmapbuilder.github.io/
2.3. I have questions about tbaMUD. Where should I go? 2.3. I have questions about tbaMUD. Where should I go?
Stop by The Builder Academy at tbamud.com 9091 or the website at: Stop by The Builder Academy at tbamud.com 9091 or the website at:

View File

@@ -10,6 +10,8 @@ to rec.games.mud.diku which originally announced CircleMUD as a publicly
available MUD source code. available MUD source code.
tbaMUD Release history: tbaMUD Release history:
Version 2025 release: January, 2025
Version 2023 release: January, 2023
Version 2021 release: March, 2021 Version 2021 release: March, 2021
Version 2020 release: January, 2020 Version 2020 release: January, 2020
Version 2019 release: January, 2019 Version 2019 release: January, 2019

View File

@@ -6109,7 +6109,7 @@ $n looks around for a victim to strangle.
You throw yourself against $N's throat, trying to squeeze the life out. You throw yourself against $N's throat, trying to squeeze the life out.
$n throws $mself after $N's throat. $n throws $mself after $N's throat.
$n throws $mself after your throat, you try to defend yourself. $n throws $mself after your throat, you try to defend yourself.
AARGH! They must have left... #&%£@! AARGH! They must have left...
You put your hands around your throat and stop breathing. You put your hands around your throat and stop breathing.
$n tries to strangle $mself, making a very strange noise and getting blue in the face. $n tries to strangle $mself, making a very strange noise and getting blue in the face.
You strangle $M $t. You strangle $M $t.

View File

@@ -1,5 +1,5 @@
T B A M U D T B A M U D
2 0 2 1 2 0 2 5
Based on CircleMUD by Jeremy Elson and DikuMUD by Hans-Henrik Staerfeldt, Based on CircleMUD by Jeremy Elson and DikuMUD by Hans-Henrik Staerfeldt,
Katja Nyboe, Tom Madsen, Michael Seifert, and Sebastian Hammer Katja Nyboe, Tom Madsen, Michael Seifert, and Sebastian Hammer

View File

@@ -3312,7 +3312,7 @@ the earthquake spell.
See also: WATERWALK, EARTHQUAKE See also: WATERWALK, EARTHQUAKE
#0 #0
FOLLOWERS FOLLOWERS UNFOLLOW
Usage: follow <leader> Usage: follow <leader>
@@ -3350,7 +3350,7 @@ The 3rd number is liquid type from the following:
value 1: Initial drink units. Must be 1 or greater. value 1: Initial drink units. Must be 1 or greater.
value 2: see below value 2: see below
value 3: 0 for not poisoned. Otherwise, the number of hours until the poison value 3: 0 for not poisoned. Otherwise, the number of hours until the poison
burns off? burns off.
value 2: The type of liquid in the drink-container, one of: value 2: The type of liquid in the drink-container, one of:
@@ -9879,6 +9879,7 @@ tbalim test 61165
return return
toggle nohassle on toggle nohassle on
To list empty zones "show zone none"
To setup test with zone 348 To setup test with zone 348
return return
saveall saveall

View File

@@ -128,6 +128,18 @@ Samuel himself is here, pouring the drinks and getting rich.
300 90000 300 90000
8 8 1 8 8 1
E E
#31510
postal worker postmasters~
the postal worker~
A postal worker is here, ready to send or get your mail.
~
Be careful. No sudden moves. You know how these guys get....
~
10 0 0 0 0 0 0 0 0 E
30 10 -8 6d6+300 5d5+5
300 90000
8 8 1
E
#31511 #31511
Juan pusher potion~ Juan pusher potion~
Juan the potion pusher~ Juan the potion pusher~

View File

@@ -222,8 +222,16 @@ An awl pike is here, taking up much space.~
5 0 0 0 0 an 0 0 0 0 0 0 0 5 0 0 0 0 an 0 0 0 0 0 0 0
4 3 5 3 4 3 5 3
15 750 75 0 0 15 750 75 0 0
#3927
jeweled dagger~
a jeweled dagger~
A dagger is lying here, its jewels sparkling merrily.~
~
5 0 0 0 0 an 0 0 0 0 0 0 0
5 2 3 14
4 120 12 0 0
#3928 #3928
14~ curving dagger~
a wickedly curving dagger~ a wickedly curving dagger~
A dagger lies here on the ground, its curve looking particularly wicked.~ A dagger lies here on the ground, its curve looking particularly wicked.~
~ ~

View File

@@ -1929,6 +1929,34 @@ pamphlet leaflet photograph photo~
even your stomach... Blech! even your stomach... Blech!
~ ~
S S
#30170
The Post Office~
This seems to be the standard post office given to any university by the
wonderful XXX government. You can tell that it is a university post office
because of the surplus amount of obscene graffiti upon the walls. The back
hall is south of here.
~
301 8 0 0 0 0
D2
You can see the back hall from here complete with humming bank machines.
~
~
0 -1 30138
E
graffiti~
You really don't want to read this! (if you want to continue reading type
"look wirt")
~
E
wirt~
You really are a sucker for punishment now aren't you? If you still want to
read it type "look prawn"
~
E
prawn~
You see nothing special. The Prawn is in excellent condition.
~
S
#30173 #30173
De-Tox Unit~ De-Tox Unit~
This room seems to be the place where people get "detoxified". Although it This room seems to be the place where people get "detoxified". Although it

View File

@@ -1,6 +1,6 @@
#30200 #30200
The Top Of The Greasepole~ The Top of the Greasepole~
You've made it to the top! All you have to do now is get down... You've made it to the top! All you have to do now is get down.
~ ~
302 4 0 0 0 5 302 4 0 0 0 5
D5 D5
@@ -9,6 +9,11 @@ It's a long slide down.
~ ~
0 -1 30192 0 -1 30192
E E
pole greasepole~
The pole still looks pretty bad, but it doesn't look quite as bad as before.
~
E
info credits~ info credits~
See zone description room for Campus. See zone description room for Campus.
Zone 302 is linked to the following zones: Zone 302 is linked to the following zones:
@@ -48,11 +53,6 @@ Links: 64e to catacombs
(Mobs Stay_Zone flags have all been disabled to allow free access between (Mobs Stay_Zone flags have all been disabled to allow free access between
301, 302 and 303. Please ensure that any entrances into the area are flagged 301, 302 and 303. Please ensure that any entrances into the area are flagged
nomob to keep them in. - Parna for TBAMud.) nomob to keep them in. - Parna for TBAMud.)
~
E
pole greasepole~
The pole still looks pretty bad, but it doesn't look quite as bad as before.
~ ~
S S
#30201 #30201
@@ -71,13 +71,13 @@ D2
~ ~
0 -1 30142 0 -1 30142
E E
mail~
Why are you trying to look at the mail, it's private!
~
E
hooks hook key keys~ hooks hook key keys~
Unfortunately you don't see any keys hanging off of any of the hooks. Unfortunately you don't see any keys hanging off of any of the hooks.
~ ~
E
mail~
Why are you trying to look at the mail, it's private!
~
S S
#30202 #30202
Main Office~ Main Office~
@@ -92,9 +92,10 @@ This way leads back to the reception desk.
door~ door~
1 30103 30201 1 30103 30201
E E
chair~ filing cabinet files~
The chair is not unusual in any way whatsoever. The chair is in excellent Looking through the files you see that Wally World was originally slated to
condition. have at least eleven levels but the designers got sick and tired of it and gave
up after just a few levels.
~ ~
E E
desk~ desk~
@@ -102,10 +103,9 @@ desk~
excellent condition. excellent condition.
~ ~
E E
filing cabinet files~ chair~
Looking through the files you see that Wally World was originally slated to The chair is not unusual in any way whatsoever. The chair is in excellent
have at least eleven levels but the designers got sick and tired of it and gave condition.
up after just a few levels.
~ ~
S S
#30203 #30203
@@ -230,14 +230,14 @@ You can't tell where this leads.
door~ door~
1 -1 30210 1 -1 30210
E E
door~
The door on the west has the number 206 and the door on the east, 205.
~
E
floor carpet~ floor carpet~
This is a nice, groovy, red patterned carpet which extends all the way down This is a nice, groovy, red patterned carpet which extends all the way down
the hall. the hall.
~ ~
E
door~
The door on the west has the number 206 and the door on the east, 205.
~
S S
#30209 #30209
Private Room 205~ Private Room 205~
@@ -300,15 +300,15 @@ You can't tell where this leads.
door~ door~
1 -1 30213 1 -1 30213
E E
door~
The door on the west has the number 204 and the door on the east, 203 while
the door to the north has the number 201.
~
E
floor carpet~ floor carpet~
This is a nice, groovy, red patterned carpet which extends all the way down This is a nice, groovy, red patterned carpet which extends all the way down
the hall. the hall.
~ ~
E
door~
The door on the west has the number 204 and the door on the east, 203 while
the door to the north has the number 201.
~
S S
#30212 #30212
Private Room 203~ Private Room 203~
@@ -388,14 +388,14 @@ You can't tell where this leads.
door~ door~
1 -1 30217 1 -1 30217
E E
door~
The door on the west has the number 208 and the door on the east, 207.
~
E
floor carpet~ floor carpet~
This is a nice, groovy, red patterned carpet which extends all the way down This is a nice, groovy, red patterned carpet which extends all the way down
the hall. the hall.
~ ~
E
door~
The door on the west has the number 208 and the door on the east, 207.
~
S S
#30216 #30216
Private Room 207~ Private Room 207~
@@ -458,15 +458,15 @@ You can't tell where this leads.
door~ door~
1 -1 30220 1 -1 30220
E E
door~
The door on the west has the number 210 and the door on the east, 209 and the
door to the south has the number 202.
~
E
floor carpet~ floor carpet~
This is a nice, groovy, red patterned carpet which extends all the way down This is a nice, groovy, red patterned carpet which extends all the way down
the hall. the hall.
~ ~
E
door~
The door on the west has the number 210 and the door on the east, 209 and the
door to the south has the number 202.
~
S S
#30219 #30219
Private Room 209~ Private Room 209~
@@ -654,14 +654,14 @@ The trapdoor leads up... beyond that, you aren't sure where it goes.
trapdoor door~ trapdoor door~
1 -1 30233 1 -1 30233
E E
trapdoor~
The trapdoor is neatly fastened with a small hook.
~
E
desk chair plush~ desk chair plush~
The desk and chairs are neatly arranged as if in preparation for an upcoming The desk and chairs are neatly arranged as if in preparation for an upcoming
meeting or something of the sort. meeting or something of the sort.
~ ~
E
trapdoor~
The trapdoor is neatly fastened with a small hook.
~
S S
#30229 #30229
Hallway~ Hallway~
@@ -770,13 +770,13 @@ A chute leads down from this room.
~ ~
0 -1 30235 0 -1 30235
E E
chute~
The chute is rather smooth and looks to be a fun ride.
~
E
grate~ grate~
Beyond the grate you can see the attic. Beyond the grate you can see the attic.
~ ~
E
chute~
The chute is rather smooth and looks to be a fun ride.
~
S S
#30235 #30235
The Chute~ The Chute~
@@ -871,13 +871,13 @@ An exit from this hellhole.
~ ~
0 -1 30240 0 -1 30240
E E
mess~
Need you ask?
~
E
hell hole hellhole~ hell hole hellhole~
Never seen one before? Never seen one before?
~ ~
E
mess~
Need you ask?
~
S S
#30240 #30240
The Ghetto~ The Ghetto~
@@ -897,13 +897,13 @@ A run-down house lies to the west.
~ ~
0 -1 30239 0 -1 30239
E E
house run-down~
It's in bad shape.
~
E
overturned police policemobile mobile~ overturned police policemobile mobile~
It is blocking the road quite nicely. Maybe it is meant to impede passage. It is blocking the road quite nicely. Maybe it is meant to impede passage.
~ ~
E
house run-down~
It's in bad shape.
~
S S
#30241 #30241
The Ghetto Intersection~ The Ghetto Intersection~
@@ -1344,16 +1344,16 @@ The auditorium is to the north.
~ ~
0 -1 30259 0 -1 30259
E E
drab brown curtains curtain~ sturdy wooden plank planks~
They are just your average, everyday, drab brown curtains. They are sturdy. They are wooden. They are planks.
~ ~
E E
cords cord pulley pulleys~ cords cord pulley pulleys~
Hey! It can make you look like you are flying! Hey! It can make you look like you are flying!
~ ~
E E
sturdy wooden plank planks~ drab brown curtains curtain~
They are sturdy. They are wooden. They are planks. They are just your average, everyday, drab brown curtains.
~ ~
S S
#30262 #30262
@@ -1403,13 +1403,13 @@ It's the same stairwell.
~ ~
0 -1 30257 0 -1 30257
E E
cobweb cobwebs web webs~
Don't disturb them now!
~
E
huge stone door~ huge stone door~
The huge stone door looks very inviting. The huge stone door looks very inviting.
~ ~
E
cobweb cobwebs web webs~
Don't disturb them now!
~
S S
#30265 #30265
The Grant Hall Clock~ The Grant Hall Clock~
@@ -1785,10 +1785,6 @@ It is too dark to tell.
~ ~
0 -1 30276 0 -1 30276
E E
door~
This door is covered with all types of non-magical sigils.
~
E
sigils~ sigils~
The sigils seem to form some strange shapes: The sigils seem to form some strange shapes:
SSSSS SSSSS
@@ -1805,6 +1801,10 @@ sigils~
SSSSS SSSSS
I wonder what it could be? I wonder what it could be?
~ ~
E
door~
This door is covered with all types of non-magical sigils.
~
S S
#30281 #30281
A Classroom~ A Classroom~
@@ -1851,13 +1851,13 @@ You are repulsed by this exit since the exit to the east is well lit.
~ ~
0 -1 30274 0 -1 30274
E E
light~
It's nice, warm, and inviting.
~
E
dark~ dark~
Are you mad? Are you mad?
~ ~
E
light~
It's nice, warm, and inviting.
~
S S
#30283 #30283
The Exit~ The Exit~
@@ -1875,13 +1875,13 @@ Back into darkness, I don't think so!
~ ~
0 -1 30282 0 -1 30282
E E
light~
It's nice, warm, and inviting.
~
E
dark~ dark~
Are you mad? Are you mad?
~ ~
E
light~
It's nice, warm, and inviting.
~
S S
#30284 #30284
Mob Chute A~ Mob Chute A~
@@ -1916,10 +1916,6 @@ This is just an exit.
~ ~
0 -1 30106 0 -1 30106
E E
door~
This door is covered with all types of non-magical sigils.
~
E
sigils~ sigils~
The sigils seem to form some strange shapes: The sigils seem to form some strange shapes:
MMM MMM OOO OOO !! MMM MMM OOO OOO !!
@@ -1929,6 +1925,10 @@ sigils~
MM M MM OO OO OO OO MM M MM OO OO OO OO
MM MM OOO OOO !! MM MM OOO OOO !!
~ ~
E
door~
This door is covered with all types of non-magical sigils.
~
S S
#30285 #30285
Mob Chute B~ Mob Chute B~

View File

@@ -103,8 +103,6 @@ E 1 30135 4 16 (a T-square of Death)
O 0 30100 1 30176 (a red key) O 0 30100 1 30176 (a red key)
O 0 30101 1 30186 (a brass key) O 0 30101 1 30186 (a brass key)
O 0 30102 5 30150 (an Oreo(tm) cookie) O 0 30102 5 30150 (an Oreo(tm) cookie)
O 0 30111 99 30172 (a condom)
O 0 30122 8 30171 (Magebane)
O 0 30129 1 30110 (the extension cord) O 0 30129 1 30110 (the extension cord)
O 0 30129 1 30111 (the extension cord) O 0 30129 1 30111 (the extension cord)
O 0 30129 1 30112 (the extension cord) O 0 30129 1 30112 (the extension cord)
@@ -129,7 +127,6 @@ D 0 30155 1 1 (Locker Room)
D 0 30165 0 1 (Campus Pub Stairwell) D 0 30165 0 1 (Campus Pub Stairwell)
D 0 30141 2 1 (Campus Bookstore) D 0 30141 2 1 (Campus Bookstore)
D 0 30167 5 1 (The Infobank) D 0 30167 5 1 (The Infobank)
D 0 30171 4 1 (The Special Hidden Room)
D 0 30177 0 1 (Hallway) D 0 30177 0 1 (Hallway)
D 0 30179 2 1 (Library) D 0 30179 2 1 (Library)
D 0 30178 3 2 (The Back Exit) D 0 30178 3 2 (The Back Exit)

View File

@@ -2,6 +2,8 @@
Matrix of C.A.W.~ Matrix of C.A.W.~
Campus II~ Campus II~
30200 30299 30 2 30200 30299 30 2
R 0 30200 30112 -1 (a tam)
O 1 30112 99 30200 (a tam)
M 0 30105 4 30284 (Security) M 0 30105 4 30284 (Security)
E 1 30115 99 16 (a flashlight) E 1 30115 99 16 (a flashlight)
M 0 30105 4 30284 (Security) M 0 30105 4 30284 (Security)
@@ -32,8 +34,6 @@ M 0 30132 1 30284 (Chris)
M 0 30137 1 30284 (Alex) M 0 30137 1 30284 (Alex)
M 0 30138 1 30284 (Steve) M 0 30138 1 30284 (Steve)
M 0 30145 10 30284 (a copy of Golden World) M 0 30145 10 30284 (a copy of Golden World)
R 0 30200 30112 -1 (a tam)
O 1 30112 99 30200 (a tam)
M 0 30139 1 30245 (Bob the storekeeper) M 0 30139 1 30245 (Bob the storekeeper)
G 1 30136 99 -1 (a pale apple) G 1 30136 99 -1 (a pale apple)
G 1 30140 99 -1 (a can of PopCoke) G 1 30140 99 -1 (a can of PopCoke)

View File

@@ -1,6 +1,6 @@
#4 #4
Unknown~ trunks shaoden~
Jade Forest~ Rename~
400 499 30 2 d 0 0 0 10 25 400 499 30 2 d 0 0 0 10 25
M 0 481 1 481 (Zachary) M 0 481 1 481 (Zachary)
G 1 403 99 -1 (rawhide whip) G 1 403 99 -1 (rawhide whip)

View File

@@ -1,5 +1,5 @@
#6 #6
Unknown~ q~
Sea of Souls~ Sea of Souls~
600 699 30 2 d 0 0 0 10 25 600 699 30 2 d 0 0 0 10 25
M 0 600 1 600 (a snail) M 0 600 1 600 (a snail)

26
src/CMakeLists.txt Normal file
View File

@@ -0,0 +1,26 @@
cmake_minimum_required(VERSION 3.27)
# Set the project name
project(circle)
# Global definitions
if(MSVC)
# using Visual Studio C++
add_definitions(-D_CRT_SECURE_NO_WARNINGS -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE)
endif()
# circle itself
file(GLOB CIRCLE_SOURCES
"*.h"
"*.c"
)
add_executable(circle ${CIRCLE_SOURCES})
if(MSVC)
target_link_libraries(circle wsock32.lib)
set_target_properties(circle PROPERTIES
VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}/.."
)
endif()

View File

@@ -20,8 +20,8 @@ CFLAGS = @CFLAGS@ $(MYFLAGS) $(PROFILE)
LIBS = @LIBS@ @CRYPTLIB@ @NETLIB@ LIBS = @LIBS@ @CRYPTLIB@ @NETLIB@
SRCFILES := act.comm.c act.informative.c act.item.c act.movement.c act.offensive.c act.other.c act.social.c act.wizard.c aedit.c asciimap.c ban.c boards.c bsd-snprintf.c castle.c cedit.c class.c comm.c config.c constants.c db.c dg_comm.c dg_db_scripts.c dg_event.c dg_handler.c dg_misc.c dg_mobcmd.c dg_objcmd.c dg_olc.c dg_scripts.c dg_triggers.c dg_variables.c dg_wldcmd.c fight.c genmob.c genobj.c genolc.c genqst.c genshp.c genwld.c genzon.c graph.c handler.c hedit.c house.c ibt.c improved-edit.c interpreter.c limits.c lists.c magic.c mail.c medit.c mobact.c modify.c msgedit.c mud_event.c oasis.c oasis_copy.c oasis_delete.c oasis_list.c objsave.c oedit.c players.c prefedit.c protocol.c qedit.c quest.c random.c redit.c sedit.c shop.c spec_assign.c spec_procs.c spell_parser.c spells.c tedit.c utils.c weather.c zedit.c zmalloc.c SRCFILES := $(shell ls *.c | sort)
OBJFILES := act.comm.o act.informative.o act.item.o act.movement.o act.offensive.o act.other.o act.social.o act.wizard.o aedit.o asciimap.o ban.o boards.o bsd-snprintf.o castle.o cedit.o class.o comm.o config.o constants.o db.o dg_comm.o dg_db_scripts.o dg_event.o dg_handler.o dg_misc.o dg_mobcmd.o dg_objcmd.o dg_olc.o dg_scripts.o dg_triggers.o dg_variables.o dg_wldcmd.o fight.o genmob.o genobj.o genolc.o genqst.o genshp.o genwld.o genzon.o graph.o handler.o hedit.o house.o ibt.o improved-edit.o interpreter.o limits.o lists.o magic.o mail.o medit.o mobact.o modify.o msgedit.o mud_event.o oasis.o oasis_copy.o oasis_delete.o oasis_list.o objsave.o oedit.o players.o prefedit.o protocol.o qedit.o quest.o random.o redit.o sedit.o shop.o spec_assign.o spec_procs.o spell_parser.o spells.o tedit.o utils.o weather.o zedit.o zmalloc.o OBJFILES := $(patsubst %.c,%.o,$(SRCFILES))
default: all default: all

56
src/Makefile.macOS Normal file
View File

@@ -0,0 +1,56 @@
# tbaMUD Makefile.in - Makefile template used by 'configure'
# Clean-up provided by seqwith.
# C compiler to use
CC = gcc
# Any special flags you want to pass to the compiler
MYFLAGS = -Wall -Wno-char-subscripts -Wno-invalid-source-encoding -DMEMORY_DEBUG
#flags for profiling (see hacker.doc for more information)
PROFILE =
##############################################################################
# Do Not Modify Anything Below This Line (unless you know what you're doing) #
##############################################################################
BINDIR = ../bin
CFLAGS = -g -O0 $(MYFLAGS) $(PROFILE)
LIBS =
SRCFILES := $(shell ls *.c | sort)
OBJFILES := $(patsubst %.c,%.o,$(SRCFILES))
default: all
all: .accepted
$(MAKE) $(BINDIR)/circle
$(MAKE) utils
.accepted:
@./licheck less
utils: .accepted
(cd util; $(MAKE) all)
circle:
$(MAKE) $(BINDIR)/circle
$(BINDIR)/circle : $(OBJFILES)
$(CC) -o $(BINDIR)/circle $(PROFILE) $(OBJFILES) $(LIBS)
$%.o: %.c
$(CC) $< $(CFLAGS) -c -o $@
clean:
rm -f *.o depend
# Dependencies for the object files (automagically generated with
# gcc -MM)
depend:
$(CC) -MM *.c > depend
-include depend

View File

@@ -51,7 +51,7 @@ static void perform_mortal_where(struct char_data *ch, char *arg);
static void print_object_location(int num, struct obj_data *obj, struct char_data *ch, int recur); static void print_object_location(int num, struct obj_data *obj, struct char_data *ch, int recur);
/* Subcommands */ /* Subcommands */
/* For show_obj_to_char 'mode'. /-- arbitrary */ /* For show_obj_to_char 'mode'. /-- arbitrary */
#define SHOW_OBJ_LONG 0 #define SHOW_OBJ_LONG 0
#define SHOW_OBJ_SHORT 1 #define SHOW_OBJ_SHORT 1
#define SHOW_OBJ_ACTION 2 #define SHOW_OBJ_ACTION 2
@@ -125,7 +125,7 @@ static void show_obj_to_char(struct obj_data *obj, struct char_data *ch, int mod
snprintf(notebuf, sizeof(notebuf), "There is something written on it:\r\n\r\n%s", obj->action_description); snprintf(notebuf, sizeof(notebuf), "There is something written on it:\r\n\r\n%s", obj->action_description);
page_string(ch->desc, notebuf, TRUE); page_string(ch->desc, notebuf, TRUE);
} else } else
send_to_char(ch, "It's blank.\r\n"); send_to_char(ch, "It's blank.\r\n");
return; return;
case ITEM_DRINKCON: case ITEM_DRINKCON:
@@ -225,14 +225,14 @@ static void diag_char_to_char(struct char_data *i, struct char_data *ch)
byte percent; byte percent;
const char *text; const char *text;
} diagnosis[] = { } diagnosis[] = {
{ 100, "is in excellent condition." }, { 100, "is in excellent condition." },
{ 90, "has a few scratches." }, { 90, "has a few scratches." },
{ 75, "has some small wounds and bruises." }, { 75, "has some small wounds and bruises." },
{ 50, "has quite a few wounds." }, { 50, "has quite a few wounds." },
{ 30, "has some big nasty wounds and scratches." }, { 30, "has some big nasty wounds and scratches." },
{ 15, "looks pretty hurt." }, { 15, "looks pretty hurt." },
{ 0, "is in awful condition." }, { 0, "is in awful condition." },
{ -1, "is bleeding awfully from big wounds." }, { -1, "is bleeding awfully from big wounds." },
}; };
int percent, ar_index; int percent, ar_index;
const char *pers = PERS(i, ch); const char *pers = PERS(i, ch);
@@ -240,7 +240,7 @@ static void diag_char_to_char(struct char_data *i, struct char_data *ch)
if (GET_MAX_HIT(i) > 0) if (GET_MAX_HIT(i) > 0)
percent = (100 * GET_HIT(i)) / GET_MAX_HIT(i); percent = (100 * GET_HIT(i)) / GET_MAX_HIT(i);
else else
percent = -1; /* How could MAX_HIT be < 1?? */ percent = -1; /* How could MAX_HIT be < 1?? */
for (ar_index = 0; diagnosis[ar_index].percent >= 0; ar_index++) for (ar_index = 0; diagnosis[ar_index].percent >= 0; ar_index++)
if (percent >= diagnosis[ar_index].percent) if (percent >= diagnosis[ar_index].percent)
@@ -269,12 +269,12 @@ static void look_at_char(struct char_data *i, struct char_data *ch)
found = TRUE; found = TRUE;
if (found) { if (found) {
send_to_char(ch, "\r\n"); /* act() does capitalization. */ send_to_char(ch, "\r\n"); /* act() does capitalization. */
act("$n is using:", FALSE, i, 0, ch, TO_VICT); act("$n is using:", FALSE, i, 0, ch, TO_VICT);
for (j = 0; j < NUM_WEARS; j++) for (j = 0; j < NUM_WEARS; j++)
if (GET_EQ(i, j) && CAN_SEE_OBJ(ch, GET_EQ(i, j))) { if (GET_EQ(i, j) && CAN_SEE_OBJ(ch, GET_EQ(i, j))) {
send_to_char(ch, "%s", wear_where[j]); send_to_char(ch, "%s", wear_where[j]);
show_obj_to_char(GET_EQ(i, j), ch, SHOW_OBJ_SHORT); show_obj_to_char(GET_EQ(i, j), ch, SHOW_OBJ_SHORT);
} }
} }
if (ch != i && (IS_THIEF(ch) || GET_LEVEL(ch) >= LVL_IMMORT)) { if (ch != i && (IS_THIEF(ch) || GET_LEVEL(ch) >= LVL_IMMORT)) {
@@ -300,7 +300,7 @@ static void list_one_char(struct char_data *i, struct char_data *ch)
if (!IS_NPC(ch) && PRF_FLAGGED(ch, PRF_SHOWVNUMS)) { if (!IS_NPC(ch) && PRF_FLAGGED(ch, PRF_SHOWVNUMS)) {
if (IS_NPC(i)) if (IS_NPC(i))
send_to_char(ch, "[%d] ", GET_MOB_VNUM(i)); send_to_char(ch, "[%d] ", GET_MOB_VNUM(i));
if (SCRIPT(i) && TRIGGERS(SCRIPT(i))) { if (SCRIPT(i) && TRIGGERS(SCRIPT(i))) {
if (!TRIGGERS(SCRIPT(i))->next) if (!TRIGGERS(SCRIPT(i))->next)
send_to_char(ch, "[T%d] ", GET_TRIG_VNUM(TRIGGERS(SCRIPT(i)))); send_to_char(ch, "[T%d] ", GET_TRIG_VNUM(TRIGGERS(SCRIPT(i))));
@@ -312,12 +312,12 @@ static void list_one_char(struct char_data *i, struct char_data *ch)
if (GROUP(i)) { if (GROUP(i)) {
if (GROUP(i) == GROUP(ch)) if (GROUP(i) == GROUP(ch))
send_to_char(ch, "(%s%s%s) ", CBGRN(ch, C_NRM), send_to_char(ch, "(%s%s%s) ", CBGRN(ch, C_NRM),
GROUP_LEADER(GROUP(i)) == i ? "leader" : "group", GROUP_LEADER(GROUP(i)) == i ? "leader" : "group",
CCNRM(ch, C_NRM)); CCNRM(ch, C_NRM));
else else
send_to_char(ch, "(%s%s%s) ", CBRED(ch, C_NRM), send_to_char(ch, "(%s%s%s) ", CBRED(ch, C_NRM),
GROUP_LEADER(GROUP(i)) == i ? "leader" : "group", GROUP_LEADER(GROUP(i)) == i ? "leader" : "group",
CCNRM(ch, C_NRM)); CCNRM(ch, C_NRM));
} }
if (IS_NPC(i) && i->player.long_descr && GET_POS(i) == GET_DEFAULT_POS(i)) { if (IS_NPC(i) && i->player.long_descr && GET_POS(i) == GET_DEFAULT_POS(i)) {
@@ -326,9 +326,9 @@ static void list_one_char(struct char_data *i, struct char_data *ch)
if (AFF_FLAGGED(ch, AFF_DETECT_ALIGN)) { if (AFF_FLAGGED(ch, AFF_DETECT_ALIGN)) {
if (IS_EVIL(i)) if (IS_EVIL(i))
send_to_char(ch, "(Red Aura) "); send_to_char(ch, "(Red Aura) ");
else if (IS_GOOD(i)) else if (IS_GOOD(i))
send_to_char(ch, "(Blue Aura) "); send_to_char(ch, "(Blue Aura) ");
} }
send_to_char(ch, "%s", i->player.long_descr); send_to_char(ch, "%s", i->player.long_descr);
@@ -361,24 +361,24 @@ static void list_one_char(struct char_data *i, struct char_data *ch)
if (GET_POS(i) != POS_FIGHTING) { if (GET_POS(i) != POS_FIGHTING) {
if (!SITTING(i)) if (!SITTING(i))
send_to_char(ch, "%s", positions[(int) GET_POS(i)]); send_to_char(ch, "%s", positions[(int) GET_POS(i)]);
else { else {
furniture = SITTING(i); furniture = SITTING(i);
send_to_char(ch, " is %s upon %s.", (GET_POS(i) == POS_SLEEPING ? send_to_char(ch, " is %s upon %s.", (GET_POS(i) == POS_SLEEPING ?
"sleeping" : (GET_POS(i) == POS_RESTING ? "resting" : "sitting")), "sleeping" : (GET_POS(i) == POS_RESTING ? "resting" : "sitting")),
OBJS(furniture, ch)); OBJS(furniture, ch));
} }
} else { } else {
if (FIGHTING(i)) { if (FIGHTING(i)) {
send_to_char(ch, " is here, fighting "); send_to_char(ch, " is here, fighting ");
if (FIGHTING(i) == ch) if (FIGHTING(i) == ch)
send_to_char(ch, "YOU!"); send_to_char(ch, "YOU!");
else { else {
if (IN_ROOM(i) == IN_ROOM(FIGHTING(i))) if (IN_ROOM(i) == IN_ROOM(FIGHTING(i)))
send_to_char(ch, "%s!", PERS(FIGHTING(i), ch)); send_to_char(ch, "%s!", PERS(FIGHTING(i), ch));
else else
send_to_char(ch, "someone who has already left!"); send_to_char(ch, "someone who has already left!");
} }
} else /* NIL fighting pointer */ } else /* NIL fighting pointer */
send_to_char(ch, " is here struggling with thin air."); send_to_char(ch, " is here struggling with thin air.");
} }
@@ -402,13 +402,13 @@ static void list_char_to_char(struct char_data *list, struct char_data *ch)
if (ch != i) { if (ch != i) {
/* hide npcs whose description starts with a '.' from non-holylighted people - Idea from Elaseth of TBA */ /* hide npcs whose description starts with a '.' from non-holylighted people - Idea from Elaseth of TBA */
if (!IS_NPC(ch) && !PRF_FLAGGED(ch, PRF_HOLYLIGHT) && if (!IS_NPC(ch) && !PRF_FLAGGED(ch, PRF_HOLYLIGHT) &&
IS_NPC(i) && i->player.long_descr && *i->player.long_descr == '.') IS_NPC(i) && i->player.long_descr && *i->player.long_descr == '.')
continue; continue;
send_to_char(ch, "%s", CCYEL(ch, C_NRM)); send_to_char(ch, "%s", CCYEL(ch, C_NRM));
if (CAN_SEE(ch, i)) if (CAN_SEE(ch, i))
list_one_char(i, ch); list_one_char(i, ch);
else if (IS_DARK(IN_ROOM(ch)) && !CAN_SEE_IN_DARK(ch) && else if (IS_DARK(IN_ROOM(ch)) && !CAN_SEE_IN_DARK(ch) &&
AFF_FLAGGED(i, AFF_INFRAVISION)) AFF_FLAGGED(i, AFF_INFRAVISION))
send_to_char(ch, "You see a pair of glowing red eyes looking your way.\r\n"); send_to_char(ch, "You see a pair of glowing red eyes looking your way.\r\n");
send_to_char(ch, "%s", CCNRM(ch, C_NRM)); send_to_char(ch, "%s", CCNRM(ch, C_NRM));
} }
@@ -425,12 +425,12 @@ static void do_auto_exits(struct char_data *ch)
continue; continue;
if (EXIT_FLAGGED(EXIT(ch, door), EX_CLOSED) && !CONFIG_DISP_CLOSED_DOORS) if (EXIT_FLAGGED(EXIT(ch, door), EX_CLOSED) && !CONFIG_DISP_CLOSED_DOORS)
continue; continue;
if (EXIT_FLAGGED(EXIT(ch, door), EX_HIDDEN) && !PRF_FLAGGED(ch, PRF_HOLYLIGHT)) if (EXIT_FLAGGED(EXIT(ch, door), EX_HIDDEN) && !PRF_FLAGGED(ch, PRF_HOLYLIGHT))
continue; continue;
if (EXIT_FLAGGED(EXIT(ch, door), EX_CLOSED)) if (EXIT_FLAGGED(EXIT(ch, door), EX_CLOSED))
send_to_char(ch, "%s(%s)%s ", EXIT_FLAGGED(EXIT(ch, door), EX_HIDDEN) ? CCWHT(ch, C_NRM) : CCRED(ch, C_NRM), autoexits[door], CCCYN(ch, C_NRM)); send_to_char(ch, "%s(%s)%s ", EXIT_FLAGGED(EXIT(ch, door), EX_HIDDEN) ? CCWHT(ch, C_NRM) : CCRED(ch, C_NRM), autoexits[door], CCCYN(ch, C_NRM));
else if (EXIT_FLAGGED(EXIT(ch, door), EX_HIDDEN)) else if (EXIT_FLAGGED(EXIT(ch, door), EX_HIDDEN))
send_to_char(ch, "%s%s%s ", CCWHT(ch, C_NRM), autoexits[door], CCCYN(ch, C_NRM)); send_to_char(ch, "%s%s%s ", CCWHT(ch, C_NRM), autoexits[door], CCCYN(ch, C_NRM));
else else
send_to_char(ch, "\t(%s\t) ", autoexits[door]); send_to_char(ch, "\t(%s\t) ", autoexits[door]);
slen++; slen++;
@@ -443,44 +443,50 @@ ACMD(do_exits)
{ {
int door, len = 0; int door, len = 0;
if (AFF_FLAGGED(ch, AFF_BLIND) && GET_LEVEL(ch) < LVL_IMMORT) { if (AFF_FLAGGED(ch, AFF_BLIND) && GET_LEVEL(ch) < LVL_IMMORT)
{
send_to_char(ch, "You can't see a damned thing, you're blind!\r\n"); send_to_char(ch, "You can't see a damned thing, you're blind!\r\n");
return; return;
} }
send_to_char(ch, "Obvious exits:\r\n"); send_to_char(ch, "Obvious exits:\r\n");
for (door = 0; door < DIR_COUNT; door++) { for (door = 0; door < DIR_COUNT; door++)
{
if (!EXIT(ch, door) || EXIT(ch, door)->to_room == NOWHERE) if (!EXIT(ch, door) || EXIT(ch, door)->to_room == NOWHERE)
continue; continue;
if (EXIT_FLAGGED(EXIT(ch, door), EX_CLOSED) && !CONFIG_DISP_CLOSED_DOORS) if (EXIT_FLAGGED(EXIT(ch, door), EX_CLOSED) && !CONFIG_DISP_CLOSED_DOORS)
continue; continue;
if (EXIT_FLAGGED(EXIT(ch, door), EX_HIDDEN) && !PRF_FLAGGED(ch, PRF_HOLYLIGHT)) if (EXIT_FLAGGED(EXIT(ch, door), EX_HIDDEN) && !PRF_FLAGGED(ch, PRF_HOLYLIGHT))
continue; continue;
len++; len++;
if (!IS_NPC(ch) && PRF_FLAGGED(ch, PRF_SHOWVNUMS) && !EXIT_FLAGGED(EXIT(ch, door), EX_CLOSED)) if (!IS_NPC(ch) && PRF_FLAGGED(ch, PRF_SHOWVNUMS) && !EXIT_FLAGGED(EXIT(ch, door), EX_CLOSED))
send_to_char(ch, "%-5s - [%5d]%s %s\r\n", dirs[door], GET_ROOM_VNUM(EXIT(ch, door)->to_room), {
EXIT_FLAGGED(EXIT(ch, door), EX_HIDDEN) ? " [HIDDEN]" : "", world[EXIT(ch, door)->to_room].name); send_to_char(ch, "%-5s -[%5d]%s %s\r\n", dirs[door], GET_ROOM_VNUM(EXIT(ch, door)->to_room),
else if (CONFIG_DISP_CLOSED_DOORS && EXIT_FLAGGED(EXIT(ch, door), EX_CLOSED)) { EXIT_FLAGGED(EXIT(ch, door), EX_HIDDEN) ? "[HIDDEN]" : "", world[EXIT(ch, door)->to_room].name);
/* But we tell them the door is closed */ }
else if (CONFIG_DISP_CLOSED_DOORS && EXIT_FLAGGED(EXIT(ch, door), EX_CLOSED))
{
/*But we tell them the door is closed */
send_to_char(ch, "%-5s - The %s is closed%s\r\n", dirs[door], send_to_char(ch, "%-5s - The %s is closed%s\r\n", dirs[door],
(EXIT(ch, door)->keyword)? fname(EXIT(ch, door)->keyword) : "opening", (EXIT(ch, door)->keyword) ? fname(EXIT(ch, door)->keyword) : "opening",
EXIT_FLAGGED(EXIT(ch, door), EX_HIDDEN) ? " and hidden." : "."); EXIT_FLAGGED(EXIT(ch, door), EX_HIDDEN) ? " and hidden." : ".");
} }
else else
{
send_to_char(ch, "%-5s - %s\r\n", dirs[door], IS_DARK(EXIT(ch, door)->to_room) && send_to_char(ch, "%-5s - %s\r\n", dirs[door], IS_DARK(EXIT(ch, door)->to_room) &&
!CAN_SEE_IN_DARK(ch) ? "Too dark to tell." : world[EXIT(ch, door)->to_room].name); !CAN_SEE_IN_DARK(ch) ? "Too dark to tell." : world[EXIT(ch, door)->to_room].name);
}
} }
if (!len)
if (!len) send_to_char(ch, " None.\r\n");
send_to_char(ch, " None.\r\n");
} }
void look_at_room(struct char_data *ch, int ignore_brief) void look_at_room(struct char_data *ch, int ignore_brief)
{ {
trig_data *t; trig_data * t;
struct room_data *rm = &world[IN_ROOM(ch)]; struct room_data *rm = &world[IN_ROOM(ch)];
room_vnum target_room; room_vnum target_room;
@@ -489,20 +495,22 @@ void look_at_room(struct char_data *ch, int ignore_brief)
if (!ch->desc) if (!ch->desc)
return; return;
if (IS_DARK(IN_ROOM(ch)) && !CAN_SEE_IN_DARK(ch)) { if (IS_DARK(IN_ROOM(ch)) && !CAN_SEE_IN_DARK(ch)){
send_to_char(ch, "It is pitch black...\r\n"); send_to_char(ch, "It is pitch black...\r\n");
return; return;
} else if (AFF_FLAGGED(ch, AFF_BLIND) && GET_LEVEL(ch) < LVL_IMMORT) { }
else if (AFF_FLAGGED(ch, AFF_BLIND) && GET_LEVEL(ch) < LVL_IMMORT) {
send_to_char(ch, "You see nothing but infinite darkness...\r\n"); send_to_char(ch, "You see nothing but infinite darkness...\r\n");
return; return;
} }
send_to_char(ch, "%s", CCCYN(ch, C_NRM));
send_to_char(ch, "%s", CCYEL(ch, C_NRM));
if (!IS_NPC(ch) && PRF_FLAGGED(ch, PRF_SHOWVNUMS)) { if (!IS_NPC(ch) && PRF_FLAGGED(ch, PRF_SHOWVNUMS)) {
char buf[MAX_STRING_LENGTH]; char buf[MAX_STRING_LENGTH];
sprintbitarray(ROOM_FLAGS(IN_ROOM(ch)), room_bits, RF_ARRAY_MAX, buf); sprintbitarray(ROOM_FLAGS(IN_ROOM(ch)), room_bits, RF_ARRAY_MAX, buf);
send_to_char(ch, "[%5d] ", GET_ROOM_VNUM(IN_ROOM(ch))); send_to_char(ch, "[%5d] ", GET_ROOM_VNUM(IN_ROOM(ch)));
send_to_char(ch, "%s [ %s] [ %s ]", world[IN_ROOM(ch)].name, buf, sector_types[world[IN_ROOM(ch)].sector_type]); send_to_char(ch, "%s[ %s][ %s ]", world[IN_ROOM(ch)].name, buf, sector_types[world[IN_ROOM(ch)].sector_type]);
if (SCRIPT(rm)) { if (SCRIPT(rm)) {
send_to_char(ch, "[T"); send_to_char(ch, "[T");
@@ -513,21 +521,23 @@ void look_at_room(struct char_data *ch, int ignore_brief)
} }
else else
send_to_char(ch, "%s", world[IN_ROOM(ch)].name); send_to_char(ch, "%s", world[IN_ROOM(ch)].name);
send_to_char(ch, "%s\r\n", CCNRM(ch, C_NRM)); send_to_char(ch, "%s\r\n", CCNRM(ch, C_NRM));
if ((!IS_NPC(ch) && !PRF_FLAGGED(ch, PRF_BRIEF)) || ignore_brief || if ((!IS_NPC(ch) && !PRF_FLAGGED(ch, PRF_BRIEF)) || ignore_brief ||
ROOM_FLAGGED(IN_ROOM(ch), ROOM_DEATH)) { ROOM_FLAGGED(IN_ROOM(ch), ROOM_DEATH)) {
if(!IS_NPC(ch) && PRF_FLAGGED(ch, PRF_AUTOMAP) && can_see_map(ch)) if (!IS_NPC(ch) && PRF_FLAGGED(ch, PRF_AUTOMAP) && can_see_map(ch))
str_and_map(world[target_room].description, ch, target_room); str_and_map(world[target_room].description, ch, target_room);
else else
send_to_char(ch, "%s", world[IN_ROOM(ch)].description); send_to_char(ch, "%s", world[IN_ROOM(ch)].description);
} }
/* autoexits */
/*autoexits */
if (!IS_NPC(ch) && PRF_FLAGGED(ch, PRF_AUTOEXIT)) if (!IS_NPC(ch) && PRF_FLAGGED(ch, PRF_AUTOEXIT))
do_auto_exits(ch); do_auto_exits(ch);
/* now list characters & objects */ /*now list characters &objects */
list_obj_to_char(world[IN_ROOM(ch)].contents, ch, SHOW_OBJ_LONG, FALSE); list_obj_to_char(world[IN_ROOM(ch)].contents, ch, SHOW_OBJ_LONG, FALSE);
list_char_to_char(world[IN_ROOM(ch)].people, ch); list_char_to_char(world[IN_ROOM(ch)].people, ch);
} }
@@ -557,35 +567,35 @@ static void look_in_obj(struct char_data *ch, char *arg)
if (!*arg) if (!*arg)
send_to_char(ch, "Look in what?\r\n"); send_to_char(ch, "Look in what?\r\n");
else if (!(bits = generic_find(arg, FIND_OBJ_INV | FIND_OBJ_ROOM | else if (!(bits = generic_find(arg, FIND_OBJ_INV | FIND_OBJ_ROOM |
FIND_OBJ_EQUIP, ch, &dummy, &obj))) { FIND_OBJ_EQUIP, ch, &dummy, &obj))) {
send_to_char(ch, "There doesn't seem to be %s %s here.\r\n", AN(arg), arg); send_to_char(ch, "There doesn't seem to be %s %s here.\r\n", AN(arg), arg);
} else if ((GET_OBJ_TYPE(obj) != ITEM_DRINKCON) && } else if ((GET_OBJ_TYPE(obj) != ITEM_DRINKCON) &&
(GET_OBJ_TYPE(obj) != ITEM_FOUNTAIN) && (GET_OBJ_TYPE(obj) != ITEM_FOUNTAIN) &&
(GET_OBJ_TYPE(obj) != ITEM_CONTAINER)) (GET_OBJ_TYPE(obj) != ITEM_CONTAINER))
send_to_char(ch, "There's nothing inside that!\r\n"); send_to_char(ch, "There's nothing inside that!\r\n");
else { else {
if (GET_OBJ_TYPE(obj) == ITEM_CONTAINER) { if (GET_OBJ_TYPE(obj) == ITEM_CONTAINER) {
if (OBJVAL_FLAGGED(obj, CONT_CLOSED) && (GET_LEVEL(ch) < LVL_IMMORT || !PRF_FLAGGED(ch, PRF_NOHASSLE))) if (OBJVAL_FLAGGED(obj, CONT_CLOSED) && (GET_LEVEL(ch) < LVL_IMMORT || !PRF_FLAGGED(ch, PRF_NOHASSLE)))
send_to_char(ch, "It is closed.\r\n"); send_to_char(ch, "It is closed.\r\n");
else { else {
send_to_char(ch, "%s", fname(obj->name)); send_to_char(ch, "%s", fname(obj->name));
switch (bits) { switch (bits) {
case FIND_OBJ_INV: case FIND_OBJ_INV:
send_to_char(ch, " (carried): \r\n"); send_to_char(ch, " (carried): \r\n");
break; break;
case FIND_OBJ_ROOM: case FIND_OBJ_ROOM:
send_to_char(ch, " (here): \r\n"); send_to_char(ch, " (here): \r\n");
break; break;
case FIND_OBJ_EQUIP: case FIND_OBJ_EQUIP:
send_to_char(ch, " (used): \r\n"); send_to_char(ch, " (used): \r\n");
break; break;
} }
list_obj_to_char(obj->contains, ch, SHOW_OBJ_SHORT, TRUE); list_obj_to_char(obj->contains, ch, SHOW_OBJ_SHORT, TRUE);
} }
} else { /* item must be a fountain or drink container */ } else { /* item must be a fountain or drink container */
if ((GET_OBJ_VAL(obj, 1) == 0) && (GET_OBJ_VAL(obj, 0) != -1)) if ((GET_OBJ_VAL(obj, 1) == 0) && (GET_OBJ_VAL(obj, 0) != -1))
send_to_char(ch, "It is empty.\r\n"); send_to_char(ch, "It is empty.\r\n");
else { else {
if (GET_OBJ_VAL(obj, 0) < 0) if (GET_OBJ_VAL(obj, 0) < 0)
{ {
@@ -593,14 +603,15 @@ static void look_in_obj(struct char_data *ch, char *arg)
sprinttype(GET_OBJ_VAL(obj, 2), color_liquid, buf2, sizeof(buf2)); sprinttype(GET_OBJ_VAL(obj, 2), color_liquid, buf2, sizeof(buf2));
send_to_char(ch, "It's full of a %s liquid.\r\n", buf2); send_to_char(ch, "It's full of a %s liquid.\r\n", buf2);
} }
else if (GET_OBJ_VAL(obj,1)>GET_OBJ_VAL(obj,0)) else if (GET_OBJ_VAL(obj,1)>GET_OBJ_VAL(obj,0))
send_to_char(ch, "Its contents seem somewhat murky.\r\n"); /* BUG */ send_to_char(ch, "Its contents seem somewhat murky.\r\n"); /* BUG */
else { else
{
char buf2[MAX_STRING_LENGTH]; char buf2[MAX_STRING_LENGTH];
amt = (GET_OBJ_VAL(obj, 1) * 3) / GET_OBJ_VAL(obj, 0); amt = (GET_OBJ_VAL(obj, 1) * 3) / GET_OBJ_VAL(obj, 0);
sprinttype(GET_OBJ_VAL(obj, 2), color_liquid, buf2, sizeof(buf2)); sprinttype(GET_OBJ_VAL(obj, 2), color_liquid, buf2, sizeof(buf2));
send_to_char(ch, "It's %sfull of a %s liquid.\r\n", fullness[amt], buf2); send_to_char(ch, "It's %sfull of a %s liquid.\r\n", fullness[amt], buf2);
} }
} }
} }
} }
@@ -637,14 +648,14 @@ static void look_at_target(struct char_data *ch, char *arg)
} }
bits = generic_find(arg, FIND_OBJ_INV | FIND_OBJ_ROOM | FIND_OBJ_EQUIP | bits = generic_find(arg, FIND_OBJ_INV | FIND_OBJ_ROOM | FIND_OBJ_EQUIP |
FIND_CHAR_ROOM, ch, &found_char, &found_obj); FIND_CHAR_ROOM, ch, &found_char, &found_obj);
/* Is the target a character? */ /* Is the target a character? */
if (found_char != NULL) { if (found_char != NULL) {
look_at_char(found_char, ch); look_at_char(found_char, ch);
if (ch != found_char) { if (ch != found_char) {
if (CAN_SEE(found_char, ch)) if (CAN_SEE(found_char, ch))
act("$n looks at you.", TRUE, ch, 0, found_char, TO_VICT); act("$n looks at you.", TRUE, ch, 0, found_char, TO_VICT);
act("$n looks at $N.", TRUE, ch, 0, found_char, TO_NOTVICT); act("$n looks at $N.", TRUE, ch, 0, found_char, TO_NOTVICT);
} }
return; return;
@@ -666,16 +677,16 @@ static void look_at_target(struct char_data *ch, char *arg)
for (j = 0; j < NUM_WEARS && !found; j++) for (j = 0; j < NUM_WEARS && !found; j++)
if (GET_EQ(ch, j) && CAN_SEE_OBJ(ch, GET_EQ(ch, j))) if (GET_EQ(ch, j) && CAN_SEE_OBJ(ch, GET_EQ(ch, j)))
if ((desc = find_exdesc(arg, GET_EQ(ch, j)->ex_description)) != NULL && ++i == fnum) { if ((desc = find_exdesc(arg, GET_EQ(ch, j)->ex_description)) != NULL && ++i == fnum) {
send_to_char(ch, "%s", desc); send_to_char(ch, "%s", desc);
found = TRUE; found = TRUE;
} }
/* Does the argument match an extra desc in the char's inventory? */ /* Does the argument match an extra desc in the char's inventory? */
for (obj = ch->carrying; obj && !found; obj = obj->next_content) { for (obj = ch->carrying; obj && !found; obj = obj->next_content) {
if (CAN_SEE_OBJ(ch, obj)) if (CAN_SEE_OBJ(ch, obj))
if ((desc = find_exdesc(arg, obj->ex_description)) != NULL && ++i == fnum) { if ((desc = find_exdesc(arg, obj->ex_description)) != NULL && ++i == fnum) {
send_to_char(ch, "%s", desc); send_to_char(ch, "%s", desc);
found = TRUE; found = TRUE;
} }
} }
@@ -683,8 +694,8 @@ static void look_at_target(struct char_data *ch, char *arg)
for (obj = world[IN_ROOM(ch)].contents; obj && !found; obj = obj->next_content) for (obj = world[IN_ROOM(ch)].contents; obj && !found; obj = obj->next_content)
if (CAN_SEE_OBJ(ch, obj)) if (CAN_SEE_OBJ(ch, obj))
if ((desc = find_exdesc(arg, obj->ex_description)) != NULL && ++i == fnum) { if ((desc = find_exdesc(arg, obj->ex_description)) != NULL && ++i == fnum) {
send_to_char(ch, "%s", desc); send_to_char(ch, "%s", desc);
found = TRUE; found = TRUE;
} }
/* If an object was found back in generic_find */ /* If an object was found back in generic_find */
@@ -714,7 +725,7 @@ ACMD(do_look)
send_to_char(ch, "You can't see a damned thing, you're blind!\r\n"); send_to_char(ch, "You can't see a damned thing, you're blind!\r\n");
else if (IS_DARK(IN_ROOM(ch)) && !CAN_SEE_IN_DARK(ch)) { else if (IS_DARK(IN_ROOM(ch)) && !CAN_SEE_IN_DARK(ch)) {
send_to_char(ch, "It is pitch black...\r\n"); send_to_char(ch, "It is pitch black...\r\n");
list_char_to_char(world[IN_ROOM(ch)].people, ch); /* glowing red eyes */ list_char_to_char(world[IN_ROOM(ch)].people, ch); /* glowing red eyes */
} else { } else {
char arg[MAX_INPUT_LENGTH], arg2[MAX_INPUT_LENGTH]; char arg[MAX_INPUT_LENGTH], arg2[MAX_INPUT_LENGTH];
@@ -722,12 +733,12 @@ ACMD(do_look)
if (subcmd == SCMD_READ) { if (subcmd == SCMD_READ) {
if (!*arg) if (!*arg)
send_to_char(ch, "Read what?\r\n"); send_to_char(ch, "Read what?\r\n");
else else
look_at_target(ch, strcpy(tempsave, arg)); look_at_target(ch, strcpy(tempsave, arg));
return; return;
} }
if (!*arg) /* "look" alone, without an argument at all */ if (!*arg) /* "look" alone, without an argument at all */
look_at_room(ch, 1); look_at_room(ch, 1);
else if (is_abbrev(arg, "in")) else if (is_abbrev(arg, "in"))
look_in_obj(ch, arg2); look_in_obj(ch, arg2);
@@ -767,15 +778,15 @@ ACMD(do_examine)
} }
/* look_at_target() eats the number. */ /* look_at_target() eats the number. */
look_at_target(ch, strcpy(tempsave, arg)); /* strcpy: OK */ look_at_target(ch, strcpy(tempsave, arg)); /* strcpy: OK */
generic_find(arg, FIND_OBJ_INV | FIND_OBJ_ROOM | FIND_CHAR_ROOM | generic_find(arg, FIND_OBJ_INV | FIND_OBJ_ROOM | FIND_CHAR_ROOM |
FIND_OBJ_EQUIP, ch, &tmp_char, &tmp_object); FIND_OBJ_EQUIP, ch, &tmp_char, &tmp_object);
if (tmp_object) { if (tmp_object) {
if ((GET_OBJ_TYPE(tmp_object) == ITEM_DRINKCON) || if ((GET_OBJ_TYPE(tmp_object) == ITEM_DRINKCON) ||
(GET_OBJ_TYPE(tmp_object) == ITEM_FOUNTAIN) || (GET_OBJ_TYPE(tmp_object) == ITEM_FOUNTAIN) ||
(GET_OBJ_TYPE(tmp_object) == ITEM_CONTAINER)) { (GET_OBJ_TYPE(tmp_object) == ITEM_CONTAINER)) {
send_to_char(ch, "When you look inside, you see:\r\n"); send_to_char(ch, "When you look inside, you see:\r\n");
look_in_obj(ch, arg); look_in_obj(ch, arg);
} }
@@ -807,18 +818,18 @@ ACMD(do_score)
send_to_char(ch, "\r\n"); send_to_char(ch, "\r\n");
send_to_char(ch, "You have %d(%d) hit, %d(%d) mana and %d(%d) movement points.\r\n", send_to_char(ch, "You have %d(%d) hit, %d(%d) mana and %d(%d) movement points.\r\n",
GET_HIT(ch), GET_MAX_HIT(ch), GET_MANA(ch), GET_MAX_MANA(ch), GET_HIT(ch), GET_MAX_HIT(ch), GET_MANA(ch), GET_MAX_MANA(ch),
GET_MOVE(ch), GET_MAX_MOVE(ch)); GET_MOVE(ch), GET_MAX_MOVE(ch));
send_to_char(ch, "Your armor class is %d/10, and your alignment is %d.\r\n", send_to_char(ch, "Your armor class is %d/10, and your alignment is %d.\r\n",
compute_armor_class(ch), GET_ALIGNMENT(ch)); compute_armor_class(ch), GET_ALIGNMENT(ch));
send_to_char(ch, "You have %d exp, %d gold coins, and %d questpoints.\r\n", send_to_char(ch, "You have %d exp, %d gold coins, and %d questpoints.\r\n",
GET_EXP(ch), GET_GOLD(ch), GET_QUESTPOINTS(ch)); GET_EXP(ch), GET_GOLD(ch), GET_QUESTPOINTS(ch));
if (GET_LEVEL(ch) < LVL_IMMORT) if (GET_LEVEL(ch) < LVL_IMMORT)
send_to_char(ch, "You need %d exp to reach your next level.\r\n", send_to_char(ch, "You need %d exp to reach your next level.\r\n",
level_exp(GET_CLASS(ch), GET_LEVEL(ch) + 1) - GET_EXP(ch)); level_exp(GET_CLASS(ch), GET_LEVEL(ch) + 1) - GET_EXP(ch));
send_to_char(ch, "You have earned %d quest points.\r\n", GET_QUESTPOINTS(ch)); send_to_char(ch, "You have earned %d quest points.\r\n", GET_QUESTPOINTS(ch));
send_to_char(ch, "You have completed %d quest%s, ", send_to_char(ch, "You have completed %d quest%s, ",
@@ -837,13 +848,13 @@ ACMD(do_score)
} }
playing_time = *real_time_passed((time(0) - ch->player.time.logon) + playing_time = *real_time_passed((time(0) - ch->player.time.logon) +
ch->player.time.played, 0); ch->player.time.played, 0);
send_to_char(ch, "You have been playing for %d day%s and %d hour%s.\r\n", send_to_char(ch, "You have been playing for %d day%s and %d hour%s.\r\n",
playing_time.day, playing_time.day == 1 ? "" : "s", playing_time.day, playing_time.day == 1 ? "" : "s",
playing_time.hours, playing_time.hours == 1 ? "" : "s"); playing_time.hours, playing_time.hours == 1 ? "" : "s");
send_to_char(ch, "This ranks you as %s %s (level %d).\r\n", send_to_char(ch, "This ranks you as %s %s (level %d).\r\n",
GET_NAME(ch), GET_TITLE(ch), GET_LEVEL(ch)); GET_NAME(ch), GET_TITLE(ch), GET_LEVEL(ch));
switch (GET_POS(ch)) { switch (GET_POS(ch)) {
case POS_DEAD: case POS_DEAD:
@@ -974,8 +985,8 @@ ACMD(do_time)
weekday = ((35 * time_info.month) + day) % 7; weekday = ((35 * time_info.month) + day) % 7;
send_to_char(ch, "It is %d o'clock %s, on %s.\r\n", send_to_char(ch, "It is %d o'clock %s, on %s.\r\n",
(time_info.hours % 12 == 0) ? 12 : (time_info.hours % 12), (time_info.hours % 12 == 0) ? 12 : (time_info.hours % 12),
time_info.hours >= 12 ? "pm" : "am", weekdays[weekday]); time_info.hours >= 12 ? "pm" : "am", weekdays[weekday]);
/* Peter Ajamian supplied the following as a fix for a bug introduced in the /* Peter Ajamian supplied the following as a fix for a bug introduced in the
* ordinal display that caused 11, 12, and 13 to be incorrectly displayed as * ordinal display that caused 11, 12, and 13 to be incorrectly displayed as
@@ -997,7 +1008,7 @@ ACMD(do_time)
} }
} }
send_to_char(ch, "The %d%s Day of the %s, Year %d.\r\n", send_to_char(ch, "The %d%s Day of the %s, Year %d.\r\n",
day, suf, month_name[time_info.month], time_info.year); day, suf, month_name[time_info.month], time_info.year);
} }
ACMD(do_weather) ACMD(do_weather)
@@ -1012,8 +1023,8 @@ ACMD(do_weather)
if (OUTSIDE(ch)) if (OUTSIDE(ch))
{ {
send_to_char(ch, "The sky is %s and %s.\r\n", sky_look[weather_info.sky], send_to_char(ch, "The sky is %s and %s.\r\n", sky_look[weather_info.sky],
weather_info.change >= 0 ? "you feel a warm wind from south" : weather_info.change >= 0 ? "you feel a warm wind from south" :
"your foot tells you bad weather is due"); "your foot tells you bad weather is due");
if (GET_LEVEL(ch) >= LVL_GOD) if (GET_LEVEL(ch) >= LVL_GOD)
send_to_char(ch, "Pressure: %d (change: %d), Sky: %d (%s)\r\n", send_to_char(ch, "Pressure: %d (change: %d), Sky: %d (%s)\r\n",
weather_info.pressure, weather_info.pressure,
@@ -1051,7 +1062,7 @@ int search_help(const char *argument, int level)
mid++; mid++;
if (strn_cmp(argument, help_table[mid].keywords, minlen) || level < help_table[mid].min_level) if (strn_cmp(argument, help_table[mid].keywords, minlen) || level < help_table[mid].min_level)
break; break;
return (mid); return (mid);
} }
else if (chk > 0) else if (chk > 0)
@@ -1278,7 +1289,7 @@ ACMD(do_who)
GET_LEVEL(tch), CLASS_ABBR(tch), GET_LEVEL(tch), CLASS_ABBR(tch),
GET_NAME(tch), (*GET_TITLE(tch) ? " " : ""), GET_TITLE(tch), GET_NAME(tch), (*GET_TITLE(tch) ? " " : ""), GET_TITLE(tch),
CCNRM(ch, C_SPR)); CCNRM(ch, C_SPR));
if (GET_INVIS_LEV(tch)) if (GET_INVIS_LEV(tch))
send_to_char(ch, " (i%d)", GET_INVIS_LEV(tch)); send_to_char(ch, " (i%d)", GET_INVIS_LEV(tch));
else if (AFF_FLAGGED(tch, AFF_INVISIBLE)) else if (AFF_FLAGGED(tch, AFF_INVISIBLE))
@@ -1371,7 +1382,7 @@ ACMD(do_users)
host_search[0] = name_search[0] = '\0'; host_search[0] = name_search[0] = '\0';
strcpy(buf, argument); /* strcpy: OK (sizeof: argument == buf) */ strcpy(buf, argument); /* strcpy: OK (sizeof: argument == buf) */
while (*buf) { while (*buf) {
char buf1[MAX_INPUT_LENGTH]; char buf1[MAX_INPUT_LENGTH];
@@ -1381,49 +1392,49 @@ ACMD(do_users)
switch (mode) { switch (mode) {
case 'o': case 'o':
case 'k': case 'k':
outlaws = 1; outlaws = 1;
playing = 1; playing = 1;
strcpy(buf, buf1); /* strcpy: OK (sizeof: buf1 == buf) */ strcpy(buf, buf1); /* strcpy: OK (sizeof: buf1 == buf) */
break; break;
case 'p': case 'p':
playing = 1; playing = 1;
strcpy(buf, buf1); /* strcpy: OK (sizeof: buf1 == buf) */ strcpy(buf, buf1); /* strcpy: OK (sizeof: buf1 == buf) */
break; break;
case 'd': case 'd':
deadweight = 1; deadweight = 1;
strcpy(buf, buf1); /* strcpy: OK (sizeof: buf1 == buf) */ strcpy(buf, buf1); /* strcpy: OK (sizeof: buf1 == buf) */
break; break;
case 'l': case 'l':
playing = 1; playing = 1;
half_chop(buf1, arg, buf); half_chop(buf1, arg, buf);
sscanf(arg, "%d-%d", &low, &high); sscanf(arg, "%d-%d", &low, &high);
break; break;
case 'n': case 'n':
playing = 1; playing = 1;
half_chop(buf1, name_search, buf); half_chop(buf1, name_search, buf);
break; break;
case 'h': case 'h':
playing = 1; playing = 1;
half_chop(buf1, host_search, buf); half_chop(buf1, host_search, buf);
break; break;
case 'c': case 'c':
playing = 1; playing = 1;
half_chop(buf1, arg, buf); half_chop(buf1, arg, buf);
showclass = find_class_bitvector(arg); showclass = find_class_bitvector(arg);
break; break;
default: default:
send_to_char(ch, "%s", USERS_FORMAT); send_to_char(ch, "%s", USERS_FORMAT);
return; return;
} /* end of switch */ } /* end of switch */
} else { /* endif */ } else { /* endif */
send_to_char(ch, "%s", USERS_FORMAT); send_to_char(ch, "%s", USERS_FORMAT);
return; return;
} }
} /* end while (parser) */ } /* end while (parser) */
send_to_char(ch, send_to_char(ch,
"Num Class Name State Idl Login\t* Site\r\n" "Num Class Name State Idl Login\t* Site\r\n"
"--- ------- ------------ -------------- ----- -------- ------------------------\r\n"); "--- ------- ------------ -------------- ----- -------- ------------------------\r\n");
one_argument(argument, arg); one_argument(argument, arg);
@@ -1445,7 +1456,7 @@ ACMD(do_users)
if (!CAN_SEE(ch, tch) || GET_LEVEL(tch) < low || GET_LEVEL(tch) > high) if (!CAN_SEE(ch, tch) || GET_LEVEL(tch) < low || GET_LEVEL(tch) > high)
continue; continue;
if (outlaws && !PLR_FLAGGED(tch, PLR_KILLER) && if (outlaws && !PLR_FLAGGED(tch, PLR_KILLER) &&
!PLR_FLAGGED(tch, PLR_THIEF)) !PLR_FLAGGED(tch, PLR_THIEF))
continue; continue;
if (showclass && !(showclass & (1 << GET_CLASS(tch)))) if (showclass && !(showclass & (1 << GET_CLASS(tch))))
continue; continue;
@@ -1453,11 +1464,11 @@ ACMD(do_users)
continue; continue;
if (d->original) if (d->original)
sprintf(classname, "[%2d %s]", GET_LEVEL(d->original), sprintf(classname, "[%2d %s]", GET_LEVEL(d->original),
CLASS_ABBR(d->original)); CLASS_ABBR(d->original));
else else
sprintf(classname, "[%2d %s]", GET_LEVEL(d->character), sprintf(classname, "[%2d %s]", GET_LEVEL(d->character),
CLASS_ABBR(d->character)); CLASS_ABBR(d->character));
} else } else
strcpy(classname, " - "); strcpy(classname, " - ");
@@ -1470,15 +1481,15 @@ ACMD(do_users)
if (d->character && STATE(d) == CON_PLAYING) if (d->character && STATE(d) == CON_PLAYING)
sprintf(idletime, "%5d", d->character->char_specials.timer * sprintf(idletime, "%5d", d->character->char_specials.timer *
SECS_PER_MUD_HOUR / SECS_PER_REAL_MIN); SECS_PER_MUD_HOUR / SECS_PER_REAL_MIN);
else else
strcpy(idletime, " "); strcpy(idletime, " ");
sprintf(line, "%3d %-7s %-12s %-14s %-3s %-8s ", d->desc_num, classname, sprintf(line, "%3d %-7s %-12s %-14s %-3s %-8s ", d->desc_num, classname,
d->original && d->original->player.name ? d->original->player.name : d->original && d->original->player.name ? d->original->player.name :
d->character && d->character->player.name ? d->character->player.name : d->character && d->character->player.name ? d->character->player.name :
"UNDEFINED", "UNDEFINED",
state, idletime, timestr); state, idletime, timestr);
if (*d->host) if (*d->host)
sprintf(line + strlen(line), "[%s]\r\n", d->host); sprintf(line + strlen(line), "[%s]\r\n", d->host);
@@ -1568,23 +1579,23 @@ static void perform_mortal_where(struct char_data *ch, char *arg)
send_to_char(ch, "Players in %s\tn.\r\n--------------------\r\n", zone_table[j].name); send_to_char(ch, "Players in %s\tn.\r\n--------------------\r\n", zone_table[j].name);
for (d = descriptor_list; d; d = d->next) { for (d = descriptor_list; d; d = d->next) {
if (STATE(d) != CON_PLAYING || d->character == ch) if (STATE(d) != CON_PLAYING || d->character == ch)
continue; continue;
if ((i = (d->original ? d->original : d->character)) == NULL) if ((i = (d->original ? d->original : d->character)) == NULL)
continue; continue;
if (IN_ROOM(i) == NOWHERE || !CAN_SEE(ch, i)) if (IN_ROOM(i) == NOWHERE || !CAN_SEE(ch, i))
continue; continue;
if (world[IN_ROOM(ch)].zone != world[IN_ROOM(i)].zone) if (world[IN_ROOM(ch)].zone != world[IN_ROOM(i)].zone)
continue; continue;
send_to_char(ch, "%-20s%s - %s%s\r\n", GET_NAME(i), QNRM, world[IN_ROOM(i)].name, QNRM); send_to_char(ch, "%-20s%s - %s%s\r\n", GET_NAME(i), QNRM, world[IN_ROOM(i)].name, QNRM);
} }
} else { /* print only FIRST char, not all. */ } else { /* print only FIRST char, not all. */
for (i = character_list; i; i = i->next) { for (i = character_list; i; i = i->next) {
if (IN_ROOM(i) == NOWHERE || i == ch) if (IN_ROOM(i) == NOWHERE || i == ch)
continue; continue;
if (!CAN_SEE(ch, i) || world[IN_ROOM(i)].zone != world[IN_ROOM(ch)].zone) if (!CAN_SEE(ch, i) || world[IN_ROOM(i)].zone != world[IN_ROOM(ch)].zone)
continue; continue;
if (!isname(arg, i->player.name)) if (!isname(arg, i->player.name))
continue; continue;
send_to_char(ch, "%-25s%s - %s%s\r\n", GET_NAME(i), QNRM, world[IN_ROOM(i)].name, QNRM); send_to_char(ch, "%-25s%s - %s%s\r\n", GET_NAME(i), QNRM, world[IN_ROOM(i)].name, QNRM);
return; return;
} }
@@ -1593,7 +1604,7 @@ static void perform_mortal_where(struct char_data *ch, char *arg)
} }
static void print_object_location(int num, struct obj_data *obj, struct char_data *ch, static void print_object_location(int num, struct obj_data *obj, struct char_data *ch,
int recur) int recur)
{ {
if (num > 0) if (num > 0)
send_to_char(ch, "O%3d. %-25s%s - ", num, obj->short_description, QNRM); send_to_char(ch, "O%3d. %-25s%s - ", num, obj->short_description, QNRM);
@@ -1658,7 +1669,7 @@ static void perform_immort_where(struct char_data *ch, char *arg)
else else
send_to_char(ch, "[TRIGS] "); send_to_char(ch, "[TRIGS] ");
} }
send_to_char(ch, "%s\r\n", QNRM); send_to_char(ch, "%s\r\n", QNRM);
} }
for (num = 0, k = object_list; k; k = k->next) for (num = 0, k = object_list; k; k = k->next)
if (CAN_SEE_OBJ(ch, k) && isname(arg, k->name)) { if (CAN_SEE_OBJ(ch, k) && isname(arg, k->name)) {
@@ -1727,7 +1738,7 @@ ACMD(do_levels)
for (i = min_lev; i < max_lev; i++) { for (i = min_lev; i < max_lev; i++) {
nlen = snprintf(buf + len, sizeof(buf) - len, "[%2d] %8d-%-8d : ", (int)i, nlen = snprintf(buf + len, sizeof(buf) - len, "[%2d] %8d-%-8d : ", (int)i,
level_exp(GET_CLASS(ch), i), level_exp(GET_CLASS(ch), i + 1) - 1); level_exp(GET_CLASS(ch), i), level_exp(GET_CLASS(ch), i + 1) - 1);
if (len + nlen >= sizeof(buf)) if (len + nlen >= sizeof(buf))
break; break;
len += nlen; len += nlen;
@@ -1751,7 +1762,7 @@ ACMD(do_levels)
if (len < sizeof(buf) && max_lev == LVL_IMMORT) if (len < sizeof(buf) && max_lev == LVL_IMMORT)
snprintf(buf + len, sizeof(buf) - len, "[%2d] %8d : Immortality\r\n", snprintf(buf + len, sizeof(buf) - len, "[%2d] %8d : Immortality\r\n",
LVL_IMMORT, level_exp(GET_CLASS(ch), LVL_IMMORT)); LVL_IMMORT, level_exp(GET_CLASS(ch), LVL_IMMORT));
page_string(ch->desc, buf, TRUE); page_string(ch->desc, buf, TRUE);
} }
@@ -1941,14 +1952,14 @@ ACMD(do_toggle)
else else
sprintf(buf2, "%-3.3d", GET_WIMP_LEV(ch)); /* sprintf: OK */ sprintf(buf2, "%-3.3d", GET_WIMP_LEV(ch)); /* sprintf: OK */
if (GET_LEVEL(ch) == LVL_IMPL) { if (GET_LEVEL(ch) == LVL_IMPL) {
send_to_char(ch, send_to_char(ch,
" SlowNameserver: %-3s " " SlowNameserver: %-3s "
" " " "
" Trackthru Doors: %-3s\r\n", " Trackthru Doors: %-3s\r\n",
ONOFF(CONFIG_NS_IS_SLOW), ONOFF(CONFIG_NS_IS_SLOW),
ONOFF(CONFIG_TRACK_T_DOORS)); ONOFF(CONFIG_TRACK_T_DOORS));
} }
if (GET_LEVEL(ch) >= LVL_IMMORT) { if (GET_LEVEL(ch) >= LVL_IMMORT) {
@@ -2112,7 +2123,7 @@ ACMD(do_toggle)
for (i=0; *arg2 && *(sector_types[i]) != '\n'; i++) for (i=0; *arg2 && *(sector_types[i]) != '\n'; i++)
if (is_abbrev(arg2, sector_types[i])) if (is_abbrev(arg2, sector_types[i]))
break; break;
if (*(sector_types[i]) == '\n') if (*(sector_types[i]) == '\n')
i=0; i=0;
GET_BUILDWALK_SECTOR(ch) = i; GET_BUILDWALK_SECTOR(ch) = i;
send_to_char(ch, "Default sector type is %s\r\n", sector_types[i]); send_to_char(ch, "Default sector type is %s\r\n", sector_types[i]);
@@ -2365,9 +2376,9 @@ ACMD(do_whois)
{ {
CREATE(victim, struct char_data, 1); CREATE(victim, struct char_data, 1);
clear_char(victim); clear_char(victim);
new_mobile_data(victim); new_mobile_data(victim);
CREATE(victim->player_specials, struct player_special_data, 1); CREATE(victim->player_specials, struct player_special_data, 1);
if (load_char(buf, victim) > -1) if (load_char(buf, victim) > -1)

View File

@@ -461,6 +461,9 @@ int has_key(struct char_data *ch, obj_vnum key)
{ {
struct obj_data *o; struct obj_data *o;
if (key == NOTHING)
return (0);
for (o = ch->carrying; o; o = o->next_content) for (o = ch->carrying; o; o = o->next_content)
if (GET_OBJ_VNUM(o) == key) if (GET_OBJ_VNUM(o) == key)
return (1); return (1);

View File

@@ -546,7 +546,6 @@ ACMD(do_split)
if (rest) { if (rest) {
send_to_char(ch, "%d coin%s %s not splitable, so you keep the money.\r\n", send_to_char(ch, "%d coin%s %s not splitable, so you keep the money.\r\n",
rest, (rest == 1) ? "" : "s", (rest == 1) ? "was" : "were"); rest, (rest == 1) ? "" : "s", (rest == 1) ? "was" : "were");
increase_gold(ch, rest);
} }
} else { } else {
send_to_char(ch, "How many coins do you wish to split with your group?\r\n"); send_to_char(ch, "How many coins do you wish to split with your group?\r\n");

View File

@@ -557,7 +557,7 @@ void aedit_parse(struct descriptor_data * d, char *arg) {
} }
if (OLC_ACTION(d)->command) if (OLC_ACTION(d)->command)
free(OLC_ACTION(d)->command); free(OLC_ACTION(d)->command);
OLC_ACTION(d)->command = strdup(arg); OLC_ACTION(d)->command = strdup(arg);
break; break;
@@ -566,10 +566,10 @@ void aedit_parse(struct descriptor_data * d, char *arg) {
aedit_disp_menu(d); aedit_disp_menu(d);
return; return;
} }
if (OLC_ACTION(d)->sort_as) { if (OLC_ACTION(d)->sort_as)
free(OLC_ACTION(d)->sort_as); free(OLC_ACTION(d)->sort_as);
OLC_ACTION(d)->sort_as = strdup(arg); OLC_ACTION(d)->sort_as = strdup(arg);
}
break; break;
case AEDIT_MIN_CHAR_POS: case AEDIT_MIN_CHAR_POS:

View File

@@ -1596,7 +1596,7 @@ static int process_output(struct descriptor_data *t)
result = write_to_descriptor(t->descriptor, osb); result = write_to_descriptor(t->descriptor, osb);
if (result < 0) { /* Oops, fatal error. Bye! */ if (result < 0) { /* Oops, fatal error. Bye! */
close_socket(t); // close_socket(t); // close_socket is called after return of negative result
return (-1); return (-1);
} else if (result == 0) /* Socket buffer full. Try later. */ } else if (result == 0) /* Socket buffer full. Try later. */
return (0); return (0);

367
src/conf.h.macOS Normal file
View File

@@ -0,0 +1,367 @@
#ifndef _CONF_H_
#define _CONF_H_
/* Define to empty if the keyword does not work. */
/* #undef const */
/* Define if you don't have vprintf but do have _doprnt. */
/* #undef HAVE_DOPRNT */
/* Define if you have <sys/wait.h> that is POSIX.1 compatible. */
#define HAVE_SYS_WAIT_H 1
/* Define if you have the vprintf function. */
#define HAVE_VPRINTF 1
/* Define to `int' if <sys/types.h> doesn't define. */
/* #undef pid_t */
/* Define as the return type of signal handlers (int or void). */
#define RETSIGTYPE void
/* Define to `unsigned' if <sys/types.h> doesn't define. */
/* #undef size_t */
/* Define if you have the ANSI C header files. */
/* #undef STDC_HEADERS */
/* Define if you can safely include both <sys/time.h> and <time.h>. */
#define TIME_WITH_SYS_TIME 1
/* Define if we're compiling CircleMUD under any type of UNIX system. */
#define CIRCLE_UNIX 1
/* Machine-specific dependencies for running on modern macOS systems 10.13+ (High Sierra)
* Updated by Victor Augusto Borges Dias de Almeida (aka Stoneheart), 26 June 2024.
*
* Tested on:
* - macOS 10.13: High Sierra - September 25, 2017 (Latest: 10.13.6)
* - macOS 10.14: Mojave - September 24, 2018 (Latest: 10.14.6)
* - macOS 10.15: Catalina - October 7, 2019 (Latest: 10.15.7)
* - macOS 11: Big Sur - November 12, 2020 (Latest: 11.7.10)
* - macOS 12: Monterey - October 25, 2021 (Latest: 12.7)
* - macOS 13: Ventura - November 7, 2022 (Latest: 13.7)
* - macOS 14: Sonoma - November 7, 2023 (Latest: 14.3)
*
* This file works on Apple Silicon Chips (M1, M2, M3) without futher configurations. */
#if defined(__APPLE__) && defined(__MACH__)
#define CIRCLE_MAC_OS 1
#endif
/* Define if the system is capable of using crypt() to encrypt. */
#define CIRCLE_CRYPT 1
/* Define if we don't have proper support for the system's crypt(). */
/* #undef HAVE_UNSAFE_CRYPT */
/* Define is the system has struct in_addr. */
#define HAVE_STRUCT_IN_ADDR 1
/* Define to `int' if <sys/socket.h> doesn't define. */
/* #undef socklen_t */
/* Define to `int' if <sys/types.h> doesn't define. */
/* #undef ssize_t */
/* Define if you have the gettimeofday function. */
#define HAVE_GETTIMEOFDAY 1
/* Define if you have the inet_addr function. */
#define HAVE_INET_ADDR 1
/* Define if you have the inet_aton function. */
#define HAVE_INET_ATON 1
/* Define if you have the select function. */
#define HAVE_SELECT 1
/* Define if you have the snprintf function. */
#define HAVE_SNPRINTF 1
/* Define if you have the strcasecmp function. */
#define HAVE_STRCASECMP 1
/* Define if you have the strdup function. */
#define HAVE_STRDUP 1
/* Define if you have the strerror function. */
#define HAVE_STRERROR 1
/* Define if you have the stricmp function. */
/* #undef HAVE_STRICMP */
/* Define if you have the strlcpy function. */
#ifndef CIRCLE_MAC_OS
#define HAVE_STRLCPY 1
#else
#define HAVE_STRLCPY 0
#endif
/* Define if you have the strncasecmp function. */
#define HAVE_STRNCASECMP 1
/* Define if you have the strnicmp function. */
/* #undef HAVE_STRNICMP */
/* Define if you have the strstr function. */
#define HAVE_STRSTR 1
/* Define if you have the vsnprintf function. */
#define HAVE_VSNPRINTF 1
/* Define if you have the <arpa/inet.h> header file. */
#define HAVE_ARPA_INET_H 1
/* Define if you have the <arpa/telnet.h> header file. */
#define HAVE_ARPA_TELNET_H 1
/* Define if you have the <assert.h> header file. */
#define HAVE_ASSERT_H 1
/* Define if you have the <crypt.h> header file. */
/* #undef HAVE_CRYPT_H */
#ifdef CIRCLE_MAC_OS
#define HAVE_CRYPT_H 1
#endif
/* Define if you have the <errno.h> header file. */
#define HAVE_ERRNO_H 1
/* Define if you have the <fcntl.h> header file. */
#define HAVE_FCNTL_H 1
/* Define if you have the <limits.h> header file. */
#define HAVE_LIMITS_H 1
/* Define if you have the <mcheck.h> header file. */
/* #undef HAVE_MCHECK_H */
#ifdef CIRCLE_MAC_OS
#define HAVE_MCHECK_H 1
#endif
/* Define if you have the <memory.h> header file. */
#define HAVE_MEMORY_H 1
/* Define if you have the <net/errno.h> header file. */
/* #undef HAVE_NET_ERRNO_H */
/* Define if you have the <netdb.h> header file. */
#define HAVE_NETDB_H 1
/* Define if you have the <netinet/in.h> header file. */
#define HAVE_NETINET_IN_H 1
/* Define if you have the <signal.h> header file. */
#define HAVE_SIGNAL_H 1
/* Define if you have the <string.h> header file. */
#define HAVE_STRING_H 1
/* Define if you have the <strings.h> header file. */
#define HAVE_STRINGS_H 1
/* Define if you have the <sys/fcntl.h> header file. */
#define HAVE_SYS_FCNTL_H 1
/* Define if you have the <sys/resource.h> header file. */
#define HAVE_SYS_RESOURCE_H 1
/* Define if you have the <sys/select.h> header file. */
#define HAVE_SYS_SELECT_H 1
/* Define if you have the <sys/socket.h> header file. */
#define HAVE_SYS_SOCKET_H 1
/* Define if you have the <sys/stat.h> header file. */
#define HAVE_SYS_STAT_H 1
/* Define if you have the <sys/time.h> header file. */
#define HAVE_SYS_TIME_H 1
/* Define if you have the <sys/types.h> header file. */
#define HAVE_SYS_TYPES_H 1
/* Define if you have the <sys/uio.h> header file. */
#define HAVE_SYS_UIO_H 1
/* Define if you have the <unistd.h> header file. */
#define HAVE_UNISTD_H 1
/* Define if you have the malloc library (-lmalloc). */
/* #undef HAVE_LIBMALLOC */
/* Check for a prototype to accept. */
/* #undef NEED_ACCEPT_PROTO */
#ifndef CIRCLE_MAC_OS
/* Check for a prototype to atoi. */
#define NEED_ATOI_PROTO
/* Check for a prototype to atol. */
#define NEED_ATOL_PROTO
#endif
/* Check for a prototype to bind. */
/* #undef NEED_BIND_PROTO */
/* Check for a prototype to bzero. */
/* #undef NEED_BZERO_PROTO */
/* Check for a prototype to chdir. */
/* #undef NEED_CHDIR_PROTO */
/* Check for a prototype to close. */
/* #undef NEED_CLOSE_PROTO */
/* Check for a prototype to crypt. */
/* #undef NEED_CRYPT_PROTO */
/* Check for a prototype to fclose. */
/* #undef NEED_FCLOSE_PROTO */
/* Check for a prototype to fcntl. */
/* #undef NEED_FCNTL_PROTO */
/* Check for a prototype to fflush. */
/* #undef NEED_FFLUSH_PROTO */
/* Check for a prototype to fprintf. */
/* #undef NEED_FPRINTF_PROTO */
/* Check for a prototype to fputc. */
/* #undef NEED_FPUTC_PROTO */
/* Check for a prototype to fputs. */
/* #undef NEED_FPUTS_PROTO */
/* Check for a prototype to fread. */
/* #undef NEED_FREAD_PROTO */
/* Check for a prototype to fscanf. */
/* #undef NEED_FSCANF_PROTO */
/* Check for a prototype to fseek. */
/* #undef NEED_FSEEK_PROTO */
/* Check for a prototype to fwrite. */
/* #undef NEED_FWRITE_PROTO */
/* Check for a prototype to getpeername. */
/* #undef NEED_GETPEERNAME_PROTO */
/* Check for a prototype to getpid. */
/* #undef NEED_GETPID_PROTO */
/* Check for a prototype to getrlimit. */
/* #undef NEED_GETRLIMIT_PROTO */
/* Check for a prototype to getsockname. */
/* #undef NEED_GETSOCKNAME_PROTO */
/* Check for a prototype to gettimeofday. */
/* #undef NEED_GETTIMEOFDAY_PROTO */
/* Check for a prototype to htonl. */
/* #undef NEED_HTONL_PROTO */
/* Check for a prototype to htons. */
/* #undef NEED_HTONS_PROTO */
/* Check for a prototype to inet_addr. */
/* #undef NEED_INET_ADDR_PROTO */
/* Check for a prototype to inet_aton. */
/* #undef NEED_INET_ATON_PROTO */
/* Check for a prototype to inet_ntoa. */
/* #undef NEED_INET_NTOA_PROTO */
/* Check for a prototype to listen. */
/* #undef NEED_LISTEN_PROTO */
/* Check for a prototype to ntohl. */
/* #undef NEED_NTOHL_PROTO */
/* Check for a prototype to perror. */
/* #undef NEED_PERROR_PROTO */
/* Check for a prototype to printf. */
/* #undef NEED_PRINTF_PROTO */
/* Check for a prototype to qsort. */
#ifndef CIRCLE_MAC_OS
#define NEED_QSORT_PROTO
#endif
/* Check for a prototype to read. */
/* #undef NEED_READ_PROTO */
/* Check for a prototype to remove. */
/* #undef NEED_REMOVE_PROTO */
/* Check for a prototype to rewind. */
/* #undef NEED_REWIND_PROTO */
/* Check for a prototype to select. */
/* #undef NEED_SELECT_PROTO */
/* Check for a prototype to setitimer. */
/* #undef NEED_SETITIMER_PROTO */
/* Check for a prototype to setrlimit. */
/* #undef NEED_SETRLIMIT_PROTO */
/* Check for a prototype to setsockopt. */
/* #undef NEED_SETSOCKOPT_PROTO */
/* Check for a prototype to snprintf. */
/* #undef NEED_SNPRINTF_PROTO */
/* Check for a prototype to socket. */
/* #undef NEED_SOCKET_PROTO */
/* Check for a prototype to sprintf. */
/* #undef NEED_SPRINTF_PROTO */
/* Check for a prototype to sscanf. */
/* #undef NEED_SSCANF_PROTO */
/* Check for a prototype to strcasecmp. */
/* #undef NEED_STRCASECMP_PROTO */
/* Check for a prototype to strdup. */
/* #undef NEED_STRDUP_PROTO */
/* Check for a prototype to strerror. */
/* #undef NEED_STRERROR_PROTO */
/* Check for a prototype to stricmp. */
#define NEED_STRICMP_PROTO
/* Check for a prototype to strlcpy. */
/* #undef NEED_STRLCPY_PROTO */
/* Check for a prototype to strncasecmp. */
/* #undef NEED_STRNCASECMP_PROTO */
/* Check for a prototype to strnicmp. */
#define NEED_STRNICMP_PROTO
/* Check for a prototype to system. */
#ifndef CIRCLE_MAC_OS
#define NEED_SYSTEM_PROTO
#endif
/* Check for a prototype to time. */
/* #undef NEED_TIME_PROTO */
/* Check for a prototype to unlink. */
/* #undef NEED_UNLINK_PROTO */
/* Check for a prototype to vsnprintf. */
/* #undef NEED_VSNPRINTF_PROTO */
/* Check for a prototype to write. */
/* #undef NEED_WRITE_PROTO */
#endif /* _CONF_H_ */

View File

@@ -24,7 +24,7 @@
* @todo cpp_extern isn't needed here (or anywhere) as the extern reserved word * @todo cpp_extern isn't needed here (or anywhere) as the extern reserved word
* works correctly with C compilers (at least in my Experience) * works correctly with C compilers (at least in my Experience)
* Jeremy Osborne 1/28/2008 */ * Jeremy Osborne 1/28/2008 */
cpp_extern const char *tbamud_version = "tbaMUD 2021"; cpp_extern const char *tbamud_version = "tbaMUD 2025";
/* strings corresponding to ordinals/bitvectors in structs.h */ /* strings corresponding to ordinals/bitvectors in structs.h */
/* (Note: strings for class definitions in class.c instead of here) */ /* (Note: strings for class definitions in class.c instead of here) */

View File

@@ -1091,70 +1091,85 @@ int format_script(struct descriptor_data *d)
char nsc[MAX_CMD_LENGTH], *t, line[READ_SIZE]; char nsc[MAX_CMD_LENGTH], *t, line[READ_SIZE];
char *sc; char *sc;
size_t len = 0, nlen = 0, llen = 0; size_t len = 0, nlen = 0, llen = 0;
int indent = 0, indent_next = FALSE, found_case = FALSE, i, line_num = 0, ret; int indent = 0, indent_next = FALSE, line_num = 0, ret, i; // Declare i here
int block_stack[READ_SIZE]; // Stack to track block types
int stack_top = -1; // Initialize stack as empty
int switch_indent[READ_SIZE]; // Array to track switch indent levels
int switch_top = -1; // Index for switch_indent array
int case_indent = 0; // Track indent for case blocks
int in_switch = 0; // Flag to indicate if we're inside a switch block
if (!d->str || !*d->str) if (!d->str || !*d->str)
return FALSE; return FALSE;
sc = strdup(*d->str); /* we work on a copy, because of strtok() */ sc = strdup(*d->str); // Work on a copy
t = strtok(sc, "\n\r"); t = strtok(sc, "\n\r");
*nsc = '\0'; *nsc = '\0';
while (t) { while (t) {
line_num++; line_num++;
skip_spaces(&t); skip_spaces(&t);
if (!strn_cmp(t, "if ", 3) ||
!strn_cmp(t, "switch ", 7)) { if (!strn_cmp(t, "switch ", 7)) {
indent_next = TRUE; indent_next = TRUE;
} else if (!strn_cmp(t, "while ", 6)) { stack_top++;
found_case = TRUE; /* so you can 'break' a loop without complains */ block_stack[stack_top] = 's'; // 's' for switch
switch_top++;
switch_indent[switch_top] = indent; // Save current indent level for switch
in_switch++; // We're entering a switch block
} else if (!strn_cmp(t, "case", 4) || !strn_cmp(t, "default", 7)) {
if (in_switch > 0) { // If we're inside a switch
indent = switch_indent[switch_top] + 1; // Indent cases one level under switch
indent_next = TRUE; // Indent the next line after case
case_indent = indent; // Save indent for case block
}
} else if (!strn_cmp(t, "if ", 3) || !strn_cmp(t, "while ", 6)) {
indent_next = TRUE; indent_next = TRUE;
} else if (!strn_cmp(t, "end", 3) || stack_top++;
!strn_cmp(t, "done", 4)) { block_stack[stack_top] = 'l'; // 'l' for loop or conditional
if (!indent) { } else if (!strn_cmp(t, "end", 3) || !strn_cmp(t, "done", 4)) {
if (stack_top < 0) {
write_to_output(d, "Unmatched 'end' or 'done' (line %d)!\r\n", line_num); write_to_output(d, "Unmatched 'end' or 'done' (line %d)!\r\n", line_num);
free(sc); free(sc);
return FALSE; return FALSE;
} }
indent--; if (block_stack[stack_top] == 's') {
indent_next = FALSE; indent = switch_indent[switch_top]; // Reset to the exact indent level where switch was declared
switch_top--; // Decrease switch stack if ending a switch
case_indent = 0; // Reset case indent since we're leaving the switch
in_switch--; // We're leaving a switch block
} else {
indent--; // For other blocks like while
}
stack_top--;
indent_next = FALSE; // Reset for next line
} else if (!strn_cmp(t, "else", 4)) { } else if (!strn_cmp(t, "else", 4)) {
if (!indent) { if (stack_top < 0 || block_stack[stack_top] != 'l') {
write_to_output(d, "Unmatched 'else' (line %d)!\r\n", line_num); write_to_output(d, "Unmatched 'else' (line %d)!\r\n", line_num);
free(sc); free(sc);
return FALSE; return FALSE;
} }
indent--; indent--; // Reduce indent for else, then increment for next statement
indent_next = TRUE; indent_next = TRUE;
} else if (!strn_cmp(t, "case", 4) ||
!strn_cmp(t, "default", 7)) {
if (!indent) {
write_to_output(d, "Case/default outside switch (line %d)!\r\n", line_num);
free(sc);
return FALSE;
}
if (!found_case) /* so we don't indent multiple case statements without a break */
indent_next = TRUE;
found_case = TRUE;
} else if (!strn_cmp(t, "break", 5)) { } else if (!strn_cmp(t, "break", 5)) {
if (!found_case || !indent ) { if (stack_top < 0 || (block_stack[stack_top] != 's' && block_stack[stack_top] != 'l')) {
write_to_output(d, "Break not in case (line %d)!\r\n", line_num); write_to_output(d, "Break not in case or loop (line %d)!\r\n", line_num);
free(sc); free(sc);
return FALSE; return FALSE;
} }
found_case = FALSE; indent = case_indent + 1; // Indent break one level deeper than case
indent--; indent_next = FALSE; // Ensure no automatic increase for next line after break
} }
*line = '\0'; *line = '\0';
for (nlen = 0, i = 0;i<indent;i++) { for (nlen = 0, i = 0; i < indent; i++) {
strncat(line, " ", sizeof(line)-1); strncat(line, " ", sizeof(line) - strlen(line) - 1);
nlen += 2; nlen += 2;
} }
ret = snprintf(line + nlen, sizeof(line) - nlen, "%s\r\n", t); ret = snprintf(line + nlen, sizeof(line) - nlen, "%s\r\n", t);
llen = (size_t)ret; llen = (size_t)ret;
if (ret < 0 || llen + nlen + len > d->max_str - 1 ) { if (ret < 0 || llen + nlen + len > d->max_str - 1) {
write_to_output(d, "String too long, formatting aborted\r\n"); write_to_output(d, "String too long, formatting aborted\r\n");
free(sc); free(sc);
return FALSE; return FALSE;
@@ -1169,8 +1184,8 @@ int format_script(struct descriptor_data *d)
t = strtok(NULL, "\n\r"); t = strtok(NULL, "\n\r");
} }
if (indent) if (stack_top >= 0)
write_to_output(d, "Unmatched if, while or switch ignored.\r\n"); write_to_output(d, "Unmatched block statements ignored.\r\n");
free(*d->str); free(*d->str);
*d->str = strdup(nsc); *d->str = strdup(nsc);

View File

@@ -2486,7 +2486,6 @@ int script_driver(void *go_adress, trig_data *trig, int type, int mode)
char cmd[MAX_INPUT_LENGTH], *p; char cmd[MAX_INPUT_LENGTH], *p;
struct script_data *sc = 0; struct script_data *sc = 0;
struct cmdlist_element *temp; struct cmdlist_element *temp;
unsigned long loops = 0;
void *go = NULL; void *go = NULL;
void obj_command_interpreter(obj_data *obj, char *argument); void obj_command_interpreter(obj_data *obj, char *argument);
@@ -2578,8 +2577,8 @@ int script_driver(void *go_adress, trig_data *trig, int type, int mode)
if (process_if(p + 6, go, sc, trig, type)) { if (process_if(p + 6, go, sc, trig, type)) {
temp->original = cl; temp->original = cl;
} else { } else {
cl->loops = 0;
cl = temp; cl = temp;
loops = 0;
} }
} else if (!strn_cmp("switch ", p, 7)) { } else if (!strn_cmp("switch ", p, 7)) {
cl = find_case(trig, cl, go, sc, type, p + 7); cl = find_case(trig, cl, go, sc, type, p + 7);
@@ -2599,9 +2598,10 @@ int script_driver(void *go_adress, trig_data *trig, int type, int mode)
if (cl->original && process_if(orig_cmd + 6, go, sc, trig, if (cl->original && process_if(orig_cmd + 6, go, sc, trig,
type)) { type)) {
cl = cl->original; cl = cl->original;
loops++; cl->loops++;
GET_TRIG_LOOPS(trig)++; GET_TRIG_LOOPS(trig)++;
if (loops == 30) { if (cl->loops == 30) {
cl->loops = 0;
process_wait(go, trig, type, "wait 1", cl); process_wait(go, trig, type, "wait 1", cl);
depth--; depth--;
return ret_val; return ret_val;

View File

@@ -135,6 +135,7 @@ struct cmdlist_element {
char *cmd; /* one line of a trigger */ char *cmd; /* one line of a trigger */
struct cmdlist_element *original; struct cmdlist_element *original;
struct cmdlist_element *next; struct cmdlist_element *next;
int loops; /* for counting number of runs in a while loop */
}; };
struct trig_var_data { struct trig_var_data {

View File

@@ -268,7 +268,7 @@ void create_world_index(int znum, const char *type)
while (get_line(oldfile, buf)) { while (get_line(oldfile, buf)) {
if (*buf == '$') { if (*buf == '$') {
/* The following used to add a blank line, thanks to Brian Taylor for the fix. */ /* The following used to add a blank line, thanks to Brian Taylor for the fix. */
fprintf(newfile, "%s", (!found ? strncat(buf1, "\n$\n", sizeof(buf1)-1) : "$\n")); fprintf(newfile, "%s", (!found ? strncat(buf1, "\n$\n", sizeof(buf1) - strlen(buf1) - 1) : "$\n"));
break; break;
} else if (!found) { } else if (!found) {
sscanf(buf, "%d", &num); sscanf(buf, "%d", &num);

View File

@@ -671,12 +671,20 @@ struct char_data *get_char_num(mob_rnum nr)
/* put an object in a room */ /* put an object in a room */
void obj_to_room(struct obj_data *object, room_rnum room) void obj_to_room(struct obj_data *object, room_rnum room)
{ {
if (!object || room == NOWHERE || room > top_of_world) if (!object || room == NOWHERE || room > top_of_world){
log("SYSERR: Illegal value(s) passed to obj_to_room. (Room #%d/%d, obj %p)", log("SYSERR: Illegal value(s) passed to obj_to_room. (Room #%d/%d, obj %p)",
room, top_of_world, (void *)object); room, top_of_world, (void *)object);
}
else { else {
object->next_content = world[room].contents; if (world[room].contents == NULL){ // if list is empty
world[room].contents = object; world[room].contents = object; // add object to list
}
else {
struct obj_data *i = world[room].contents; // define a temporary pointer
while (i->next_content != NULL) i = i->next_content; // find the first without a next_content
i->next_content = object; // add object at the end
}
object->next_content = NULL; // mostly for sanity. should do nothing.
IN_ROOM(object) = room; IN_ROOM(object) = room;
object->carried_by = NULL; object->carried_by = NULL;
if (ROOM_FLAGGED(room, ROOM_HOUSE)) if (ROOM_FLAGGED(room, ROOM_HOUSE))

View File

@@ -177,6 +177,13 @@ static IBT_DATA *read_ibt( char *filename, FILE *fp )
} }
break; break;
case 'F':
if (!str_cmp(word, "Flags")) {
fMatch = TRUE;
fread_flags(fp, ibtData->flags, 4);
}
break;
case 'I': case 'I':
TXT_KEY("IdNum", id_num, fread_line(fp)); TXT_KEY("IdNum", id_num, fread_line(fp));
break; break;

View File

@@ -13,6 +13,11 @@
#include <sys/types.h> #include <sys/types.h>
#include "protocol.h" #include "protocol.h"
#ifdef _MSC_VER
#include "telnet.h"
#define alloca _alloca
#endif
/****************************************************************************** /******************************************************************************
The following section is for Diku/Merc derivatives. Replace as needed. The following section is for Diku/Merc derivatives. Replace as needed.
******************************************************************************/ ******************************************************************************/

View File

@@ -1276,7 +1276,7 @@ struct happyhour {
struct recent_player struct recent_player
{ {
int vnum; /* The ID number for this instance */ int vnum; /* The ID number for this instance */
char name[MAX_NAME_LENGTH]; /* The char name of the player */ char name[MAX_NAME_LENGTH+1];/* The char name of the player */
bool new_player; /* Is this a new player? */ bool new_player; /* Is this a new player? */
bool copyover_player; /* Is this a player that was on during the last copyover? */ bool copyover_player; /* Is this a player that was on during the last copyover? */
time_t time; /* login time */ time_t time; /* login time */

View File

@@ -63,6 +63,24 @@
/* Do not change anything below this line. */ /* Do not change anything below this line. */
#if defined(__APPLE__) && defined(__MACH__)
/* Machine-specific dependencies for running on modern macOS systems 10.13+ (High Sierra)
* Updated by Victor Augusto Borges Dias de Almeida (aka Stoneheart), 26 June 2024.
*
* Tested on:
* - macOS 10.13: High Sierra (Lobo) - September 25, 2017 (Latest: 10.13.6)
* - macOS 10.14: Mojave (Liberty) - September 24, 2018 (Latest: 10.14.6)
* - macOS 10.15: Catalina (Jazz) - October 7, 2019 (Latest: 10.15.7)
* - macOS 11: Big Sur (GoldenGate) - November 12, 2020 (Latest: 11.7.10)
* - macOS 12: Monterey (Star) - October 25, 2021 (Latest: 12.7)
* - macOS 13: Ventura (Rome) - November 7, 2022 (Latest: 13.7)
* - macOS 14: Sonoma (Sunburst) - November 7, 2023 (Latest: 14.3)
*
* This file works on Apple Silicon Chips (M1, M2, M3) without futher configurations.
*/
#define CIRCLE_MAC_OS 1
#endif
/* Set up various machine-specific things based on the values determined from /* Set up various machine-specific things based on the values determined from
* configure and conf.h. */ * configure and conf.h. */
@@ -78,7 +96,7 @@
#include <strings.h> #include <strings.h>
#endif #endif
#if (defined (STDC_HEADERS) || defined (__GNU_LIBRARY__)) #if (defined (STDC_HEADERS) || defined (__GNU_LIBRARY__) || defined(CIRCLE_MAC_OS))
#include <stdlib.h> #include <stdlib.h>
#else /* No standard headers. */ #else /* No standard headers. */
@@ -88,9 +106,8 @@
#endif #endif
extern char *malloc(), *calloc(), *realloc(); extern char *malloc(), *calloc(), *realloc();
extern void free (); extern void free();
extern void abort(), exit();
extern void abort (), exit ();
#endif /* Standard headers. */ #endif /* Standard headers. */
@@ -150,9 +167,11 @@ extern void abort (), exit ();
#include <sys/errno.h> #include <sys/errno.h>
#endif #endif
#ifndef CIRCLE_MAC_OS
#ifdef HAVE_CRYPT_H #ifdef HAVE_CRYPT_H
#include <crypt.h> #include <crypt.h>
#endif #endif
#endif
#ifdef TIME_WITH_SYS_TIME #ifdef TIME_WITH_SYS_TIME
# include <sys/time.h> # include <sys/time.h>
@@ -434,9 +453,11 @@ struct in_addr {
char *strerror(int errnum); char *strerror(int errnum);
#endif #endif
#ifndef CIRCLE_MAC_OS
#ifdef NEED_STRLCPY_PROTO #ifdef NEED_STRLCPY_PROTO
size_t strlcpy(char *dest, const char *src, size_t copylen); size_t strlcpy(char *dest, const char *src, size_t copylen);
#endif #endif
#endif
#ifdef NEED_SYSTEM_PROTO #ifdef NEED_SYSTEM_PROTO
int system(const char *string); int system(const char *string);

View File

@@ -12,7 +12,6 @@
#include "conf.h" #include "conf.h"
#include "sysdep.h" #include "sysdep.h"
#define NOWHERE -1 /* nil reference for room-database */ #define NOWHERE -1 /* nil reference for room-database */
/* The cardinal directions: used as index to room_data.dir_option[] */ /* The cardinal directions: used as index to room_data.dir_option[] */
@@ -22,14 +21,17 @@
#define WEST 3 #define WEST 3
#define UP 4 #define UP 4
#define DOWN 5 #define DOWN 5
#define NORTHWEST 6
#define NORTHEAST 7
#define SOUTHEAST 8
#define SOUTHWEST 9
#define NUM_OF_DIRS 6 #define NUM_OF_DIRS 10
#define CREATE(result, type, number) do {\ #define CREATE(result, type, number) do {\
if (!((result) = (type *) calloc ((number), sizeof(type))))\ if (!((result) = (type *) calloc ((number), sizeof(type))))\
{ perror("malloc failure"); abort(); } } while(0) { perror("malloc failure"); abort(); } } while(0)
/* Exit info: used in room_data.dir_option.exit_info */ /* Exit info: used in room_data.dir_option.exit_info */
#define EX_ISDOOR (1 << 0) /* Exit is a door */ #define EX_ISDOOR (1 << 0) /* Exit is a door */
#define EX_CLOSED (1 << 1) /* The door is closed */ #define EX_CLOSED (1 << 1) /* The door is closed */
@@ -45,7 +47,7 @@ typedef unsigned short int ush_int;
typedef char bool; typedef char bool;
typedef char byte; typedef char byte;
typedef sh_int room_num; typedef int room_num;
typedef sh_int obj_num; typedef sh_int obj_num;
@@ -133,13 +135,14 @@ struct room_data {
struct room_data *world = NULL; /* array of rooms */ struct room_data *world = NULL; /* array of rooms */
int top_of_world = 0; /* ref to top element of world */ int top_of_world = 0; /* ref to top element of world */
int rec_count = 0;
/* local functions */ /* local functions */
char *fread_string(FILE * fl, char *error); char *fread_string(FILE * fl, char *error);
void setup_dir(FILE * fl, int room, int dir); void setup_dir(FILE * fl, int room, int dir);
void index_boot(char *name); void index_boot(int cnt, char **name);
void discrete_load(FILE * fl); void discrete_load(FILE * fl);
void parse_room(FILE * fl, int virtual_nr); void parse_room(FILE * fl, int virtual_nr);
void parse_mobile(FILE * mob_f, int nr); void parse_mobile(FILE * mob_f, int nr);
@@ -150,7 +153,7 @@ void write_output(void);
char *dir_names[] = char *dir_names[] =
{"North", "East", "South", "West", "Up", "Down"}; {"North", "East", "South", "West", "Up", "Down","North West","North East","South East","South West"};
/************************************************************************* /*************************************************************************
@@ -160,14 +163,12 @@ char *dir_names[] =
/* body of the booting system */ /* body of the booting system */
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
if (argc != 2) { if (argc < 2) {
fprintf(stderr, "Usage: %s <world-file-name>\n", argv[0]); fprintf(stderr, "Usage: %s <world-file-name(s)>\n", argv[0]);
exit(1); exit(1);
} }
index_boot(argv[1]);
log("Renumbering rooms."); index_boot(argc,argv);
renum_world();
log("Writing output."); log("Writing output.");
write_output(); write_output();
@@ -176,6 +177,21 @@ int main(int argc, char **argv)
return (0); return (0);
} }
/* Since the world is loaded into memory by index
* and not room number, we need to search through
* all rooms and return the correct one. This is
* used to generate door information (ie: the name)
*/
struct room_data* findRoom(int nr)
{
int i;
for (i=0;i<rec_count;i++)
if (world[i].number==nr)
return &world[i];
return NULL;
}
void write_output(void) void write_output(void)
{ {
@@ -184,11 +200,22 @@ void write_output(void)
char buf[128]; char buf[128];
register int door, found; register int door, found;
for (i = 0; i <= top_of_world; i++) { for (i=0;i<rec_count;i++) {
//print the record number, but no linefeed.
fprintf(stderr, "Record: %d ",i);
if (world[i].name == NULL) {
//linefeed the prior record since we're skipping this one.
log("");
//the name is blank, which means, most likely, the record is bad as well.
continue;
}
sprintf(buf, "Writing %d.html", world[i].number); sprintf(buf, "Writing %d.html", world[i].number);
log(buf); log(buf);
sprintf(buf, "%d.html", world[i].number); //for some reason, if you use %d with sprintf it rolls over like its 16bit,
//but only if you use the buffer with fopen.
//using %ld and casting to long solves this in case someone really wants
//to use negative room numbers.
sprintf(buf, "%ld.html",(long)world[i].number);
if (!(fl = fopen(buf, "w"))) { if (!(fl = fopen(buf, "w"))) {
perror("opening output file"); perror("opening output file");
exit(1); exit(1);
@@ -203,18 +230,22 @@ void write_output(void)
found = 0; found = 0;
for (door = 0; door < NUM_OF_DIRS; door++) for (door = 0; door < NUM_OF_DIRS; door++)
if (world[i].dir_option[door] && if (world[i].dir_option[door] &&
world[i].dir_option[door]->to_room != NOWHERE) { world[i].dir_option[door]->to_room != NOWHERE) {
found = 1; found = 1;
fprintf(fl, "<a href = \"%d.html\"> %s to %s</a> <p>\n", //this call gets a pointer to the room referenced by the to_room for the door.
world[world[i].dir_option[door]->to_room].number, //This fixes a lot of issues introduced with the whole 'renumbering rooms' call
dir_names[door], //and the binary search that didn't work well.
world[world[i].dir_option[door]->to_room].name); struct room_data* to_room = findRoom(world[i].dir_option[door]->to_room);
fprintf(fl, "<a href = \"%d.html\"> %s to %s</a> <p>\n",
to_room->number,
dir_names[door],
to_room->name);
} }
if (!found) if (!found)
fprintf(fl, "None!"); fprintf(fl, "None!");
fclose(fl); fclose(fl);
} }
} }
/* function to count how many hash-mark delimited records exist in a file */ /* function to count how many hash-mark delimited records exist in a file */
int count_hash_records(FILE * fl) int count_hash_records(FILE * fl)
@@ -231,19 +262,35 @@ int count_hash_records(FILE * fl)
void index_boot(char *name) void index_boot(int cnt, char **names)
{ {
FILE *db_file; FILE *db_file;
int rec_count = 0;
if (!(db_file = fopen(name, "r"))) { //throw first entry away as that is the executable.
perror("error opening world file"); for (int i=1;i<cnt;i++) {
exit(1); if (!(db_file = fopen(names[i], "r"))) {
perror("error opening world file");
exit(1);
}
//have to loop through files twice.
//once to get total record count
//second time to load them
rec_count += count_hash_records(db_file);
fclose(db_file);
} }
rec_count = count_hash_records(db_file); sprintf(buf,"Total records: %d\n",rec_count);
log(buf);
//now that we know how many records in total
//we can create the memory structure
CREATE(world, struct room_data, rec_count); CREATE(world, struct room_data, rec_count);
rewind(db_file); //now loop through files and load them
discrete_load(db_file); for (int i=1;i<cnt;i++) {
if (!(db_file = fopen(names[i], "r"))) {
perror("error opening world file");
exit(1);
}
discrete_load(db_file);
}
} }
@@ -257,6 +304,9 @@ void discrete_load(FILE * fl)
fprintf(stderr, "Format error after room #%d\n", nr); fprintf(stderr, "Format error after room #%d\n", nr);
exit(1); exit(1);
} }
if (*line == 'T') //Toss triggers. THey currently break this util.
continue;
if (*line == '$') if (*line == '$')
return; return;
@@ -394,22 +444,6 @@ void setup_dir(FILE * fl, int room, int dir)
} }
/* resolve all vnums into rnums in the world */
void renum_world(void)
{
register int room, door;
for (room = 0; room <= top_of_world; room++)
for (door = 0; door < NUM_OF_DIRS; door++)
if (world[room].dir_option[door])
if (world[room].dir_option[door]->to_room != NOWHERE)
world[room].dir_option[door]->to_room =
real_room(world[room].dir_option[door]->to_room,
world[room].number);
}
/************************************************************************* /*************************************************************************
* procedures for resetting, both play-time and boot-time * * procedures for resetting, both play-time and boot-time *
*********************************************************************** */ *********************************************************************** */
@@ -464,32 +498,6 @@ char *fread_string(FILE * fl, char *error)
/* returns the real number of the room with given virtual number */
int real_room(int virtual, int reference)
{
int bot, top, mid;
bot = 0;
top = top_of_world;
/* perform binary search on world-table */
for (;;) {
mid = (bot + top) / 2;
if ((world + mid)->number == virtual)
return (mid);
if (bot >= top) {
fprintf(stderr, "Room %d does not exist in database (referenced in room %d)\n", virtual, reference);
return (-1);
}
if ((world + mid)->number > virtual)
top = mid - 1;
else
bot = mid + 1;
}
}
/* get_line reads the next non-blank line off of the input stream. /* get_line reads the next non-blank line off of the input stream.
* The newline character is removed from the input. Lines which begin * The newline character is removed from the input. Lines which begin
* with '*' are considered to be comments. * with '*' are considered to be comments.