93 Commits

Author SHA1 Message Date
f6c8c764ca patch for Grenzland zone
Some checks failed
C/C++ CI / build (push) Has been cancelled
2026-01-27 23:26:30 +01:00
94b9b69eec commit after restart 2026-01-26 23:35:20 +01:00
f6cbe30c10 Merge pull request 'grenzland-region' (#3) from agroschim/grenzland-mud:grenzland-region into master
Some checks failed
C/C++ CI / build (push) Has been cancelled
Reviewed-on: #3
2026-01-26 20:58:06 +01:00
agroschim
1127cb5d3e Bugfix in trigger #49100
Some checks failed
C/C++ CI / build (pull_request) Has been cancelled
2026-01-22 21:24:17 +01:00
60c28bbfee merge upstream
Some checks failed
C/C++ CI / build (pull_request) Has been cancelled
2026-01-22 21:03:28 +01:00
agroschim
168bdc20b7 First level of the library dungeon 2026-01-22 21:01:22 +01:00
1433fb4145 not needed
Some checks failed
C/C++ CI / build (push) Has been cancelled
2026-01-22 17:32:38 +01:00
b38e0deaf8 test
Some checks failed
C/C++ CI / build (push) Has been cancelled
2026-01-22 17:31:23 +01:00
agroschim
cd6d42146b Added more rooms to the Grenzland Building 2026-01-22 17:24:20 +01:00
1a6953dc9f Merge branch 'master' of https://gitea.wilderland.ovh/kyonshi/grenzland-mud
Some checks failed
C/C++ CI / build (push) Has been cancelled
2026-01-22 12:25:26 +01:00
9b9bb8eab5 moving stuff around 2026-01-22 12:23:29 +01:00
agroschim
6fb926bd21 Made the shops work
Some checks failed
C/C++ CI / build (pull_request) Has been cancelled
2026-01-20 21:32:00 +01:00
agroschim
237948350d Restructured the zone and fleshed out the Grenzland Building. 2026-01-20 20:13:49 +01:00
agroschim
7ab0918c9c Add the first rooms of the Grenzland Building in Midgaard 2026-01-20 18:41:24 +01:00
b1844be82d Update README.md
Some checks failed
C/C++ CI / build (push) Has been cancelled
2026-01-20 16:14:59 +01:00
8fd4d5b234 Merge branch 'master' of https://gitea.wilderland.ovh/kyonshi/grenzland-mud
Some checks failed
C/C++ CI / build (push) Has been cancelled
2026-01-20 16:13:41 +01:00
5ac7427a6f Merge branch 'grenzland' 2026-01-20 16:11:17 +01:00
37ba5ea608 yep
Some checks failed
C/C++ CI / build (pull_request) Has been cancelled
2026-01-20 01:03:20 +01:00
agroschim
1678f66809 Initial commit 2026-01-19 21:29:53 +01:00
e0083e3767 Update README.md
Some checks failed
C/C++ CI / build (push) Has been cancelled
2026-01-16 17:40:31 +01:00
8125d736c9 new branch Grenzland 2026-01-16 13:31:28 +01:00
c8e9cd8dc6 Update README.md
Some checks failed
C/C++ CI / build (push) Has been cancelled
2026-01-16 13:27:16 +01:00
44a7ac0308 changes to text files
Some checks failed
C/C++ CI / build (push) Has been cancelled
2026-01-16 13:24:46 +01:00
Thomas Arp
4e1680db1a KAIZEN remove webster from CMakeLists.txt (#158) 2025-11-07 23:53:23 +01:00
Thomas Arp
f6339b495e Feature/clang tidy (#154)
* First cmake list file, simple docs.

TODO: utils folder.

* Support for building utils

* All fields except HAVE_DOPRNT in place

* Now builds and runs :)

* Added support for clang-tidy, if available.
2025-07-02 22:34:57 +02:00
Thomas Arp
3e0c1ccc18 Support cmake (#153)
* First cmake list file, simple docs.

TODO: utils folder.

* Support for building utils

* All fields except HAVE_DOPRNT in place

* Now builds and runs :)
2025-07-02 22:23:10 +02:00
Thomas Arp
b9d84fc325 Make sure %target% also works in act triggers and code cleanup (#152)
* Make sure %target% works in act triggers

* code cleanup. Remove inline block, make variable names more understandable.

Ref https://www.tbamud.com/forum/4-development/4525-confused-over-piece-of-code-in-parse-room
2025-07-02 22:22:36 +02:00
Thomas Arp
bdaca46e79 Added a new trigger type for mobs, called "Damage", that triggers every (#151)
time the mob is harmed, through any means.

Valid return values: 
-1: prevents damage from occurring. Will also prevent a fight from
starting.
0: forces a miss.
>0 : the damage the mob will endure.

Available variables:
%actor%: the one doing the damage
%victim%: typically the same as %self% - the one being attacked
%damage%: the damage inflicted. Always a non-negative number.
%attacktype%: The attack type. Will be UNDEFINED when hitting with a
weapon.
2025-07-02 22:22:17 +02:00
Thomas Arp
f1794521cf Feature/issue 141 immort where (#142)
* perform_immort_where and print_object_location rewritten to handle paging.

Fixes #141

* A little more info in immort where now we have more space for output.

Fixes #141

* Added PRF_VERBOSE for toggling long output in where command.

Fixes #141

* Also toggle headers in `where x` depending on verbose-pref.

Fixes #141
2025-07-02 22:21:14 +02:00
Thomas Arp
89eb009c4f Remove webster lookup since it no longer works (#99)
* removed useless util/webster.c and fixed a couple of potential buffer overruns in the util functions

* removed stray utf-8 error chars. I guess someone has used an editor with fancy 's

* removed last webster integrations
2025-07-02 22:18:40 +02:00
Thomas Arp
9a0a096f85 Merge remote-tracking branch 'refs/remotes/origin/master' 2025-07-02 21:27:07 +02:00
Thomas Arp
ba7dc7bf6f convert docs files to utf-8 2025-07-02 21:26:19 +02:00
Thomas Arp
558e71eed8 ignore .idea from clion IDE 2025-07-02 21:25:34 +02:00
Marthammor
a4af23538f Add MTTS support (#150)
MTTS support - thanks to marthammer for the patch
2025-06-28 23:58:14 +02:00
Thomas Arp
b471ff195e avoid freeing obj_proto[].name. (#149)
fixes #148
2025-05-06 23:15:06 +02:00
Rumble
392f3d90b8 Staying ahead of the power curve 2025-04-16 12:24:37 -07:00
Thomas Arp
be8de64cf8 fix buffer overrun act.informative.c (#146)
Ref https://www.tbamud.com/kunena/4-development/5636-bug-in-do-toggle-in-act-informative-c#10540

Thanks to Ironfist for the fix
2025-02-19 21:18:39 +01:00
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
Rumble
68dd901943 Updated for 2021 release 2021-03-06 15:50:00 +00:00
Noah Cunningham
547c7ddccf Fix for pointer in fread() db.c to fix Raspberry Pi load issue (#97)
This corrects an issue encountered when loading world information on the Raspberry Pi. Sometimes, there is a ~ stored in the memory location in front of tmp char array. The for loop will decrement below the starting memory address, making it read the ~ and think it's at the end of the room, causing an error and preventing the MUD from loading.

This change checks the memory address of tmp, ensuring it is > the starting memory address before decrementing it in the for() loop. Then, the if/else checks to ensure the carriage return and newline are properly placed to prevent duplication.
2020-11-16 12:36:04 -05:00
MBourne
dceb563a9b Bug/drink containers (#94)
* Bugfix for name_from_drinkcon

* Newline at end of utils.c
2020-06-07 08:52:22 -04:00
Thomas Arp
c0fb6f8a71 Correct log message for strange room flags (#88)
Thanks to Cunning on the tba board for the bug report
https://www.tbamud.com/forum/4-development/4548-db-c-typo-in-parse-rooms#8633
2020-04-16 20:12:34 -04:00
Thomas Arp
1f520546b2 Merge pull request #84 from tbamud/crash-bug-in-object-drop-script
Crash bug in object drop script
2020-03-08 23:57:15 +01:00
Thomas Arp
6fede208d2 Gcc 9.2.1 warnings (#87)
* Make sure all followers are free'd before freeing the character list

Otherwise, the followers structs will point to free'd memory and
the stop_follower call will attempt to dereference a free'd
characters' followers list.

* fix gcc warning: truncation in strncat

In file included from /usr/include/string.h:494,
from sysdep.h:74,
from act.item.c:12:
In function ‘strncat’,
inlined from ‘name_from_drinkcon’ at act.item.c:804:5,
inlined from ‘name_from_drinkcon’ at act.item.c:769:6:
/usr/include/x86_64-linux-gnu/bits/string_fortified.h:136:10: warning: ‘__builtin_strncat’ output truncated before terminating nul copying as many bytes from a string as its length [-Wstringop-truncation]
136 | return __builtin___strncat_chk (__dest, __src, __len, __bos (__dest));
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
act.item.c: In function ‘name_from_drinkcon’:
act.item.c:797:16: note: length computed here
797 | cpylen = strlen(cur_name);
| ^~~~~~~~~~~~~~~~

* Whitespace cleanup before bugfix

* Fix warnings for gcc-9.2.1

Also, fixed an ancient FIXME and a known bad strcat usage.

spell_parser.c: In function ‘say_spell’:
spell_parser.c:135:75: warning: ‘%s’ directive output may be truncated writing up to 255 bytes into a region of size 216 [-Wformat-truncation=]
135 | snprintf(buf1, sizeof(buf1), "$n stares at you and utters the words, '%s'.",
| ^~
In file included from /usr/include/stdio.h:867,
from sysdep.h:69,
from spell_parser.c:12:
/usr/include/x86_64-linux-gnu/bits/stdio2.h:67:10: note: ‘__builtin___snprintf_chk’ output between 43 and 298 bytes into a destination of size 256
2020-03-08 08:33:59 -04:00
Thomas Arp
fc223452e8 Fix typo in previous commit.
Also, inline lookup functions if possible.
2020-03-07 23:24:32 +01:00
Thomas Arp
a60f0eefb8 Minor bugfix in code that should be unreachable.
We already log that we update, but no update was taking place.
2020-03-07 23:22:01 +01:00
Thomas Arp
53870eba5d Added further failsafes to prevent dereferencing free'd objects
"obj" variable is not updated here, so we must lookup to see if it has
been free'd in script_driver().

Fixes #83
2020-03-01 01:27:57 +01:00
Thomas Arp
d5a11618f1 Remove crash bug when purging a dropped item in a wtrigger.
We're leveraging the lookup table, because it's a safer way
to see if an object has been free'd than looking at the object
itself (which while it may work may just as well fail).

Fixes #83
2020-03-01 01:19:06 +01:00
Thomas Arp
140cdc5d22 Merge branch 'master' of github.com:tbamud/tbamud 2020-02-29 14:33:30 +01:00
Thomas Arp
eb650c2811 GitHub issues 78 79 81 num aff flags off by one (#82)
* Make sure all followers are free'd before freeing the character list

Otherwise, the followers structs will point to free'd memory and
the stop_follower call will attempt to dereference a free'd
characters' followers list.

* https://github.com/tbamud/tbamud/issues/79 typo

* https://github.com/tbamud/tbamud/issues/81 nullpointer crash on syntax check run

* NUM_AFF_FLAGS fix.

Now, consistently, the NUM_AFF_FLAGS is used in the same way as other
NUM_* variables. Specifically, the the number is consistent with
how others are defined - 1 above the highest in the list.

I would like to have removed the need to start from 1 instead of 0
as well, but the loading mechanism, and thus potentially a lot of
existing object files, use 0 as a marker for "no flags set", and
we can't easily fix that. So, the places we loop through the list,
we still need to make sure we're stying within the [1;NUM_AFF_FLAGS) interval.

Simultaneously, I've checked over the other flags, and it seems like
the usage is pretty consistent there.

Fixes https://github.com/tbamud/tbamud/issues/78
2020-02-25 18:39:29 -05:00
Thomas Arp
4f875db90e Merge branch 'master' of github.com:tbamud/tbamud 2020-02-25 22:46:53 +01:00
Thomas Arp
7f0acefcb4 Confusing code fix (#76)
* Make sure all followers are free'd before freeing the character list

Otherwise, the followers structs will point to free'd memory and
the stop_follower call will attempt to dereference a free'd
characters' followers list.

* Make sure %target% works in act triggers

* code cleanup. Remove inline block, make variable names more understandable.

Ref https://www.tbamud.com/forum/4-development/4525-confused-over-piece-of-code-in-parse-room
2020-01-26 16:19:10 -05:00
Thomas Arp
28ca86645b Merge branch 'master' of github.com:tbamud/tbamud 2020-01-26 21:43:08 +01:00
Thomas Arp
1ab51a0545 Make sure all followers are free'd before freeing the character list (#75)
Otherwise, the followers structs will point to free'd memory and
the stop_follower call will attempt to dereference a free'd
characters' followers list.
2020-01-19 08:44:21 -05:00
Thomas Arp
bf31d98414 Make sure all followers are free'd before freeing the character list
Otherwise, the followers structs will point to free'd memory and
the stop_follower call will attempt to dereference a free'd
characters' followers list.
2020-01-19 14:40:33 +01:00
Rumble
934d83b829 Updating for 2020 release.
Merge branch 'master' of https://github.com/tbamud/tbamud
2020-01-14 20:08:23 +01:00
Thomas Arp
462807d9e8 Fixes for w-format-truncation. Also, export of zones work again on linux (#74) 2020-01-10 19:28:09 -05:00
127 changed files with 5252 additions and 1692 deletions

8
.clang-tidy Normal file
View File

@@ -0,0 +1,8 @@
Checks: >
-*,
clang-analyzer-*,
bugprone-*,
performance-*,
portability-*
#WarningsAsErrors: '*'
HeaderFilterRegex: 'src/.*'

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

87
.gitignore vendored
View File

@@ -10,3 +10,90 @@ src/util/Makefile
src/.accepted src/.accepted
src/depend src/depend
src/util/depend src/util/depend
build/*
# 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
#don't commit logs
!log/*
!syslog.CRASH
# also not autogenerated config file
/lib/etc/config
# or the list of last logins
/lib/etc/last
# or mail
lib/etc/plrmail
#or time
lib/etc/time
# test object files, etc
src/test/depend
src/test/*.o
src/test/testfile
# ide etc.
.vscode
.project
.settings
.idea
.cproject
# macOS generated files
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db

407
CMakeLists.txt Normal file
View File

@@ -0,0 +1,407 @@
cmake_minimum_required(VERSION 3.12)
project(TbaMUD C)
set(CMAKE_C_STANDARD 99)
# Include checker modules
include(CheckFunctionExists)
include(CheckIncludeFile)
include(CheckTypeSize)
include(CheckStructHasMember)
include(CheckSymbolExists)
include(CheckCSourceCompiles)
# Output paths
set(BIN_OUTPUT_DIR ${CMAKE_SOURCE_DIR}/bin)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${BIN_OUTPUT_DIR})
# Include source and build paths
include_directories(src ${CMAKE_BINARY_DIR})
# ========== Compiler flags ==========
if (CMAKE_COMPILER_IS_GNUCC)
include(CheckCCompilerFlag)
check_c_compiler_flag(-Wall SUPPORTS_WALL)
check_c_compiler_flag(-Wno-char-subscripts SUPPORTS_WNO_CHAR_SUBSCRIPTS)
if (SUPPORTS_WALL)
set(MYFLAGS "-Wall")
if (SUPPORTS_WNO_CHAR_SUBSCRIPTS)
set(MYFLAGS "${MYFLAGS} -Wno-char-subscripts")
endif()
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${MYFLAGS}")
endif()
endif()
# clang-tidy if available
find_program(CLANG_TIDY_EXE NAMES clang-tidy)
if(CLANG_TIDY_EXE AND STATIC_ANALYSIS)
message(STATUS "clang-tidy enabled: ${CLANG_TIDY_EXE}")
set(CMAKE_C_CLANG_TIDY "${CLANG_TIDY_EXE}")
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
else()
message(WARNING "clang-tidy not found. Static analysis disabled.")
endif()
# ========== Header checks ==========
check_include_file("fcntl.h" HAVE_FCNTL_H)
check_include_file("errno.h" HAVE_ERRNO_H)
check_include_file("string.h" HAVE_STRING_H)
check_include_file("strings.h" HAVE_STRINGS_H)
check_include_file("limits.h" HAVE_LIMITS_H)
check_include_file("sys/select.h" HAVE_SYS_SELECT_H)
check_include_file("sys/wait.h" HAVE_SYS_WAIT_H)
check_include_file("sys/types.h" HAVE_SYS_TYPES_H)
check_include_file("unistd.h" HAVE_UNISTD_H)
check_include_file("memory.h" HAVE_MEMORY_H)
check_include_file("assert.h" HAVE_ASSERT_H)
check_include_file("arpa/telnet.h" HAVE_ARPA_TELNET_H)
check_include_file("arpa/inet.h" HAVE_ARPA_INET_H)
check_include_file("sys/stat.h" HAVE_SYS_STAT_H)
check_include_file("sys/socket.h" HAVE_SYS_SOCKET_H)
check_include_file("sys/resource.h" HAVE_SYS_RESOURCE_H)
check_include_file("netinet/in.h" HAVE_NETINET_IN_H)
check_include_file("netdb.h" HAVE_NETDB_H)
check_include_file("signal.h" HAVE_SIGNAL_H)
check_include_file("sys/uio.h" HAVE_SYS_UIO_H)
check_include_file("mcheck.h" HAVE_MCHECK_H)
check_include_file("stdlib.h" HAVE_STDLIB_H)
check_include_file("stdarg.h" HAVE_STDARG_H)
check_include_file("float.h" HAVE_FLOAT_H)
if (HAVE_STDLIB_H AND HAVE_STDARG_H AND HAVE_STRING_H AND HAVE_FLOAT_H)
set(STDC_HEADERS 1)
endif()
# macros
macro(check_run_return_value CODE EXPECTED_RESULT VAR_NAME)
set(_file "${CMAKE_BINARY_DIR}/check_run_${VAR_NAME}.c")
file(WRITE "${_file}" "${CODE}")
try_run(_run_result _compile_result
${CMAKE_BINARY_DIR} ${_file}
)
if (_compile_result EQUAL 0 AND _run_result EQUAL ${EXPECTED_RESULT})
set(${VAR_NAME} TRUE)
else()
set(${VAR_NAME} FALSE)
endif()
endmacro()
# ========== Function checks ==========
foreach(FUNC gettimeofday select snprintf strcasecmp strdup strerror
stricmp strlcpy strncasecmp strnicmp strstr vsnprintf vprintf
inet_addr inet_aton)
string(TOUPPER "${FUNC}" _upper_name)
check_function_exists(${FUNC} HAVE_${_upper_name})
endforeach()
if (NOT HAVE_VPRINTF)
check_function_exists(_doprnt HAVE_DOPRNT)
endif()
# ========== Type checks ==========
check_type_size("pid_t" HAVE_PID_T)
check_type_size("size_t" HAVE_SIZE_T)
check_type_size("ssize_t" HAVE_SSIZE_T)
set(CMAKE_EXTRA_INCLUDE_FILES "sys/socket.h")
check_type_size("socklen_t" HAVE_SOCKLEN_T)
unset(CMAKE_EXTRA_INCLUDE_FILES)
if (NOT HAVE_PID_T)
set(pid_t int)
endif()
if (NOT HAVE_SIZE_T)
set(size_t "unsigned")
endif()
if (NOT HAVE_SSIZE_T)
set(ssize_t int)
endif()
if (NOT HAVE_SOCKLEN_T)
set(socklen_t int)
endif()
# ========== const ==========
check_c_source_compiles("
int main() {
/* Ultrix mips cc rejects this. */
typedef int charset[2]; const charset x;
/* SunOS 4.1.1 cc rejects this. */
char const *const *ccp;
char **p;
/* NEC SVR4.0.2 mips cc rejects this. */
struct point {int x, y;};
static struct point const zero = {0,0};
/* AIX XL C 1.02.0.0 rejects this.
It does not let you subtract one const X* pointer from another in an arm
of an if-expression whose if-part is not a constant expression */
const char *g = \"string\";
ccp = &g + (g ? g-g : 0);
/* HPUX 7.0 cc rejects these. */
++ccp;
p = (char**) ccp;
ccp = (char const *const *) p;
{ /* SCO 3.2v4 cc rejects this. */
char *t;
char const *s = 0 ? (char *) 0 : (char const *) 0;
*t++ = 0;
}
{ /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */
int x[] = {25, 17};
const int *foo = &x[0];
++foo;
}
{ /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
typedef const int *iptr;
iptr p = 0;
++p;
}
{ /* AIX XL C 1.02.0.0 rejects this saying
\"k.c\", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
struct s { int j; const int *ap[3]; };
struct s *b; b->j = 5;
}
{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
const int foo = 10;
}
; return 0; }
" HAVE_CONST)
if (HAVE_CONST)
set(CONST_KEYWORD const)
else()
set(CONST_KEYWORD "")
endif()
# ========== Struct checks ==========
if (HAVE_NETINET_IN_H)
check_struct_has_member("struct in_addr" s_addr netinet/in.h HAVE_STRUCT_IN_ADDR)
endif()
# ========== crypt()/libcrypt ==========
find_library(CRYPT_LIBRARY crypt)
if (CRYPT_LIBRARY)
message(STATUS "Found libcrypt: ${CRYPT_LIBRARY}")
list(APPEND EXTRA_LIBS ${CRYPT_LIBRARY})
set(_saved_lib_list ${CMAKE_REQUIRED_LIBRARIES})
set(CMAKE_REQUIRED_LIBRARIES ${CRYPT_LIBRARY})
check_include_file("crypt.h" HAVE_CRYPT_H)
check_function_exists(crypt CIRCLE_CRYPT)
check_run_return_value("
#include <string.h>
#include <unistd.h>
${HAVE_CRYPT_H} ? \"#include <crypt.h>\" : \"\"
int main(void)
{
char pwd[11], pwd2[11];
strncpy(pwd, (char *)crypt(\"FooBar\", \"BazQux\"), 10);
pwd[10] = '\\\\0';
strncpy(pwd2, (char *)crypt(\"xyzzy\", \"BazQux\"), 10);
pwd2[10] = '\\\\0';
if (strcmp(pwd, pwd2) == 0)
exit(0);
exit(1);
}
" 0 HAVE_UNSAFE_CRYPT)
set(CMAKE_REQUIRED_LIBRARIES ${_saved_lib_list})
endif()
# ========== network libs ==========
check_function_exists(gethostbyaddr HAVE_GETHOSTBYADDR)
if (NOT HAVE_GETHOSTBYADDR)
message(STATUS "gethostbyaddr() not available, trying nsllib")
find_library(NSL_LIBRARY nsl)
if (NSL_LIBRARY)
message(STATUS "...nsllib found.")
list(APPEND EXTRA_LIBS ${NSL_LIBRARY})
endif()
endif()
check_function_exists(socket HAVE_SOCKET)
if (NOT HAVE_SOCKET)
message(STATUS "socket() not available, trying socketlib")
find_library(SOCKET_LIBRARY socket)
if (SOCKET_LIBRARY)
message(STATUS "...socketlib found")
list(APPEND EXTRA_LIBS ${SOCKET_LIBRARY})
endif()
endif()
# ========== time.h needs special treatment ==========
check_include_file("sys/time.h" HAVE_SYS_TIME_H)
check_include_file("sys/time.h" HAVE_TIME_H)
if (HAVE_SYS_TIME_H AND HAVE_TIME_H)
check_c_source_compiles("
#include <sys/types.h>
#include <sys/time.h>
#include <time.h>
int main() {
struct tm *tp;
; return 0; }
" TIME_WITH_SYS_TIME)
endif()
# ========== Determine return value of signal() ==========
check_c_source_compiles("
#include <signal.h>
int handler(int sig) { return 0; }
int main() {
signal(SIGINT, handler);
return 1;
}
" SIGNAL_RETURNS_INT FAIL_REGEX ".*incompatible pointer type.*")
check_c_source_compiles("
#include <signal.h>
void handler(int sig) { }
int main() {
signal(SIGINT, handler);
return 1;
}
" SIGNAL_RETURNS_VOID FAIL_REGEX ".*incompatible pointer type.*")
if (SIGNAL_RETURNS_INT)
message(STATUS "signal() returns int.")
set(RETSIGTYPE int)
elseif (SIGNAL_RETURNS_VOID)
message(STATUS "signal() returns void.")
set(RETSIGTYPE void)
else()
message(FATAL_ERROR "Could not determine return value from signal handler.")
endif()
# ========== Define general UNIX-system ==========
if (UNIX)
set(CIRCLE_UNIX 1)
endif()
set(PROTO_FUNCTIONS
accept
bind
gettimeofday
atoi
atol
bzero
chdir
close
fclose
fcntl
fflush
fprintf
fputc
fread
fscanf
fseek
fwrite
getpeername
getpid
getrlimit
getsockname
htonl
htons
inet_addr
inet_aton
inet_ntoa
listen
ntohl
perror
printf
qsort
read
remove
rewind
select
setitimer
setrlimit
setsockopt
snprintf
sprintf
sscanf
strcasecmp
strdup
strerror
stricmp
strlcpy
strncasecmp
strnicmp
system
time
unlink
vsnprintf
write
socket
)
configure_file(
${CMAKE_SOURCE_DIR}/src/conf.h.cmake.in
${CMAKE_BINARY_DIR}/tmp_conf.h
)
macro(check_function_prototype FUNCTION)
set(_code "
#define NO_LIBRARY_PROTOTYPES
#define __COMM_C__
#define __ACT_OTHER_C__
#include \"${CMAKE_BINARY_DIR}/tmp_conf.h\"
#include \"${CMAKE_SOURCE_DIR}/src/sysdep.h\"
#ifdef ${FUNCTION}
error - already defined!
#endif
void ${FUNCTION}(int a, char b, int c, char d, int e, char f, int g, char h);
int main() {
; return 0; }
")
string(TOUPPER "${FUNCTION}" _upper_name)
check_c_source_compiles("${_code}" NEED_${_upper_name}_PROTO FAIL_REGEX ".*incompatible pointer type.*")
if (NEED_${_upper_name}_PROTO)
message(STATUS "${FUNCTION}() has no prototype, NEED_${_upper_name}_PROTO set!")
else()
message(STATUS "${FUNCTION}() has a prototype, not setting NEED_${_upper_name}_PROTO")
endif()
endmacro()
foreach (FUNC ${PROTO_FUNCTIONS})
check_function_prototype(${FUNC})
endforeach()
# ========== Generate conf.h ==========
configure_file(
${CMAKE_SOURCE_DIR}/src/conf.h.cmake.in
${CMAKE_BINARY_DIR}/conf.h
)
# ========== Source-filer ==========
file(GLOB SRC_FILES src/*.c)
# ========== Bygg kjørbar ==========
add_executable(circle ${SRC_FILES})
target_link_libraries(circle ${EXTRA_LIBS})
add_subdirectory(src/util)
if (MEMORY_DEBUG)
message(STATUS "MEMORY_DEBUG is activated, setting up zmalloc")
target_compile_definitions(circle PRIVATE MEMORY_DEBUG)
endif()

View File

@@ -1,3 +1,5 @@
Files for tbaMUD.
Files for Grenzland-MUD
Files for grenzland-mud, forked from tbamud

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

@@ -1,7 +1,7 @@
Updated: Apr 2007 Updated: Apr 2007
tbaMUD README tbaMUD README
------------- -------------
All requests for help or bugs should be reported to: builderacademy.net 9091. All requests for help or bugs should be reported to: tbamud.com 9091.
Information about CircleMUD can be found at the CircleMUD Home Page and FTP: Information about CircleMUD can be found at the CircleMUD Home Page and FTP:
http://www.circlemud.org http://www.circlemud.org

93
doc/README.CMAKE.md Normal file
View File

@@ -0,0 +1,93 @@
Updated 2025-04
## Building TbaMUD with the cmake tool
# Building with CMake
This document describes how to configure, build and install tbamud
from source code using the CMake build tool. To build with CMake, you of
course first have to install CMake. The minimum required version of CMake is
specified in the file `CMakeLists.txt` found in the top of the tbamud source
tree. Once the correct version of CMake is installed you can follow the
instructions below for the platform you are building on.
CMake builds can be configured either from the command line, or from one of
CMake's GUIs.
NOTE: The current CMakeLists.txt only supports linux.
# Configuring
A CMake configuration of tbamud is similar to the autotools build of curl.
It consists of the following steps after you have unpacked the source.
We recommend building with CMake on Windows.
## Using `cmake`
You can configure for in source tree builds or for a build tree
that is apart from the source tree.
- Build in a separate directory (parallel to the source tree in this
example). The build directory is created for you. This is recommended over
building in the source tree to separate source and build artifacts.
```shell
$ cmake -B build -S .
```
- Build in the source tree. Not recommended.
```shell
$ cmake -B .
```
The examples below will assume you have created a build folder.
The above commands will generate the build files. If you need to regenerate
the files, you can delete the cmake cache file, and rerun the above command:
```shell
$ rm build/CMakeCache.txt
```
Once the build files are generated, the build is run with cmake
```shell
$ cmake --build build
```
This will generate the object files in a subdirectory under the specified
build folder and link the executable. The resulting binaries will be in the
bin/ folder.
### Utilities
It is possible to build only single tools, none or all of them,
by specifying the target in the build command:
```shell
# only build the mud
$ cmake --build build --target circle
# only build tools
$ cmake --build build --target utils
# only build one tool
$ cmake --build build --target wld2html
```
### Debugging memory
In case you want to run the mud with memory debugging turned on, you
can set the MEMORY_DEBUG flag during configuration by specifying the
flag:
```shell
$ cmake -B build -S . -DMEMORY_DEBUG:int=1
$ cmake --build build
```
When the mud is shut down, the zmalloc code will identify any leaks in your code.
Note that memory debugging may consume quite a lot of memory and take some time
to be handled on shutdown.

21
doc/README.MSVC2022 Normal file
View File

@@ -0,0 +1,21 @@
Updated: Apr 2025
Compiling CircleMUD under Microsoft Windows XP
using Microsoft Visual C++ 2022 (8.0)
### 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. Run this command in the root folder:
cmake -B build -S . -G "Visual Studio 17 2022"
3. Open `build/circle.sln` in Visual Studio.
4. Compile and run.

View File

@@ -24,7 +24,7 @@ Contents
1.1 Overview 1.1 Overview
The act() function is used to process and send strings of text to characters The act() function is used to process and send strings of text to characters
in a room. It can be used to send the same basic string to a number of in a room. It can be used to send the same basic string to a number of
characters filling in certain segments designated by control characters characters filling in certain segments designated by control characters
in different ways, dependant on what each character can see and who each in different ways, dependant on what each character can see and who each
character is. Once the text string passed to the function has been parsed, it character is. Once the text string passed to the function has been parsed, it
is capitalized and a newline is added to its tail. is capitalized and a newline is added to its tail.
@@ -38,17 +38,17 @@ struct obj_data *obj, const void *vict_obj, int type)
These pieces are used as follows: These pieces are used as follows:
str: This is the basic string, a null terminated character array, including str: This is the basic string, a null terminated character array, including
control characters (see section 1.4 on Control Characters), to be sent to control characters (see section 1.4 on Control Characters), to be sent to
characters designated by the targets. characters designated by the targets.
hide_invisible: A TRUE or FALSE value indicating whether or not to hide the hide_invisible: A TRUE or FALSE value indicating whether or not to hide the
entire output from any characters that cannot see the “performing character”. entire output from any characters that cannot see the “performing character”.
ch: The “performing character”. This is the character that the output string ch: The “performing character”. This is the character that the output string
is associated with. The character is used to determine the room for the output is associated with. The character is used to determine the room for the output
of the action in question. of the action in question.
obj: An object (an actual item obj_data) used in the course of the action. obj: An object (an actual item obj_data) used in the course of the action.
vict_obj: This can be either a character involved in the action, another vict_obj: This can be either a character involved in the action, another
object, or even a predefined string of text. object, or even a predefined string of text.
@@ -73,7 +73,7 @@ The next parameter vict_objcan be a number of things ranging from a game object
null terminated character array (char *). null terminated character array (char *).
Do note, however, that obj and vict_obj are both ignored if there is no control Do note, however, that obj and vict_obj are both ignored if there is no control
character reference (see section 1.4 Control Characters) to them and the type character reference (see section 1.4 Control Characters) to them and the type
is set to TO_ROOM or TO_CHAR. In these cases, NULL should be supplied as the is set to TO_ROOM or TO_CHAR. In these cases, NULL should be supplied as the
input to the function. input to the function.
@@ -96,7 +96,7 @@ TO_CHAR: Finally, this option sends the output to the ch.
TO_SLEEP: This is a special option that must be combined with one of the above TO_SLEEP: This is a special option that must be combined with one of the above
options. It tells act() that the output is to be sent even to characters that options. It tells act() that the output is to be sent even to characters that
are sleeping. It is combined with a bitwise or. i.e. TO_VICT | TO_SLEEP. are sleeping. It is combined with a bitwise or. i.e. TO_VICT | TO_SLEEP.
When the string has been parsed, it is capitalized and a newline is added. When the string has been parsed, it is capitalized and a newline is added.
@@ -105,20 +105,20 @@ In a manner similar to the printf() family of functions, act() uses control
characters. However, instead of using the % symbol, act() uses the $ character characters. However, instead of using the % symbol, act() uses the $ character
to indicate control characters. to indicate control characters.
$n Write name, short description, or “someone”, for ch, depending on whether $n Write name, short description, or “someone”, for ch, depending on whether
ch is a PC, a NPC, or an invisible PC/NPC. ch is a PC, a NPC, or an invisible PC/NPC.
$N Like $n, except insert the text for vict_obj.* $N Like $n, except insert the text for vict_obj.*
$m “him,” “her,” or “it,” depending on the gender of ch. $m “him,” “her,” or “it,” depending on the gender of ch.
$M Like $m, for vict_obj.* $M Like $m, for vict_obj.*
$s “his,” “her,”or “it,” depending on the gender of ch. $s “his,” “her,”or “it,” depending on the gender of ch.
$S Like $s, for vict_obj.* $S Like $s, for vict_obj.*
$e “he,” “she,” “it,” depending on the gender of ch. $e “he,” “she,” “it,” depending on the gender of ch.
$E Like $e, for vict_obj.* $E Like $e, for vict_obj.*
$o Name or “something” for obj, depending on visibility. $o Name or “something” for obj, depending on visibility.
$O Like $o, for vict_obj.* $O Like $o, for vict_obj.*
$p Short description or “something” for obj. $p Short description or “something” for obj.
$P Like $p for vict_obj.* $P Like $p for vict_obj.*
$a “an” or“a”, depending on the first character of objs name. $a “an” or“a”, depending on the first character of objs name.
$A Like $a, for vict_obj.* $A Like $a, for vict_obj.*
$T Prints the string pointed to by vict_obj.* $T Prints the string pointed to by vict_obj.*
$F Processes the string pointed to by vict_obj with the fname() function prior $F Processes the string pointed to by vict_obj with the fname() function prior
@@ -129,7 +129,7 @@ no action is taken.
$U Processes the buffer and uppercases the first letter of the following word $U Processes the buffer and uppercases the first letter of the following word
(the word immediately after to the control code). If there is no following (the word immediately after to the control code). If there is no following
word, no action is taken. word, no action is taken.
$$ Print the character $. $$ Print the character $.
NOTE*: vict_obj must be a pointer of type struct char_data *. NOTE*: vict_obj must be a pointer of type struct char_data *.

View File

@@ -9,8 +9,8 @@ to players in color in the tbaMUD game engine. Its intended audience is for
Coders of tbaMUD. Coders of tbaMUD.
tbaMUD allows you to create colorful messages by using ANSI control sequences. tbaMUD allows you to create colorful messages by using ANSI control sequences.
Each player may select what “level” of color he/she desires from the four Each player may select what “level” of color he/she desires from the four
levels “off,” “brief,” “normal,” and “complete.” Each player can select his/her levels “off,” “brief,” “normal,” and “complete.” Each player can select his/her
color level by using the TOGGLE COLOR command from within the MUD; you as the color level by using the TOGGLE COLOR command from within the MUD; you as the
programmer must decide which messages will be colored for each of the color programmer must decide which messages will be colored for each of the color
levels. levels.
@@ -21,17 +21,17 @@ All files in which you wish to use color must have the line:
This should be put in after all other includes in the beginning of the file. This should be put in after all other includes in the beginning of the file.
There are 8 colors available “normal,” red, green, yellow, blue, magenta, There are 8 colors available “normal,” red, green, yellow, blue, magenta,
cyan and white. They are accessible by sending control sequences as part of cyan and white. They are accessible by sending control sequences as part of
another string, for example: another string, for example:
sprintf(buf, "If youre %shappy%s and you know it clap " sprintf(buf, "If youre %shappy%s and you know it clap "
"%d of your hands.\n\r", x, y, num_of_hands); "%d of your hands.\n\r", x, y, num_of_hands);
send_to_char(ch, buf); send_to_char(ch, buf);
In this example, x and y are the “on” and “off” sequences for the color you In this example, x and y are the “on” and “off” sequences for the color you
want. There are 2 main series of color macros available for you to use (dont want. There are 2 main series of color macros available for you to use (dont
actually use “x” and “y,” of course!): the K series and the CC series. The CC actually use “x” and “y,” of course!): the K series and the CC series. The CC
(Conditional Color) series is recommended for most general use. (Conditional Color) series is recommended for most general use.
The name of the actual sequence starts with the name of its series, plus a The name of the actual sequence starts with the name of its series, plus a
@@ -51,21 +51,21 @@ CCBLU() (arguments defined below).
The K series requires no arguments, and is simply a macro to the ANSI color The K series requires no arguments, and is simply a macro to the ANSI color
code. Therefore, if you use a K-series color code, the color will ALWAYS be code. Therefore, if you use a K-series color code, the color will ALWAYS be
sent, even if the person youre sending it to has color off. This can very bad. sent, even if the person youre sending it to has color off. This can very bad.
Some people who do not have ANSI-compatible terminals will see garbage Some people who do not have ANSI-compatible terminals will see garbage
characters instead of colors. If the terminal correctly ignores ANSI color characters instead of colors. If the terminal correctly ignores ANSI color
codes, then nothing will show up on their screen at all. The K series is mainly codes, then nothing will show up on their screen at all. The K series is mainly
used to print colors to a string if the players color level will later be used to print colors to a string if the players color level will later be
tested manually (for an example, see do_gen_com in act.comm.c). tested manually (for an example, see do_gen_com in act.comm.c).
The recommended series is the CC series (i.e. CCNRM(), CCRED(), etc.) The CC The recommended series is the CC series (i.e. CCNRM(), CCRED(), etc.) The CC
series macros require two arguments a pointer to the character to whom the series macros require two arguments a pointer to the character to whom the
string is being sent, and the minimum color level the player must be set to in string is being sent, and the minimum color level the player must be set to in
order to see the color. Color sent as 'brief' (formerly known as sparse it was order to see the color. Color sent as 'brief' (formerly known as sparse it was
changed for consistency with the syslog command) (C_SPR) will be seen by people changed for consistency with the syslog command) (C_SPR) will be seen by people
with color set to sparse, normal, or complete; color sent as normal (C_NRM) with color set to sparse, normal, or complete; color sent as normal (C_NRM)
will be seen only by people with color set to normal or complete; color sent as will be seen only by people with color set to normal or complete; color sent as
complete (C_CMP) will be seen only by people with color set to complete. complete (C_CMP) will be seen only by people with color set to complete.
To illustrate the above, an example is in order: To illustrate the above, an example is in order:
@@ -76,29 +76,29 @@ ACMD(do_showcolor)
{ {
char buf[300]; char buf[300];
sprintf(buf, "Dont you just love %scolor%s, %scolor%s, " "%sCOLOR%s!\n\r", sprintf(buf, "Dont you just love %scolor%s, %scolor%s, " "%sCOLOR%s!\n\r",
CCBLU(ch, C_CMP), CCNRM(ch, C_CMP), CCYEL(ch, C_NRM), CCNRM(ch, C_NRM), CCBLU(ch, C_CMP), CCNRM(ch, C_CMP), CCYEL(ch, C_NRM), CCNRM(ch, C_NRM),
CCRED(ch, C_SPR), CCNRM(ch, C_SPR)); CCRED(ch, C_SPR), CCNRM(ch, C_SPR));
send_to_char(ch, buf); send_to_char(ch, buf);
} }
What does this do? For people with color set to Complete, it prints: What does this do? For people with color set to Complete, it prints:
Dont you just love color, color, COLOR! (blue) (yellow) (red) Dont you just love color, color, COLOR! (blue) (yellow) (red)
People who have color set to Normal will see: People who have color set to Normal will see:
Dont you just love color, color, COLOR! (yellow) (red) Dont you just love color, color, COLOR! (yellow) (red)
People who have color set to Sparse will see: People who have color set to Sparse will see:
Dont you just love color, color, COLOR! (red) Dont you just love color, color, COLOR! (red)
People who have color set to Off will see: People who have color set to Off will see:
Dont you just love color, color, COLOR! (no color, as youd expect) Dont you just love color, color, COLOR! (no color, as youd expect)
There are several common pitfalls with using the CC series of color macros: There are several common pitfalls with using the CC series of color macros:
Do not confuse CCNRM with C_NRM. CCNRM() is a macro to turn the color back to Do not confuse CCNRM with C_NRM. CCNRM() is a macro to turn the color back to
normal; C_NRMis a color level of “normal.” Always make sure that every pair of normal; C_NRMis a color level of “normal.” Always make sure that every pair of
“on” and “off” codes are at the same color level. For example: “on” and “off” codes are at the same color level. For example:
WRONG: sprintf(buf, "%sCOLOR%s\n\r", CCBLU(ch, C_NRM), CCNRM(ch, C_CMP)); WRONG: sprintf(buf, "%sCOLOR%s\n\r", CCBLU(ch, C_NRM), CCNRM(ch, C_CMP));
@@ -110,14 +110,14 @@ WRONG: sprintf(buf, "%sCOLOR%s\n\r", CCBLU(ch, C_CMP), CCNRM(ch, C_NRM));
The above statement is also wrong, although not as bad. In this case, someone The above statement is also wrong, although not as bad. In this case, someone
with color set to Normal will (correctly) not get the CCBLU code, but will then with color set to Normal will (correctly) not get the CCBLU code, but will then
unnecessarily get the CCNRM code. Never send a color code if you dont have to. unnecessarily get the CCNRM code. Never send a color code if you dont have to.
The codes are several bytes long, and cause a noticeable pause at 2400 baud. The codes are several bytes long, and cause a noticeable pause at 2400 baud.
This should go without saying, but dont ever send color at the C_OFF level. This should go without saying, but dont ever send color at the C_OFF level.
Special precautions must be taken when sending a colored string to a large Special precautions must be taken when sending a colored string to a large
group of people. You cant use the color level of “ch” (the person sending the group of people. You cant use the color level of “ch” (the person sending the
string) each person receiving the string must get a string appropriately string) each person receiving the string must get a string appropriately
colored for his/her level. In such cases, it is usually best to set up two colored for his/her level. In such cases, it is usually best to set up two
strings (one colored and one not), and test each players color level strings (one colored and one not), and test each players color level
individually (see do_gen_comin act.comm.c for an example). individually (see do_gen_comin act.comm.c for an example).

View File

@@ -4,14 +4,14 @@ Builder Academy at telnet://tbamud.com:9091 or email rumble@tbamud.com -- Rumble
The Art of Debugging The Art of Debugging
Originally by Michael Chastain and Sammy Originally by Michael Chastain and Sammy
The following documentation is excerpted from Merc 2.0s hacker.txt file. It The following documentation is excerpted from Merc 2.0s hacker.txt file. It
was written by Furey of MERC Industries and is included here with his was written by Furey of MERC Industries and is included here with his
permission. We have packaged it with tbaMUD (changed in a couple of places, permission. We have packaged it with tbaMUD (changed in a couple of places,
such as specific filenames) because it offers good advice and insight into the such as specific filenames) because it offers good advice and insight into the
art and science of software engineering. More information about tbaMUD, art and science of software engineering. More information about tbaMUD,
can be found at the tbaMUD home page http://tbamud.com. can be found at the tbaMUD home page http://tbamud.com.
1 “Im running a Mud so I can learn C programming!” 1 “Im running a Mud so I can learn C programming!”
Yeah, right. The purpose of this document is to record some of our knowledge, Yeah, right. The purpose of this document is to record some of our knowledge,
experience and philosophy. No matter what your level, we hope that this experience and philosophy. No matter what your level, we hope that this
@@ -31,11 +31,11 @@ Play with it some more.
Read documentation again. Read documentation again.
Get the idea? Get the idea?
The idea is that your mind can accept only so much “new data” in a single The idea is that your mind can accept only so much “new data” in a single
session. Playing with something doesnt introduce very much new data, but it session. Playing with something doesnt introduce very much new data, but it
does transform data in your head from the “new” category to the “familiar” does transform data in your head from the “new” category to the “familiar”
category. Reading documentation doesnt make anything “familiar,” but it category. Reading documentation doesnt make anything “familiar,” but it
refills your “new” hopper. refills your “new” hopper.
Most people, if they even read documentation in the first place, never return Most people, if they even read documentation in the first place, never return
to it. They come to a certain minimum level of proficiency and then never to it. They come to a certain minimum level of proficiency and then never
@@ -47,17 +47,17 @@ through the two-step learning cycle many times to master it.
man gives you online manual pages. man gives you online manual pages.
grep stands for “global regular expression print;” searches for strings in text grep stands for “global regular expression print;” searches for strings in text
files. files.
vi, emacs, jove use whatever editor floats your boat, but learn the hell out vi, emacs, jove use whatever editor floats your boat, but learn the hell out
of it; you should know every command in your editor. of it; you should know every command in your editor.
ctags mags “tags” for your editor which allows you to go to functions by name ctags mags “tags” for your editor which allows you to go to functions by name
in any source file. in any source file.
>, >>, <, | input and output redirection at the command line; get someone to >, >>, <, | input and output redirection at the command line; get someone to
show you, or dig it out of “man csh” show you, or dig it out of “man csh”
These are the basic day-in day-out development tools. Developing without These are the basic day-in day-out development tools. Developing without
knowing how to use all of these well is like driving a car without knowing knowing how to use all of these well is like driving a car without knowing
@@ -70,21 +70,21 @@ the hypothesis, run the program and provide it experimental input, observe its
behavior, and confirm or refute the hypothesis. behavior, and confirm or refute the hypothesis.
A good hypothesis is one which makes surprising predictions which then come A good hypothesis is one which makes surprising predictions which then come
true; predictions that other hypotheses dont make. true; predictions that other hypotheses dont make.
The first step in debugging is not to write bugs in the first place. This The first step in debugging is not to write bugs in the first place. This
sounds obvious, but sadly, is all too often ignored. sounds obvious, but sadly, is all too often ignored.
If you build a program, and you get any errors or any warnings, you should fix If you build a program, and you get any errors or any warnings, you should fix
them before continuing. C was designed so that many buggy ways of writing code them before continuing. C was designed so that many buggy ways of writing code
are legal, but will draw warnings from a suitably smart compiler (such as “gcc” are legal, but will draw warnings from a suitably smart compiler (such as “gcc”
with the -Wall flag enabled). It takes only minutes to check your warnings and with the -Wall flag enabled). It takes only minutes to check your warnings and
to fix the code that generates them, but it takes hours to find bugs otherwise. to fix the code that generates them, but it takes hours to find bugs otherwise.
“Desk checking” (proof reading) is almost a lost art these days. Too bad. You “Desk checking” (proof reading) is almost a lost art these days. Too bad. You
should desk check your code before even compiling it, and desk-check it again should desk check your code before even compiling it, and desk-check it again
periodically to keep it fresh in mind and find new errors. If you have someone periodically to keep it fresh in mind and find new errors. If you have someone
in your group whose only job it is to desk-check other peoples code, that in your group whose only job it is to desk-check other peoples code, that
person will find and fix more bugs than everyone else combined. person will find and fix more bugs than everyone else combined.
One can desk-check several hundred lines of code per hour. A top-flight One can desk-check several hundred lines of code per hour. A top-flight
@@ -95,20 +95,20 @@ fixing technique. Compare that to all the hours you spend screwing around with
broken programs trying to find one bug at a time. broken programs trying to find one bug at a time.
The next technique beyond desk-checking is the time-honored technique of The next technique beyond desk-checking is the time-honored technique of
inserting “print” statements into the code, and then watching the logged inserting “print” statements into the code, and then watching the logged
values. Within tbaMUD code, you can call printf(), fprintf(), or log()to dump values. Within tbaMUD code, you can call printf(), fprintf(), or log()to dump
interesting values at interesting times. Where and when to dump these values interesting values at interesting times. Where and when to dump these values
is an art, which you will learn only with practice. is an art, which you will learn only with practice.
If you dont already know how to redirect output in your operating system, now If you dont already know how to redirect output in your operating system, now
is the time to learn. On Unix, type the command “man csh”, and read the part is the time to learn. On Unix, type the command “man csh”, and read the part
about the “>” operator. You should also learn the difference between “standard about the “>” operator. You should also learn the difference between “standard
output” (for example, output from “printf”) and “standard error” (for example, output” (for example, output from “printf”) and “standard error” (for example,
output from “fprintf(stderr, ...)”). output from “fprintf(stderr, ...)”).
Ultimately, you cannot fix a program unless you understand how it is operating Ultimately, you cannot fix a program unless you understand how it is operating
in the first place. Powerful debugging tools will help you collect data, but in the first place. Powerful debugging tools will help you collect data, but
they cant interpret it, and they cant fix the underlying problems. Only you they cant interpret it, and they cant fix the underlying problems. Only you
can do that. can do that.
When you find a bug... your first impulse will be to change the code, kill the When you find a bug... your first impulse will be to change the code, kill the
@@ -117,9 +117,9 @@ observe is often just the symptom of a deeper bug. You should keep pursuing the
bug, all the way down. You should grok the bug and cherish it in fullness bug, all the way down. You should grok the bug and cherish it in fullness
before causing its discorporation. before causing its discorporation.
Also, when finding a bug, ask yourself two questions: “What design and Also, when finding a bug, ask yourself two questions: “What design and
programming habits led to the introduction of the bug in the first place?” And: programming habits led to the introduction of the bug in the first place?” And:
“What habits would systematically prevent the introduction of bugs like this?” “What habits would systematically prevent the introduction of bugs like this?”
5 Debugging: Tools 5 Debugging: Tools
@@ -127,20 +127,20 @@ When a Unix process accesses an invalid memory location, or (more rarely)
executes an illegal instruction, or (even more rarely) something else goes executes an illegal instruction, or (even more rarely) something else goes
wrong, the Unix operating system takes control. The process is incapable of wrong, the Unix operating system takes control. The process is incapable of
further execution and must be killed. Before killing the process, however, the further execution and must be killed. Before killing the process, however, the
operating system does something for you: it opens a file named “core” and operating system does something for you: it opens a file named “core” and
writes the entire data space of the process into it. writes the entire data space of the process into it.
Thus, “dumping core” is not a cause of problems, or even an effect of problems. Thus, “dumping core” is not a cause of problems, or even an effect of problems.
Its something the operating system does to help you find fatal problems which Its something the operating system does to help you find fatal problems which
have rendered your process unable to continue. have rendered your process unable to continue.
One reads a “core” file with a debugger. The two most popular debuggers on Unix One reads a “core” file with a debugger. The two most popular debuggers on Unix
are adb and gdb, although occasionally one finds dbx. Typically one starts a are adb and gdb, although occasionally one finds dbx. Typically one starts a
debugger like this: “gdb bin/circle” or “gdb bin/circle lib/core”. debugger like this: “gdb bin/circle” or “gdb bin/circle lib/core”.
The first thing, and often the only thing, you need to do inside the debugger The first thing, and often the only thing, you need to do inside the debugger
is take a stack trace. In adb, the command for this is “$c”. In gdb, the is take a stack trace. In adb, the command for this is “$c”. In gdb, the
command is “backtrace”. In dbx, the command is “where”. The stack trace will command is “backtrace”. In dbx, the command is “where”. The stack trace will
tell you what function your program was in when it crashed, and what functions tell you what function your program was in when it crashed, and what functions
were calling it. The debugger will also list the arguments to these functions. were calling it. The debugger will also list the arguments to these functions.
Interpreting these arguments, and using more advanced debugger features, Interpreting these arguments, and using more advanced debugger features,
@@ -343,12 +343,12 @@ new tools.
7 Profiling 7 Profiling
Another useful technique is “profiling,” to find out where your program is Another useful technique is “profiling,” to find out where your program is
spending most of its time. This can help you to make a program more efficient. spending most of its time. This can help you to make a program more efficient.
Here is how to profile a program: Here is how to profile a program:
1. Remove all the .o files and the “circle” executable: 1. Remove all the .o files and the “circle” executable:
make clean make clean
2. Edit your Makefile, and change the PROFILE=line: 2. Edit your Makefile, and change the PROFILE=line:
@@ -359,25 +359,25 @@ make
4. Run circle as usual. Shutdown the game with the shutdown command when you 4. Run circle as usual. Shutdown the game with the shutdown command when you
have run long enough to get a good profiling base under normal usage have run long enough to get a good profiling base under normal usage
conditions. If you crash the game, or kill the process externally, you wont conditions. If you crash the game, or kill the process externally, you wont
get profiling information. get profiling information.
5. Run the profcommand: 5. Run the profcommand:
prof bin/circle > prof.out prof bin/circle > prof.out
6. Read prof.out. Run “man prof” to understand the format of the output. For 6. Read prof.out. Run “man prof” to understand the format of the output. For
advanced profiling, you can use “PROFILE = -pg” in step 2, and use the “gprof” advanced profiling, you can use “PROFILE = -pg” in step 2, and use the “gprof”
command in step 5. The “gprof” form of profiling gives you a report which lists command in step 5. The “gprof” form of profiling gives you a report which lists
exactly how many times any function calls any other function. This information exactly how many times any function calls any other function. This information
is valuable for debugging as well as performance analysis. is valuable for debugging as well as performance analysis.
Availability of “prof” and “gprof” varies from system to system. Almost every Availability of “prof” and “gprof” varies from system to system. Almost every
Unix system has “prof”. Only some systems have “gprof”. Unix system has “prof”. Only some systems have “gprof”.
7 Books for Serious Programmers 7 Books for Serious Programmers
Out of all the thousands of books out there, three stand out: Out of all the thousands of books out there, three stand out:
Kernighan and Plaugher, “The Elements of Programming Style” Kernighan and Plaugher, “The Elements of Programming Style”
Kernighan and Ritchie, “The C Programming Language” Kernighan and Ritchie, “The C Programming Language”
Brooks, “The Mythical Man Month” Brooks, “The Mythical Man Month”

View File

@@ -3,7 +3,7 @@ Builder Academy at telnet://tbamud.com:9091 or email rumble@tbamud.com -- Rumble
tbaMUD File Manifest tbaMUD File Manifest
The main tbaMUD/ directory has the following subdirectories and files: The main tbaMUD/ directory has the following subdirectories and files:
autorun - Shell script to run the MUD (./autorun &). autorun - Shell script to run the MUD (./autorun &).
FAQ - Frequently Aske Questions with answers. FAQ - Frequently Aske Questions with answers.
@@ -16,7 +16,7 @@ lib/ - MUD data.
log/ - System logs. log/ - System logs.
src/ - Source code. src/ - Source code.
The bin/directory contains only binaries: circle (the main MUD) and its The bin/directory contains only binaries: circle (the main MUD) and its
utilities, which are described in utils.txt. utilities, which are described in utils.txt.
The doc/ directory has its own README file, describing the contents of each The doc/ directory has its own README file, describing the contents of each
@@ -51,12 +51,12 @@ time - Where the MUD time is saved.
The lib/misc/ directory contains the following files: The lib/misc/ directory contains the following files:
bugs - Bugs reported by players with the bug command. bugs - Bugs reported by players with the bug command.
ideas - Ideas from players from idea command. ideas - Ideas from players from idea command.
messages - Spell and skill damage messages. messages - Spell and skill damage messages.
socials - Text file with text of the socials. socials - Text file with text of the socials.
socials.new - New format of socials you can edit via AEDIT. socials.new - New format of socials you can edit via AEDIT.
typos - Typos reported by players with the typo command. typos - Typos reported by players with the typo command.
xnames - Text file of invalid names. xnames - Text file of invalid names.
The lib/plrobjs/ contains the following files and directories: The lib/plrobjs/ contains the following files and directories:
@@ -80,18 +80,18 @@ zzz/
The lib/text/ directory contains the following files: The lib/text/ directory contains the following files:
background - Background story (for option 3 from main menu). background - Background story (for option 3 from main menu).
credits - Text for credits command. credits - Text for credits command.
greetings - Greeting message. greetings - Greeting message.
handbook - Text for Immortal Handbook (handbook command). handbook - Text for Immortal Handbook (handbook command).
immlist - Text for immlist command. immlist - Text for immlist command.
imotd - Immortal MOTD --seen by immortals on login. imotd - Immortal MOTD --seen by immortals on login.
info - Text for info command. info - Text for info command.
motd - MOTD --seen by mortals on login. motd - MOTD --seen by mortals on login.
news - Text for news command. news - Text for news command.
policies - Text for policy command. policies - Text for policy command.
wizlist - Text for wizlist command. wizlist - Text for wizlist command.
/help/screen - Text for help command as a mortal with no arguments. /help/screen - Text for help command as a mortal with no arguments.
/help/iscreen - Text for help command an an immortal with no arguments. /help/iscreen - Text for help command an an immortal with no arguments.
The lib/world/directory contains the following subdirectories: The lib/world/directory contains the following subdirectories:
@@ -103,8 +103,8 @@ wld - Contains *.wld files (world files)
zon - Contains *.zon files (zone files) zon - Contains *.zon files (zone files)
Each of the 6 subdirectories in the lib/world/ directory also contains two Each of the 6 subdirectories in the lib/world/ directory also contains two
additional files one called index, which specifies which files in that additional files one called index, which specifies which files in that
directory should be loaded when the MUD boots, and index.mini, which directory should be loaded when the MUD boots, and index.mini, which
specifies which files should be loaded if the MUD is booted with the -m specifies which files should be loaded if the MUD is booted with the -m
(mini-mud) option. (mini-mud) option.
@@ -128,6 +128,6 @@ trigger - Trigedit log messages.
usage - Mud system usage (player load & memory usage info). usage - Mud system usage (player load & memory usage info).
The src/ directory contains all of the C and header files for the MUD, along The src/ directory contains all of the C and header files for the MUD, along
with a Makefile. The src/util/ directory contains source for tbaMUDs utility with a Makefile. The src/util/ directory contains source for tbaMUDs utility
programs. See admin.txt for more information on how to compile the MUD. See programs. See admin.txt for more information on how to compile the MUD. See
utils.txt for more information on how to use tbaMUDs utilities. utils.txt for more information on how to use tbaMUDs utilities.

View File

@@ -9,16 +9,16 @@ every platform that exists. This document is for experienced programmers
trying to make tbaMUD work on their platform. trying to make tbaMUD work on their platform.
tbaMUD should work on most UNIX platforms without any modifications; simply run tbaMUD should work on most UNIX platforms without any modifications; simply run
the “configure” script and it should automatically detect what type of system the “configure” script and it should automatically detect what type of system
you have and anything that may be strange about it. These findings are all you have and anything that may be strange about it. These findings are all
stored in a header file called conf.h which is created in the src directory stored in a header file called conf.h which is created in the src directory
from a template called conf.h.in. A Makefile is also created from the template from a template called conf.h.in. A Makefile is also created from the template
Makefile.in. Makefile.in.
Non-UNIX platforms are a problem. Some cant run tbaMUD at all. However, any Non-UNIX platforms are a problem. Some cant run tbaMUD at all. However, any
multitasking OS that has an ANSI C compiler, and supports non-blocking I/O and multitasking OS that has an ANSI C compiler, and supports non-blocking I/O and
socket-based TCP/IP networking, should theoretically be able to run tbaMUD; for socket-based TCP/IP networking, should theoretically be able to run tbaMUD; for
example, OS/2, AmigaOS, Mac OS (Classic versions; Mac OS X supports tbaMUDs example, OS/2, AmigaOS, Mac OS (Classic versions; Mac OS X supports tbaMUDs
configure script from the command line), and all versions of Windows. configure script from the command line), and all versions of Windows.
The port can be very easy or very difficult, depending mainly on whether or nor The port can be very easy or very difficult, depending mainly on whether or nor
@@ -26,7 +26,7 @@ your OS supports the Berkeley socket API.
The general steps for porting tbaMUD to a non-UNIX platform are listed below. A The general steps for porting tbaMUD to a non-UNIX platform are listed below. A
number of tips for porting can be found after the porting steps. Note that we number of tips for porting can be found after the porting steps. Note that we
have already ported tba to Windows, so if youre confused as to how to perform have already ported tba to Windows, so if youre confused as to how to perform
some of these steps, you can look at what we have done as an example (see the some of these steps, you can look at what we have done as an example (see the
files README.CYGWIN). files README.CYGWIN).
@@ -36,11 +36,11 @@ trying to port the code.
Porting the Code Porting the Code
Step 1. Create a “conf.h” file for your system. Copy the template “conf.h.in” Step 1. Create a “conf.h” file for your system. Copy the template “conf.h.in”
to “conf.h”, and then define or undefine each item as directed by the comments to “conf.h”, and then define or undefine each item as directed by the comments
and based on the characteristics of your system. To write the conf.h file, and based on the characteristics of your system. To write the conf.h file,
youll need to know which header files are included with your system, the youll need to know which header files are included with your system, the
return type of signals, whether or not your compiler supports the const return type of signals, whether or not your compiler supports the const
keyword, and whether or not you have various functions such as crypt()and keyword, and whether or not you have various functions such as crypt()and
random(). Also, you can ignore the HAVE_LIBxxx and HAVE_xxx_PROTO constants at random(). Also, you can ignore the HAVE_LIBxxx and HAVE_xxx_PROTO constants at
the end of conf.h.in; they are not used in the code (they are part of UNIX the end of conf.h.in; they are not used in the code (they are part of UNIX
@@ -58,12 +58,12 @@ be in the source file comm.c.
Step 4. Test your changes! Make sure that multiple people can log in Step 4. Test your changes! Make sure that multiple people can log in
simultaneously and that they can all type commands at the same time. No player simultaneously and that they can all type commands at the same time. No player
should ever have a “frozen” screen just because another is waiting at a prompt. should ever have a “frozen” screen just because another is waiting at a prompt.
Leave the MUD up for at least 24 hours, preferably with people playing it, to Leave the MUD up for at least 24 hours, preferably with people playing it, to
make sure that your changes are stable. Make sure that automatic events such as make sure that your changes are stable. Make sure that automatic events such as
zone resets, point regeneration, and corpse decomposition are being timed zone resets, point regeneration, and corpse decomposition are being timed
correctly (a tick should be about 75 seconds). Try resetting all the zones correctly (a tick should be about 75 seconds). Try resetting all the zones
repeatedly by typing “zr *” many times. Play the MUD and make sure that the repeatedly by typing “zr *” many times. Play the MUD and make sure that the
basic commands (killing mobs as a mortal, casting spells, etc.) work correctly. basic commands (killing mobs as a mortal, casting spells, etc.) work correctly.
Step 5. If you are satisfied that your changes work correctly, you are Step 5. If you are satisfied that your changes work correctly, you are
@@ -71,20 +71,20 @@ encouraged to submit them to be included as part of the tbaMUD distribution so
that future releases of tbaMUD will support your platform. This prevents you that future releases of tbaMUD will support your platform. This prevents you
from re-porting the code every time a new version is released and allows other from re-porting the code every time a new version is released and allows other
people who use your platform to enjoy tbaMUD as well. To submit your changes people who use your platform to enjoy tbaMUD as well. To submit your changes
you must make a patch file using the GNU diff program. diff will create a you must make a patch file using the GNU diff program. diff will create a
patch file which can be later used with the patch utility to incorporate patch file which can be later used with the patch utility to incorporate
your changes into the stock tbaMUD distribution. For example, if you have a your changes into the stock tbaMUD distribution. For example, if you have a
copy of tbaMUD in the “stock-tba” directory, and your changes are in “my-tba”, copy of tbaMUD in the “stock-tba” directory, and your changes are in “my-tba”,
you can create a patch file like this: you can create a patch file like this:
diff -u --new-file --recursive stock-tba/src my-tba/src > patch diff -u --new-file --recursive stock-tba/src my-tba/src > patch
This will create a file called patch with your patches. You should then try This will create a file called patch with your patches. You should then try
to use the patch program (the inverse of diff) on a copy of tbaMUD to make to use the patch program (the inverse of diff) on a copy of tbaMUD to make
sure that tbaMUD is correctly changed to incorporate your patches. This step is sure that tbaMUD is correctly changed to incorporate your patches. This step is
very important: if you dont create these patches correctly, your work will be very important: if you dont create these patches correctly, your work will be
useless because no one will be able to figure out what you did! Make sure to useless because no one will be able to figure out what you did! Make sure to
read the documentation to diff and patch if you dont understand how to use read the documentation to diff and patch if you dont understand how to use
them. If your patches work, CELEBRATE!! them. If your patches work, CELEBRATE!!
Step 6. Write a README file for your operating system that describes everything Step 6. Write a README file for your operating system that describes everything
@@ -107,7 +107,7 @@ Each system to which tba is already ported has a CIRCLE_xx constant associated
with it: CIRCLE_UNIX for plain vanilla UNIX tbaMUD, CIRCLE_WINDOWS for MS with it: CIRCLE_UNIX for plain vanilla UNIX tbaMUD, CIRCLE_WINDOWS for MS
Windows, CIRCLE_OS2 for IBM OS/2, and CIRCLE_AMIGA for the Amiga. You must use Windows, CIRCLE_OS2 for IBM OS/2, and CIRCLE_AMIGA for the Amiga. You must use
a similar constant for your system. At the top of your conf.h, make sure to a similar constant for your system. At the top of your conf.h, make sure to
comment out “#define CIRCLE_UNIX” and add “#define CIRCLE_YOUR_SYSTEM”. comment out “#define CIRCLE_UNIX” and add “#define CIRCLE_YOUR_SYSTEM”.
3.2 ANSI C and GCC 3.2 ANSI C and GCC
As long as your system has an ANSI C compiler, all of the code (except for As long as your system has an ANSI C compiler, all of the code (except for
@@ -122,22 +122,22 @@ you use gcc.
Make absolutely sure to use non-blocking I/O; i.e. make sure to enable the Make absolutely sure to use non-blocking I/O; i.e. make sure to enable the
option so that the read() system call will immediately return with an error if option so that the read() system call will immediately return with an error if
there is no data available. If you do not use non-blocking I/O, read() will there is no data available. If you do not use non-blocking I/O, read() will
“block,” meaning it will wait infinitely for one particular player to type “block,” meaning it will wait infinitely for one particular player to type
something even if other players are trying to enter commands. If your system something even if other players are trying to enter commands. If your system
does not implement non-blocking I/O correctly, try using the does not implement non-blocking I/O correctly, try using the
POSIX_NONBLOCK_BROKEN constant in sysdep.h. POSIX_NONBLOCK_BROKEN constant in sysdep.h.
3.4 Timing 3.4 Timing
tbaMUD needs a fairly precise (on the order of 5 or 10 ms) timer in order to tbaMUD needs a fairly precise (on the order of 5 or 10 ms) timer in order to
correctly schedule events such as zone resets, point regeneration (“ticks”), correctly schedule events such as zone resets, point regeneration (“ticks”),
corpse decomposition, and other automatic tasks. If your system supports the corpse decomposition, and other automatic tasks. If your system supports the
select() system call with sufficient precision, the default timing code should select() system call with sufficient precision, the default timing code should
work correctly. If not, youll have to find out which system calls your system work correctly. If not, youll have to find out which system calls your system
supports for determining how much time has passed and replace the select() supports for determining how much time has passed and replace the select()
timing method. timing method.
3.5 Signals and Signal Handlers 3.5 Signals and Signal Handlers
A note about signals: Most systems dont support the concept of signals in the A note about signals: Most systems dont support the concept of signals in the
same way that UNIX does. Since signals are not a critical part of how tbaMUD same way that UNIX does. Since signals are not a critical part of how tbaMUD
works anyway (they are only used for updating the wizlist and some other works anyway (they are only used for updating the wizlist and some other
trivial things), all signal handling is turned off by default when compiling trivial things), all signal handling is turned off by default when compiling
@@ -147,7 +147,7 @@ conf.h file and all signal code will be ignored automatically.
4 Final Note 4 Final Note
IMPORTANT: Remember to keep any changes you make surrounded by #ifdef IMPORTANT: Remember to keep any changes you make surrounded by #ifdef
statements (i.e. “#ifdef CIRCLE_WINDOWS ... #endif”). If you make absolutely statements (i.e. “#ifdef CIRCLE_WINDOWS ... #endif”). If you make absolutely
sure to mark all of your changes with #ifdef statements, then your patches sure to mark all of your changes with #ifdef statements, then your patches
(once you get them to work) will be suitable for incorporation into the (once you get them to work) will be suitable for incorporation into the
tbaMUD distribution, meaning that tbaMUD will officially support your platform. tbaMUD distribution, meaning that tbaMUD will officially support your platform.

View File

@@ -10,6 +10,9 @@ 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 2020 release: January, 2020 Version 2020 release: January, 2020
Version 2019 release: January, 2019 Version 2019 release: January, 2019
Version 2018 release: January, 2018 Version 2018 release: January, 2018
@@ -140,7 +143,7 @@ communication channels
totally ignores all commands from that player until they are thawed. totally ignores all commands from that player until they are thawed.
--Even handier DELETE flag allows you to delete players on the fly. --Even handier DELETE flag allows you to delete players on the fly.
--"set" command (mentioned above) allows you to freeze/unfreeze/ --"set" command (mentioned above) allows you to freeze/unfreeze/
delete/siteok/un-siteok players --even if they arent logged in! delete/siteok/un-siteok players --even if they arent logged in!
--Bad password attempts are written to the system log and saved; --Bad password attempts are written to the system log and saved;
if someone tries to hack your account, you see "4 LOGIN FAILURES if someone tries to hack your account, you see "4 LOGIN FAILURES
SINCE LAST SUCCESSFUL LOGIN" next time you log on. SINCE LAST SUCCESSFUL LOGIN" next time you log on.

View File

@@ -110,12 +110,12 @@ is being specified. The command sort name is the shortest part of the command a
player must type for it to match. The hide-flag can be either 0 or 1; if 1, the player must type for it to match. The hide-flag can be either 0 or 1; if 1, the
social is hidden from OTHERS if they cannot see the character performing the social is hidden from OTHERS if they cannot see the character performing the
social. The action is not hidden from the VICTIM, even if s/he cannot see the social. The action is not hidden from the VICTIM, even if s/he cannot see the
character performing the social, although in such cases the characters name character performing the social, although in such cases the characters name
will, of course, be replaced with “someone”. The min positions should be set to will, of course, be replaced with “someone”. The min positions should be set to
dictate the minimum position a player must be in to target the victim and dictate the minimum position a player must be in to target the victim and
perform the social. Min level allows you to further customize who can use what perform the social. Min level allows you to further customize who can use what
socials.Where it makes sense to do so, text fields may be left empty. If socials.Where it makes sense to do so, text fields may be left empty. If
editing manually you should by put a # in the first column on the line. Aedit editing manually you should by put a # in the first column on the line. Aedit
does this automatically. does this automatically.
Examples: Examples:

View File

@@ -34,7 +34,7 @@ older CircleMUD data files to the versions used in CircleMUD v3, while others
are used to convert currently existing files into different formats. are used to convert currently existing files into different formats.
Overall, these utilities have been created in an attempt to make the tbaMUD Overall, these utilities have been created in an attempt to make the tbaMUD
administrators life a bit easier, and to give the administrator some ideas of administrators life a bit easier, and to give the administrator some ideas of
further and more grandiose utilities to create. Some are no longer applicable further and more grandiose utilities to create. Some are no longer applicable
but are retained as examples. but are retained as examples.
@@ -61,7 +61,7 @@ the second, and so forth.
The split utility is designed to split large world files into smaller, zone The split utility is designed to split large world files into smaller, zone
sized files that are easier to manage and maintain. The utility reads its input sized files that are easier to manage and maintain. The utility reads its input
from the standard input and writes the output to files with names specified from the standard input and writes the output to files with names specified
within the larger world file. This is done by inserting =filename into the within the larger world file. This is done by inserting =filename into the
world file at the appropriate points, where filename is the name of the file world file at the appropriate points, where filename is the name of the file
for the following section. for the following section.
@@ -141,8 +141,8 @@ The command line syntax for autowiz is as follows:
autowiz <wizlev> <wizlistfile> <immlev> <immlistfile> [pid to signal] autowiz <wizlev> <wizlistfile> <immlev> <immlistfile> [pid to signal]
where <wizlev> is equal to whatever LVL_GOD is set to in your tbaMUD server, where <wizlev> is equal to whatever LVL_GOD is set to in your tbaMUD server,
<wizlistfile> is the filename for the file containing the games Wizlist. <wizlistfile> is the filename for the file containing the games Wizlist.
<immlev> should be set to your games LVL_IMMORT, while <immlistfile> <immlev> should be set to your games LVL_IMMORT, while <immlistfile>
is the name of the Immlist file. is the name of the Immlist file.
This utility must be recompiled if you make any changes to the player file structure. This utility must be recompiled if you make any changes to the player file structure.

BIN
lib/etc/board.grenzland Normal file

Binary file not shown.

View File

@@ -2893,7 +2893,7 @@ $n looks at your $t and seems to think it could use a little trimming off the to
You look at $p and think it could use a little trimming off the top. You look at $p and think it could use a little trimming off the top.
$n looks at $p and seems to think it could use a little trimming off the top. $n looks at $p and seems to think it could use a little trimming off the top.
~halo halo 0 8 8 31 ~halo halo 0 8 8 1
You whip out the ol' halo. That should prove your innocence. You whip out the ol' halo. That should prove your innocence.
$n loads a halo and dons it. $n loads a halo and dons it.
$N could use a good disguise. $N could use a good disguise.
@@ -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,8 +1,10 @@
(lib/text/background) (lib/text/background)
There once was a guy who played MUDs The mists part and you find yourself in a
But the MUDs that he played were all duds world unlike the one you have just left.
"I'll write one," said he. Reality twisted and turned, and the land
And he brushed off his C. has found itself in a new configuration.
And soon played his game with his buds. Enter the borderland of reality and find
your own way.
In the Grenzland.

View File

@@ -1,7 +1,13 @@
T B A M U D
2 0 2 0
G R E N Z L A N D M U D
2 0 2 6
Based on tbaMUD, by The Builder Academy
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
By what name do you wish to be known?
Oh hero, by what name shall you wish to be known?

View File

@@ -865,7 +865,7 @@ AUTOQUESTS QUESTS QUESTMASTERS QUEST-MOBS QUESTMOBS
An autoquest is a quest that can be automatically started and completed An autoquest is a quest that can be automatically started and completed
without the intervention of an immortal. Simply visit a questmaster and join without the intervention of an immortal. Simply visit a questmaster and join
an available quest, and get rewarded on its completion. Keep an eye out for an available quest, and get rewarded on it's completion. Keep an eye out for
autoquests scattered throughout the World. autoquests scattered throughout the World.
See Also: QUEST-FLAG, QUESTPOINTS See Also: QUEST-FLAG, QUESTPOINTS
@@ -1584,7 +1584,6 @@ qedit (quest editor)
questpoints questpoints
buildwalk buildwalk
dig dig
tell m-w (an in game dictionary lookup)
gemote gemote
history history
file file
@@ -2444,25 +2443,6 @@ Example:
> diagnose doctor > diagnose doctor
See also: CONSIDER, HIT, KILL See also: CONSIDER, HIT, KILL
#0
DICTIONARY DICTIONARIES THESAURUS M-W.COM DEFINITION MERRIAM-WEBSTER M-W-DEFINITION WEBSTER MW TELL-M-W BREATHER SPELLING WORDS
Usage: tell m-w <word>
We have a direct link to Merriam Webster. To use the dictionary just
tell m-w <word>
>tell m-w breather
You get this feedback from Merriam-Webster:
That means:
1 : one that breathes
2 : a break in activity for rest or relief
3 : a small vent in an otherwise airtight enclosure
A few obscure definitions are not available through m-w since they are in the
unabridged version that requires membership. They also offer a thesaurus at:
@Chttp://m-w.com/@n
#31 #31
DIG UNDIG RDIG RELINK RLINKS DIG UNDIG RDIG RELINK RLINKS
@@ -3173,7 +3153,7 @@ game.
Invest in a thesaurus. Makes a world of difference, and if that doesn't Invest in a thesaurus. Makes a world of difference, and if that doesn't
help, just make up your own words for things you create (just be sure to help, just make up your own words for things you create (just be sure to
describe them very well. Use @Chttp://m-w.com/@n for an online thesaurus describe them very well. Use @Chttp://m-w.com/@n for an online thesaurus
and dictionary. You can @Rtell m-w <word>@n to lookup a definition. and dictionary.
4. Where can I learn Trigedit? 4. Where can I learn Trigedit?
Here! Welcor is now the developer of trigedit. We have extensive help files, Here! Welcor is now the developer of trigedit. We have extensive help files,
@@ -3312,7 +3292,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 +3330,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:
@@ -3564,8 +3544,8 @@ GRAMMAR GRAMMER TIPS
words can be particularly tricky and elude electronic spell checkers. A good words can be particularly tricky and elude electronic spell checkers. A good
dictionary, however, will help you spell archaic words. Whenever I am building dictionary, however, will help you spell archaic words. Whenever I am building
I use our Merriam Webster dictionary link on TBA to check any tough words for I use our Merriam Webster dictionary link on TBA to check any tough words for
proper spelling. Test it out @RTELL M-W DEFINITION@n. We hope to add a thesaurus proper spelling. We hope to add a thesaurus soon! Goto @Chttp://m-w.com/@n
soon! Goto @Chttp://m-w.com/@n until then. until then.
I have found that a good principle to make is to avoid the use of all I have found that a good principle to make is to avoid the use of all
contractions. For example, if you mean to say "it is", do not use "it's", spell contractions. For example, if you mean to say "it is", do not use "it's", spell
it out. This will help differentiate between "its" (which means 'belonging to it out. This will help differentiate between "its" (which means 'belonging to
@@ -7093,31 +7073,28 @@ See also: FLAGS, PLR
#31 #31
PROMOTE PROMOTIONS ADVANCEMENTS RAISES LVLS LEVELS GAINS 31 32 33 34 RANKS RANKING HIRING JOBS STAFFING PROMOTE PROMOTIONS ADVANCEMENTS RAISES LVLS LEVELS GAINS 31 32 33 34 RANKS RANKING HIRING JOBS STAFFING
Here at The Builder Academy the level of an immortal generally denotes Here at The Builder Academy, the level of an immortal generally reflects that
their skill at building. This makes it easier for people to know who is in immortal's building skill and willingness to help others. If you have
charge, who they can ask for help, and who they should be wary of taking tips questions, you may want to ask someone whose level is at least 32. Of course,
from. I encourage everyone to help each other. Just realize that if the person everyone is encouraged to help everyone else, but know that those who are not
is not at least a Great God they may have relatively little experience. at least level 32 may have relatively little experience.
Level 31 (Immortal) Anyone who is new to TBA and is working on their trial Level 31 (Immortal) Anyone who is new to TBA and is working on their trial
vnum or zone. vnum or zone.
Level 32 (God) An experienced builder that has proven their knowledge and is Level 32 (God) An experienced builder with proven knowledge that is
willing to teach others. Level 2 and above is considered staff. willing to teach others. Immortals of level 32 and above
Level 33 (Greater God) An experienced builder that has contributed are considered staff.
significantly to TBA. Level 33 (Greater God) An experienced builder that has contributed significantly
to TBA.
Level 34 (Implementor) Current developers: Welcor, Wyld, and Opie. Level 34 (Implementor) Current developers: Welcor, Wyld, and Opie.
Do not bother asking to be advanced, and if that is why you are here, you Please do not bother asking to be advanced. If your goal is merely to rise in
are wasting your time. Note, this does not mean you are not a quality builder, the ranks, you are wasting your time. The Gods here are dedicated to helping
but TBA is not your typical MUD. On the contrary, we are here as dedicated others learn to build. Thus, those who advance in level are those who become
people to help you learn to build. Because of this the only chance of proficient builders that offer their time to teach others. If you are willing
advancement is if you are willing to learn to build and then help teach others. to give back to the tbaMUD community and have the requisite skills, you will be
If you are willing to give back to the tbaMUD community, and have the advanced and given further tools to teach others via your level. Generally, if
necessary skills to do so, you will be advanced and given further privileges you ask for a promotion, you will be less likely to receive it.
to help teach others. Generally, if you have to ask for a promotion you will be
less likely to receive it. Performance is everything here.
q
#0 #0
PROPOSALS GUIDELINES ZONE-PROPOSALS PROPOSITIONS PROPOSE REQUESTS CRITERIA PROPOSALS GUIDELINES ZONE-PROPOSALS PROPOSITIONS PROPOSE REQUESTS CRITERIA
@@ -7195,7 +7172,7 @@ prefer to add the quest in the zone where quest completion takes place.
Quests use vnums in exactly the same way as mobiles, object and rooms. Each Quests use vnums in exactly the same way as mobiles, object and rooms. Each
zone will normally have 100 vnums available (#00 to #99, where # is the zone zone will normally have 100 vnums available (#00 to #99, where # is the zone
number). Usually, when creating the first quest in a zone, #00 is used, number). Usually, when creating the first quest in a zone, #00 is used,
then #01, etc then #01, etc.
When you qedit <vnum> to create a new quest (or edit an existing one), you will When you qedit <vnum> to create a new quest (or edit an existing one), you will
see the menu in @RHELP QEDIT-MENU@n see the menu in @RHELP QEDIT-MENU@n
@@ -7206,12 +7183,12 @@ QEDIT-ACCEPT
This is the text that is sent to the player when they start the quest. It This is the text that is sent to the player when they start the quest. It
should describe in detail exactly what is required to complete the quest. The should describe in detail exactly what is required to complete the quest. The
text is simply output on the players screen, so be creative here. An example text is simply output on the player's screen, so be creative here. An example
of an accept message text could be something like: of an accept message text could be something like:
The questmaster rummages in a large pile of papers. The questmaster rummages in a large pile of papers.
The questmaster says Ah, here it is The questmaster says "Ah, here it is"
The questmaster says Bob, the local butcher has offered this quest The questmaster says "Bob, the local butcher has offered this quest"
The questmaster shows you a hastily scrawled note, that reads: The questmaster shows you a hastily scrawled note, that reads:
I am willing to offer any plucky adventurer 10 quest points if they bring me a I am willing to offer any plucky adventurer 10 quest points if they bring me a
@@ -7221,7 +7198,7 @@ order to fill. I need these within 24 hours
Thanks, Bob the Butcher, Midgaard Thanks, Bob the Butcher, Midgaard
The questmaster sighs. The questmaster sighs.
The questmaster says A tricky quest, but itll cost you 5qp to back out now The questmaster says "A tricky quest, but it'll cost you 5qp to back out now"
#31 #31
QEDIT-COMPLETED QEDIT-ABANDONED QEDIT-COMPLETED QEDIT-ABANDONED
@@ -7235,7 +7212,7 @@ all timed quests.
QEDIT-COMPLETION QEDIT-COMPLETION
Just like the accept message, this is simply text that is output on the Just like the accept message, this is simply text that is output on the
players screen when they successfully complete the quest. Prizes (quest player's screen when they successfully complete the quest. Prizes (quest
points, gold coins, experience points or an object) are automatically points, gold coins, experience points or an object) are automatically
announced after this text is shown, so this text does not need to have that announced after this text is shown, so this text does not need to have that
information in it. information in it.
@@ -7261,7 +7238,7 @@ Quest flags: @cNOBITS@n
Enter quest flags, 0 to quit : Enter quest flags, 0 to quit :
Currently, only one flag is available, the REPEATABLE flag. When you have Currently, only one flag is available, the REPEATABLE flag. When you have
finished turning this on or off, select 0 (zero) to return to the main menu. finished turning this on or off, select "0" (zero) to return to the main menu.
#31 #31
QEDIT-LEVELS QEDIT-LEVELS
@@ -7315,12 +7292,12 @@ QEDIT-NEXT
This is the quest vnum of next quest in a chain. When a player completes This is the quest vnum of next quest in a chain. When a player completes
the current quest, the next quest will automatically be joined. This allows the current quest, the next quest will automatically be joined. This allows
for long quests with a number of steps. for long quests with a number of "steps".
#31 #31
QEDIT-PREREQUISITE QEDIT-PREREQUISITE
This is the object vnum for a prerequisite object. The prerequisite object This is the object vnum for a prerequisite object. The prerequisite object
should be in the players inventory in order for them to be able to join the should be in the player's inventory in order for them to be able to join the
quest. It is not taken from the player when the quest starts. quest. It is not taken from the player when the quest starts.
#31 #31
QEDIT-PREVIOUS QEDIT-PREVIOUS
@@ -7331,15 +7308,15 @@ completed by the player in order to join this quest.
QEDIT-QUANTITY QEDIT-QUANTITY
This is the number of times the player needs to repeat the quest. For This is the number of times the player needs to repeat the quest. For
example, it could be the number of items the player needs to find in a object example, it could be the number of items the player needs to find in a "object"
quest of the number of mobs the player should kill in a kill mob quest. This quest of the number of mobs the player should kill in a "kill mob" quest. This
should be used with caution, however. In an object quest picking up the same should be used with caution, however. In an object quest picking up the same
object 20 times will also complete the quest. object 20 times will also complete the quest.
#31 #31
QEDIT-QUIT QEDIT-MESSAGE QEDIT-QUIT QEDIT-MESSAGE
The quit message is sent to the player when they type quest leave. Players The quit message is sent to the player when they type quest leave. Players
can lose quest points for abandoning a quest (see Abandoned on the next can lose quest points for abandoning a quest (see "Abandoned" on the next
page), so if they lose quest points, this text really should inform them of page), so if they lose quest points, this text really should inform them of
that. that.
#31 #31
@@ -7368,14 +7345,14 @@ Room, Clear Room - Room VNUM
#31 #31
QEDIT-TIME QEDIT-TIME
This is the number of ticks or game hours that the player has to complete This is the number of 'ticks' or game hours that the player has to complete
the quest. If this is set, then the builder should really try to do the quest the quest. If this is set, then the builder should really try to do the quest
themselves, and time how long it takes (typing time before and after the themselves, and time how long it takes (typing 'time' before and after the
attempt), and then giving at least one extra tick for players to complete it. attempt), and then giving at least one extra 'tick' for players to complete it.
#31 #31
QEDIT-TYPE QEDIT-TYPE
There are a few different quest types. When you select option 7 from the There are a few different quest types. When you select option '7' from the
main menu, you will be shown a list to choose from: main menu, you will be shown a list to choose from:
0) Object - Player needs to find a particular object. 0) Object - Player needs to find a particular object.
@@ -7450,7 +7427,7 @@ Usage: quest [list | join <#> | progress | leave | history]
quest - Show usage information for the quest command. quest - Show usage information for the quest command.
quest list - Used at the questmaster to see which quests are available. quest list - Used at the questmaster to see which quests are available.
quest join # - Used to the questmaster to join the quest listed as number nn on quest list. quest join # - Used to the questmaster to join the quest listed as number 'nn' on quest list.
quest progress - Shows the player which quest they are doing, and their quest progress. quest progress - Shows the player which quest they are doing, and their quest progress.
quest leave - Allows the player to abandon the current quest, taking the quest point penalty. quest leave - Allows the player to abandon the current quest, taking the quest point penalty.
quest history - Shows all previously completed non-repeatable quests. quest history - Shows all previously completed non-repeatable quests.
@@ -9355,7 +9332,7 @@ and simply bearing artistic merit. Second, by ensuring that they are absolutely
necessary to achieve the goals of the game! If your game is made for experience necessary to achieve the goals of the game! If your game is made for experience
and equipment gathering, and failure to read descriptions directly impedes this and equipment gathering, and failure to read descriptions directly impedes this
goal, then players will learn to read everything. If your game is made for goal, then players will learn to read everything. If your game is made for
exploring or role-play, most of your players probably already read them Â- exploring or role-play, most of your players probably already read them -
because knowing their environment is a basic requirement of play. In any case, because knowing their environment is a basic requirement of play. In any case,
builders exist to ensure that the goals of play are supported by game builders exist to ensure that the goals of play are supported by game
descriptions. descriptions.
@@ -9367,7 +9344,7 @@ meaning behind descriptions, areas to find, special items, unique nooks and
crannies to spend time socializing, and hints that point to these things crannies to spend time socializing, and hints that point to these things
elsewhere outside of your own zone is an excellent idea. In fact, if you elsewhere outside of your own zone is an excellent idea. In fact, if you
don't wish to be building descriptions no one will read, you should employ don't wish to be building descriptions no one will read, you should employ
special secrets Â- most especially on games where knowing one's environment special secrets - most especially on games where knowing one's environment
does deeply affect a character's development. No matter what kind of zone you does deeply affect a character's development. No matter what kind of zone you
are building, keep it interesting throughout! are building, keep it interesting throughout!
@@ -9390,7 +9367,7 @@ road.
shouldn't be the sole builder of your zone. Instead, seek the assistance of shouldn't be the sole builder of your zone. Instead, seek the assistance of
someone who adds creative merit to your descriptions. You can do practically someone who adds creative merit to your descriptions. You can do practically
everything from plot to secrets to minutiae, even write the zone in full and everything from plot to secrets to minutiae, even write the zone in full and
just ask someone you know who writes well to Â'say it better' and rewrite just ask someone you know who writes well to 'say it better' and rewrite
what you intended to have there all along. Novels have editors, and so what you intended to have there all along. Novels have editors, and so
should any zone. should any zone.
@@ -9662,19 +9639,19 @@ have a point and here it is: *drum roll please*
Building is hard work! It is a form of expression and creativity. What kind Building is hard work! It is a form of expression and creativity. What kind
of areas you build generally reflects on what kind of person you are. You of areas you build generally reflects on what kind of person you are. You
do not have to be a good speller but you do need a good dictionary/thesaurus. do not have to be a good speller but you do need a good dictionary/thesaurus.
@RHELP M-W@n. Sometimes building can seem like a thankless job and sometimes Sometimes building can seem like a thankless job and sometimes building can be
building can be a reward in itself. Building a few areas, even a few good a reward in itself. Building a few areas, even a few good ones, does not make
ones, does not make you an Immortal or an Imp. It takes more than building to you an Immortal or an Imp. It takes more than building to be one of those and
be one of those and it entails even more work. Respect others and they will it entails even more work. Respect others and they will respect you. The more
respect you. The more detailed an area the better it is. Always choose Quality detailed an area the better it is. Always choose Quality over Quantity. Put
over Quantity. Put some pride in your areas, develop a style of your own. Try some pride in your areas, develop a style of your own. Try new things keep it
new things keep it interesting, if you become bored with building an area take interesting, if you become bored with building an area take a break and play a
a break and play a mortal or do something else, don't take advantage of builder mortal or do something else, don't take advantage of builder privileges.
privileges. Treat others as you wish to be treated. One more warning I would Treat others as you wish to be treated. One more warning I would give to
give to builders before they take things personally or get insulted. Everyone builders before they take things personally or get insulted. Everyone has their
has their own ideas on how to run a MUD, what it comes down to is whoever owns own ideas on how to run a MUD, what it comes down to is whoever owns the MUD
the MUD makes the final decision, so it does not matter how good you think your makes the final decision, so it does not matter how good you think your idea
idea is, it may never be used if the owner does not like it. Plain and simple. is, it may never be used if the owner does not like it. Plain and simple.
You see this on every MUD. So please keep the ideas coming, but do not try to You see this on every MUD. So please keep the ideas coming, but do not try to
force them onto anyone. Be constructive, not critical about peoples ideas. force them onto anyone. Be constructive, not critical about peoples ideas.
Everyone is allowed their opinions. Everyone is allowed their opinions.
@@ -9882,6 +9859,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

@@ -1,8 +1,12 @@
(lib/text/policies) (lib/text/policies)
This file should list, in no uncertain terms, the policies you must abide Right now we are all adults and should be able to interact with
by on this MUD. each other without any larger issues.
But the Grenzland maxim still is in force:
We are here to play, don't piss into anyone else's beer.
Bug the higher-ups to make some policies and write them in this file, lest No harassing, no doxxing, no sexism, racism, or other unacceptable
a political disaster ensue... isms towards your fellow players.
We definitely should add something more worked out in here.

View File

@@ -10,4 +10,5 @@
Gods Gods
~~~~ ~~~~
kyonshi

View File

@@ -990,7 +990,6 @@ He is covered in a film of dirt and grime. He smells even worse than you.
30 900 30 900
8 8 1 8 8 1
E E
T 206
#169 #169
citizen~ citizen~
a citizen~ a citizen~

25
lib/world/mob/491.mob Normal file
View File

@@ -0,0 +1,25 @@
#49100
waiter~
the waiter~
A waiter who knows all his customers is serving drinks here.
~
He looks very nice. But I bet he packs a punch.
~
24586 0 0 0 0 0 0 0 600 E
23 13 -3 4d4+230 3d3+3
230 52900
8 8 1
E
#49101
shopkeeper~
the shopkeeper~
A friendly man reading a zine is sitting behind the counter.
~
He looks very nice. But I bet he packs a punch.
~
24586 0 0 0 0 0 0 0 600 E
23 13 -3 4d4+230 3d3+3
230 52900
8 8 1
E
$

66
lib/world/mob/492.mob Normal file
View File

@@ -0,0 +1,66 @@
#49200
book worm~
the book worm~
A creepy little book work is crawling through the books.
~
Yuck! I bet they eat books!
~
72 0 0 0 0 0 0 0 -250 E
1 20 9 0d0+10 1d2+0
10 100
8 8 0
E
#49201
apprentice~
Master Ultan's apprentice~
One of Master Ultan's apprentices stands here looking confused.
~
He is clinging to a book he has never read. He looks harmless, but
you never can tell.
~
76 0 0 0 0 0 0 0 0 E
2 20 8 0d0+20 1d2+0
20 400
8 8 1
E
#49202
journeyman guard~
Master Ultan's journeyman~
One of Master Ultan's journeymen stands guard here.
~
The Journeyman is responsible for protecting the books from being read.
What a strange guild they are!
~
10 0 0 0 0 0 0 0 0 E
3 19 8 0d0+30 1d2+0
30 900
8 8 1
E
#49203
book thief~
the book thief~
An imp-like thing is sneaking thorugh the shelves, stealing books.
~
A tiny, vaguely humanoid shaped creature. Before you ever get a
good look at it, it darts back into the shelves.
~
236 0 0 0 0 0 0 0 -800 E
3 19 8 0d0+30 1d2+0
30 900
8 8 1
E
#49204
master ultan~
Master Ultan~
Master Ultan stands here, touching books with his creepy finger.
~
He is the head of the Librarians Guild, which hoards books. He is
an old man, haggard and nearly blind. He looks like a harmless old
man, but he has survived thus far.
~
10 0 0 0 0 0 0 0 0 E
5 19 7 1d1+50 1d2+0
50 2500
8 8 1
E
$

View File

@@ -182,6 +182,8 @@
343.mob 343.mob
345.mob 345.mob
346.mob 346.mob
491.mob
492.mob
555.mob 555.mob
556.mob 556.mob
653.mob 653.mob

View File

@@ -7,28 +7,6 @@ A granite fountain is gurgling here.~
-1 2 15 0 -1 2 15 0
0 0 0 0 0 0 0 0 0 0
E E
fountain basin~
The fountain is made of black granite and the water
in it looks and inviting to drink. In the center is a
'SPADE' shaped centerstone that seems to have writing
all over it.
~
E
spade~
The spade seems to be the headstone of the center of the
fountain here. It is made of black stone and is an obelisk
in shape. It has 'Directory' on the side of it and it also
has a 'MAP' on the side of it as well.
~
E
Map~
Nth: God Hall - Nth, Inn, Post Office, Coffee Alcove
Sth: God Hall - Sth, Bus. Ctr, Bldr Brd Rm, God Hall, Ext
Est: God Hall - Est, Imm/Mrtl Brd Rm, Upr Imm Hall, Grd Lvl, God Hl - Ext
Wst: God Hall - Wst, H.O.Jst/Chpl, Mtn Rm, Upr Imm Hall, Grd Lvl, God Hl - Ext
Dwn: Midguaard
~
E
Directory~ Directory~
--------------------------------------------------------- ---------------------------------------------------------
Immortal Name: ===== Room # ====== Location: ======= Immortal Name: ===== Room # ====== Location: =======
@@ -57,6 +35,26 @@ Niamh ----------- 34351 ----------- God Hall, Southeast
Fade ----------- 34337 ------------ God Hall, West Fade ----------- 34337 ------------ God Hall, West
Angela -------- 34636 --------God Hall, South Extension Angela -------- 34636 --------God Hall, South Extension
~ ~
E
Map~
Nth: God Hall - Nth, Inn, Post Office, Coffee Alcove
Sth: God Hall - Sth, Bus. Ctr, Bldr Brd Rm, God Hall, Ext
Est: God Hall - Est, Imm/Mrtl Brd Rm, Upr Imm Hall, Grd Lvl, God Hl - Ext
Wst: God Hall - Wst, H.O.Jst/Chpl, Mtn Rm, Upr Imm Hall, Grd Lvl, God Hl - Ext
Dwn: Midguaard
~
E
spade~
The spade seems to be the headstone of the center of the fountain here. It
is made of black stone and is an obelisk in shape. It has 'Directory' on the
side of it and it also has a 'MAP' on the side of it as well.
~
E
fountain basin~
The fountain is made of black granite and the water in it looks and inviting
to drink. In the center is a 'SPADE' shaped centerstone that seems to have
writing all over it.
~
#34301 #34301
fouton~ fouton~
a Fouton(tm) ~ a Fouton(tm) ~
@@ -287,8 +285,8 @@ A plush couch is here in front of a coffee table.~
0 0 0 0 0 0 0 0 0 0
E E
couch~ couch~
The couch is long, has a frame of oak wood and a long The couch is long, has a frame of oak wood and a long blue cushion. It
blue cushion. It happens to be a Futon (tm). happens to be a Futon (tm).
~ ~
#34319 #34319
LazyBoy recliner~ LazyBoy recliner~
@@ -684,15 +682,15 @@ A toilet is here made of porclein.~
1 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 0 0
E E
sign~
Be sure to Flush!
~
E
toilet toidy throne~ toilet toidy throne~
The toilet is made of white porcelien and it stands with a tank near the The toilet is made of white porcelien and it stands with a tank near the
wall. It has a wooden seat that is made of carved walnut and it has gold wall. It has a wooden seat that is made of carved walnut and it has gold
fixtures all around, which include the handles. fixtures all around, which include the handles.
~ ~
E
sign~
Be sure to Flush!
~
#34344 #34344
sink~ sink~
a sink and granite counter~ a sink and granite counter~
@@ -702,15 +700,15 @@ A sink and long granite counter is here.~
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
E E
counter~
The counters are made of granite and are immaculately carved with such
precision into a smooth flowing shape and designs all over them.
~
E
sink~ sink~
The sink is clean and white, with a shiny chrome faucet system and drain in The sink is clean and white, with a shiny chrome faucet system and drain in
the bottom. the bottom.
~ ~
E
counter~
The counters are made of granite and are immaculately carved with such
precision into a smooth flowing shape and designs all over them.
~
#34345 #34345
tub clawtub~ tub clawtub~
an old fashioned claw tub and shower~ an old fashioned claw tub and shower~
@@ -720,16 +718,16 @@ An old fashioned claw tub and shower is here.~
3 0 0 0 3 0 0 0
0 0 0 0 0 0 0 0 0 0
E E
tub~
The tub is made of iron and porcelin and it has claw feet in which it sits.
It is quite large and deep holding several meters of water.
~
E
shower~ shower~
The shower is a gold tube and a nozzle that is located on one side of the tub The shower is a gold tube and a nozzle that is located on one side of the tub
and the water pours down over the person or persons. The valve is located just and the water pours down over the person or persons. The valve is located just
above the fixture on the bottom of the tub that fills it. above the fixture on the bottom of the tub that fills it.
~ ~
E
tub~
The tub is made of iron and porcelin and it has claw feet in which it sits.
It is quite large and deep holding several meters of water.
~
#34346 #34346
bench~ bench~
a short teak bench~ a short teak bench~
@@ -752,16 +750,16 @@ A gurgling spring is here splashing into a golden basin.~
-1 2 15 0 -1 2 15 0
0 0 0 0 0 0 0 0 0 0
E E
spring~
The spring is just a free flowing stream of water that flows from the ground
with a murmuring, gurgling sound.
~
E
basin~ basin~
The basin is made of gold and it holds the water as it splashes out from the The basin is made of gold and it holds the water as it splashes out from the
spring from the ground. When full it runs into what appears to be a channel spring from the ground. When full it runs into what appears to be a channel
leading to the lagoon. leading to the lagoon.
~ ~
E
spring~
The spring is just a free flowing stream of water that flows from the ground
with a murmuring, gurgling sound.
~
#34348 #34348
statue~ statue~
a guardian statue of Rumble~ a guardian statue of Rumble~
@@ -771,6 +769,12 @@ A guardian statue of Rumble is here next to a pedistal.~
0 0 0 0 0 0 0 0
0 0 0 31 0 0 0 0 31 0
E E
pedistal~
The pedistal is made of rounded carved marble and it has unique designs,
portraying extreme power. The top of the pedistal is empty, but it seems that
something should go there.
~
E
statue Rumble rumble guardian~ statue Rumble rumble guardian~
The statue is a guardian to this shrine, it depicts one of the immortals of The statue is a guardian to this shrine, it depicts one of the immortals of
TBA and his power and influence over all who worship here. He stands clad as a TBA and his power and influence over all who worship here. He stands clad as a
@@ -778,12 +782,6 @@ Battle Mage, in flowing robes and carries a staff. His hair is long and flowing
as he seems to be raising the staff in battle. You seem to feel at ease by this as he seems to be raising the staff in battle. You seem to feel at ease by this
statue. statue.
~ ~
E
pedistal~
The pedistal is made of rounded carved marble and it has unique designs,
portraying extreme power. The top of the pedistal is empty, but it seems that
something should go there.
~
#34349 #34349
Opie~ Opie~
a guardian statue of Opie~ a guardian statue of Opie~
@@ -793,6 +791,11 @@ A guardian statue of Opie is here.~
0 0 0 0 0 0 0 0
0 0 0 31 0 0 0 0 31 0
E E
nametag~
The nametag reads Opie the Cunning and that is carved at the base of the
statue near the foot of his statue.
~
E
Opie Guardian~ Opie Guardian~
The statue is a guardian to this shine, it depicts one of the immortals of The statue is a guardian to this shine, it depicts one of the immortals of
TBA and the influence of steath and cunning to all who worhip here. He stands TBA and the influence of steath and cunning to all who worhip here. He stands
@@ -800,11 +803,6 @@ clad in carved battle armor of leather, a loose flowing shirt and a sash about
his waist. In his hand he carries a dagger that is thrust outward in a backstab his waist. In his hand he carries a dagger that is thrust outward in a backstab
motion. You feel a strange surge of adventure looking at this statue. motion. You feel a strange surge of adventure looking at this statue.
~ ~
E
nametag~
The nametag reads Opie the Cunning and that is carved at the base of the
statue near the foot of his statue.
~
#34350 #34350
Welcor~ Welcor~
a guardian statue of Welcor~ a guardian statue of Welcor~
@@ -814,6 +812,11 @@ A guardian statue of Welcor is here.~
0 0 0 0 0 0 0 0
0 0 0 31 0 0 0 0 31 0
E E
nametag~
The nametag reads Welcor the Bishop and that is carved at the base of the
statue near the foot of it.
~
E
Welcor guardian~ Welcor guardian~
The statue is a guardian to this shine, it depicts one of the immortals of The statue is a guardian to this shine, it depicts one of the immortals of
TBA and the influence of Justice to all who worship here. He/She stands clad in TBA and the influence of Justice to all who worship here. He/She stands clad in
@@ -821,9 +824,4 @@ a long flowing set of robes and he/she carries a warhammer in their hand. The
feeling of peace overwhelms the senses when you look at the statue that seems to feeling of peace overwhelms the senses when you look at the statue that seems to
be floating and glowing brightly. be floating and glowing brightly.
~ ~
E
nametag~
The nametag reads Welcor the Bishop and that is carved at the base of the
statue near the foot of it.
~
$~ $~

View File

@@ -231,7 +231,7 @@ A dagger is lying here, its jewels sparkling merrily.~
5 2 3 14 5 2 3 14
4 120 12 0 0 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.~
~ ~

73
lib/world/obj/49.obj Normal file
View File

@@ -0,0 +1,73 @@
#4900
boards bulletin gen_boards~
a bulletin board~
A small bulletin board is mounted on a wall here.~
~
13 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0
0 0 0 0 0
E
bulletin~
Use 'look board' to read the board.
~
E
board~
If you can read this, the board is not working.
~
#4901
bottle beer~
a bottle~
A beer bottle has been left here.~
~
17 0 0 0 0 a 0 0 0 0 0 0 0
8 8 1 0
10 20 8 0 0
#4902
bottle dark ale~
a bottle~
A dark bottle of ale has been left here.~
~
17 0 0 0 0 a 0 0 0 0 0 0 0
8 8 3 0
10 10 3 0 0
#4903
bottle firebreather~
a bottle~
A bottle of firebreather has been left here.~
~
17 0 0 0 0 a 0 0 0 0 0 0 0
8 8 7 0
10 50 17 0 0
#4904
bottle local~
a bottle~
A dark bottle has been left here.~
~
17 0 0 0 0 a 0 0 0 0 0 0 0
8 8 8 0
10 20 7 0 0
#4905
zine~
the grenzland zine~
A tiny zine labelled "Grenzland No. 7" was left here.~
~
12 0 0 0 0 a 0 0 0 0 0 0 0
0 0 0 0
1 4 0 0 0
E
zine~
It looks like the 7th issue of the Grenzland Zine. This issue
focuses on High Level Adventures, and - look! - there is a report from
the ongoing Arden Vul campaign in there too!
~
#4906
dagger~
a dagger~
A dagger is lying here.~
~
5 ag 0 0 0 ano 0 0 0 0 0 0 0
0 1 4 11
1 1 0 0
A
19 1
$

22
lib/world/obj/491.obj Normal file
View File

@@ -0,0 +1,22 @@
#49103
sink water~
a sink~
A sink with a tap.~
~
23 cde 0 0 0 0 0 0 0 0 0 0 0
500 500 0 0
505 0 0 0 0
E
sink tap~
It is an ordinary sink with a tap. You might fill your canteen
here.
~
#49104
key~
a small key~
A smalk brass key.~
~
18 c 0 0 0 a 0 0 0 0 0 0 0
1 0 0 0
1 1 0 0
$

View File

@@ -38,6 +38,7 @@
44.obj 44.obj
45.obj 45.obj
46.obj 46.obj
49.obj
50.obj 50.obj
51.obj 51.obj
52.obj 52.obj
@@ -181,6 +182,7 @@
343.obj 343.obj
345.obj 345.obj
346.obj 346.obj
491.obj
555.obj 555.obj
556.obj 556.obj
653.obj 653.obj

51
lib/world/shp/491.shp Normal file
View File

@@ -0,0 +1,51 @@
CircleMUD v3.0 Shop File~
#49100~
4901
4902
4903
4904
-1
1.50
0.75
-1
%s Sorry, I don't stock that item.~
%s You don't seem to have that.~
%s I don't trade in such items.~
%s I can't afford that!~
%s You are too poor!~
%s That'll be %d coins, thanks.~
%s I'll give you %d coins for that.~
0
2
49100
0
49100
-1
0
28
0
0
#49102~
4905
-1
1.50
0.75
-1
%s Sorry, I don't stock that item.~
%s You don't seem to have that.~
%s I don't trade in such items.~
%s I can't afford that!~
%s You are too poor!~
%s That'll be %d coins, thanks.~
%s I'll give you %d coins for that.~
0
2
49101
0
49102
-1
0
28
0
0
$~

View File

@@ -163,6 +163,7 @@
343.shp 343.shp
345.shp 345.shp
346.shp 346.shp
491.shp
555.shp 555.shp
556.shp 556.shp
653.shp 653.shp

View File

@@ -127,6 +127,7 @@ Smelly Bum - M168~
* By Rumble of The Builder Academy tbamud.com 9091 * By Rumble of The Builder Academy tbamud.com 9091
* A trig to let people smell the bum from 1 room away. * A trig to let people smell the bum from 1 room away.
* For the first move there is no from_room so set it. * For the first move there is no from_room so set it.
* Not working - something broke
if !%from_room% if !%from_room%
eval from_room %self.room.vnum% eval from_room %self.room.vnum%
global from_room global from_room
@@ -157,7 +158,6 @@ end
* *
eval from_room %self.room.vnum% eval from_room %self.room.vnum%
global from_room global from_room
%echo% FROM:%from_room% TO:%inroom%
~ ~
#207 #207
Mob Blocks opening of chest~ Mob Blocks opening of chest~

12
lib/world/trg/491.trg Normal file
View File

@@ -0,0 +1,12 @@
0;190;19M0;190;19m#49100
Editorial Room Key - 49104~
2 c 0
l~
if %cmd.mudcommand% == look && !%actor.has_item(49104)%
%echo% Wait? Is that a key lying there!? Better pick that up!
%load% obj 49104 %actor% inv
else
return 0
end
~
$~

View File

@@ -182,8 +182,10 @@
343.trg 343.trg
345.trg 345.trg
346.trg 346.trg
491.trg
555.trg 555.trg
556.trg 556.trg
653.trg 653.trg
654.trg 654.trg
$ $

View File

@@ -65,6 +65,7 @@ D1
~ ~
0 0 4 0 0 4
S S
T 56
#4 #4
The Beginning~ The Beginning~
By simply following the different halls new builders will be taught the By simply following the different halls new builders will be taught the
@@ -135,7 +136,7 @@ HELP BREATHE@n
D0 D0
~ ~
~ ~
0 0 24 0 0 -1
D1 D1
~ ~
~ ~
@@ -143,7 +144,7 @@ D1
D2 D2
~ ~
~ ~
0 0 25 0 0 -1
D3 D3
~ ~
~ ~
@@ -151,7 +152,7 @@ D3
D4 D4
~ ~
~ ~
0 0 26 0 0 -1
S S
#7 #7
Writing Good Descriptions~ Writing Good Descriptions~
@@ -215,7 +216,7 @@ D3
D4 D4
~ ~
~ ~
0 0 27 0 0 -1
S S
#9 #9
How to Use Oedit~ How to Use Oedit~
@@ -570,6 +571,7 @@ John Stuart Mill
~ ~
0 8 0 0 0 0 0 8 0 0 0 0
S S
T 308
#34 #34
Pool of Images~ Pool of Images~
A broad mosaic walkway wraps around the natural hotsprings in this cavernous A broad mosaic walkway wraps around the natural hotsprings in this cavernous
@@ -775,14 +777,14 @@ D2
~ ~
0 0 98 0 0 98
E E
sky winds~
Cold winds plunge ceaselessly at you from the dark, cloudless sky.
~
E
floor~ floor~
The stone floor is the same shade of gray as the sky and is completely plain The stone floor is the same shade of gray as the sky and is completely plain
and unscratched. It is probably too hard for anything to leave as much as a and unscratched. It is probably too hard for anything to leave as much as a
scratch on it. scratch on it.
~ ~
E
sky winds~
Cold winds plunge ceaselessly at you from the dark, cloudless sky.
~
S S
$~ $~

View File

@@ -72,7 +72,7 @@ Zone 1 is linked to the following zones:
2 Sanctus II at 199 (south) ---> 206 2 Sanctus II at 199 (south) ---> 206
~ ~
S S
T 56 T 24
#101 #101
The Temple of the Gods~ The Temple of the Gods~
This seems to be the highest point in the kingdom of Sanctus. It is from This seems to be the highest point in the kingdom of Sanctus. It is from
@@ -92,19 +92,19 @@ D5
~ ~
0 0 100 0 0 100
E E
altar~
The altar is made from black granite and has been carved into a small basin
with a high back. Almost as if it was meant to be some sort of seat.
Inscriptions in some foreign tongue are written on every square inch of the
altar. You wonder what they must say and who could have written it.
~
E
statue~ statue~
As you examine the statues more closely you realize they must resemble the As you examine the statues more closely you realize they must resemble the
two gods responsible for the creation and ongoing protection of Sanctus, Ferret two gods responsible for the creation and ongoing protection of Sanctus, Ferret
and Rumble. They both radiate a strength and power that resembles the solid and Rumble. They both radiate a strength and power that resembles the solid
white marble they were crafted from. white marble they were crafted from.
~ ~
E
altar~
The altar is made from black granite and has been carved into a small basin
with a high back. Almost as if it was meant to be some sort of seat.
Inscriptions in some foreign tongue are written on every square inch of the
altar. You wonder what they must say and who could have written it.
~
S S
T 158 T 158
T 163 T 163
@@ -240,17 +240,17 @@ D5
~ ~
0 0 142 0 0 142
E E
table~
The table is made out of cherry. It is worn from years of use. The glass
top allows for an excellent view of the map protected within.
~
E
map~ map~
The map is a geographic representation of Sanctus. Not even really a map, The map is a geographic representation of Sanctus. Not even really a map,
more of a scaled model. The walls and buildings of the city are raised higher more of a scaled model. The walls and buildings of the city are raised higher
than the rest of the map to give it a third dimension. Small soldiers are than the rest of the map to give it a third dimension. Small soldiers are
scattered around the top of the table to help the War Master place his men. scattered around the top of the table to help the War Master place his men.
~ ~
E
table~
The table is made out of cherry. It is worn from years of use. The glass
top allows for an excellent view of the map protected within.
~
S S
#109 #109
Thieves Retreat~ Thieves Retreat~
@@ -383,18 +383,18 @@ D1
~ ~
0 0 100 0 0 100
E E
hole~
You can look out over the inner wall to the western side of Sanctus. The
smell of charred human remains and smoldering plaster makes your eyes water so
it is difficult to see much else through the tiny hole.
~
E
man silhouette~ man silhouette~
The distinct outline of a human body that must have taken the brunt of the The distinct outline of a human body that must have taken the brunt of the
blast when the portal imploded. You wonder what or who it might have been. blast when the portal imploded. You wonder what or who it might have been.
You can still see pieces of cloth and bone buried deeply into the wall inside You can still see pieces of cloth and bone buried deeply into the wall inside
the shadow of the unlucky man. the shadow of the unlucky man.
~ ~
E
hole~
You can look out over the inner wall to the western side of Sanctus. The
smell of charred human remains and smoldering plaster makes your eyes water so
it is difficult to see much else through the tiny hole.
~
S S
#117 #117
Travelling Room~ Travelling Room~
@@ -530,19 +530,19 @@ D2
~ ~
0 0 129 0 0 129
E E
shrine~
A beutiful shrine. It has two white marble figures facing each other with a
painting of the city below them. The two figures seem to be looking down at
the city with looks of worry and hopelessness. An unlit candle and mirror lay
on the floor beside the small shrine.
~
E
table desk chair~ table desk chair~
The table, desk, and chair are made from solid oak of the highest quality. The table, desk, and chair are made from solid oak of the highest quality.
A thin goose down mattress and pillow are the only comfortable looking items in A thin goose down mattress and pillow are the only comfortable looking items in
the room. The desk is bare and all the drawers are empty. It is as if no one the room. The desk is bare and all the drawers are empty. It is as if no one
even lives here. even lives here.
~ ~
E
shrine~
A beutiful shrine. It has two white marble figures facing each other with a
painting of the city below them. The two figures seem to be looking down at
the city with looks of worry and hopelessness. An unlit candle and mirror lay
on the floor beside the small shrine.
~
S S
#125 #125
Plane of the Magi~ Plane of the Magi~
@@ -816,10 +816,14 @@ D0
~ ~
0 0 128 0 0 128
E E
bed~ window~
The bed is made of a sturdy pine. A thin mattress covered in a white sheet Overlooking the western gate you can see the shimmering protective dome.
with a down pillow overlaying it. The mattress is too thin to hold anything of You hope it lasts, peace and tranquility is a good thing.
value. ~
E
chair~
It's just your standard wooden chair. Uncomfortable and only real
usefulness would be as firewood.
~ ~
E E
desk~ desk~
@@ -829,14 +833,10 @@ centered on the top of the desk. The desk has three drawers. All of them are
empty. empty.
~ ~
E E
chair~ bed~
It's just your standard wooden chair. Uncomfortable and only real The bed is made of a sturdy pine. A thin mattress covered in a white sheet
usefulness would be as firewood. with a down pillow overlaying it. The mattress is too thin to hold anything of
~ value.
E
window~
Overlooking the western gate you can see the shimmering protective dome.
You hope it lasts, peace and tranquility is a good thing.
~ ~
S S
#136 #136

View File

@@ -1372,15 +1372,21 @@ D5
door~ door~
2 0 225 2 0 225
E E
sky winds~
Cold winds plunge ceaselessly at you from the dark, cloudless sky.
~
E
floor~ floor~
The stone floor is the same shade of gray as the sky and is completely plain The stone floor is the same shade of gray as the sky and is completely plain
and unscratched. It is probably too hard for anything to leave as much as a and unscratched. It is probably too hard for anything to leave as much as a
scratch on it. scratch on it.
~ ~
E S
sky winds~ #391
Cold winds plunge ceaselessly at you from the dark, cloudless sky. Bomber's Trial Vnum~
You are in an unfinished room.
~ ~
3 0 0 0 0 0
S S
#399 #399
Welcome to the Builder Academy~ Welcome to the Builder Academy~

View File

@@ -637,10 +637,17 @@ You see Poor Alley.
S S
#3026 #3026
The Dark Alley~ The Dark Alley~
The dark alley, to the west is the common square and to the south is the The dark alley, to the west is the common square and to the south
Guild of Thieves. The alley continues east. is the Guild of Thieves. The alley continues east. You see a curious
building to the north you swear wasn't here the last time you have
been to this dark alley.
~ ~
30 0 0 0 0 1 30 0 0 0 0 1
D0
This building wasn't here last time, right?
~
~
0 -1 49101
D1 D1
The alley continues east. The alley continues east.
~ ~

View File

@@ -12,6 +12,11 @@ Campus Crescent continues to the east.
~ ~
0 -1 30101 0 -1 30101
E E
sign~
Campus by Matrix and The Wandering Bard
Copyright 1994 by Curious Areas Workshop
~
E
info credits~ info credits~
Campus by Matrix and The Wandering Bard Campus by Matrix and The Wandering Bard
Copyright 1994 by Curious Areas Workshop Copyright 1994 by Curious Areas Workshop
@@ -55,11 +60,6 @@ Zone 301 is linked to the following zones:
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
sign~
Campus by Matrix and The Wandering Bard
Copyright 1994 by Curious Areas Workshop
~
S S
#30101 #30101
Campus Crescent~ Campus Crescent~
@@ -112,13 +112,13 @@ Campus Crescent continues to the west.
~ ~
0 -1 30101 0 -1 30101
E E
dorm dormitory dormitories~
Well, they're dormitories. What else can be said?
~
E
cobblestone stone cobble~ cobblestone stone cobble~
The cobblestones are clean. The cobblestones are clean.
~ ~
E
dorm dormitory dormitories~
Well, they're dormitories. What else can be said?
~
S S
#30103 #30103
Campus Crescent~ Campus Crescent~
@@ -144,13 +144,13 @@ Campus Crescent continues to the west.
~ ~
0 -1 30102 0 -1 30102
E E
cobblestone stone cobble~
The cobblestones are clean.
~
E
caf cafeteria~ caf cafeteria~
You barely see, through the thick putrid fumes, the Mary Rotte Cafeteria. You barely see, through the thick putrid fumes, the Mary Rotte Cafeteria.
~ ~
E
cobblestone stone cobble~
The cobblestones are clean.
~
S S
#30104 #30104
The Crossroads~ The Crossroads~
@@ -214,13 +214,13 @@ The Crossroads lie to the west.
~ ~
0 -1 30104 0 -1 30104
E E
cobblestone stone cobble~
The cobblestones are clean.
~
E
building~ building~
The buildings seem warm and inviting. You almost feel like hugging one. The buildings seem warm and inviting. You almost feel like hugging one.
~ ~
E
cobblestone stone cobble~
The cobblestones are clean.
~
S S
#30106 #30106
Campus Crescent~ Campus Crescent~
@@ -251,8 +251,8 @@ Campus Crescent continues to the west.
~ ~
0 -1 30105 0 -1 30105
E E
cobblestone stone cobble~ round building~
The cobblestones are still clean. Yes... It's a round building. Go figure.
~ ~
E E
bookstore~ bookstore~
@@ -260,8 +260,8 @@ bookstore~
floor. floor.
~ ~
E E
round building~ cobblestone stone cobble~
Yes... It's a round building. Go figure. The cobblestones are still clean.
~ ~
S S
#30107 #30107
@@ -286,13 +286,13 @@ Campus Crescent and its cobblestones are to the west.
~ ~
0 -1 30106 0 -1 30106
E E
cobblestone stone cobble~
It's asphalt, you idiot! If you want to look at cobblestones, go west.
~
E
asphalt pavement~ asphalt pavement~
It's asphalt. It's asphalt.
~ ~
E
cobblestone stone cobble~
It's asphalt, you idiot! If you want to look at cobblestones, go west.
~
S S
#30108 #30108
University Avenue~ University Avenue~
@@ -316,8 +316,8 @@ The cafeteria lies to the west.
~ ~
0 -1 30128 0 -1 30128
E E
cobblestone stone cobble~ cafeteria fog~
It's a dirt road. There are NO cobblestones here, although to the north... The fog seems to be coming from the Mary Rotte Cafeteria.
~ ~
E E
dirt~ dirt~
@@ -325,8 +325,8 @@ dirt~
World Dictionary) World Dictionary)
~ ~
E E
cafeteria fog~ cobblestone stone cobble~
The fog seems to be coming from the Mary Rotte Cafeteria. It's a dirt road. There are NO cobblestones here, although to the north...
~ ~
S S
#30109 #30109
@@ -346,14 +346,14 @@ Morris House lies to the west.
~ ~
0 -1 30129 0 -1 30129
E E
dormitory dorm~
They are student living establishments.
~
E
dirt~ dirt~
It's unclean matter, such as mud, trash, earth, or soil. (Webster's New It's unclean matter, such as mud, trash, earth, or soil. (Webster's New
World Dictionary) World Dictionary)
~ ~
E
dormitory dorm~
They are student living establishments.
~
S S
#30110 #30110
University Avenue~ University Avenue~
@@ -382,8 +382,8 @@ The Engineering building, Ellis Hall, lies to the west.
~ ~
0 -1 30132 0 -1 30132
E E
cobblestone stone cobble~ building buildings~
It's a dirt road. There are NO cobblestones here, although to the south... There are two buildings here. Which one?
~ ~
E E
dirt~ dirt~
@@ -391,8 +391,8 @@ dirt~
World Dictionary) World Dictionary)
~ ~
E E
building buildings~ cobblestone stone cobble~
There are two buildings here. Which one? It's a dirt road. There are NO cobblestones here, although to the south...
~ ~
S S
#30111 #30111
@@ -422,14 +422,14 @@ The Commerce building, Dunning Hall, lies to the west.
~ ~
0 -1 30135 0 -1 30135
E E
building buildings~
There are two buildings here. Which one?
~
E
dirt~ dirt~
It's unclean matter, such as mud, trash, earth, or soil. (Webster's New It's unclean matter, such as mud, trash, earth, or soil. (Webster's New
World Dictionary) World Dictionary)
~ ~
E
building buildings~
There are two buildings here. Which one?
~
S S
#30112 #30112
University Avenue~ University Avenue~
@@ -481,23 +481,23 @@ University Avenue continues to the south.
~ ~
0 -1 30112 0 -1 30112
E E
dirt~ building~
It's unclean matter, such as mud, trash, earth, or soil. (Webster's New The student center lies to the east.
World Dictionary)
~ ~
E E
sign warning~ sign warning~
The sign says: The sign says:
Welcome to the Student Ghetto! Welcome to the Student Ghetto!
@n n
Fine $103.50 for carrying open alcohol in the streets. Fine $103.50 for carrying open alcohol in the streets.
Fine $ 53.75 for excessively loud noises. Fine $ 53.75 for excessively loud noises.
@n n
ENTER AT YOUR OWN RISK! ENTER AT YOUR OWN RISK!
~ ~
E E
building~ dirt~
The student center lies to the east. It's unclean matter, such as mud, trash, earth, or soil. (Webster's New
World Dictionary)
~ ~
S S
#30114 #30114
@@ -522,13 +522,13 @@ University Avenue lies to the west.
~ ~
0 -1 30112 0 -1 30112
E E
non-descript non descript~
(No description)
~
E
building~ building~
The student center lies to the north. The student center lies to the north.
~ ~
E
non-descript non descript~
(No description)
~
S S
#30115 #30115
Union Street~ Union Street~
@@ -557,13 +557,13 @@ Union Street continues to the west.
~ ~
0 -1 30114 0 -1 30114
E E
non-descript non descript~
(No description)
~
E
building buildings~ building buildings~
There are two buildings here. Which one? There are two buildings here. Which one?
~ ~
E
non-descript non descript~
(No description)
~
S S
#30116 #30116
Division Road~ Division Road~
@@ -588,13 +588,13 @@ Union Street is to the west.
~ ~
0 -1 30115 0 -1 30115
E E
building gym arena~
The Jock Hardy Arena lies to the north.
~
E
asphalt pavement~ asphalt pavement~
It's asphalt. It's asphalt.
~ ~
E
building gym arena~
The Jock Hardy Arena lies to the north.
~
S S
#30117 #30117
Division Road~ Division Road~
@@ -613,13 +613,13 @@ Division Road continues south.
~ ~
0 -1 30118 0 -1 30118
E E
asphalt pavement~
It's asphalt.
~
E
zork~ zork~
What would possess you to look at that? What is a zork anyways? What would possess you to look at that? What is a zork anyways?
~ ~
E
asphalt pavement~
It's asphalt.
~
S S
#30118 #30118
Division Road~ Division Road~
@@ -643,14 +643,14 @@ The Campus bookstore lies to the west.
~ ~
0 -1 30141 0 -1 30141
E E
asphalt pavement~
It's asphalt.
~
E
bookstore building~ bookstore building~
The bookstore is a 2-story cubical building, loud noises emanate from the top The bookstore is a 2-story cubical building, loud noises emanate from the top
floor. floor.
~ ~
E
asphalt pavement~
It's asphalt.
~
S S
#30119 #30119
Division Road~ Division Road~
@@ -669,13 +669,13 @@ Division Road continues south.
~ ~
0 -1 30120 0 -1 30120
E E
asphalt pavement~
It's asphalt.
~
E
zork~ zork~
What would possess you to look at that? What is a zork anyways? What would possess you to look at that? What is a zork anyways?
~ ~
E
asphalt pavement~
It's asphalt.
~
S S
#30120 #30120
Division Road~ Division Road~
@@ -694,14 +694,14 @@ Division Road continues south.
~ ~
0 -1 30121 0 -1 30121
E E
asphalt pavement~
It's asphalt.
~
E
tree~ tree~
It has been placed here just to relieve the monotony. It serves no other It has been placed here just to relieve the monotony. It serves no other
purpose whatsoever. purpose whatsoever.
~ ~
E
asphalt pavement~
It's asphalt.
~
S S
#30121 #30121
Division Road~ Division Road~
@@ -721,16 +721,16 @@ Wally World sits to the east.
~ ~
0 -1 30142 0 -1 30142
E E
asphalt pavement~
It's asphalt.
~
E
dorm dormitory~ dorm dormitory~
This is a rather tall dormitory. You'd guess that in real life, it's This is a rather tall dormitory. You'd guess that in real life, it's
probably 11-stories high, but since that would take an absurd amount of time to probably 11-stories high, but since that would take an absurd amount of time to
program, you don't think that there are that many floors in this replica of the program, you don't think that there are that many floors in this replica of the
building. building.
~ ~
E
asphalt pavement~
It's asphalt.
~
S S
#30122 #30122
The Northern Campus Entrance~ The Northern Campus Entrance~
@@ -747,6 +747,12 @@ The Student GHETTO... Beware!
~ ~
0 -1 30123 0 -1 30123
E E
gate gateway pillar~
The gateway is made of limestone and covered in ivy. As you already knew
that you feel rather silly wasting your time looking at it. There is a sign on
the left pillar.
~
E
sign plaque~ sign plaque~
The nicely polished brass plaque reads: The nicely polished brass plaque reads:
@@ -754,12 +760,6 @@ sign plaque~
ENTER AT YOUR OWN RISK ENTER AT YOUR OWN RISK
~ ~
E
gate gateway pillar~
The gateway is made of limestone and covered in ivy. As you already knew
that you feel rather silly wasting your time looking at it. There is a sign on
the left pillar.
~
S S
#30123 #30123
The Ghetto~ The Ghetto~
@@ -834,14 +834,14 @@ There is a locked door leading to a stairwell.
door~ door~
1 30105 30295 1 30105 30295
E E
mailbox mailboxes~
All of the mailboxes are all empty ... Just like normal you think.
~
E
tiles floor~ tiles floor~
The floor is covered with tiles that are so ugly, you have a difficult time The floor is covered with tiles that are so ugly, you have a difficult time
keeping your lunch down keeping your lunch down
~ ~
E
mailbox mailboxes~
All of the mailboxes are all empty ... Just like normal you think.
~
S S
#30127 #30127
Mary Rotte Cafeteria Entrance~ Mary Rotte Cafeteria Entrance~
@@ -868,14 +868,14 @@ There is a doorway leading to the kitchen.
door doorway~ door doorway~
1 -1 30143 1 -1 30143
E E
cafeteria caf~
Yes, this is the cafeteria.
~
E
door doorway~ door doorway~
You believe that the doorway leads to the kitchen. Let's give our You believe that the doorway leads to the kitchen. Let's give our
compliments to the chef... *grin* compliments to the chef... *grin*
~ ~
E
cafeteria caf~
Yes, this is the cafeteria.
~
S S
#30128 #30128
Mary Rotte Cafeteria Entrance~ Mary Rotte Cafeteria Entrance~
@@ -902,14 +902,14 @@ The dining hall lies to the west... Beware!
~ ~
0 -1 30148 0 -1 30148
E E
cafeteria caf~
Yes, this is the cafeteria.
~
E
door doorway~ door doorway~
You believe that the doorway leads to the kitchen. Let's give our You believe that the doorway leads to the kitchen. Let's give our
compliments to the chef... *grin* compliments to the chef... *grin*
~ ~
E
cafeteria caf~
Yes, this is the cafeteria.
~
S S
#30129 #30129
Morris House~ Morris House~
@@ -959,16 +959,16 @@ The hallway continues west.
~ ~
0 -1 30324 0 -1 30324
E E
round circle circular~
Yes, it's round.
~
E
footnote~ footnote~
Yes, believe it or not, this is a reasonably accurate representation of the Yes, believe it or not, this is a reasonably accurate representation of the
Physics building, Stirling Hall at our university. The lecture halls are Physics building, Stirling Hall at our university. The lecture halls are
numbered in the same manner as represented and it is in fact round, so that you numbered in the same manner as represented and it is in fact round, so that you
can walk in one direction all the way around the building. can walk in one direction all the way around the building.
~ ~
E
round circle circular~
Yes, it's round.
~
S S
#30131 #30131
The Student Health Services Entrance~ The Student Health Services Entrance~
@@ -1038,13 +1038,13 @@ University Avenue lies to the west.
~ ~
0 -1 30110 0 -1 30110
E E
halls hallways hall hallway~
They are twisting alright.
~
E
minds mind great greatest~ minds mind great greatest~
All of whom were probably smarter than you. All of whom were probably smarter than you.
~ ~
E
halls hallways hall hallway~
They are twisting alright.
~
S S
#30134 #30134
Corry-Mack Hall~ Corry-Mack Hall~
@@ -1065,13 +1065,13 @@ Campus Crescent lies to the south.
~ ~
0 -1 30105 0 -1 30105
E E
halls hallways hall hallway~
They are twisting alright.
~
E
minds mind great greatest~ minds mind great greatest~
All of whom were probably smarter than you. All of whom were probably smarter than you.
~ ~
E
halls hallways hall hallway~
They are twisting alright.
~
S S
#30135 #30135
Dunning Hall Lobby~ Dunning Hall Lobby~
@@ -1163,7 +1163,7 @@ You can distinctly see a post office here, it might have a message in it, but
you are not quite sure. you are not quite sure.
~ ~
~ ~
0 -1 30170 0 -1 -1
D1 D1
There are electronic sounds coming from the east. There are electronic sounds coming from the east.
~ ~
@@ -1208,18 +1208,18 @@ A long hallway lies to the west.
~ ~
0 -1 30153 0 -1 30153
E E
plaque plaques~
They are rather boring. A bunch of people you don't know.
~
E
sign~ sign~
The sign says: The sign says:
@n n
Gym -> North Gym -> North
Arena -> East Arena -> East
Locker Rooms -> West Locker Rooms -> West
Exit -> South Exit -> South
~ ~
E
plaque plaques~
They are rather boring. A bunch of people you don't know.
~
S S
#30140 #30140
The Grant Hall Building~ The Grant Hall Building~
@@ -1308,13 +1308,13 @@ The kitchen continues south.
~ ~
0 -1 30144 0 -1 30144
E E
door doorway~
You stare intently at the door. Its wooden frame enthrals you.
~
E
food~ food~
Believe me, you don't want to look at that! Believe me, you don't want to look at that!
~ ~
E
door doorway~
You stare intently at the door. Its wooden frame enthrals you.
~
S S
#30144 #30144
The Kitchen~ The Kitchen~
@@ -1357,13 +1357,13 @@ The dining hall continues south.
~ ~
0 -1 30147 0 -1 30147
E E
food~
Believe me, you don't want to look at that!
~
E
students poor~ students poor~
You feel sorry for them. You feel sorry for them.
~ ~
E
food~
Believe me, you don't want to look at that!
~
S S
#30146 #30146
Dining Hall~ Dining Hall~
@@ -1384,13 +1384,13 @@ The dining hall continues west.
~ ~
0 -1 30145 0 -1 30145
E E
food~
Believe me, you don't want to look at that!
~
E
students poor~ students poor~
You feel sorry for them. You feel sorry for them.
~ ~
E
food~
Believe me, you don't want to look at that!
~
S S
#30147 #30147
Dining Hall~ Dining Hall~
@@ -1411,13 +1411,13 @@ The dining hall continues east.
~ ~
0 -1 30148 0 -1 30148
E E
food~
Believe me, you don't want to look at that!
~
E
students poor~ students poor~
You feel sorry for them. You feel sorry for them.
~ ~
E
food~
Believe me, you don't want to look at that!
~
S S
#30148 #30148
Dining Hall~ Dining Hall~
@@ -1443,13 +1443,13 @@ The dining hall continues west.
~ ~
0 -1 30147 0 -1 30147
E E
food~
Believe me, you don't want to look at that!
~
E
students poor~ students poor~
You feel sorry for them. You feel sorry for them.
~ ~
E
food~
Believe me, you don't want to look at that!
~
S S
#30149 #30149
Kitchen~ Kitchen~
@@ -1470,13 +1470,13 @@ There is a storeroom beyond the door to the south.
door doorway~ door doorway~
1 -1 30150 1 -1 30150
E E
food~
Believe me, you don't want to look at that!
~
E
door doorway~ door doorway~
It's a door. It has a nice steel frame surrounding a metallic door. It's a door. It has a nice steel frame surrounding a metallic door.
~ ~
E
food~
Believe me, you don't want to look at that!
~
S S
#30150 #30150
A Storeroom~ A Storeroom~
@@ -1491,16 +1491,16 @@ These stairs lead back to the door to the kitchen.
door doorway~ door doorway~
1 -1 30149 1 -1 30149
E E
food~ door doorway~
Well, it's food. It's a door. It has a nice steel frame surrounding a metallic door.
~ ~
E E
spam pre-made packages ingredients uninteresting stuff~ spam pre-made packages ingredients uninteresting stuff~
It's rather uninteresting. It's rather uninteresting.
~ ~
E E
door doorway~ food~
It's a door. It has a nice steel frame surrounding a metallic door. Well, it's food.
~ ~
S S
#30151 #30151
@@ -1522,13 +1522,13 @@ The kitchen continues west.
~ ~
0 -1 30149 0 -1 30149
E E
door doorway~
You stare intently at the door. Its wooden frame enthrals you.
~
E
food~ food~
Believe me, you don't want to look at that! Believe me, you don't want to look at that!
~ ~
E
door doorway~
You stare intently at the door. Its wooden frame enthrals you.
~
S S
#30152 #30152
Stairway~ Stairway~
@@ -1829,13 +1829,13 @@ The only way out is down.
~ ~
0 -1 30165 0 -1 30165
E E
zorpa~
You see nothing special. Now what is a zorpa anyways?
~
E
moshing mosh~ moshing mosh~
All you can see is a mass of bodies moving up and down, up and down... All you can see is a mass of bodies moving up and down, up and down...
~ ~
E
zorpa~
You see nothing special. Now what is a zorpa anyways?
~
S S
#30167 #30167
The Infobank~ The Infobank~
@@ -1856,17 +1856,17 @@ D5
plank~ plank~
1 -1 30171 1 -1 30171
E E
map~
This map shows absolutely nothing, further proving the value of student
governments to you.
~
E
list~ list~
The list reads: The list reads:
<name scratched out> President <name scratched out> President
<name scratched out> Vice-President <name scratched out> Vice-President
Seems as though everyone is claiming ignorance today. Seems as though everyone is claiming ignorance today.
~ ~
E
map~
This map shows absolutely nothing, further proving the value of student
governments to you.
~
S S
#30168 #30168
The Games Room~ The Games Room~
@@ -1899,34 +1899,6 @@ You can see the central annex to the east.
~ ~
0 -1 30137 0 -1 30137
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
#30171 #30171
The Special Hidden Room~ The Special Hidden Room~
This room is completely empty except for the things you can see in it. The This room is completely empty except for the things you can see in it. The
@@ -1957,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
@@ -2002,15 +2002,15 @@ be interesting.
~ ~
0 -1 30180 0 -1 30180
E E
neat engineering devices~
You see lots of neat engineering devices which were used in the real world at
some point or another. At least you think they were.
~
E
award awards~ award awards~
These are awards for various Engineering competitions which the university These are awards for various Engineering competitions which the university
entered at one time or another. entered at one time or another.
~ ~
E
neat engineering devices~
You see lots of neat engineering devices which were used in the real world at
some point or another. At least you think they were.
~
S S
#30175 #30175
Hallway~ Hallway~
@@ -2047,9 +2047,12 @@ The hallway you probably entered from is handily located to the west.
~ ~
0 -1 30175 0 -1 30175
E E
stage~ goalie~
The stage is located at the west end of the room. In one corner of the How did you know it was a goalie stick? Have you been reading the keywords?
stage, there is a hockey stick lying on the ground. ~
E
crest~
The crest seems to be the crest belonging to the class of `97.
~ ~
E E
hockey stick~ hockey stick~
@@ -2057,12 +2060,9 @@ hockey stick~
crest prominently displayed. crest prominently displayed.
~ ~
E E
crest~ stage~
The crest seems to be the crest belonging to the class of `97. The stage is located at the west end of the room. In one corner of the
~ stage, there is a hockey stick lying on the ground.
E
goalie~
How did you know it was a goalie stick? Have you been reading the keywords?
~ ~
S S
#30177 #30177
@@ -2270,13 +2270,13 @@ This leads into the building.
door~ door~
2 30101 30178 2 30101 30178
E E
pathway~
The path is well worn, but there are no discernible footsteps upon it.
~
E
building~ building~
This is the back side of Ellis Hall, the Engineering building. This is the back side of Ellis Hall, the Engineering building.
~ ~
E
pathway~
The path is well worn, but there are no discernible footsteps upon it.
~
S S
#30188 #30188
A Pathway~ A Pathway~

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

@@ -105,10 +105,10 @@ S
#34306 #34306
The Social Gathering Room~ The Social Gathering Room~
This is the Main Social Gathering Room of the Immortals. It is circular in This is the Main Social Gathering Room of the Immortals. It is circular in
design and it connects four foyers in all directions to the north, south, east, design, and it connects four foyers in all directions to the north, south, east,
and west. The room is quite plush with many fountains, couches, and carpeted and west. The room is quite plush with many fountains, couches, and carpeted
areas, also with a few planters filled with thick green bushes and trees. The areas, also with a few planters filled with thick green bushes and trees. The
fountain seems to be glowing best to look at it. fountain seems to be glowing.
~ ~
343 28 0 0 0 0 343 28 0 0 0 0
D0 D0
@@ -159,10 +159,10 @@ D3
S S
#34308 #34308
Eastern Foyer~ Eastern Foyer~
This is the Eastern End of the Gathering Hall. This foyer continues to the You are in the Eastern End of the Gathering Hall. Several pillars line this
east into what appears to be a hallway and west into a circular central room. room. The foyer continues east into what looks like a hallway and west into a
Several pillars line the room here, Archways north and south lead into the circular central room. Archways north and south lead into the Immortal Board
Immortal Board Room and the Mortal Board Room. Room and the Mortal Board Room.
~ ~
343 24 0 0 0 0 343 24 0 0 0 0
D0 D0

10
lib/world/wld/49.wld Normal file
View File

@@ -0,0 +1,10 @@
#4900
In a Time and Place before Creation~
You are standing in the Void. Earth and Sky have not yet been
separated. Nothing has form here, except the Celestial Mound rising
above the shapeless waters of Nu. Could this be a time and place
before Creation?
~
49 ce 0 0 0 0
S
$

162
lib/world/wld/491.wld Normal file
View File

@@ -0,0 +1,162 @@
#49100
The Grenzland Club~
You are in the woodpaneled club room of the Grenzland Building.
People are talking quietly or reading in silence. There is a fire
crackling in the hearth to the North. To the West is a restroom. To
the South is the Entry Hall. To the East is a nice looking bar.
~
491 de 0 0 0 0
D2
You see the Entry Hall to the Grenzland Building.
~
~
1 -1 49101
D3
You see the restroom.
~
~
1 -1 49103
S
#49101
The Entry Hall to the Grenzland Building~
You are in the Entry Hall to the Grenzland Building. To the North
you see the Grenzland Club room. To the West is a door with a small
note pinned to it. To the South you see the Entry Hall. To the South
is a Dark Alley in Midgaard. To the East you see the Grenzland Shop.
A double staircase leads up to the Balcony.
~
491 de 0 0 0 0
D0
You see the Grenzland Club room.
~
~
1 -1 49100
D1
You see the Grenzland Shop.
~
~
1 -1 49102
D2
You see a Dark Alley.
~
~
1 -1 3026
D4
You see the Balcony from below.
~
~
1 -1 49110
E
note~
The note reads:
This door will lead to a teleporter room in the future.
- a.
~
S
#49102
The Grenzland Shop~
You are in the Grenzland Shop. The room is full of books, zines,
dice, minis, and game boxes! The exit is to the West, but do you
really want to leave?
~
491 de 0 0 0 0
D1
You see the Entry Hall.
~
~
1 -1 49101
S
#49103
The Restroom~
You are in the restroom of the Grenzland Club. The exit is to the
East. To the south are some bathroom stalls.
~
491 de 0 0 0 0
D1
You see the Grenzland Club room.
~
~
1 -1 49100
D2
You see bathroom stalls.
~
~
1 -1 49104
S
#49104
Bathroom Stalls~
Well, these are bathroom stalls. Quite clean.
~
491 de 0 0 0 0
D0
You see the sink and the exit.
~
~
1 -1 49103
E
stall stalls toilet toilets room~
Surprisingly clean.
~
S
T 49100
#49110
The Balcony above the Entry Hall~
This is the Balcony above the Entry Hall To the North is the
Library. From the door to the East you hear busy typing. The door to
has a brass plaque on it. A double staircase leads down to the Entry
Hall.
~
491 de 0 0 0 0
D0
You see a double-winged door leading into the Library.
~
~
1 -1 49112
D1
You see a door with a brass plaque on it.
~
~
1 49104 49111
D5
You see the Entry Hall from above.
~
~
1 -1 49101
E
note plaque door~
The plaque reads: "Grenzland Zine Editorial Room"
~
S
#49111
The Grenzland Zine Editorial Room~
This is supposed to be the editorial room of the Grenzland Zine.
Dozens of monkeys chained to typwriters type frantically. This is a
joke, right?
~
491 de 0 0 0 0
D3
You see the Balcony above the Entry Hall.
~
~
1 49104 49110
S
#49112
The Library~
The walls are bookshelves and the room is filled with plenty of
winged chairs, reading desks and map tables. One book shelves to the
North seems to be a door of some sort?
~
491 de 0 0 0 0
D0
A curious door. Where might it lead?
~
~
1 -1 49200
D2
You see the Balcony above the Entry.
~
~
1 -1 49110
S
$

286
lib/world/wld/492.wld Normal file
View File

@@ -0,0 +1,286 @@
#49200
The Entrance to the Library Maze~
This seems to be some secret section of the library. There is
shelves full of books everywhere! Let's hope you don't get lost here.
~
492 d 0 0 0 0
D0
The shelves continue North.
~
~
0 -1 49202
D3
The shelves continue West.
~
~
0 -1 49201
D2
Through the door you see the Library of the Grenzland Build.
~
~
1 -1 49112
S
#49201
A dead end in the Library Maze~
This is a dead end. There is shelves full of books everywhere!
Let's hope you don't get lost here.
~
492 d 0 0 0 0
D1
The shelves continue East.
~
~
0 -1 49200
S
#49202
A corridor in the Library Maze~
This is a corridor. It continues North and South. There is
shelves full of books everywhere! Let's hope you don't get lost here.
~
492 d 0 0 0 0
D0
The shelves continue North.
~
~
0 -1 49203
D2
The shelves continue South.
~
~
0 -1 49200
S
#49203
A junktion in the Library Maze~
This is a junktion. Corridors continue East, South, and West. A
door leads North. There is shelves full of books everywhere! Let's
hope you don't get lost here.
~
492 d 0 0 0 0
D0
A door leads north
~
~
1 -1 49210
D1
The shelves continue East.
~
~
0 -1 49207
D2
The shelves continue South.
~
~
0 -1 49202
D3
The shelves continue West.
~
~
0 -1 49204
S
#49204
A corridor in the Library Maze~
This is a corridor. It continues East and West. There is shelves
full of books everywhere! Let's hope you don't get lost here.
~
492 d 0 0 0 0
D1
The shelves continue East.
~
~
0 -1 49203
D3
The shelves continue West.
~
~
0 -1 49205
S
#49205
A corridor in the Library Maze~
This is a corridor. It continues East. A door leads south. There
is shelves full of books everywhere! Let's hope you don't get lost
here.
~
492 d 0 0 0 0
D1
The shelves continue East.
~
~
0 -1 49204
D2
A door leads South.
~
~
1 -1 49206
S
#49206
A Reading Room~
This seems to be a reading room. There are a few desks here. The
room has only one exit North.
~
492 d 0 0 0 0
D0
A door leads North.
~
~
1 -1 49205
S
#49207
A corridor in the Library Maze~
This is a corridor. It continues East and West. There is shelves
full of books everywhere! Let's hope you don't get lost here.
~
492 d 0 0 0 0
D1
The shelves continue East.
~
~
0 -1 49208
D3
The shelves continue West.
~
~
0 -1 49203
S
#49208
A junktion in the Library Maze~
This is a junktion. Corridors continue South and West. A door
leads North. There is shelves full of books everywhere! Let's hope
you don't get lost here.
~
492 d 0 0 0 0
D0
A door leads north
~
~
1 -1 49211
D2
The shelves continue South.
~
~
0 -1 49209
D3
The shelves continue West.
~
~
0 -1 49207
S
#49209
A dead end in the Library Maze~
This is a dead end. There is shelves full of books everywhere!
Let's hope you don't get lost here.
~
492 d 0 0 0 0
D0
The shelves continue North.
~
~
0 -1 49208
S
#49210
A dark corridor in the Library Maze~
This is a corridor. There are no light sources! The corridor
continues North. A door leads South. There is shelves full of books
everywhere! Let's hope you don't get lost here.
~
492 ad 0 0 0 0
D0
The shelves continue North.
~
~
0 -1 49214
D2
A door leads South.
~
~
1 -1 49203
S
#49211
A dark corridor in the Library Maze~
This is a corridor. There are no light sources! The corridor
continues North. A door leads South. There is shelves full of books
everywhere! Let's hope you don't get lost here.
~
492 ad 0 0 0 0
D0
The shelves continue North.
~
~
0 -1 49212
D2
A door leads South.
~
~
1 -1 49208
S
#49212
A dark corridor in the Library Maze~
This is a corridor. There are no light sources! The corridor
continues South and West. There is shelves full of books everywhere!
Let's hope you don't get lost here.
~
492 ad 0 0 0 0
D2
The shelves continue South.
~
~
0 -1 49211
D3
The shelves continue West.
~
~
1 -1 49213
S
#49213
A dark junktion in the Library Maze~
This is a junktion. There are no light sources! Corridors
continue East and West. A door leads North. There is shelves full
of books everywhere! Let's hope you don't get lost here.
~
492 ad 0 0 0 0
D0
A door leads north
~
~
1 -1 49215
D1
The shelves continue East.
~
~
0 -1 49212
D3
The shelves continue West.
~
~
0 -1 49214
S
#49214
A dark corridor in the Library Maze~
This is a corridor. There are no light sources! The corridor
continues East and South. There is shelves full of books everywhere!
Let's hope you don't get lost here.
~
492 ad 0 0 0 0
D1
The shelves continue East.
~
~
1 -1 49213
D2
The shelves continue South.
~
~
0 -1 49210
S
#49215
Master Ultan's Hideout~
This seems to be a reading room. There are no light sources here!
There are a few desks here. The room has only one exit South.
~
492 d 0 0 0 0
D2
A door leads South.
~
~
1 -1 49213
S
$

View File

@@ -38,6 +38,7 @@
44.wld 44.wld
45.wld 45.wld
46.wld 46.wld
49.wld
50.wld 50.wld
51.wld 51.wld
52.wld 52.wld
@@ -183,6 +184,8 @@
343.wld 343.wld
345.wld 345.wld
346.wld 346.wld
491.wld
492.wld
555.wld 555.wld
556.wld 556.wld
653.wld 653.wld

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)

7
lib/world/zon/49.zon Normal file
View File

@@ -0,0 +1,7 @@
#49
GrenzlandMUD~
Grenzland~
4900 4999 15 2 d 0 0 0 1 33
S
$

21
lib/world/zon/491.zon Normal file
View File

@@ -0,0 +1,21 @@
#491
GrenzlandMUD~
Grenzland Building~
49100 49199 15 2 d 0 0 0 1 33
M 0 49100 1 49100 (the waiter)
G 1 4901 100 -1 (a bottle)
G 1 4902 100 -1 (a bottle)
G 1 4903 100 -1 (a bottle)
G 1 4904 100 -1 (a bottle)
M 0 49102 1 49101 (the shopkeeper)
G 1 4905 50 -1 (a zine)
R 0 49101 4900 -1 (a bulletin board)
O 0 4900 99 49101 (a bulletin board)
R 0 49103 49103 -1 (a sink)
O 0 49103 99 49103 (a sink)
R 0 49104 49104 -1 (a key)
D 0 49110 1 2
D 0 49111 3 2
D 0 49112 0 1
S
$

View File

@@ -0,0 +1,21 @@
#491
GrenzlandMUD~
Grenzland Building~
49100 49199 15 2 d 0 0 0 1 33
M 0 49100 1 49100 (the waiter)
G 1 4901 100 -1 (a bottle)
G 1 4902 100 -1 (a bottle)
G 1 4903 100 -1 (a bottle)
G 1 4904 100 -1 (a bottle)
M 0 4901 1 49102 (the waiter)
G 1 4905 100 -1 (a zine)
R 0 49101 4900 -1 (a bulletin board)
O 0 4900 99 49101 (a bulletin board)
R 0 49103 49103 -1 (a sink)
O 0 49103 99 49103 (a sink)
R 0 49104 49104 -1 (a key)
D 0 49110 1 2
D 0 49111 3 2
D 0 49112 0 1
S
$

35
lib/world/zon/492.zon Normal file
View File

@@ -0,0 +1,35 @@
#492
GrenzlandMUD~
The Library Maze~
49200 49299 15 2 d 0 0 0 1 7
M 0 49200 8 49200 (a book worm)
M 0 49200 8 49201 (a book worm)
M 0 49200 8 49201 (a book worm)
M 0 49200 8 49202 (a book worm)
M 0 49201 5 49202 (an apprentice)
M 0 49201 5 49203 (an apprentice)
M 0 49200 8 49205 (a book worm)
M 0 49202 2 49206 (a journeyman)
E 1 4906 99 16 (a dagger)
M 0 49200 8 49207 (a book worm)
M 0 49200 8 49208 (a book worm)
M 0 49201 5 49209 (an apprentice)
E 1 4906 99 16 (a dagger)
M 0 49203 3 49210 (a book thief)
M 0 49203 3 49212 (a book thief)
M 0 49202 2 49213 (a journeyman)
E 1 4906 99 16 (a dagger)
M 0 49204 1 49215 (master ultan)
E 1 4906 99 16 (a dagger)
G 1 4905 99 -1 (the grenzland zine)
D 0 49200 2 1
D 0 49203 0 1
D 0 49205 2 1
D 0 49206 0 1
D 0 49208 0 1
D 0 49210 2 1
D 0 49211 2 1
D 0 49213 0 1
D 0 49215 2 1
S
$

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)

View File

@@ -38,6 +38,7 @@
44.zon 44.zon
45.zon 45.zon
46.zon 46.zon
49.zon
50.zon 50.zon
51.zon 51.zon
52.zon 52.zon
@@ -183,6 +184,8 @@
343.zon 343.zon
345.zon 345.zon
346.zon 346.zon
491.zon
492.zon
555.zon 555.zon
556.zon 556.zon
653.zon 653.zon

View File

@@ -1 +0,0 @@
This directory is for log files.

0
log/badpws Normal file
View File

0
log/delete Normal file
View File

0
log/dts Normal file
View File

13
log/errors Normal file
View File

@@ -0,0 +1,13 @@
SYSERR: bind: Address already in use
SYSERR: bind: Address already in use
SYSERR: bind: Address already in use
Jan 26 21:34:14 2026 :: SYSERR: zone file: Invalid vnum 4900, cmd disabled
Jan 26 21:34:14 2026 :: SYSERR: ...offending cmd: 'M' cmd in zone #491, line 5
Jan 26 21:34:14 2026 :: SYSERR: zone file: Invalid vnum 4901, cmd disabled
Jan 26 21:34:14 2026 :: SYSERR: ...offending cmd: 'M' cmd in zone #491, line 10
Jan 26 21:34:42 2026 :: SYSERR: Received SIGHUP, SIGINT, or SIGTERM. Shutting down...
Jan 26 21:34:49 2026 :: SYSERR: zone file: Invalid vnum 4900, cmd disabled
Jan 26 21:34:49 2026 :: SYSERR: ...offending cmd: 'M' cmd in zone #491, line 5
Jan 26 21:34:49 2026 :: SYSERR: zone file: Invalid vnum 4901, cmd disabled
Jan 26 21:34:49 2026 :: SYSERR: ...offending cmd: 'M' cmd in zone #491, line 10
Jan 26 21:38:19 2026 :: SYSERR: Received SIGHUP, SIGINT, or SIGTERM. Shutting down...

0
log/godcmds Normal file
View File

0
log/help Normal file
View File

0
log/levels Normal file
View File

1
log/newplayers Normal file
View File

@@ -0,0 +1 @@
Jan 26 21:36:53 2026 :: Karrn [localhost] new player.

0
log/olc Normal file
View File

0
log/rentgone Normal file
View File

5
log/restarts Normal file
View File

@@ -0,0 +1,5 @@
Jan 26 21:00:54 2026 :: Running game on port 4000.
Jan 26 21:17:40 2026 :: Running game on port 4000.
Jan 26 21:25:55 2026 :: Running game on port 4000.
Jan 26 21:34:13 2026 :: Running game on port 4000.
Jan 26 21:34:49 2026 :: Running game on port 4000.

0
log/rip Normal file
View File

265
log/syslog.1 Normal file
View File

@@ -0,0 +1,265 @@
autorun starting game Mo 26. Jan 21:34:13 CET 2026
running bin/circle -q 4000
nohup: Eingabe wird ignoriert
No etc/config file, using defaults: No such file or directory
Jan 26 21:34:13 2026 :: Loading configuration.
Jan 26 21:34:13 2026 :: tbaMUD 2025
Jan 26 21:34:13 2026 :: Using lib as data directory.
Jan 26 21:34:13 2026 :: Running game on port 4000.
Jan 26 21:34:13 2026 :: Finding player limit.
Jan 26 21:34:13 2026 :: Setting player limit to 300 using rlimit.
Jan 26 21:34:13 2026 :: Opening mother connection.
Jan 26 21:34:13 2026 :: Binding to all IP interfaces on this host.
Jan 26 21:34:13 2026 :: Boot db -- BEGIN.
Jan 26 21:34:13 2026 :: Resetting the game time:
Jan 26 21:34:13 2026 :: No time file 'etc/time' starting from the beginning.
Jan 26 21:34:13 2026 :: Current Gametime: 23H 29D 15M 1044Y.
Jan 26 21:34:13 2026 :: Initialize Global Lists
Jan 26 21:34:13 2026 :: Initializing Events
Jan 26 21:34:13 2026 :: Reading news, credits, help, ihelp, bground, info & motds.
Jan 26 21:34:13 2026 :: Loading spell definitions.
Jan 26 21:34:13 2026 :: Loading zone table.
Jan 26 21:34:13 2026 :: 192 zones, 13824 bytes.
Jan 26 21:34:13 2026 :: Loading triggers and generating index.
Jan 26 21:34:13 2026 :: Loading rooms.
Jan 26 21:34:14 2026 :: 12758 rooms, 2347472 bytes.
Jan 26 21:34:14 2026 :: Renumbering rooms.
Jan 26 21:34:14 2026 :: Checking start rooms.
Jan 26 21:34:14 2026 :: Loading mobs and generating index.
Jan 26 21:34:14 2026 :: 3712 mobs, 118784 bytes in index, 2138112 bytes in prototypes.
Jan 26 21:34:14 2026 :: Loading objs and generating index.
Jan 26 21:34:14 2026 :: 4774 objs, 152768 bytes in index, 1145760 bytes in prototypes.
Jan 26 21:34:14 2026 :: Renumbering zone table.
Jan 26 21:34:14 2026 :: SYSERR: zone file: Invalid vnum 4900, cmd disabled
Jan 26 21:34:14 2026 :: SYSERR: ...offending cmd: 'M' cmd in zone #491, line 5
Jan 26 21:34:14 2026 :: SYSERR: zone file: Invalid vnum 4901, cmd disabled
Jan 26 21:34:14 2026 :: SYSERR: ...offending cmd: 'M' cmd in zone #491, line 10
Jan 26 21:34:14 2026 :: Loading shops.
Jan 26 21:34:14 2026 :: Loading quests.
Jan 26 21:34:14 2026 :: 1 entries, 128 bytes.
Jan 26 21:34:14 2026 :: Loading help entries.
Jan 26 21:34:14 2026 :: 2640 entries, 84480 bytes.
Jan 26 21:34:14 2026 :: Generating player index.
Jan 26 21:34:14 2026 :: Loading fight messages.
Jan 26 21:34:14 2026 :: Loaded 37 Combat Messages...
Jan 26 21:34:14 2026 :: Loading social messages.
Jan 26 21:34:14 2026 :: Social table contains 490 socials.
Jan 26 21:34:14 2026 :: Building command list.
Jan 26 21:34:14 2026 :: Command info rebuilt, 766 total commands.
Jan 26 21:34:14 2026 :: Assigning function pointers:
Jan 26 21:34:14 2026 :: Mobiles.
Jan 26 21:34:14 2026 :: Shopkeepers.
Jan 26 21:34:14 2026 :: Objects.
Jan 26 21:34:14 2026 :: Rooms.
Jan 26 21:34:14 2026 :: Questmasters.
Jan 26 21:34:14 2026 :: Assigning spell and skill levels.
Jan 26 21:34:14 2026 :: Sorting command list and spells.
Jan 26 21:34:14 2026 :: Booting mail system.
Jan 26 21:34:14 2026 :: Mail file read -- 0 messages.
Jan 26 21:34:14 2026 :: Reading banned site and invalid-name list.
Jan 26 21:34:14 2026 :: Loading Ideas.
Jan 26 21:34:14 2026 :: Loading Bugs.
Jan 26 21:34:14 2026 :: Loading Typos.
Jan 26 21:34:14 2026 :: Booting houses.
Jan 26 21:34:14 2026 :: No houses to load. File 'etc/hcontrol' does not exist.
Jan 26 21:34:14 2026 :: Cleaning up last log.
Jan 26 21:34:14 2026 :: Resetting #0: The Builder Academy Zone (rooms 0-99).
Jan 26 21:34:14 2026 :: Resetting #1: Sanctus (rooms 100-199).
Jan 26 21:34:14 2026 :: Resetting #2: Sanctus II (rooms 200-299).
Jan 26 21:34:14 2026 :: Resetting #3: Sanctus III (rooms 300-399).
Jan 26 21:34:14 2026 :: Resetting #4: Rename (rooms 400-499).
Jan 26 21:34:14 2026 :: Resetting #5: Newbie Farm (rooms 500-599).
Jan 26 21:34:14 2026 :: Resetting #6: Sea of Souls (rooms 600-699).
Jan 26 21:34:14 2026 :: Resetting #7: Camelot (rooms 700-799).
Jan 26 21:34:14 2026 :: Resetting #9: River Island of Minos (rooms 900-999).
Jan 26 21:34:14 2026 :: Resetting #11: Frozen Castle (rooms 1100-1199).
Jan 26 21:34:14 2026 :: Resetting #12: God Complex Merged with 343 (rooms 1200-1299).
Jan 26 21:34:14 2026 :: Resetting #13: TBA Examples (rooms 1300-1399).
Jan 26 21:34:14 2026 :: Resetting #14: TBA Examples II (rooms 1400-1499).
Jan 26 21:34:14 2026 :: Resetting #15: Straight Path (rooms 1500-1599).
Jan 26 21:34:14 2026 :: Resetting #16: Camelot II (rooms 1600-1699).
Jan 26 21:34:14 2026 :: Resetting #17: Camelot III (rooms 1700-1799).
Jan 26 21:34:14 2026 :: Resetting #18: Nuclear Wasteland (rooms 1800-1899).
Jan 26 21:34:14 2026 :: Resetting #19: Spider Swamp (rooms 1900-1999).
Jan 26 21:34:14 2026 :: Resetting #20: Arena (rooms 2000-2099).
Jan 26 21:34:14 2026 :: Resetting #22: Tower of the Undead (rooms 2200-2299).
Jan 26 21:34:14 2026 :: Resetting #25: High Tower of Magic (rooms 2500-2599).
Jan 26 21:34:14 2026 :: Resetting #26: High Tower of Magic II (rooms 2600-2699).
Jan 26 21:34:14 2026 :: Resetting #27: Memlin Caverns (rooms 2700-2799).
Jan 26 21:34:14 2026 :: Resetting #28: Mudschool (rooms 2800-2899).
Jan 26 21:34:14 2026 :: Resetting #30: Northern Midgaard (rooms 3000-3099).
Jan 26 21:34:14 2026 :: Resetting #31: Southern Midgaard (rooms 3100-3199).
Jan 26 21:34:14 2026 :: Resetting #32: Midgaard (rooms 3200-3299).
Jan 26 21:34:14 2026 :: Resetting #33: Three of Swords (rooms 3300-3399).
Jan 26 21:34:14 2026 :: Resetting #35: Miden'Nir (rooms 3500-3599).
Jan 26 21:34:14 2026 :: Resetting #36: Chessboard of Midgaard (rooms 3600-3699).
Jan 26 21:34:14 2026 :: Resetting #37: Capital Sewer System (rooms 3700-3799).
Jan 26 21:34:14 2026 :: Resetting #38: Capital Sewer System II (rooms 3800-3899).
Jan 26 21:34:14 2026 :: Resetting #39: Haven (rooms 3900-3999).
Jan 26 21:34:14 2026 :: Resetting #40: Mines of Moria (rooms 4000-4099).
Jan 26 21:34:14 2026 :: Resetting #41: Mines of Moria (rooms 4100-4199).
Jan 26 21:34:14 2026 :: Resetting #42: Dragon Chasm (rooms 4200-4299).
Jan 26 21:34:14 2026 :: Resetting #43: Arctic Zone (rooms 4300-4399).
Jan 26 21:34:14 2026 :: Resetting #44: Orc Camp (rooms 4400-4499).
Jan 26 21:34:14 2026 :: Resetting #45: Woodland Monastery (rooms 4500-4599).
Jan 26 21:34:14 2026 :: Resetting #46: Ant Hill (rooms 4600-4699).
Jan 26 21:34:14 2026 :: Resetting #49: Grenzland (rooms 4900-4999).
Jan 26 21:34:14 2026 :: Resetting #50: Great Eastern Desert (rooms 5000-5099).
Jan 26 21:34:14 2026 :: Resetting #51: Drow City (rooms 5100-5199).
Jan 26 21:34:14 2026 :: Resetting #52: City of Thalos (rooms 5200-5299).
Jan 26 21:34:14 2026 :: Resetting #53: Great Pyramid (rooms 5300-5399).
Jan 26 21:34:14 2026 :: Resetting #54: New Thalos (rooms 5400-5499).
Jan 26 21:34:14 2026 :: Resetting #55: New Thalos II (rooms 5500-5599).
Jan 26 21:34:14 2026 :: Resetting #56: New Thalos Wilderness (rooms 5600-5699).
Jan 26 21:34:14 2026 :: Resetting #57: Zodiac (rooms 5700-5799).
Jan 26 21:34:14 2026 :: Resetting #60: Haon-Dor, Light Forest (rooms 6000-6099).
Jan 26 21:34:14 2026 :: Resetting #61: Haon-Dor, Light Forest II (rooms 6100-6199).
Jan 26 21:34:14 2026 :: Resetting #62: Orc Enclave (rooms 6200-6299).
Jan 26 21:34:14 2026 :: Resetting #63: Arachnos (rooms 6300-6399).
Jan 26 21:34:14 2026 :: Resetting #64: Rand's Tower (rooms 6400-6499).
Jan 26 21:34:14 2026 :: Resetting #65: Dwarven Kingdom (rooms 6500-6599).
Jan 26 21:34:14 2026 :: Resetting #70: Sewer, First Level (rooms 7000-7099).
Jan 26 21:34:14 2026 :: Resetting #71: Second Sewer (rooms 7100-7199).
Jan 26 21:34:14 2026 :: Resetting #72: Sewer Maze (rooms 7200-7299).
Jan 26 21:34:14 2026 :: Resetting #73: Tunnels in the Sewer (rooms 7300-7399).
Jan 26 21:34:14 2026 :: Resetting #74: Newbie Graveyard (rooms 7400-7499).
Jan 26 21:34:14 2026 :: Resetting #75: Zamba (rooms 7500-7599).
Jan 26 21:34:14 2026 :: Resetting #78: Gideon (rooms 7800-7899).
Jan 26 21:34:14 2026 :: Resetting #79: Redferne's Residence (rooms 7900-7999).
Jan 26 21:34:14 2026 :: Resetting #83: Glumgold's Sea (rooms 8300-8399).
Jan 26 21:34:14 2026 :: Resetting #86: Duke Kalithorn's Keep (rooms 8600-8699).
Jan 26 21:34:14 2026 :: Resetting #90: Oasis (rooms 9000-9099).
Jan 26 21:34:14 2026 :: Resetting #96: Domiae (rooms 9600-9699).
Jan 26 21:34:14 2026 :: Resetting #100: Northern Highway (rooms 10000-10099).
Jan 26 21:34:14 2026 :: Resetting #101: South Road (rooms 10100-10199).
Jan 26 21:34:14 2026 :: Resetting #103: DBZ World (rooms 10300-10399).
Jan 26 21:34:14 2026 :: Resetting #104: Land of Orchan (rooms 10400-10499).
Jan 26 21:34:14 2026 :: Resetting #106: Elcardo (rooms 10600-10699).
Jan 26 21:34:14 2026 :: Resetting #107: Realms of Iuel (rooms 10700-10799).
Jan 26 21:34:14 2026 :: Resetting #115: Monestary Omega (rooms 11500-11599).
Jan 26 21:34:14 2026 :: Resetting #117: Los Torres (rooms 11700-11799).
Jan 26 21:34:14 2026 :: Resetting #118: The Dollhouse (rooms 11800-11899).
Jan 26 21:34:14 2026 :: Resetting #120: Rome (rooms 12000-12099).
Jan 26 21:34:14 2026 :: Resetting #125: Hannah (rooms 12500-12599).
Jan 26 21:34:14 2026 :: Resetting #130: Mist Maze (rooms 13000-13099).
Jan 26 21:34:14 2026 :: Resetting #140: Wyvern City (rooms 14000-14099).
Jan 26 21:34:14 2026 :: Resetting #150: King Welmar's Castle (rooms 15000-15099).
Jan 26 21:34:14 2026 :: Resetting #169: Gibberling Caves (rooms 16900-16999).
Jan 26 21:34:14 2026 :: Resetting #175: Cardinal Wizards (rooms 17500-17599).
Jan 26 21:34:14 2026 :: Resetting #186: Newbie Zone (rooms 18600-18699).
Jan 26 21:34:14 2026 :: Resetting #187: Circus (rooms 18700-18799).
Jan 26 21:34:14 2026 :: Resetting #200: Western Highway (rooms 20000-20099).
Jan 26 21:34:14 2026 :: Resetting #201: Sapphire Islands (rooms 20100-20199).
Jan 26 21:34:14 2026 :: Resetting #211: Tarot (rooms 21100-21199).
Jan 26 21:34:14 2026 :: Resetting #220: The Enchanted Kitchen (rooms 22000-22099).
Jan 26 21:34:14 2026 :: Resetting #232: Terringham (rooms 23200-23299).
Jan 26 21:34:14 2026 :: Resetting #233: Dragon Plains (rooms 23300-23399).
Jan 26 21:34:14 2026 :: Resetting #234: Newbie School (rooms 23400-23499).
Jan 26 21:34:14 2026 :: Resetting #235: Dwarven Mines (rooms 23500-23599).
Jan 26 21:34:14 2026 :: Resetting #236: Aldin (rooms 23600-23699).
Jan 26 21:34:14 2026 :: Resetting #237: Dwarven Trade Route (rooms 23700-23799).
Jan 26 21:34:14 2026 :: Resetting #238: Crystal Castle (rooms 23800-23899).
Jan 26 21:34:14 2026 :: Resetting #239: South Pass (rooms 23900-23999).
Jan 26 21:34:14 2026 :: Resetting #240: Dun Maura (rooms 24000-24099).
Jan 26 21:34:14 2026 :: Resetting #241: Starship Enterprise (rooms 24100-24199).
Jan 26 21:34:14 2026 :: Resetting #242: New Southern Midgaard (rooms 24200-24299).
Jan 26 21:34:14 2026 :: Resetting #243: Snowy Valley (rooms 24300-24399).
Jan 26 21:34:14 2026 :: Resetting #244: Cooland Prison (rooms 24400-24499).
Jan 26 21:34:14 2026 :: Resetting #245: The Nether (rooms 24500-24599).
Jan 26 21:34:14 2026 :: Resetting #246: The Nether II (rooms 24600-24699).
Jan 26 21:34:14 2026 :: Resetting #247: Graveyard (rooms 24700-24799).
Jan 26 21:34:14 2026 :: Resetting #248: Elven Woods (rooms 24800-24899).
Jan 26 21:34:14 2026 :: Resetting #249: Jedi Clan House (rooms 24900-24999).
Jan 26 21:34:14 2026 :: Resetting #250: DragonSpyre (rooms 25000-25099).
Jan 26 21:34:14 2026 :: Resetting #251: Ape Village (rooms 25100-25199).
Jan 26 21:34:14 2026 :: Resetting #252: Castle of the Vampyre (rooms 25200-25299).
Jan 26 21:34:14 2026 :: Resetting #253: Windmill (rooms 25300-25399).
Jan 26 21:34:14 2026 :: Resetting #254: Mordecai's Village (rooms 25400-25499).
Jan 26 21:34:14 2026 :: Resetting #255: Shipwreck (rooms 25500-25599).
Jan 26 21:34:14 2026 :: Resetting #256: Lord's Keep (rooms 25600-25699).
Jan 26 21:34:14 2026 :: Resetting #257: Jareth Main City (rooms 25700-25799).
Jan 26 21:34:14 2026 :: Resetting #258: Light Forest (rooms 25800-25899).
Jan 26 21:34:14 2026 :: Resetting #259: Haunted Mansion (rooms 25900-25999).
Jan 26 21:34:14 2026 :: Resetting #260: Grasslands (rooms 26000-26099).
Jan 26 21:34:14 2026 :: Resetting #261: Inna & Igor's Castle (rooms 26100-26199).
Jan 26 21:34:14 2026 :: Resetting #262: Forest Trails (rooms 26200-26299).
Jan 26 21:34:14 2026 :: Resetting #263: Farmlands (rooms 26300-26399).
Jan 26 21:34:14 2026 :: Resetting #264: Banshide (rooms 26400-26499).
Jan 26 21:34:14 2026 :: Resetting #265: Beach & Lighthouse (rooms 26500-26599).
Jan 26 21:34:14 2026 :: Resetting #266: Realm of Lord Ankou (rooms 26600-26699).
Jan 26 21:34:14 2026 :: Resetting #267: Vice Island (rooms 26700-26799).
Jan 26 21:34:14 2026 :: Resetting #268: Vice Island II (rooms 26800-26899).
Jan 26 21:34:14 2026 :: Resetting #269: Southern Desert (rooms 26900-26999).
Jan 26 21:34:14 2026 :: Resetting #270: Wasteland (rooms 27000-27099).
Jan 26 21:34:14 2026 :: Resetting #271: Sundhaven (rooms 27100-27199).
Jan 26 21:34:14 2026 :: Resetting #272: Sundhaven II (rooms 27200-27299).
Jan 26 21:34:14 2026 :: Resetting #273: Space Station Alpha (rooms 27300-27399).
Jan 26 21:34:14 2026 :: Resetting #274: Adria: Saint Brigid (rooms 27400-27499).
Jan 26 21:34:14 2026 :: Resetting #275: New Sparta (rooms 27500-27599).
Jan 26 21:34:14 2026 :: Resetting #276: New Sparta II (rooms 27600-27699).
Jan 26 21:34:14 2026 :: Resetting #277: Shire (rooms 27700-27799).
Jan 26 21:34:14 2026 :: Resetting #278: Oceania (rooms 27800-27899).
Jan 26 21:34:14 2026 :: Resetting #279: Notre Dame (rooms 27900-27999).
Jan 26 21:34:14 2026 :: Resetting #280: Living Motherboard (rooms 28000-28099).
Jan 26 21:34:14 2026 :: Resetting #281: Forest of Khanjar (rooms 28100-28199).
Jan 26 21:34:14 2026 :: Resetting #282: Infernal Pit of Kerjim (rooms 28200-28299).
Jan 26 21:34:14 2026 :: Resetting #283: Haunted House (rooms 28300-28399).
Jan 26 21:34:14 2026 :: Resetting #284: Ghenna (rooms 28400-28499).
Jan 26 21:34:14 2026 :: Resetting #285: Descent to Hell II (rooms 28500-28599).
Jan 26 21:34:14 2026 :: Resetting #286: Descent to Hell (rooms 28600-28699).
Jan 26 21:34:14 2026 :: Resetting #287: Ofingia and the Goblin Town (rooms 28700-28799).
Jan 26 21:34:14 2026 :: Resetting #288: Galaxy (rooms 28800-28899).
Jan 26 21:34:14 2026 :: Resetting #289: Werith's Wayhouse (rooms 28900-28999).
Jan 26 21:34:14 2026 :: Resetting #290: Lizard Lair Safari (rooms 29000-29099).
Jan 26 21:34:14 2026 :: Resetting #291: Black Forest (rooms 29100-29199).
Jan 26 21:34:14 2026 :: Resetting #292: Kerofk (rooms 29200-29299).
Jan 26 21:34:14 2026 :: Resetting #293: Kerofk II (rooms 29300-29399).
Jan 26 21:34:14 2026 :: Resetting #294: Trade Road (rooms 29400-29499).
Jan 26 21:34:14 2026 :: Resetting #295: Jungle (rooms 29500-29599).
Jan 26 21:34:14 2026 :: Resetting #296: Froboz Fun Factory (rooms 29600-29699).
Jan 26 21:34:14 2026 :: Resetting #298: Castle of Desire (rooms 29800-29899).
Jan 26 21:34:14 2026 :: Resetting #299: Abandoned Cathedral (rooms 29900-29999).
Jan 26 21:34:14 2026 :: Resetting #300: Ancalador (rooms 30000-30099).
Jan 26 21:34:14 2026 :: Resetting #301: Campus (rooms 30100-30199).
Jan 26 21:34:14 2026 :: Resetting #302: Campus II (rooms 30200-30299).
Jan 26 21:34:14 2026 :: Resetting #303: Campus III (rooms 30300-30399).
Jan 26 21:34:14 2026 :: Resetting #304: Temple of the Bull (rooms 30400-30499).
Jan 26 21:34:14 2026 :: Resetting #305: Chessboard (rooms 30500-30599).
Jan 26 21:34:14 2026 :: Resetting #306: Newbie Tree (rooms 30600-30699).
Jan 26 21:34:14 2026 :: Resetting #307: Castle (rooms 30700-30799).
Jan 26 21:34:14 2026 :: Resetting #308: Baron Cailveh (rooms 30800-30899).
Jan 26 21:34:14 2026 :: Resetting #309: Keep of Baron Westlawn (rooms 30900-30999).
Jan 26 21:34:14 2026 :: Resetting #310: Graye Area (rooms 31000-31099).
Jan 26 21:34:14 2026 :: Resetting #311: The Dragon's Teeth (rooms 31100-31199).
Jan 26 21:34:14 2026 :: Resetting #312: Leper Island (rooms 31200-31299).
Jan 26 21:34:14 2026 :: Resetting #313: Farmlands of Ofingia (rooms 31300-31399).
Jan 26 21:34:14 2026 :: Resetting #314: X'Raantra's Altar of Sacrifice (rooms 31400-31499).
Jan 26 21:34:14 2026 :: Resetting #315: McGintey Business District (rooms 31500-31599).
Jan 26 21:34:14 2026 :: Resetting #316: McGintey Guild Area (rooms 31600-31699).
Jan 26 21:34:14 2026 :: Resetting #317: Wharf (rooms 31700-31799).
Jan 26 21:34:14 2026 :: Resetting #318: Dock Area (rooms 31800-31899).
Jan 26 21:34:14 2026 :: Resetting #319: Yllythad Sea (rooms 31900-31999).
Jan 26 21:34:14 2026 :: Resetting #320: Yllythad Sea II (rooms 32000-32099).
Jan 26 21:34:14 2026 :: Resetting #321: Yllythad Sea III (rooms 32100-32199).
Jan 26 21:34:14 2026 :: Resetting #322: McGintey Bay (rooms 32200-32299).
Jan 26 21:34:14 2026 :: Resetting #323: Caverns of the Pale Man (rooms 32300-32399).
Jan 26 21:34:14 2026 :: Resetting #324: Army Encampment (rooms 32400-32499).
Jan 26 21:34:14 2026 :: Resetting #325: Revelry (rooms 32500-32599).
Jan 26 21:34:14 2026 :: Resetting #326: Army Perimeter (rooms 32600-32699).
Jan 26 21:34:14 2026 :: Resetting #343: God Complex (rooms 34300-34399).
Jan 26 21:34:14 2026 :: Resetting #345: Asylum for the Insane (rooms 34500-34599).
Jan 26 21:34:14 2026 :: Resetting #346: God Hall Ext 346 for God Hall Cmplx (rooms 34600-34699).
Jan 26 21:34:14 2026 :: Resetting #491: Grenzland Building (rooms 49100-49199).
Jan 26 21:34:14 2026 :: Resetting #492: The Library Maze (rooms 49200-49299).
Jan 26 21:34:14 2026 :: Resetting #555: Ultima (rooms 55500-55599).
Jan 26 21:34:14 2026 :: Resetting #556: Ultima II (rooms 55600-55699).
Jan 26 21:34:14 2026 :: Resetting #653: Apartment (rooms 65300-65399).
Jan 26 21:34:14 2026 :: Resetting #654: Subdivision (rooms 65400-65499).
Jan 26 21:34:14 2026 :: Boot db -- DONE.
Jan 26 21:34:14 2026 :: Signal trapping.
Jan 26 21:34:14 2026 :: Entering game loop.
Jan 26 21:34:14 2026 :: No connections. Going to sleep.
Jan 26 21:34:42 2026 :: SYSERR: Received SIGHUP, SIGINT, or SIGTERM. Shutting down...
Quick boot mode -- rent check supressed.
Using file descriptor for logging.
Improper shutdown of autorun detected, rotating syslogs before startup.

16
log/syslog.2 Normal file
View File

@@ -0,0 +1,16 @@
autorun starting game Mo 26. Jan 21:25:55 CET 2026
running bin/circle -q 4000
nohup: Eingabe wird ignoriert
No etc/config file, using defaults: No such file or directory
Jan 26 21:25:55 2026 :: Loading configuration.
Jan 26 21:25:55 2026 :: tbaMUD 2025
Jan 26 21:25:55 2026 :: Using lib as data directory.
Jan 26 21:25:55 2026 :: Running game on port 4000.
Jan 26 21:25:55 2026 :: Finding player limit.
Jan 26 21:25:55 2026 :: Setting player limit to 300 using rlimit.
Jan 26 21:25:55 2026 :: Opening mother connection.
Jan 26 21:25:55 2026 :: Binding to all IP interfaces on this host.
SYSERR: bind: Address already in use
Quick boot mode -- rent check supressed.
Using file descriptor for logging.
autoscript terminated Mo 26. Jan 21:25:55 CET 2026

269
log/syslog.4 Normal file
View File

@@ -0,0 +1,269 @@
autorun starting game Mo 26. Jan 21:34:49 CET 2026
running bin/circle -q 4000
nohup: Eingabe wird ignoriert
No etc/config file, using defaults: No such file or directory
Jan 26 21:34:49 2026 :: Loading configuration.
Jan 26 21:34:49 2026 :: tbaMUD 2025
Jan 26 21:34:49 2026 :: Using lib as data directory.
Jan 26 21:34:49 2026 :: Running game on port 4000.
Jan 26 21:34:49 2026 :: Finding player limit.
Jan 26 21:34:49 2026 :: Setting player limit to 300 using rlimit.
Jan 26 21:34:49 2026 :: Opening mother connection.
Jan 26 21:34:49 2026 :: Binding to all IP interfaces on this host.
Jan 26 21:34:49 2026 :: Boot db -- BEGIN.
Jan 26 21:34:49 2026 :: Resetting the game time:
Jan 26 21:34:49 2026 :: No time file 'etc/time' starting from the beginning.
Jan 26 21:34:49 2026 :: Current Gametime: 23H 29D 15M 1044Y.
Jan 26 21:34:49 2026 :: Initialize Global Lists
Jan 26 21:34:49 2026 :: Initializing Events
Jan 26 21:34:49 2026 :: Reading news, credits, help, ihelp, bground, info & motds.
Jan 26 21:34:49 2026 :: Loading spell definitions.
Jan 26 21:34:49 2026 :: Loading zone table.
Jan 26 21:34:49 2026 :: 192 zones, 13824 bytes.
Jan 26 21:34:49 2026 :: Loading triggers and generating index.
Jan 26 21:34:49 2026 :: Loading rooms.
Jan 26 21:34:49 2026 :: 12758 rooms, 2347472 bytes.
Jan 26 21:34:49 2026 :: Renumbering rooms.
Jan 26 21:34:49 2026 :: Checking start rooms.
Jan 26 21:34:49 2026 :: Loading mobs and generating index.
Jan 26 21:34:49 2026 :: 3712 mobs, 118784 bytes in index, 2138112 bytes in prototypes.
Jan 26 21:34:49 2026 :: Loading objs and generating index.
Jan 26 21:34:49 2026 :: 4774 objs, 152768 bytes in index, 1145760 bytes in prototypes.
Jan 26 21:34:49 2026 :: Renumbering zone table.
Jan 26 21:34:49 2026 :: SYSERR: zone file: Invalid vnum 4900, cmd disabled
Jan 26 21:34:49 2026 :: SYSERR: ...offending cmd: 'M' cmd in zone #491, line 5
Jan 26 21:34:49 2026 :: SYSERR: zone file: Invalid vnum 4901, cmd disabled
Jan 26 21:34:49 2026 :: SYSERR: ...offending cmd: 'M' cmd in zone #491, line 10
Jan 26 21:34:49 2026 :: Loading shops.
Jan 26 21:34:49 2026 :: Loading quests.
Jan 26 21:34:49 2026 :: 1 entries, 128 bytes.
Jan 26 21:34:49 2026 :: Loading help entries.
Jan 26 21:34:49 2026 :: 2640 entries, 84480 bytes.
Jan 26 21:34:49 2026 :: Generating player index.
Jan 26 21:34:49 2026 :: Loading fight messages.
Jan 26 21:34:49 2026 :: Loaded 37 Combat Messages...
Jan 26 21:34:49 2026 :: Loading social messages.
Jan 26 21:34:49 2026 :: Social table contains 490 socials.
Jan 26 21:34:49 2026 :: Building command list.
Jan 26 21:34:49 2026 :: Command info rebuilt, 766 total commands.
Jan 26 21:34:49 2026 :: Assigning function pointers:
Jan 26 21:34:49 2026 :: Mobiles.
Jan 26 21:34:49 2026 :: Shopkeepers.
Jan 26 21:34:49 2026 :: Objects.
Jan 26 21:34:49 2026 :: Rooms.
Jan 26 21:34:49 2026 :: Questmasters.
Jan 26 21:34:49 2026 :: Assigning spell and skill levels.
Jan 26 21:34:49 2026 :: Sorting command list and spells.
Jan 26 21:34:49 2026 :: Booting mail system.
Jan 26 21:34:49 2026 :: Mail file read -- 0 messages.
Jan 26 21:34:49 2026 :: Reading banned site and invalid-name list.
Jan 26 21:34:49 2026 :: Loading Ideas.
Jan 26 21:34:49 2026 :: Loading Bugs.
Jan 26 21:34:49 2026 :: Loading Typos.
Jan 26 21:34:49 2026 :: Booting houses.
Jan 26 21:34:49 2026 :: No houses to load. File 'etc/hcontrol' does not exist.
Jan 26 21:34:49 2026 :: Cleaning up last log.
Jan 26 21:34:49 2026 :: Resetting #0: The Builder Academy Zone (rooms 0-99).
Jan 26 21:34:49 2026 :: Resetting #1: Sanctus (rooms 100-199).
Jan 26 21:34:49 2026 :: Resetting #2: Sanctus II (rooms 200-299).
Jan 26 21:34:49 2026 :: Resetting #3: Sanctus III (rooms 300-399).
Jan 26 21:34:49 2026 :: Resetting #4: Rename (rooms 400-499).
Jan 26 21:34:49 2026 :: Resetting #5: Newbie Farm (rooms 500-599).
Jan 26 21:34:49 2026 :: Resetting #6: Sea of Souls (rooms 600-699).
Jan 26 21:34:49 2026 :: Resetting #7: Camelot (rooms 700-799).
Jan 26 21:34:49 2026 :: Resetting #9: River Island of Minos (rooms 900-999).
Jan 26 21:34:49 2026 :: Resetting #11: Frozen Castle (rooms 1100-1199).
Jan 26 21:34:49 2026 :: Resetting #12: God Complex Merged with 343 (rooms 1200-1299).
Jan 26 21:34:49 2026 :: Resetting #13: TBA Examples (rooms 1300-1399).
Jan 26 21:34:49 2026 :: Resetting #14: TBA Examples II (rooms 1400-1499).
Jan 26 21:34:49 2026 :: Resetting #15: Straight Path (rooms 1500-1599).
Jan 26 21:34:49 2026 :: Resetting #16: Camelot II (rooms 1600-1699).
Jan 26 21:34:49 2026 :: Resetting #17: Camelot III (rooms 1700-1799).
Jan 26 21:34:49 2026 :: Resetting #18: Nuclear Wasteland (rooms 1800-1899).
Jan 26 21:34:49 2026 :: Resetting #19: Spider Swamp (rooms 1900-1999).
Jan 26 21:34:49 2026 :: Resetting #20: Arena (rooms 2000-2099).
Jan 26 21:34:49 2026 :: Resetting #22: Tower of the Undead (rooms 2200-2299).
Jan 26 21:34:49 2026 :: Resetting #25: High Tower of Magic (rooms 2500-2599).
Jan 26 21:34:49 2026 :: Resetting #26: High Tower of Magic II (rooms 2600-2699).
Jan 26 21:34:49 2026 :: Resetting #27: Memlin Caverns (rooms 2700-2799).
Jan 26 21:34:49 2026 :: Resetting #28: Mudschool (rooms 2800-2899).
Jan 26 21:34:49 2026 :: Resetting #30: Northern Midgaard (rooms 3000-3099).
Jan 26 21:34:49 2026 :: Resetting #31: Southern Midgaard (rooms 3100-3199).
Jan 26 21:34:49 2026 :: Resetting #32: Midgaard (rooms 3200-3299).
Jan 26 21:34:49 2026 :: Resetting #33: Three of Swords (rooms 3300-3399).
Jan 26 21:34:49 2026 :: Resetting #35: Miden'Nir (rooms 3500-3599).
Jan 26 21:34:49 2026 :: Resetting #36: Chessboard of Midgaard (rooms 3600-3699).
Jan 26 21:34:49 2026 :: Resetting #37: Capital Sewer System (rooms 3700-3799).
Jan 26 21:34:49 2026 :: Resetting #38: Capital Sewer System II (rooms 3800-3899).
Jan 26 21:34:49 2026 :: Resetting #39: Haven (rooms 3900-3999).
Jan 26 21:34:49 2026 :: Resetting #40: Mines of Moria (rooms 4000-4099).
Jan 26 21:34:49 2026 :: Resetting #41: Mines of Moria (rooms 4100-4199).
Jan 26 21:34:49 2026 :: Resetting #42: Dragon Chasm (rooms 4200-4299).
Jan 26 21:34:49 2026 :: Resetting #43: Arctic Zone (rooms 4300-4399).
Jan 26 21:34:49 2026 :: Resetting #44: Orc Camp (rooms 4400-4499).
Jan 26 21:34:49 2026 :: Resetting #45: Woodland Monastery (rooms 4500-4599).
Jan 26 21:34:49 2026 :: Resetting #46: Ant Hill (rooms 4600-4699).
Jan 26 21:34:49 2026 :: Resetting #49: Grenzland (rooms 4900-4999).
Jan 26 21:34:49 2026 :: Resetting #50: Great Eastern Desert (rooms 5000-5099).
Jan 26 21:34:49 2026 :: Resetting #51: Drow City (rooms 5100-5199).
Jan 26 21:34:49 2026 :: Resetting #52: City of Thalos (rooms 5200-5299).
Jan 26 21:34:49 2026 :: Resetting #53: Great Pyramid (rooms 5300-5399).
Jan 26 21:34:49 2026 :: Resetting #54: New Thalos (rooms 5400-5499).
Jan 26 21:34:49 2026 :: Resetting #55: New Thalos II (rooms 5500-5599).
Jan 26 21:34:49 2026 :: Resetting #56: New Thalos Wilderness (rooms 5600-5699).
Jan 26 21:34:49 2026 :: Resetting #57: Zodiac (rooms 5700-5799).
Jan 26 21:34:49 2026 :: Resetting #60: Haon-Dor, Light Forest (rooms 6000-6099).
Jan 26 21:34:49 2026 :: Resetting #61: Haon-Dor, Light Forest II (rooms 6100-6199).
Jan 26 21:34:49 2026 :: Resetting #62: Orc Enclave (rooms 6200-6299).
Jan 26 21:34:49 2026 :: Resetting #63: Arachnos (rooms 6300-6399).
Jan 26 21:34:49 2026 :: Resetting #64: Rand's Tower (rooms 6400-6499).
Jan 26 21:34:49 2026 :: Resetting #65: Dwarven Kingdom (rooms 6500-6599).
Jan 26 21:34:49 2026 :: Resetting #70: Sewer, First Level (rooms 7000-7099).
Jan 26 21:34:49 2026 :: Resetting #71: Second Sewer (rooms 7100-7199).
Jan 26 21:34:49 2026 :: Resetting #72: Sewer Maze (rooms 7200-7299).
Jan 26 21:34:49 2026 :: Resetting #73: Tunnels in the Sewer (rooms 7300-7399).
Jan 26 21:34:49 2026 :: Resetting #74: Newbie Graveyard (rooms 7400-7499).
Jan 26 21:34:49 2026 :: Resetting #75: Zamba (rooms 7500-7599).
Jan 26 21:34:49 2026 :: Resetting #78: Gideon (rooms 7800-7899).
Jan 26 21:34:49 2026 :: Resetting #79: Redferne's Residence (rooms 7900-7999).
Jan 26 21:34:49 2026 :: Resetting #83: Glumgold's Sea (rooms 8300-8399).
Jan 26 21:34:49 2026 :: Resetting #86: Duke Kalithorn's Keep (rooms 8600-8699).
Jan 26 21:34:49 2026 :: Resetting #90: Oasis (rooms 9000-9099).
Jan 26 21:34:49 2026 :: Resetting #96: Domiae (rooms 9600-9699).
Jan 26 21:34:49 2026 :: Resetting #100: Northern Highway (rooms 10000-10099).
Jan 26 21:34:49 2026 :: Resetting #101: South Road (rooms 10100-10199).
Jan 26 21:34:49 2026 :: Resetting #103: DBZ World (rooms 10300-10399).
Jan 26 21:34:49 2026 :: Resetting #104: Land of Orchan (rooms 10400-10499).
Jan 26 21:34:49 2026 :: Resetting #106: Elcardo (rooms 10600-10699).
Jan 26 21:34:49 2026 :: Resetting #107: Realms of Iuel (rooms 10700-10799).
Jan 26 21:34:49 2026 :: Resetting #115: Monestary Omega (rooms 11500-11599).
Jan 26 21:34:49 2026 :: Resetting #117: Los Torres (rooms 11700-11799).
Jan 26 21:34:49 2026 :: Resetting #118: The Dollhouse (rooms 11800-11899).
Jan 26 21:34:49 2026 :: Resetting #120: Rome (rooms 12000-12099).
Jan 26 21:34:49 2026 :: Resetting #125: Hannah (rooms 12500-12599).
Jan 26 21:34:49 2026 :: Resetting #130: Mist Maze (rooms 13000-13099).
Jan 26 21:34:49 2026 :: Resetting #140: Wyvern City (rooms 14000-14099).
Jan 26 21:34:49 2026 :: Resetting #150: King Welmar's Castle (rooms 15000-15099).
Jan 26 21:34:49 2026 :: Resetting #169: Gibberling Caves (rooms 16900-16999).
Jan 26 21:34:49 2026 :: Resetting #175: Cardinal Wizards (rooms 17500-17599).
Jan 26 21:34:49 2026 :: Resetting #186: Newbie Zone (rooms 18600-18699).
Jan 26 21:34:49 2026 :: Resetting #187: Circus (rooms 18700-18799).
Jan 26 21:34:49 2026 :: Resetting #200: Western Highway (rooms 20000-20099).
Jan 26 21:34:49 2026 :: Resetting #201: Sapphire Islands (rooms 20100-20199).
Jan 26 21:34:49 2026 :: Resetting #211: Tarot (rooms 21100-21199).
Jan 26 21:34:49 2026 :: Resetting #220: The Enchanted Kitchen (rooms 22000-22099).
Jan 26 21:34:49 2026 :: Resetting #232: Terringham (rooms 23200-23299).
Jan 26 21:34:49 2026 :: Resetting #233: Dragon Plains (rooms 23300-23399).
Jan 26 21:34:49 2026 :: Resetting #234: Newbie School (rooms 23400-23499).
Jan 26 21:34:49 2026 :: Resetting #235: Dwarven Mines (rooms 23500-23599).
Jan 26 21:34:49 2026 :: Resetting #236: Aldin (rooms 23600-23699).
Jan 26 21:34:49 2026 :: Resetting #237: Dwarven Trade Route (rooms 23700-23799).
Jan 26 21:34:49 2026 :: Resetting #238: Crystal Castle (rooms 23800-23899).
Jan 26 21:34:49 2026 :: Resetting #239: South Pass (rooms 23900-23999).
Jan 26 21:34:49 2026 :: Resetting #240: Dun Maura (rooms 24000-24099).
Jan 26 21:34:49 2026 :: Resetting #241: Starship Enterprise (rooms 24100-24199).
Jan 26 21:34:49 2026 :: Resetting #242: New Southern Midgaard (rooms 24200-24299).
Jan 26 21:34:49 2026 :: Resetting #243: Snowy Valley (rooms 24300-24399).
Jan 26 21:34:49 2026 :: Resetting #244: Cooland Prison (rooms 24400-24499).
Jan 26 21:34:49 2026 :: Resetting #245: The Nether (rooms 24500-24599).
Jan 26 21:34:49 2026 :: Resetting #246: The Nether II (rooms 24600-24699).
Jan 26 21:34:49 2026 :: Resetting #247: Graveyard (rooms 24700-24799).
Jan 26 21:34:49 2026 :: Resetting #248: Elven Woods (rooms 24800-24899).
Jan 26 21:34:49 2026 :: Resetting #249: Jedi Clan House (rooms 24900-24999).
Jan 26 21:34:49 2026 :: Resetting #250: DragonSpyre (rooms 25000-25099).
Jan 26 21:34:49 2026 :: Resetting #251: Ape Village (rooms 25100-25199).
Jan 26 21:34:49 2026 :: Resetting #252: Castle of the Vampyre (rooms 25200-25299).
Jan 26 21:34:49 2026 :: Resetting #253: Windmill (rooms 25300-25399).
Jan 26 21:34:49 2026 :: Resetting #254: Mordecai's Village (rooms 25400-25499).
Jan 26 21:34:49 2026 :: Resetting #255: Shipwreck (rooms 25500-25599).
Jan 26 21:34:49 2026 :: Resetting #256: Lord's Keep (rooms 25600-25699).
Jan 26 21:34:49 2026 :: Resetting #257: Jareth Main City (rooms 25700-25799).
Jan 26 21:34:49 2026 :: Resetting #258: Light Forest (rooms 25800-25899).
Jan 26 21:34:49 2026 :: Resetting #259: Haunted Mansion (rooms 25900-25999).
Jan 26 21:34:49 2026 :: Resetting #260: Grasslands (rooms 26000-26099).
Jan 26 21:34:49 2026 :: Resetting #261: Inna & Igor's Castle (rooms 26100-26199).
Jan 26 21:34:49 2026 :: Resetting #262: Forest Trails (rooms 26200-26299).
Jan 26 21:34:49 2026 :: Resetting #263: Farmlands (rooms 26300-26399).
Jan 26 21:34:49 2026 :: Resetting #264: Banshide (rooms 26400-26499).
Jan 26 21:34:49 2026 :: Resetting #265: Beach & Lighthouse (rooms 26500-26599).
Jan 26 21:34:49 2026 :: Resetting #266: Realm of Lord Ankou (rooms 26600-26699).
Jan 26 21:34:49 2026 :: Resetting #267: Vice Island (rooms 26700-26799).
Jan 26 21:34:49 2026 :: Resetting #268: Vice Island II (rooms 26800-26899).
Jan 26 21:34:49 2026 :: Resetting #269: Southern Desert (rooms 26900-26999).
Jan 26 21:34:49 2026 :: Resetting #270: Wasteland (rooms 27000-27099).
Jan 26 21:34:49 2026 :: Resetting #271: Sundhaven (rooms 27100-27199).
Jan 26 21:34:49 2026 :: Resetting #272: Sundhaven II (rooms 27200-27299).
Jan 26 21:34:49 2026 :: Resetting #273: Space Station Alpha (rooms 27300-27399).
Jan 26 21:34:49 2026 :: Resetting #274: Adria: Saint Brigid (rooms 27400-27499).
Jan 26 21:34:49 2026 :: Resetting #275: New Sparta (rooms 27500-27599).
Jan 26 21:34:49 2026 :: Resetting #276: New Sparta II (rooms 27600-27699).
Jan 26 21:34:49 2026 :: Resetting #277: Shire (rooms 27700-27799).
Jan 26 21:34:49 2026 :: Resetting #278: Oceania (rooms 27800-27899).
Jan 26 21:34:49 2026 :: Resetting #279: Notre Dame (rooms 27900-27999).
Jan 26 21:34:49 2026 :: Resetting #280: Living Motherboard (rooms 28000-28099).
Jan 26 21:34:49 2026 :: Resetting #281: Forest of Khanjar (rooms 28100-28199).
Jan 26 21:34:49 2026 :: Resetting #282: Infernal Pit of Kerjim (rooms 28200-28299).
Jan 26 21:34:49 2026 :: Resetting #283: Haunted House (rooms 28300-28399).
Jan 26 21:34:49 2026 :: Resetting #284: Ghenna (rooms 28400-28499).
Jan 26 21:34:49 2026 :: Resetting #285: Descent to Hell II (rooms 28500-28599).
Jan 26 21:34:49 2026 :: Resetting #286: Descent to Hell (rooms 28600-28699).
Jan 26 21:34:49 2026 :: Resetting #287: Ofingia and the Goblin Town (rooms 28700-28799).
Jan 26 21:34:49 2026 :: Resetting #288: Galaxy (rooms 28800-28899).
Jan 26 21:34:49 2026 :: Resetting #289: Werith's Wayhouse (rooms 28900-28999).
Jan 26 21:34:49 2026 :: Resetting #290: Lizard Lair Safari (rooms 29000-29099).
Jan 26 21:34:49 2026 :: Resetting #291: Black Forest (rooms 29100-29199).
Jan 26 21:34:49 2026 :: Resetting #292: Kerofk (rooms 29200-29299).
Jan 26 21:34:49 2026 :: Resetting #293: Kerofk II (rooms 29300-29399).
Jan 26 21:34:49 2026 :: Resetting #294: Trade Road (rooms 29400-29499).
Jan 26 21:34:49 2026 :: Resetting #295: Jungle (rooms 29500-29599).
Jan 26 21:34:49 2026 :: Resetting #296: Froboz Fun Factory (rooms 29600-29699).
Jan 26 21:34:49 2026 :: Resetting #298: Castle of Desire (rooms 29800-29899).
Jan 26 21:34:49 2026 :: Resetting #299: Abandoned Cathedral (rooms 29900-29999).
Jan 26 21:34:49 2026 :: Resetting #300: Ancalador (rooms 30000-30099).
Jan 26 21:34:49 2026 :: Resetting #301: Campus (rooms 30100-30199).
Jan 26 21:34:49 2026 :: Resetting #302: Campus II (rooms 30200-30299).
Jan 26 21:34:49 2026 :: Resetting #303: Campus III (rooms 30300-30399).
Jan 26 21:34:49 2026 :: Resetting #304: Temple of the Bull (rooms 30400-30499).
Jan 26 21:34:49 2026 :: Resetting #305: Chessboard (rooms 30500-30599).
Jan 26 21:34:49 2026 :: Resetting #306: Newbie Tree (rooms 30600-30699).
Jan 26 21:34:49 2026 :: Resetting #307: Castle (rooms 30700-30799).
Jan 26 21:34:49 2026 :: Resetting #308: Baron Cailveh (rooms 30800-30899).
Jan 26 21:34:49 2026 :: Resetting #309: Keep of Baron Westlawn (rooms 30900-30999).
Jan 26 21:34:49 2026 :: Resetting #310: Graye Area (rooms 31000-31099).
Jan 26 21:34:49 2026 :: Resetting #311: The Dragon's Teeth (rooms 31100-31199).
Jan 26 21:34:49 2026 :: Resetting #312: Leper Island (rooms 31200-31299).
Jan 26 21:34:49 2026 :: Resetting #313: Farmlands of Ofingia (rooms 31300-31399).
Jan 26 21:34:49 2026 :: Resetting #314: X'Raantra's Altar of Sacrifice (rooms 31400-31499).
Jan 26 21:34:49 2026 :: Resetting #315: McGintey Business District (rooms 31500-31599).
Jan 26 21:34:49 2026 :: Resetting #316: McGintey Guild Area (rooms 31600-31699).
Jan 26 21:34:49 2026 :: Resetting #317: Wharf (rooms 31700-31799).
Jan 26 21:34:49 2026 :: Resetting #318: Dock Area (rooms 31800-31899).
Jan 26 21:34:49 2026 :: Resetting #319: Yllythad Sea (rooms 31900-31999).
Jan 26 21:34:49 2026 :: Resetting #320: Yllythad Sea II (rooms 32000-32099).
Jan 26 21:34:49 2026 :: Resetting #321: Yllythad Sea III (rooms 32100-32199).
Jan 26 21:34:49 2026 :: Resetting #322: McGintey Bay (rooms 32200-32299).
Jan 26 21:34:49 2026 :: Resetting #323: Caverns of the Pale Man (rooms 32300-32399).
Jan 26 21:34:49 2026 :: Resetting #324: Army Encampment (rooms 32400-32499).
Jan 26 21:34:49 2026 :: Resetting #325: Revelry (rooms 32500-32599).
Jan 26 21:34:49 2026 :: Resetting #326: Army Perimeter (rooms 32600-32699).
Jan 26 21:34:49 2026 :: Resetting #343: God Complex (rooms 34300-34399).
Jan 26 21:34:49 2026 :: Resetting #345: Asylum for the Insane (rooms 34500-34599).
Jan 26 21:34:49 2026 :: Resetting #346: God Hall Ext 346 for God Hall Cmplx (rooms 34600-34699).
Jan 26 21:34:49 2026 :: Resetting #491: Grenzland Building (rooms 49100-49199).
Jan 26 21:34:49 2026 :: Resetting #492: The Library Maze (rooms 49200-49299).
Jan 26 21:34:49 2026 :: Resetting #555: Ultima (rooms 55500-55599).
Jan 26 21:34:49 2026 :: Resetting #556: Ultima II (rooms 55600-55699).
Jan 26 21:34:49 2026 :: Resetting #653: Apartment (rooms 65300-65399).
Jan 26 21:34:49 2026 :: Resetting #654: Subdivision (rooms 65400-65499).
Jan 26 21:34:49 2026 :: Boot db -- DONE.
Jan 26 21:34:49 2026 :: Signal trapping.
Jan 26 21:34:49 2026 :: Entering game loop.
Jan 26 21:34:49 2026 :: No connections. Going to sleep.
Jan 26 21:36:26 2026 :: New connection. Waking up.
Jan 26 21:36:53 2026 :: Karrn [localhost] new player.
Jan 26 21:37:11 2026 :: Karrn had no variable file
Jan 26 21:37:11 2026 :: Karrn entering game with no equipment.
Jan 26 21:38:19 2026 :: SYSERR: Received SIGHUP, SIGINT, or SIGTERM. Shutting down...
Quick boot mode -- rent check supressed.
Using file descriptor for logging.
Improper shutdown of autorun detected, rotating syslogs before startup.

2
log/trigger Normal file
View File

@@ -0,0 +1,2 @@
Jan 26 21:34:13 2026 :: Loading triggers and generating index.
Jan 26 21:34:49 2026 :: Loading triggers and generating index.

0
log/usage Normal file
View File

81
power_curve.ipynb Normal file

File diff suppressed because one or more lines are too long

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

@@ -150,39 +150,7 @@ ACMD(do_tell)
if (!*buf || !*buf2) if (!*buf || !*buf2)
send_to_char(ch, "Who do you wish to tell what??\r\n"); send_to_char(ch, "Who do you wish to tell what??\r\n");
else if (!strcmp(buf, "m-w")) { else if (GET_LEVEL(ch) < LVL_IMMORT && !(vict = get_player_vis(ch, buf, NULL, FIND_CHAR_WORLD)))
#ifdef CIRCLE_WINDOWS
/* getpid() is not portable */
send_to_char(ch, "Sorry, that is not available in the windows port.\r\n");
#else /* all other configurations */
char word[MAX_INPUT_LENGTH], *p, *q;
if (last_webster_teller != -1L) {
if (GET_IDNUM(ch) == last_webster_teller) {
send_to_char(ch, "You are still waiting for a response.\r\n");
return;
} else {
send_to_char(ch, "Hold on, m-w is busy. Try again in a couple of seconds.\r\n");
return;
}
}
/* Only a-z and +/- allowed. */
for (p = buf2, q = word; *p ; p++)
if ((LOWER(*p) <= 'z' && LOWER(*p) >= 'a') || (*p == '+') || (*p == '-'))
*q++ = *p;
*q = '\0';
if (!*word) {
send_to_char(ch, "Sorry, only letters and +/- are allowed characters.\r\n");
return;
}
snprintf(buf, sizeof(buf), "../bin/webster %s %d &", word, (int) getpid());
last_webster_teller = GET_IDNUM(ch);
send_to_char(ch, "You look up '%s' in Merriam-Webster.\r\n", word);
#endif /* platform specific part */
} else if (GET_LEVEL(ch) < LVL_IMMORT && !(vict = get_player_vis(ch, buf, NULL, FIND_CHAR_WORLD)))
send_to_char(ch, "%s", CONFIG_NOPERSON); send_to_char(ch, "%s", CONFIG_NOPERSON);
else if (GET_LEVEL(ch) >= LVL_IMMORT && !(vict = get_char_vis(ch, buf, NULL, FIND_CHAR_WORLD))) else if (GET_LEVEL(ch) >= LVL_IMMORT && !(vict = get_char_vis(ch, buf, NULL, FIND_CHAR_WORLD)))
send_to_char(ch, "%s", CONFIG_NOPERSON); send_to_char(ch, "%s", CONFIG_NOPERSON);

View File

@@ -46,12 +46,12 @@ static void list_obj_to_char(struct obj_data *list, struct char_data *ch, int mo
static void show_obj_to_char(struct obj_data *obj, struct char_data *ch, int mode); static void show_obj_to_char(struct obj_data *obj, struct char_data *ch, int mode);
static void show_obj_modifiers(struct obj_data *obj, struct char_data *ch); static void show_obj_modifiers(struct obj_data *obj, struct char_data *ch);
/* do_where utility functions */ /* do_where utility functions */
static void perform_immort_where(struct char_data *ch, char *arg); static void perform_immort_where(char_data *ch, const char *arg);
static void perform_mortal_where(struct char_data *ch, char *arg); 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 size_t print_object_location(int num, const obj_data *obj, const char_data *ch,
char *buf, size_t len, size_t buf_size, 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;
} }
@@ -1592,41 +1603,71 @@ 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 size_t print_object_location(const int num, const obj_data *obj, const char_data *ch, // NOLINT(*-no-recursion)
int recur) char *buf, size_t len, const size_t buf_size, const int recur)
{ {
size_t nlen = 0;
if (num > 0) if (num > 0)
send_to_char(ch, "O%3d. %-25s%s - ", num, obj->short_description, QNRM); nlen = snprintf(buf + len, buf_size - len, "O%4d. %-25s%s - ", num, obj->short_description, QNRM);
else else
send_to_char(ch, "%33s", " - "); nlen = snprintf(buf + len, buf_size - len, "%37s", " - ");
len += nlen;
nlen = 0;
if (len > buf_size)
return len; // let the caller know we overflowed
if (SCRIPT(obj)) { if (SCRIPT(obj)) {
if (!TRIGGERS(SCRIPT(obj))->next) if (!TRIGGERS(SCRIPT(obj))->next)
send_to_char(ch, "[T%d] ", GET_TRIG_VNUM(TRIGGERS(SCRIPT(obj)))); nlen = snprintf(buf + len, buf_size - len, "[T%d] ", GET_TRIG_VNUM(TRIGGERS(SCRIPT(obj))));
else else
send_to_char(ch, "[TRIGS] "); nlen = snprintf(buf + len, buf_size - len, "[TRIGS] ");
} }
len += nlen;
if (len > buf_size)
return len; // let the caller know we overflowed
if (IN_ROOM(obj) != NOWHERE) if (IN_ROOM(obj) != NOWHERE)
send_to_char(ch, "[%5d] %s%s\r\n", GET_ROOM_VNUM(IN_ROOM(obj)), world[IN_ROOM(obj)].name, QNRM); nlen = snprintf(buf + len, buf_size - len, "[%5d] %s%s\r\n", GET_ROOM_VNUM(IN_ROOM(obj)), world[IN_ROOM(obj)].name, QNRM);
else if (obj->carried_by) else if (obj->carried_by) {
send_to_char(ch, "carried by %s%s\r\n", PERS(obj->carried_by, ch), QNRM); if (PRF_FLAGGED(ch, PRF_SHOWVNUMS))
else if (obj->worn_by) nlen = snprintf(buf + len, buf_size - len, "carried by [%5d] %s%s\r\n", GET_MOB_VNUM(obj->carried_by), PERS(obj->carried_by, ch), QNRM);
send_to_char(ch, "worn by %s%s\r\n", PERS(obj->worn_by, ch), QNRM); else
else if (obj->in_obj) { nlen = snprintf(buf + len, buf_size - len, "carried by %s%s\r\n", PERS(obj->carried_by, ch), QNRM);
send_to_char(ch, "inside %s%s%s\r\n", obj->in_obj->short_description, QNRM, (recur ? ", which is" : " ")); if (PRF_FLAGGED(ch, PRF_VERBOSE) && IN_ROOM(obj->carried_by) != NOWHERE && len + nlen < buf_size)
if (recur) nlen += snprintf(buf + len + nlen, buf_size - len - nlen, "%37sin [%5d] %s%s\r\n", " - ", GET_ROOM_VNUM(IN_ROOM(obj->carried_by)), world[IN_ROOM(obj->carried_by)].name, QNRM);
print_object_location(0, obj->in_obj, ch, recur); } else if (obj->worn_by) {
if (PRF_FLAGGED(ch, PRF_SHOWVNUMS))
nlen = snprintf(buf + len, buf_size - len, "worn by [%5d] %s%s\r\n", GET_MOB_VNUM(obj->worn_by), PERS(obj->worn_by, ch), QNRM);
else
nlen = snprintf(buf + len, buf_size - len, "worn by %s%s\r\n", PERS(obj->worn_by, ch), QNRM);
if (PRF_FLAGGED(ch, PRF_VERBOSE) && IN_ROOM(obj->worn_by) != NOWHERE && len + nlen < buf_size)
nlen += snprintf(buf + len + nlen, buf_size - len - nlen, "%37sin [%5d] %s%s\r\n", " - ", GET_ROOM_VNUM(IN_ROOM(obj->worn_by)), world[IN_ROOM(obj->worn_by)].name, QNRM);
} else if (obj->in_obj) {
nlen = snprintf(buf + len, buf_size - len, "inside %s%s%s\r\n", obj->in_obj->short_description, QNRM, (recur ? ", which is" : " "));
if (recur && nlen + len < buf_size) {
len += nlen;
nlen = 0;
len = print_object_location(0, obj->in_obj, ch, buf, len, buf_size, recur);
}
} else } else
send_to_char(ch, "in an unknown location\r\n"); nlen = snprintf(buf + len, buf_size - len, "in an unknown location\r\n");
len += nlen;
return len;
} }
static void perform_immort_where(struct char_data *ch, char *arg) static void perform_immort_where(char_data *ch, const char *arg)
{ {
struct char_data *i; char_data *i;
struct obj_data *k; obj_data *k;
struct descriptor_data *d; struct descriptor_data *d;
int num = 0, found = 0; int num = 0, found = FALSE; // "num" here needs to match the lookup in do_stat, so "stat 4.sword" finds the right one
const char *error_message = "\r\n***OVERFLOW***\r\n";
char buf[MAX_STRING_LENGTH];
size_t len = 0, nlen = 0;
const size_t buf_size = sizeof(buf) - strlen(error_message) - 1;
if (!*arg) { if (!*arg) {
send_to_char(ch, "Players Room Location Zone\r\n"); send_to_char(ch, "Players Room Location Zone\r\n");
@@ -1647,26 +1688,64 @@ static void perform_immort_where(struct char_data *ch, char *arg)
} }
} }
} else { } else {
if (PRF_FLAGGED(ch, PRF_VERBOSE))
len = snprintf(buf, buf_size, " ### Mob name - Room # Room name\r\n");
for (i = character_list; i; i = i->next) for (i = character_list; i; i = i->next)
if (CAN_SEE(ch, i) && IN_ROOM(i) != NOWHERE && isname(arg, i->player.name)) { if (CAN_SEE(ch, i) && IN_ROOM(i) != NOWHERE && isname(arg, i->player.name)) {
found = 1; found = 1;
send_to_char(ch, "M%3d. %-25s%s - [%5d] %-25s%s", ++num, GET_NAME(i), QNRM, nlen = snprintf(buf + len, buf_size - len, "M%4d. %-25s%s - [%5d] %-25s%s", ++num, GET_NAME(i), QNRM,
GET_ROOM_VNUM(IN_ROOM(i)), world[IN_ROOM(i)].name, QNRM); GET_ROOM_VNUM(IN_ROOM(i)), world[IN_ROOM(i)].name, QNRM);
if (len + nlen >= buf_size) {
len += snprintf(buf + len, buf_size - len, "%s", error_message);
break;
}
len += nlen;
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)))); nlen = snprintf(buf + len, buf_size - len, "[T%d]", GET_TRIG_VNUM(TRIGGERS(SCRIPT(i))));
else else
send_to_char(ch, "[TRIGS] "); nlen = snprintf(buf + len, buf_size - len, "[TRIGS]");
if (len + nlen >= buf_size) {
snprintf(buf + len, buf_size - len, "%s", error_message);
break;
}
len += nlen;
} }
send_to_char(ch, "%s\r\n", QNRM); nlen = snprintf(buf + len, buf_size - len, "%s\r\n", QNRM);
if (len + nlen >= buf_size) {
snprintf(buf + len, buf_size - len, "%s", error_message);
break;
}
len += nlen;
} }
for (num = 0, k = object_list; k; k = k->next)
if (CAN_SEE_OBJ(ch, k) && isname(arg, k->name)) { if (PRF_FLAGGED(ch, PRF_VERBOSE) && len < buf_size) {
found = 1; nlen = snprintf(buf + len, buf_size - len, " ### Object name Location\r\n");
print_object_location(++num, k, ch, TRUE); if (len + nlen >= buf_size) {
snprintf(buf + len, buf_size - len, "%s", error_message);
} }
len += nlen;
}
if (len < buf_size) {
for (k = object_list; k; k = k->next) {
if (CAN_SEE_OBJ(ch, k) && isname(arg, k->name)) {
found = 1;
len = print_object_location(++num, k, ch, buf, len, buf_size, TRUE);
if (len >= buf_size) {
snprintf(buf + buf_size, sizeof(buf) - buf_size, "%s", error_message);
break;
}
}
}
}
if (!found) if (!found)
send_to_char(ch, "Couldn't find any such thing.\r\n"); send_to_char(ch, "Couldn't find any such thing.\r\n");
else
page_string(ch->desc, buf, TRUE);
} }
} }
@@ -1727,7 +1806,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 +1830,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);
} }
@@ -1926,6 +2005,9 @@ ACMD(do_toggle)
{"pagelength", 0, 0, "\n", "\n"}, {"pagelength", 0, 0, "\n", "\n"},
{"screenwidth", 0, 0, "\n", "\n"}, {"screenwidth", 0, 0, "\n", "\n"},
{"color", 0, 0, "\n", "\n"}, {"color", 0, 0, "\n", "\n"},
{"verbose", PRF_VERBOSE, LVL_IMMORT,
"You will no longer see verbose output in listings.\n",
"You will now see verbose listings.\n"},
{"\n", 0, -1, "\n", "\n"} /* must be last */ {"\n", 0, -1, "\n", "\n"} /* must be last */
}; };
@@ -1939,16 +2021,17 @@ ACMD(do_toggle)
if (!GET_WIMP_LEV(ch)) if (!GET_WIMP_LEV(ch))
strcpy(buf2, "OFF"); /* strcpy: OK */ strcpy(buf2, "OFF"); /* strcpy: OK */
else else
sprintf(buf2, "%-3.3d", GET_WIMP_LEV(ch)); /* sprintf: OK */ snprintf(buf2, sizeof(buf2), "%-3.3d", GET_WIMP_LEV(ch)); /* thanks to Ironfist for the fix for the buffer overrun here */
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) {
@@ -1959,7 +2042,8 @@ ACMD(do_toggle)
" NoHassle: %-3s " " NoHassle: %-3s "
" Holylight: %-3s " " Holylight: %-3s "
" ShowVnums: %-3s\r\n" " ShowVnums: %-3s\r\n"
" Syslog: %-3s%s ", " Syslog: %-3s "
" Verbose: %-3s%s ",
ONOFF(PRF_FLAGGED(ch, PRF_BUILDWALK)), ONOFF(PRF_FLAGGED(ch, PRF_BUILDWALK)),
ONOFF(PRF_FLAGGED(ch, PRF_NOWIZ)), ONOFF(PRF_FLAGGED(ch, PRF_NOWIZ)),
@@ -1968,6 +2052,7 @@ ACMD(do_toggle)
ONOFF(PRF_FLAGGED(ch, PRF_HOLYLIGHT)), ONOFF(PRF_FLAGGED(ch, PRF_HOLYLIGHT)),
ONOFF(PRF_FLAGGED(ch, PRF_SHOWVNUMS)), ONOFF(PRF_FLAGGED(ch, PRF_SHOWVNUMS)),
types[(PRF_FLAGGED(ch, PRF_LOG1) ? 1 : 0) + (PRF_FLAGGED(ch, PRF_LOG2) ? 2 : 0)], types[(PRF_FLAGGED(ch, PRF_LOG1) ? 1 : 0) + (PRF_FLAGGED(ch, PRF_LOG2) ? 2 : 0)],
ONOFF(PRF_FLAGGED(ch, PRF_VERBOSE)),
GET_LEVEL(ch) == LVL_IMPL ? "" : "\r\n"); GET_LEVEL(ch) == LVL_IMPL ? "" : "\r\n");
} }
if (GET_LEVEL(ch) >= LVL_IMPL) { if (GET_LEVEL(ch) >= LVL_IMPL) {
@@ -2112,7 +2197,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 +2450,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

@@ -52,11 +52,12 @@ static void wear_message(struct char_data *ch, struct obj_data *obj, int where);
static void perform_put(struct char_data *ch, struct obj_data *obj, struct obj_data *cont) static void perform_put(struct char_data *ch, struct obj_data *obj, struct obj_data *cont)
{ {
long object_id = obj_script_id(obj);
if (!drop_otrigger(obj, ch)) if (!drop_otrigger(obj, ch))
return; return;
if (!obj) /* object might be extracted by drop_otrigger */ if (!has_obj_by_uid_in_lookup_table(object_id)) /* object might be extracted by drop_otrigger */
return; return;
if ((GET_OBJ_VAL(cont, 0) > 0) && if ((GET_OBJ_VAL(cont, 0) > 0) &&
@@ -409,24 +410,27 @@ static void perform_drop_gold(struct char_data *ch, int amount, byte mode, room_
WAIT_STATE(ch, PULSE_VIOLENCE); /* to prevent coin-bombing */ WAIT_STATE(ch, PULSE_VIOLENCE); /* to prevent coin-bombing */
obj = create_money(amount); obj = create_money(amount);
if (mode == SCMD_DONATE) { if (mode == SCMD_DONATE) {
send_to_char(ch, "You throw some gold into the air where it disappears in a puff of smoke!\r\n"); send_to_char(ch, "You throw some gold into the air where it disappears in a puff of smoke!\r\n");
act("$n throws some gold into the air where it disappears in a puff of smoke!", act("$n throws some gold into the air where it disappears in a puff of smoke!",
FALSE, ch, 0, 0, TO_ROOM); FALSE, ch, 0, 0, TO_ROOM);
obj_to_room(obj, RDR); obj_to_room(obj, RDR);
act("$p suddenly appears in a puff of orange smoke!", 0, 0, obj, 0, TO_ROOM); act("$p suddenly appears in a puff of orange smoke!", 0, 0, obj, 0, TO_ROOM);
} else { } else {
char buf[MAX_STRING_LENGTH]; char buf[MAX_STRING_LENGTH];
long object_id = obj_script_id(obj);
if (!drop_wtrigger(obj, ch)) { if (!drop_wtrigger(obj, ch)) {
extract_obj(obj); if (has_obj_by_uid_in_lookup_table(object_id))
extract_obj(obj);
return; return;
} }
snprintf(buf, sizeof(buf), "$n drops %s.", money_desc(amount)); snprintf(buf, sizeof(buf), "$n drops %s.", money_desc(amount));
act(buf, TRUE, ch, 0, 0, TO_ROOM); act(buf, TRUE, ch, 0, 0, TO_ROOM);
send_to_char(ch, "You drop some gold.\r\n"); send_to_char(ch, "You drop some gold.\r\n");
obj_to_room(obj, IN_ROOM(ch)); obj_to_room(obj, IN_ROOM(ch));
} }
} else { } else {
char buf[MAX_STRING_LENGTH]; char buf[MAX_STRING_LENGTH];
@@ -447,13 +451,20 @@ static int perform_drop(struct char_data *ch, struct obj_data *obj,
{ {
char buf[MAX_STRING_LENGTH]; char buf[MAX_STRING_LENGTH];
int value; int value;
long object_id = obj_script_id(obj);
if (!drop_otrigger(obj, ch)) if (!drop_otrigger(obj, ch))
return 0; return 0;
if (!has_obj_by_uid_in_lookup_table(object_id))
return 0; // item was extracted by script
if ((mode == SCMD_DROP) && !drop_wtrigger(obj, ch)) if ((mode == SCMD_DROP) && !drop_wtrigger(obj, ch))
return 0; return 0;
if (!has_obj_by_uid_in_lookup_table(object_id))
return 0; // item was extracted by script
if (OBJ_FLAGGED(obj, ITEM_NODROP) && !PRF_FLAGGED(ch, PRF_NOHASSLE)) { if (OBJ_FLAGGED(obj, ITEM_NODROP) && !PRF_FLAGGED(ch, PRF_NOHASSLE)) {
snprintf(buf, sizeof(buf), "You can't %s $p, it must be CURSED!", sname); snprintf(buf, sizeof(buf), "You can't %s $p, it must be CURSED!", sname);
act(buf, FALSE, ch, obj, 0, TO_CHAR); act(buf, FALSE, ch, obj, 0, TO_CHAR);
@@ -768,45 +779,22 @@ void weight_change_object(struct obj_data *obj, int weight)
void name_from_drinkcon(struct obj_data *obj) void name_from_drinkcon(struct obj_data *obj)
{ {
char *new_name, *cur_name, *next;
const char *liqname; const char *liqname;
int liqlen, cpylen; char *new_name;
if (!obj || (GET_OBJ_TYPE(obj) != ITEM_DRINKCON && GET_OBJ_TYPE(obj) != ITEM_FOUNTAIN)) if (!obj || (GET_OBJ_TYPE(obj) != ITEM_DRINKCON && GET_OBJ_TYPE(obj) != ITEM_FOUNTAIN))
return; return;
if (obj->name == obj_proto[GET_OBJ_RNUM(obj)].name)
obj->name = strdup(obj_proto[GET_OBJ_RNUM(obj)].name);
liqname = drinknames[GET_OBJ_VAL(obj, 2)]; liqname = drinknames[GET_OBJ_VAL(obj, 2)];
if (!isname(liqname, obj->name)) {
log("SYSERR: Can't remove liquid '%s' from '%s' (%d) item.", liqname, obj->name, obj->item_number); remove_from_string(obj->name, liqname);
/* SYSERR_DESC: From name_from_drinkcon(), this error comes about if the new_name = right_trim_whitespace(obj->name);
* object noted (by keywords and item vnum) does not contain the liquid free(obj->name);
* string being searched for. */
return;
}
liqlen = strlen(liqname);
CREATE(new_name, char, strlen(obj->name) - strlen(liqname)); /* +1 for NUL, -1 for space */
for (cur_name = obj->name; cur_name; cur_name = next) {
if (*cur_name == ' ')
cur_name++;
if ((next = strchr(cur_name, ' ')))
cpylen = next - cur_name;
else
cpylen = strlen(cur_name);
if (!strn_cmp(cur_name, liqname, liqlen))
continue;
if (*new_name)
strcat(new_name, " "); /* strcat: OK (size precalculated) */
strncat(new_name, cur_name, cpylen); /* strncat: OK (size precalculated) */
}
if (GET_OBJ_RNUM(obj) == NOTHING || obj->name != obj_proto[GET_OBJ_RNUM(obj)].name)
free(obj->name);
obj->name = new_name; obj->name = new_name;
} }
void name_to_drinkcon(struct obj_data *obj, int type) void name_to_drinkcon(struct obj_data *obj, int type)

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

@@ -922,7 +922,7 @@ static void do_stat_character(struct char_data *ch, struct char_data *k)
if (aff->bitvector[0] || aff->bitvector[1] || aff->bitvector[2] || aff->bitvector[3]) { if (aff->bitvector[0] || aff->bitvector[1] || aff->bitvector[2] || aff->bitvector[3]) {
if (aff->modifier) if (aff->modifier)
send_to_char(ch, ", "); send_to_char(ch, ", ");
for (i=0; i<NUM_AFF_FLAGS; i++) { for (i=1; i<NUM_AFF_FLAGS; i++) {
if (IS_SET_AR(aff->bitvector, i)) { if (IS_SET_AR(aff->bitvector, i)) {
send_to_char(ch, "sets %s, ", affected_bits[i]); send_to_char(ch, "sets %s, ", affected_bits[i]);
} }

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

@@ -53,6 +53,7 @@ struct board_info_type board_info[NUM_OF_BOARDS] = {
{1226, 0, 0, LVL_IMPL, LIB_ETC "board.builder", 0}, {1226, 0, 0, LVL_IMPL, LIB_ETC "board.builder", 0},
{1227, 0, 0, LVL_IMPL, LIB_ETC "board.staff", 0}, {1227, 0, 0, LVL_IMPL, LIB_ETC "board.staff", 0},
{1228, 0, 0, LVL_IMPL, LIB_ETC "board.advertising", 0}, {1228, 0, 0, LVL_IMPL, LIB_ETC "board.advertising", 0},
{4900, 0, 0, LVL_IMMORT, LIB_ETC "board.grenzland", 0},
}; };
/* local (file scope) global variables */ /* local (file scope) global variables */

View File

@@ -13,7 +13,7 @@
#ifndef _BOARDS_H_ #ifndef _BOARDS_H_
#define _BOARDS_H_ #define _BOARDS_H_
#define NUM_OF_BOARDS 7 /* change if needed! */ #define NUM_OF_BOARDS 8 /* change if needed! */
#define MAX_BOARD_MESSAGES 60 /* arbitrary -- change if needed */ #define MAX_BOARD_MESSAGES 60 /* arbitrary -- change if needed */
#define MAX_MESSAGE_LENGTH 4096 /* arbitrary -- change if needed */ #define MAX_MESSAGE_LENGTH 4096 /* arbitrary -- change if needed */

View File

@@ -104,8 +104,7 @@ unsigned long pulse = 0; /* number of pulses since game start */
ush_int port; ush_int port;
socket_t mother_desc; socket_t mother_desc;
int next_tick = SECS_PER_MUD_HOUR; /* Tick countdown */ int next_tick = SECS_PER_MUD_HOUR; /* Tick countdown */
/* used with do_tell and handle_webster_file utility */
long last_webster_teller = -1L;
/* static local global variable declarations (current file scope only) */ /* static local global variable declarations (current file scope only) */
static struct txt_block *bufpool = 0; /* pool of large output buffers */ static struct txt_block *bufpool = 0; /* pool of large output buffers */
@@ -113,14 +112,11 @@ static int max_players = 0; /* max descriptors available */
static int tics_passed = 0; /* for extern checkpointing */ static int tics_passed = 0; /* for extern checkpointing */
static struct timeval null_time; /* zero-valued time structure */ static struct timeval null_time; /* zero-valued time structure */
static byte reread_wizlist; /* signal: SIGUSR1 */ static byte reread_wizlist; /* signal: SIGUSR1 */
/* normally signal SIGUSR2, currently orphaned in favor of Webster dictionary static byte emergency_unban; /* signal: SIGUSR2 */
* lookup
static byte emergency_unban;
*/
static int dg_act_check; /* toggle for act_trigger */ static int dg_act_check; /* toggle for act_trigger */
static bool fCopyOver; /* Are we booting in copyover mode? */ static bool fCopyOver; /* Are we booting in copyover mode? */
static char *last_act_message = NULL; static char *last_act_message = NULL;
static byte webster_file_ready = FALSE;/* signal: SIGUSR2 */
/* static local function prototypes (current file scope only) */ /* static local function prototypes (current file scope only) */
static RETSIGTYPE reread_wizlists(int sig); static RETSIGTYPE reread_wizlists(int sig);
@@ -160,9 +156,6 @@ static int open_logfile(const char *filename, FILE *stderr_fp);
#if defined(POSIX) #if defined(POSIX)
static sigfunc *my_signal(int signo, sigfunc *func); static sigfunc *my_signal(int signo, sigfunc *func);
#endif #endif
/* Webster Dictionary Lookup functions */
static RETSIGTYPE websterlink(int sig);
static void handle_webster_file(void);
static void msdp_update(void); /* KaVir plugin*/ static void msdp_update(void); /* KaVir plugin*/
@@ -958,7 +951,7 @@ void game_loop(socket_t local_mother_desc)
mudlog(CMP, LVL_IMMORT, TRUE, "Signal received - rereading wizlists."); mudlog(CMP, LVL_IMMORT, TRUE, "Signal received - rereading wizlists.");
reboot_wizlists(); reboot_wizlists();
} }
/* Orphaned right now as signal trapping is used for Webster lookup
if (emergency_unban) { if (emergency_unban) {
emergency_unban = FALSE; emergency_unban = FALSE;
mudlog(BRF, LVL_IMMORT, TRUE, "Received SIGUSR2 - completely unrestricting game (emergent)"); mudlog(BRF, LVL_IMMORT, TRUE, "Received SIGUSR2 - completely unrestricting game (emergent)");
@@ -966,11 +959,7 @@ void game_loop(socket_t local_mother_desc)
circle_restrict = 0; circle_restrict = 0;
num_invalid = 0; num_invalid = 0;
} }
*/
if (webster_file_ready) {
webster_file_ready = FALSE;
handle_webster_file();
}
#ifdef CIRCLE_UNIX #ifdef CIRCLE_UNIX
/* Update tics_passed for deadlock protection (UNIX only) */ /* Update tics_passed for deadlock protection (UNIX only) */
@@ -1596,7 +1585,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);
@@ -2232,18 +2221,10 @@ static RETSIGTYPE reread_wizlists(int sig)
reread_wizlist = TRUE; reread_wizlist = TRUE;
} }
/* Orphaned right now in place of Webster ...
static RETSIGTYPE unrestrict_game(int sig) static RETSIGTYPE unrestrict_game(int sig)
{ {
emergency_unban = TRUE; emergency_unban = TRUE;
} }
*/
static RETSIGTYPE websterlink(int sig)
{
webster_file_ready = TRUE;
}
#ifdef CIRCLE_UNIX #ifdef CIRCLE_UNIX
@@ -2318,7 +2299,7 @@ static void signal_setup(void)
/* user signal 2: unrestrict game. Used for emergencies if you lock /* user signal 2: unrestrict game. Used for emergencies if you lock
* yourself out of the MUD somehow. */ * yourself out of the MUD somehow. */
my_signal(SIGUSR2, websterlink); my_signal(SIGUSR2, unrestrict_game);
/* set up the deadlock-protection so that the MUD aborts itself if it gets /* set up the deadlock-protection so that the MUD aborts itself if it gets
* caught in an infinite loop for more than 3 minutes. */ * caught in an infinite loop for more than 3 minutes. */
@@ -2495,7 +2476,7 @@ void perform_act(const char *orig, struct char_data *ch, struct obj_data *obj,
const char *i = NULL; const char *i = NULL;
char lbuf[MAX_STRING_LENGTH], *buf, *j; char lbuf[MAX_STRING_LENGTH], *buf, *j;
bool uppercasenext = FALSE; bool uppercasenext = FALSE;
struct char_data *dg_victim = NULL; struct char_data *dg_victim = (to == vict_obj) ? vict_obj : NULL;
struct obj_data *dg_target = NULL; struct obj_data *dg_target = NULL;
char *dg_arg = NULL; char *dg_arg = NULL;
@@ -2780,45 +2761,6 @@ static void circle_sleep(struct timeval *timeout)
#endif /* CIRCLE_WINDOWS */ #endif /* CIRCLE_WINDOWS */
static void handle_webster_file(void) {
FILE *fl;
struct char_data *ch = find_char(last_webster_teller);
char retval[MAX_STRING_LENGTH], line[READ_SIZE];
size_t len = 0, nlen = 0;
last_webster_teller = -1L;
if (!ch) /* they quit ? */
return;
fl = fopen("websterinfo", "r");
if (!fl) {
send_to_char(ch, "It seems the dictionary is offline..\r\n");
return;
}
unlink("websterinfo");
get_line(fl, line);
while (!feof(fl)) {
nlen = snprintf(retval + len, sizeof(retval) - len, "%s\r\n", line);
if (len + nlen >= sizeof(retval))
break;
len += nlen;
get_line(fl, line);
}
if (len >= sizeof(retval)) {
const char *overflow = "\r\n**OVERFLOW**\r\n";
strcpy(retval + sizeof(retval) - strlen(overflow) - 1, overflow); /* strcpy: OK */
}
fclose(fl);
send_to_char(ch, "You get this feedback from Merriam-Webster:\r\n");
page_string(ch->desc, retval, 1);
}
/* KaVir's plugin*/ /* KaVir's plugin*/
static void msdp_update( void ) static void msdp_update( void )
{ {

View File

@@ -60,9 +60,6 @@ void game_loop(socket_t mother_desc);
void heartbeat(int heart_pulse); void heartbeat(int heart_pulse);
void copyover_recover(void); void copyover_recover(void);
/** webster dictionary lookup */
extern long last_webster_teller;
extern struct descriptor_data *descriptor_list; extern struct descriptor_data *descriptor_list;
extern int buf_largecount; extern int buf_largecount;
extern int buf_overflows; extern int buf_overflows;

337
src/conf.h.cmake.in Normal file
View File

@@ -0,0 +1,337 @@
/* src/conf.h.cmake.in. Used as basis for conf.h when building with cmake */
#ifndef _CONF_H_
#define _CONF_H_
/* Define to empty if the keyword does not work. */
#define const @CONST_KEYWORD@
/* Define if you don't have vprintf but do have _doprnt. */
#cmakedefine HAVE_DOPRNT
/* Define if you have <sys/wait.h> that is POSIX.1 compatible. */
#cmakedefine HAVE_SYS_WAIT_H
/* Define if you have the vprintf function. */
#cmakedefine HAVE_VPRINTF
/* Define to `int' if <sys/types.h> doesn't define. */
#cmakedefine pid_t @pid_t@
/* Define as the return type of signal handlers (int or void). */
#define RETSIGTYPE @RETSIGTYPE@
/* Define to `unsigned' if <sys/types.h> doesn't define. */
#cmakedefine size_t @size_t@
/* Define if you have the ANSI C header files. */
#cmakedefine STDC_HEADERS
/* Define if you can safely include both <sys/time.h> and <time.h>. */
#cmakedefine TIME_WITH_SYS_TIME
/* Define if we're compiling CircleMUD under any type of UNIX system. */
#cmakedefine CIRCLE_UNIX
/* Define if the system is capable of using crypt() to encrypt. */
#cmakedefine CIRCLE_CRYPT
/* Define if we don't have proper support for the system's crypt(). */
#cmakedefine HAVE_UNSAFE_CRYPT
/* Define is the system has struct in_addr. */
#cmakedefine HAVE_STRUCT_IN_ADDR
/* Define to `int' if <sys/socket.h> doesn't define. */
#cmakedefine socklen_t @socklen_t@
/* Define to `int' if <sys/types.h> doesn't define. */
#cmakedefine ssize_t @ssize_t@
/* Define if you have the gettimeofday function. */
#cmakedefine HAVE_GETTIMEOFDAY
/* Define if you have the inet_addr function. */
#cmakedefine HAVE_INET_ADDR
/* Define if you have the inet_aton function. */
#cmakedefine HAVE_INET_ATON
/* Define if you have the select function. */
#cmakedefine HAVE_SELECT
/* Define if you have the snprintf function. */
#cmakedefine HAVE_SNPRINTF
/* Define if you have the strcasecmp function. */
#cmakedefine HAVE_STRCASECMP
/* Define if you have the strdup function. */
#cmakedefine HAVE_STRDUP
/* Define if you have the strerror function. */
#cmakedefine HAVE_STRERROR
/* Define if you have the stricmp function. */
#cmakedefine HAVE_STRICMP
/* Define if you have the strlcpy function. */
#cmakedefine HAVE_STRLCPY
/* Define if you have the strncasecmp function. */
#cmakedefine HAVE_STRNCASECMP
/* Define if you have the strnicmp function. */
#cmakedefine HAVE_STRNICMP
/* Define if you have the strstr function. */
#cmakedefine HAVE_STRSTR
/* Define if you have the vsnprintf function. */
#cmakedefine HAVE_VSNPRINTF
/* Define if you have the <arpa/inet.h> header file. */
#cmakedefine HAVE_ARPA_INET_H
/* Define if you have the <arpa/telnet.h> header file. */
#cmakedefine HAVE_ARPA_TELNET_H
/* Define if you have the <assert.h> header file. */
#cmakedefine HAVE_ASSERT_H
/* Define if you have the <crypt.h> header file. */
#cmakedefine HAVE_CRYPT_H
/* Define if you have the <errno.h> header file. */
#cmakedefine HAVE_ERRNO_H
/* Define if you have the <fcntl.h> header file. */
#cmakedefine HAVE_FCNTL_H
/* Define if you have the <limits.h> header file. */
#cmakedefine HAVE_LIMITS_H
/* Define if you have the <mcheck.h> header file. */
#cmakedefine HAVE_MCHECK_H
/* Define if you have the <memory.h> header file. */
#cmakedefine HAVE_MEMORY_H
/* Define if you have the <net/errno.h> header file. */
#cmakedefine HAVE_NET_ERRNO_H
/* Define if you have the <netdb.h> header file. */
#cmakedefine HAVE_NETDB_H
/* Define if you have the <netinet/in.h> header file. */
#cmakedefine HAVE_NETINET_IN_H
/* Define if you have the <signal.h> header file. */
#cmakedefine HAVE_SIGNAL_H
/* Define if you have the <string.h> header file. */
#cmakedefine HAVE_STRING_H
/* Define if you have the <strings.h> header file. */
#cmakedefine HAVE_STRINGS_H
/* Define if you have the <sys/fcntl.h> header file. */
#cmakedefine HAVE_SYS_FCNTL_H
/* Define if you have the <sys/resource.h> header file. */
#cmakedefine HAVE_SYS_RESOURCE_H
/* Define if you have the <sys/select.h> header file. */
#cmakedefine HAVE_SYS_SELECT_H
/* Define if you have the <sys/socket.h> header file. */
#cmakedefine HAVE_SYS_SOCKET_H
/* Define if you have the <sys/stat.h> header file. */
#cmakedefine HAVE_SYS_STAT_H
/* Define if you have the <sys/time.h> header file. */
#cmakedefine HAVE_SYS_TIME_H
/* Define if you have the <sys/types.h> header file. */
#cmakedefine HAVE_SYS_TYPES_H
/* Define if you have the <sys/uio.h> header file. */
#cmakedefine HAVE_SYS_UIO_H
/* Define if you have the <unistd.h> header file. */
#cmakedefine HAVE_UNISTD_H
/* Define if you have the malloc library (-lmalloc). */
#cmakedefine HAVE_LIBMALLOC
/* Check for a prototype to accept. */
#cmakedefine NEED_ACCEPT_PROTO
/* Check for a prototype to atoi. */
#cmakedefine NEED_ATOI_PROTO
/* Check for a prototype to atol. */
#cmakedefine NEED_ATOL_PROTO
/* Check for a prototype to bind. */
#cmakedefine NEED_BIND_PROTO
/* Check for a prototype to bzero. */
#cmakedefine NEED_BZERO_PROTO
/* Check for a prototype to chdir. */
#cmakedefine NEED_CHDIR_PROTO
/* Check for a prototype to close. */
#cmakedefine NEED_CLOSE_PROTO
/* Check for a prototype to crypt. */
#cmakedefine NEED_CRYPT_PROTO
/* Check for a prototype to fclose. */
#cmakedefine NEED_FCLOSE_PROTO
/* Check for a prototype to fcntl. */
#cmakedefine NEED_FCNTL_PROTO
/* Check for a prototype to fflush. */
#cmakedefine NEED_FFLUSH_PROTO
/* Check for a prototype to fprintf. */
#cmakedefine NEED_FPRINTF_PROTO
/* Check for a prototype to fputc. */
#cmakedefine NEED_FPUTC_PROTO
/* Check for a prototype to fputs. */
#cmakedefine NEED_FPUTS_PROTO
/* Check for a prototype to fread. */
#cmakedefine NEED_FREAD_PROTO
/* Check for a prototype to fscanf. */
#cmakedefine NEED_FSCANF_PROTO
/* Check for a prototype to fseek. */
#cmakedefine NEED_FSEEK_PROTO
/* Check for a prototype to fwrite. */
#cmakedefine NEED_FWRITE_PROTO
/* Check for a prototype to getpeername. */
#cmakedefine NEED_GETPEERNAME_PROTO
/* Check for a prototype to getpid. */
#cmakedefine NEED_GETPID_PROTO
/* Check for a prototype to getrlimit. */
#cmakedefine NEED_GETRLIMIT_PROTO
/* Check for a prototype to getsockname. */
#cmakedefine NEED_GETSOCKNAME_PROTO
/* Check for a prototype to gettimeofday. */
#cmakedefine NEED_GETTIMEOFDAY_PROTO
/* Check for a prototype to htonl. */
#cmakedefine NEED_HTONL_PROTO
/* Check for a prototype to htons. */
#cmakedefine NEED_HTONS_PROTO
/* Check for a prototype to inet_addr. */
#cmakedefine NEED_INET_ADDR_PROTO
/* Check for a prototype to inet_aton. */
#cmakedefine NEED_INET_ATON_PROTO
/* Check for a prototype to inet_ntoa. */
#cmakedefine NEED_INET_NTOA_PROTO
/* Check for a prototype to listen. */
#cmakedefine NEED_LISTEN_PROTO
/* Check for a prototype to ntohl. */
#cmakedefine NEED_NTOHL_PROTO
/* Check for a prototype to perror. */
#cmakedefine NEED_PERROR_PROTO
/* Check for a prototype to printf. */
#cmakedefine NEED_PRINTF_PROTO
/* Check for a prototype to qsort. */
#cmakedefine NEED_QSORT_PROTO
/* Check for a prototype to read. */
#cmakedefine NEED_READ_PROTO
/* Check for a prototype to remove. */
#cmakedefine NEED_REMOVE_PROTO
/* Check for a prototype to rewind. */
#cmakedefine NEED_REWIND_PROTO
/* Check for a prototype to select. */
#cmakedefine NEED_SELECT_PROTO
/* Check for a prototype to setitimer. */
#cmakedefine NEED_SETITIMER_PROTO
/* Check for a prototype to setrlimit. */
#cmakedefine NEED_SETRLIMIT_PROTO
/* Check for a prototype to setsockopt. */
#cmakedefine NEED_SETSOCKOPT_PROTO
/* Check for a prototype to snprintf. */
#cmakedefine NEED_SNPRINTF_PROTO
/* Check for a prototype to socket. */
#cmakedefine NEED_SOCKET_PROTO
/* Check for a prototype to sprintf. */
#cmakedefine NEED_SPRINTF_PROTO
/* Check for a prototype to sscanf. */
#cmakedefine NEED_SSCANF_PROTO
/* Check for a prototype to strcasecmp. */
#cmakedefine NEED_STRCASECMP_PROTO
/* Check for a prototype to strdup. */
#cmakedefine NEED_STRDUP_PROTO
/* Check for a prototype to strerror. */
#cmakedefine NEED_STRERROR_PROTO
/* Check for a prototype to stricmp. */
#cmakedefine NEED_STRICMP_PROTO
/* Check for a prototype to strlcpy. */
#cmakedefine NEED_STRLCPY_PROTO
/* Check for a prototype to strncasecmp. */
#cmakedefine NEED_STRNCASECMP_PROTO
/* Check for a prototype to strnicmp. */
#cmakedefine NEED_STRNICMP_PROTO
/* Check for a prototype to system. */
#cmakedefine NEED_SYSTEM_PROTO
/* Check for a prototype to time. */
#cmakedefine NEED_TIME_PROTO
/* Check for a prototype to unlink. */
#cmakedefine NEED_UNLINK_PROTO
/* Check for a prototype to vsnprintf. */
#cmakedefine NEED_VSNPRINTF_PROTO
/* Check for a prototype to write. */
#cmakedefine NEED_WRITE_PROTO
#endif /* _CONF_H_ */

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 2020"; 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) */
@@ -877,6 +877,7 @@ const char *trig_types[] = {
"Door", "Door",
"UNUSED", "UNUSED",
"Time", "Time",
"Damage",
"\n" "\n"
}; };

View File

@@ -501,15 +501,22 @@ static void free_extra_descriptions(struct extra_descr_data *edesc)
void destroy_db(void) void destroy_db(void)
{ {
ssize_t cnt, itr; ssize_t cnt, itr;
struct char_data *chtmp; struct char_data *chtmp, *i = character_list;
struct obj_data *objtmp; struct obj_data *objtmp;
/* Active Mobiles & Players */ /* Active Mobiles & Players */
while (i) {
chtmp = i;
i = i->next;
if (chtmp->master)
stop_follower(chtmp);
}
while (character_list) { while (character_list) {
chtmp = character_list; chtmp = character_list;
character_list = character_list->next; character_list = character_list->next;
if (chtmp->master)
stop_follower(chtmp);
free_char(chtmp); free_char(chtmp);
} }
@@ -1232,6 +1239,24 @@ static bitvector_t asciiflag_conv_aff(char *flag)
return (flags); return (flags);
} }
/* Fix for crashes in the editor when formatting. E-descs are assumed to
* end with a \r\n. -Welcor */
void ensure_newline_terminated(struct extra_descr_data* new_descr) {
char *with_term, *end;
if (new_descr->description == NULL) {
return;
}
end = strchr(new_descr->description, '\0');
if (end > new_descr->description && *(end - 1) != '\n') {
CREATE(with_term, char, strlen(new_descr->description) + 3);
sprintf(with_term, "%s\r\n", new_descr->description); /* snprintf ok : size checked above*/
free(new_descr->description);
new_descr->description = with_term;
}
}
/* load the rooms */ /* load the rooms */
void parse_room(FILE *fl, int virtual_nr) void parse_room(FILE *fl, int virtual_nr)
{ {
@@ -1301,7 +1326,7 @@ void parse_room(FILE *fl, int virtual_nr)
world[room_nr].room_flags[2] = asciiflag_conv(flags3); world[room_nr].room_flags[2] = asciiflag_conv(flags3);
world[room_nr].room_flags[3] = asciiflag_conv(flags4); world[room_nr].room_flags[3] = asciiflag_conv(flags4);
sprintf(flags, "object #%d", virtual_nr); /* sprintf: OK (until 399-bit integers) */ sprintf(flags, "room #%d", virtual_nr); /* sprintf: OK (until 399-bit integers) */
for(taeller=0; taeller < AF_ARRAY_MAX; taeller++) for(taeller=0; taeller < AF_ARRAY_MAX; taeller++)
check_bitvector_names(world[room_nr].room_flags[taeller], room_bits_count, flags, "room"); check_bitvector_names(world[room_nr].room_flags[taeller], room_bits_count, flags, "room");
@@ -1339,17 +1364,8 @@ void parse_room(FILE *fl, int virtual_nr)
CREATE(new_descr, struct extra_descr_data, 1); CREATE(new_descr, struct extra_descr_data, 1);
new_descr->keyword = fread_string(fl, buf2); new_descr->keyword = fread_string(fl, buf2);
new_descr->description = fread_string(fl, buf2); new_descr->description = fread_string(fl, buf2);
/* Fix for crashes in the editor when formatting. E-descs are assumed to ensure_newline_terminated(new_descr);
* end with a \r\n. -Welcor */
{
char *end = strchr(new_descr->description, '\0');
if (end > new_descr->description && *(end-1) != '\n') {
CREATE(end, char, strlen(new_descr->description)+3);
sprintf(end, "%s\r\n", new_descr->description); /* snprintf ok : size checked above*/
free(new_descr->description);
new_descr->description = end;
}
}
new_descr->next = world[room_nr].ex_description; new_descr->next = world[room_nr].ex_description;
world[room_nr].ex_description = new_descr; world[room_nr].ex_description = new_descr;
break; break;
@@ -2857,12 +2873,16 @@ char *fread_string(FILE *fl, const char *error)
/* If there is a '~', end the string; else put an "\r\n" over the '\n'. */ /* If there is a '~', end the string; else put an "\r\n" over the '\n'. */
/* now only removes trailing ~'s -- Welcor */ /* now only removes trailing ~'s -- Welcor */
point = strchr(tmp, '\0'); point = strchr(tmp, '\0');
for (point-- ; (*point=='\r' || *point=='\n'); point--); for (point-- ; (*point=='\r' || *point=='\n') && point > tmp; point--);
if (*point=='~') { if (*point=='~') {
*point='\0'; *point='\0';
done = 1; done = 1;
} else { } else {
*(++point) = '\r'; if (*point == '\n' || *point == '\r')
*point = '\r';
else
*(++point) = '\r';
*(++point) = '\n'; *(++point) = '\n';
*(++point) = '\0'; *(++point) = '\0';
} }

View File

@@ -151,7 +151,8 @@ long event_time(struct event *event)
/** Frees all events from event_q. */ /** Frees all events from event_q. */
void event_free_all(void) void event_free_all(void)
{ {
queue_free(event_q); if (event_q != NULL)
queue_free(event_q);
} }
/** Boolean function to tell whether an event is queued or not. Does this by /** Boolean function to tell whether an event is queued or not. Does this by

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

@@ -16,7 +16,7 @@
#include "dg_scripts.h" #include "dg_scripts.h"
#define NUM_TRIG_TYPE_FLAGS 20 #define NUM_TRIG_TYPE_FLAGS 21
/* Submodes of TRIGEDIT connectedness. */ /* Submodes of TRIGEDIT connectedness. */
#define TRIGEDIT_MAIN_MENU 0 #define TRIGEDIT_MAIN_MENU 0

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;
@@ -2994,12 +2994,23 @@ void init_lookup_table(void)
} }
} }
static struct char_data *find_char_by_uid_in_lookup_table(long uid) static inline struct lookup_table_t *get_bucket_head(long uid)
{ {
int bucket = (int) (uid & (BUCKET_COUNT - 1)); int bucket = (int) (uid & (BUCKET_COUNT - 1));
struct lookup_table_t *lt = &lookup_table[bucket]; return &lookup_table[bucket];
}
static inline struct lookup_table_t *find_element_by_uid_in_lookup_table(long uid)
{
struct lookup_table_t *lt = get_bucket_head(uid);
for (;lt && lt->uid != uid ; lt = lt->next) ; for (;lt && lt->uid != uid ; lt = lt->next) ;
return lt;
}
static struct char_data *find_char_by_uid_in_lookup_table(long uid)
{
struct lookup_table_t *lt = find_element_by_uid_in_lookup_table(uid);
if (lt) if (lt)
return (struct char_data *)(lt->c); return (struct char_data *)(lt->c);
@@ -3010,10 +3021,7 @@ static struct char_data *find_char_by_uid_in_lookup_table(long uid)
static struct obj_data *find_obj_by_uid_in_lookup_table(long uid) static struct obj_data *find_obj_by_uid_in_lookup_table(long uid)
{ {
int bucket = (int) (uid & (BUCKET_COUNT - 1)); struct lookup_table_t *lt = find_element_by_uid_in_lookup_table(uid);
struct lookup_table_t *lt = &lookup_table[bucket];
for (;lt && lt->uid != uid ; lt = lt->next) ;
if (lt) if (lt)
return (struct obj_data *)(lt->c); return (struct obj_data *)(lt->c);
@@ -3022,10 +3030,16 @@ static struct obj_data *find_obj_by_uid_in_lookup_table(long uid)
return NULL; return NULL;
} }
int has_obj_by_uid_in_lookup_table(long uid)
{
struct lookup_table_t *lt = find_element_by_uid_in_lookup_table(uid);
return lt != NULL;
}
void add_to_lookup_table(long uid, void *c) void add_to_lookup_table(long uid, void *c)
{ {
int bucket = (int) (uid & (BUCKET_COUNT - 1)); struct lookup_table_t *lt = get_bucket_head(uid);
struct lookup_table_t *lt = &lookup_table[bucket];
if (lt && lt->uid == uid) { if (lt && lt->uid == uid) {
log("add_to_lookup updating existing value for uid=%ld (%p -> %p)", uid, lt->c, c); log("add_to_lookup updating existing value for uid=%ld (%p -> %p)", uid, lt->c, c);
@@ -3036,6 +3050,7 @@ void add_to_lookup_table(long uid, void *c)
for (;lt && lt->next; lt = lt->next) for (;lt && lt->next; lt = lt->next)
if (lt->next->uid == uid) { if (lt->next->uid == uid) {
log("add_to_lookup updating existing value for uid=%ld (%p -> %p)", uid, lt->next->c, c); log("add_to_lookup updating existing value for uid=%ld (%p -> %p)", uid, lt->next->c, c);
lt->next->c = c;
return; return;
} }
@@ -3054,9 +3069,7 @@ void remove_from_lookup_table(long uid)
if (uid == 0) if (uid == 0)
return; return;
for (;lt;lt = lt->next) flt = find_element_by_uid_in_lookup_table(uid);
if (lt->uid == uid)
flt = lt;
if (flt) { if (flt) {
for (lt = &lookup_table[bucket];lt->next != flt;lt = lt->next) for (lt = &lookup_table[bucket];lt->next != flt;lt = lt->next)

Some files were not shown because too many files have changed in this diff Show More