Category : BBS Programs+Doors
Archive   : WWIVMODS.ZIP
Filename : WWIVMOD3.MOD

Output of file : WWIVMOD3.MOD contained in archive : WWIVMODS.ZIP
Another EXCLUSIVE production of:
/* VARIOUS MODS 3, by Many Hands */
/* */
/* This is a collection of various mods thought up by various people so that */
/* you can personalize your WWIV bbs just alittle bit more. All credits have */
/* been given where credit was due. */
/* */
/* Compiled and edited by MrBill (WWIVnet address = 1@7300) */
/* of MrBill's Abode 703-369-6140 24hrs/2400bps */

NOTE: All mods by MrBill ARE guaranteed to work with WWIV v4.1+, and are NOT
guaranteed to work with WWIV v4.0x, though in all probability they will.

Warp Extract Mod
By MrBill

Ok kiddies, this first mod is for all those boards out there that
support the AMIGA personal computer. This mod allows the Amiga users to split
a Warp (.WRP) file on the board via the archive extract commands. What this
means is that a user who is low on time (or doesn't have alot to begin with)
can extract out the first 40 tracks (half a disk) of a huge 700+k Warp file
and download it. Then he can call back the next day and get the second half.
Pretty neat huh?

Well, the executable program inclosed with this ZIP file is the program
that does all of the actual warp splitting. it is called WSPLIT.EXE and was
just written a few days ago by the same author of Warp (now fore known as
"SDS"). I was using WRPSPLIT.EXE by Conrad Crews of Homegrown Software, but
I figure this new one will be better, and the old one had problems (continous
loop) with files that were raw MFM tracks (header info too big for it I guess).
I watched this one and it seems to be faster and better. I hope it doesn't
have that same problem with the MFM mode, but I doubt it will. I've included
the dox for it just for the hell of it, they're very brief and you can learn
just as much by just running the program. Oh well, on with the mod....


1> Load up XFER.C and put this function near the top. This is the function
that actually passes the parameters to the WSPLIT program. It's pretty
simple. If you notice your XFER.C is getting pretty big, you may want to
split it and make an XFER1.C....i know i had to (!) and i put this in there
instead. If you put in in an XFER1.C, you will have to list the name of the
function in FCNS.H, otherwise don't bother.


void do_warpsplit(char s[81]) /* add \/ */
char s1[3],s2[3],s3[81];

prt(2,"Enter starting track : ");
if (s1[0]==0)
prt(2,"Enter ending track : ");
if (s2[0]==0)
sprintf(s3,"WSPLIT %s %sTEMP.WRP %s %s",s,syscfg.tempdir,s1,s2);


2> Now search downward and find "void download_temp_arc()". Delete and
replace it with the following one. I did too much to it, it wasn't worth it
to just put comments in and tell you to /* add */ here, to /* delete */
here and to /* change */ here.... There are a few comments in here for if you
are using some other mods, so look it through real quick.


void download_temp_arc()
char s[81],s1[81];
long numbytes,temp;
double d;
int i,f,sent,abort,arc=1,warp=1;

if ((syscfg.req_ratio>0.0001) && (ratio() ((thisuser.exempt & exempt_ratio)==0)) {
sprintf(s,"Your ratio is %-5.3f. You need a ratio of %-5.3f to download.",
ratio(), syscfg.req_ratio);
f=open(s1,O_RDWR | O_BINARY);
if (f<0)
if (numbytes==0L)
f=open(s1,O_RDWR | O_BINARY);
if (f<0)
if (numbytes==0L)
if (arc)
if ((!arc)&&(!warp)){
pl("There is no temporary archive or warp file.");
if ((arc)&&(warp)){
pl("You can not download both the temporary archive and the");
pl("temporary warp file. You must delete one or the other.");
if (arc)
d=((double) (((numbytes)+127)/128)) *
(1620.0) /
((double) (modem_speed));
if (d<=nsl()) {
print("Approx. time: ",ctim(d),"");
if (warp)
if (arc)
if (sent) {
++thisuser.downloaded; += ((numbytes+1023)/1024);
sprintf(s1,"Downloaded %ldk of temporary file",(numbytes+1023)/1024);
/*>>>>>>>>>>============= if using XFER HISTORY MOD ===============<<<<<<<<<<*/
if (arc)
updatexferhist(0, "TEMP.ARC", ((numbytes+1023)/1024));
if (warp)
updatexferhist(0, "TEMP.WRP", ((numbytes+1023)/1024));
sprintf(s1,"%-6.3f",ratio()); /* or the Two Punks */
print("Your ratio is now: ",s1,""); /* dlstats() mod here */
if (useron)
} else {
pl("Not enough time left to D/L.");


3> Now search downwards again and find "void temp_extract". Change it as the
comments show.


void temp_extract()
int i,i1,i2,i3,ok,abort,ok1;
char s[81],s1[81],s2[81],s3[81];
uploadsrec u,u1;

pl("Extract to temporary directory:");
prt(2,"Filename: ");
if (!okfn(s))
if (s[0]==0)
if (strchr(s,'.')==NULL)
while ((i>0) && (ok) && (!hangup)) {
read(dlf,(void *)&u,sizeof(uploadsrec));
if (strstr(s2,".WRP")){ /* add */
sprintf(s2,"%s%s",directories[udir[curdir].subnum].path,stripfn(u.filename));/* add */
abort=0; /* add */
nl();nl(); /* add */
printinfo(&u,&abort); /* add */
do_warpsplit(s2); /* add */
closedl(); /* add */
sprintf(s2,"Extracted tracks from %s",stripfn(u.filename));/* add */
sysoplog(s2); /* add */
topscreen(); /* add */
return; /* add */
} /* add */
if ((s1[0]) && (exist(s2))) {
do {
prt(2,"Extract what (?=list,Q=abort) ? ");


Ending Note: You're done! You are now one of the very few boards in the WORLD
that allows the extraction/splitting of .WRP files. And guess what, they are
all WWIV! Spread the word, get more Amiga boards running WWIV so that Amy isn't
tied up! Greets and good wishes to all you Amy supporters.


Sub Info Mod
by MrBill

Ok kiddies, I made this one simply because I have too many users on
my system who can't remember what each sub is for and are too lazy to go back
and read message number one (permanent). This adds an 'I' command in the
message base and will print a file telling what the sub is for, kind of like
what Genesis Deluxe, or any of the Forum-Pc clones have. So whenever a user is
in doubt about a sub, he/she can just hit I and he/she'll be able to read the
file. Now, this is easy to install, but alot of work will be needed to make
the .INF file for each sub, and describe each sub.

To make this work you will need to make .INF files for each of your
subs. I have included an example file called GENERIC.INF that you can use or
you can make it anyway you want. The .INF files have to be the same filename
as the data file for each sub. To find out what you named all the data files
you can, of course, run //BOARDEDIT and take alook, but that takes too much
time, so instead shell to dos and go into your data directory. Then do a
DIR *.SUB and you've got the filenames! Now take the GENERIC.INF and make
copies of it with the same prefix (i.e. instead of GENERAL.SUB, make a
GENERAL.INF) for each sub and put them in your gfiles directory. Since I'm sure
your co-sysops will have no idea what these filenames are, I also made a quick
little menu for editing these files. This will be called upon from the main
menu by //SUBINFOEDIT.


First> Load up BBS.C and do this:


if ((strcmp(s,"SUBINFOEDIT")==0) && (cs())) /* add */
subinfo_message_modify(); /* add */
if ((strcmp(s,"UPLOAD")==0) && (>10))
if (strcmp(s,"QSCAN")==0) { /* search */


Second> Load up SYSOPF.C and add this whole function before void modify_sub()


void subinfo_message_modify() /* add \/ */
subboardrec r;
char s[4];
int i;

prt(2,"Edit which? (CR=Quit): ");
if ((s[0]==0) || (i<0) || (i>num_subs))
sprintf(s,"@ Edited %s.INF",r.filename);
if (okfsed())
}while (!hangup);

void modify_sub(int n) /* search */
subboardrec r;
char s[81],s1[81],ch,ch2;
int i,i1,done;


Third> Load up MSGBASE1.C and add this:


case 'B': /* search */
if (*nextsub!=0) {
case 'I': /* add */
sprintf(s,"%s.INF",subboards[curlsub].filename); /* add */
printfile(s); /* add */
break; /* add */
case 'T':


Now go edit your menus to reflect the new commands (don't forget to
edit the ANSI and non-ANSI menus!). Then run //SUBINFOEDIT and start typing in
your descriptions of all your subs, I hope you use a fullscreen editor, it'll
make life a hell of alot easier for you!

It looks really nice when it's have fun with it!


by MrBill

This mod will give you a more interesting 'general' message base. To
make it more interesting, the sub name will be the same as the current user!
So if I was on my board, it would be the "MRBILL's Sub." Or if The Lamest of
the Lame was on my board, the general message base would be called "THE LAMEST
OF THE LAME's Sub." Pretty neat huh?

Let it be known! This was not something I made up on my own, I got the
idea from a board I used to call called "The Enterprise" run by a guy named
"Captain Picard." Well, he doesn't run his own board anymore, just his wife's
. Anyways, I always thought it was a neat idea that he came up with and
I've been BUGGING the HELL out of him to write this mod for WWIV 4.x and he
hasn't done it, maybe he's too busy with the WWIVnet Sub Editor, who knows?
Anyways, I decided to do it, and here it is.


1> Load up BBS.C and change this in void sublist().


strcat(s," "); /* search */
strcat(s," ");
if (strcmp(subboards[usub[i].subnum].name,"THISUSER")==0) /* add */
{ /* add */
strcat(s," "); /* add */
strcat(s,; /* add */
strcat(s,"'s Sub "); /* add */
}else /* add */


2> Now go down to void mainmenu() to do the following.


strcpy(s1,"[] No Subs Available :"); /* search */
if (s1[0]==0)
{ /* add */
if (strcmp(subboards[usub[cursub].subnum].name,"THISUSER")==0) /* add */
sprintf(s1,"[%s] [ %s's Sub ] :",usub[cursub].keys,;/*add*/
else /* add */
sprintf(s1,"[%s] [%s] :",usub[cursub].keys,subboards[usub[cursub].subnum].name);
} /* add */


3> Load up MSGBASE1.C and do this to void post().


++status.msgposttoday; /* search */
if (strcmp(subboards[curlsub].name,"THISUSER")==0) /* add */
sprintf(s,"+%s posted on %s's Sub",p.title,; /* add */
else /* add */
sprintf(s,"+%s posted on %s",p.title,subboards[curlsub].name);
/*>>>>>>>>>>>>>>>>>>>>>>>>> if SALT mod installed <<<<<<<<<<<<<<<<<<<<<<<<<<<*/
prt(3,"Mr. Hands gives you three gold pieces"); nl();
prt(3,"for that 'interesting' post!"); nl(); += 3.0;
/*>>>>>>>>>>>>>>>>>>>>>>>>> if SALT mod installed <<<<<<<<<<<<<<<<<<<<<<<<<<<*/
strcpy(s,"Posted on ");
if (strcmp(subboards[curlsub].name,"THISUSER")==0) /* add */
{ /* add */
strcat(s,; /* add */
strcat(s,"'s Sub "); /* add */
}else /* add */
if ((subboards[curlsub].type) && (syscfg.systemnumber)) {
if (b==NULL)


4a> Find void_scan(blah blah) and do the following. I changed the message base
read prompt on my board so that it shows the name of the current sub at the
"Read: (1-100,^1),? :" prompt. If you don't like it (I think it looks GREAT!)
then don't put this in. Think of this part as a mini mod within a mod.


switch(optype) { /* search */
case 0: /* Read Prompt */
if (strcmp(subboards[curlsub].name,"THISUSER")==0) /* add */
sprintf(s,"\003""3[\003""4 %s's Sub \003""3] \003""2Read:(1-%d,^%d),? :"/*add*/
,,nummsgs,msgnum); /* add */
else /* add */
sprintf(s,"\003""3[\003""4%s\003""3] \003""2Read:(1-%d,^%d),? :"/*change*/
if (express) {


4b> Further down in void scan(blah blah), all the way towards the end, do this.


if (
((restrict_post & thisuser.restrict)==0) &&
(thisuser.posttoday (>=subboards[curlsub].postsl)) {
if (strcmp(subboards[curlsub].name,"THISUSER")==0) /* add */
sprintf(s,"Post on %s's Sub ? ",; /* add */
else /* add */
sprintf(s,"Post on %s? ",subboards[curlsub].name); /* search */


5> In void qscan(blah blah) do the wang chung with this.


while ((i<=nummsgs) && (msgs[i].qscan<=thisuser.qscnptr[curlsub]))
if (strcmp(subboards[curlsub].name,"THISUSER")==0) /* add */
sprintf(s,"< Q-scan %s's Sub %s - %d msgs >" /* add */
,,usub[bn].keys,nummsgs); /* add */
else /* add */
sprintf(s,"< Q-scan %s %s - %d msgs >",subboards[curlsub].name,/* search */
if ((nummsgs>0) && (msgs[nummsgs].qscan<=thisuser.qscnptr[curlsub]))
if ((nummsgs>0) && (i<=nummsgs))
if (msgs[i].qscan>thisuser.qscnptr[curlsub])
if (strcmp(subboards[curlsub].name,"THISUSER")==0) /* add */
sprintf(s,"< %s's Sub Q-Scan Done >",; /* add */
else /* add */
sprintf(s,"< %s Q-Scan Done >",subboards[curlsub].name);


6> Finally, down in scan2() do this.


pl("No subs available."); /* search */
if (strcmp(subboards[curlsub].name,"THISUSER")==0) /* add */
{ /* add */
sprintf(s,"%d msgs on %s's Sub",nummsgs,; /* add */
pl(s); /* add */
}else /* add */
print(itoa(nummsgs,s,10)," msgs on ",subboards[curlsub].name,"");
if (nummsgs==0)


Now to get this to work, run BOARDEDIT and edit your general sub, or
make a new sub (I don't care which) and make the name of the sub "THISUSER".
You must put it in all caps, or the mod won't work. This mod is promised to
confuse the hell out of your users for a little while at the least! So have
some fun with it. You can easily modify it to print their real name, or their
phone number, or their...............

p.s. Captain Picard, I've changed your user handle on my board to "THE


No Deletion of Daily Logs
by MrBill

What's this? You're sick of all my simple but huge mods? Ok, here's a
VERY short one for you. If you like to keep more then yesterday's and today's
daily logs on hand like I do (I save them all), then put this one in.

Load up BBSUTL.C and find void beginday() and do this:

/* if (1) { */ /* comment out or delete */
/* strcpy(s,syscfg.gfilesdir);*/ /* comment out or delete */
/* strcat(s,status.log2); */ /* comment out or delete */
/* unlink(s); */ /* comment out or delete */
/* } */ /* comment out or delete */
strcat(s,"USER.LOG"); /* search */

Local Shrink for DOS
by MrBill

Here's another super small one for you. In WWIV 4.1+ there is a
function to shrink the bbs out of memory to run programs. Well Wayne didn't
deem it necessary to shrink the bbs out of memory when you shell to DOS from
waiting for caller. So if you want it to do this, simply change the following.

Load up BBS.C and find void getcaller()

case 'F':
if (ok_local()) {
pl("Type \"EXIT\" to return to the BBS"); /* search */
shrink_out(getenv("COMSPEC"),0,0,0,0); /* change */
case 'G':

NOTE: If you are interested in what the 0 parameters are for the shrink_out()
(RETURN.EXE) options. They are true/fals (Boolean, true=1, false=0)
options. This will come in handy if you decide to change the code to have
the bbs shrink in other places. They work like this:

first option : Is a user online? If yes (1), retun to the mainmenu
prompt. If no (0), return to waiting for call (WFC).

second option: Have the bbs intercept DOS calls? If yes (1), then the bbs
will monitor carrier and print WWIV text files with the
cntrl-p codes in them. If no (0), then you're in a full
shell with the bbs NOT watching anything.

third option : Intercept CNTRL-C? If yes (1), the bbs wil interupt the
CNTRL-C code. If no (0), the user can break out of
batchfiles and running programs (be careful!).

fourth option: Do a "COMMAND.COM /C " (program name)? If yes (1), the
program will be run as "COMMAND.COM /C programname". If
no (0), then the child process will just be run.

Game Area Password Mod
By Sam Kerns 1@3650

This modification was written due to medical problems.... as in major
headaches. Way too many users were going in and out of the games area of
WWIV each call. This does not stop that, but it does add some work for a
user who knows only the "." key. (Chances are that is the only key that
is set up in the character table of their comm package) Results of this
mod are at the end of this file. It was interesting at best.

=========== Module BBS.C =================================================

This is the call to the games area via the do_chains function. Simply put
this code in place of the "case '.'" call in BBS.C

case '.':
pl("Access to Games Requires SPECIAL PASSWORD ");
pl("that must be obtained from Sysop # 1. It is ");
pl("given out very descretionately. Asking is no ");
pl("Guarantee of gaining access. ");
if (!ckpw())
sysoplog("Entered Games Area");
case 'B': <------- Unchanged WWIV code resumes with this.

======= Module SYSOPF.C ====================================================

Add this just below the function int checkpw() found in the SYSOPF.C file.
Just search for "checkpw" with the ^QF of TurboC and you are there. Add all
of this code below.

int ckpw()
char s[81];

prt(1,"Access Password > ");
if (strcmp(s,"XXXXXXXX")==0) <------ Place your own choice of Password
return(1); where XX is (up to 20 characters)


A SYSOP NOTE here. What was funny from this was the number of users that
entered the area that were NOT GIVEN the PASSWORD by me. Weeded out the BBS
users that like giving out System info.... and it also cleaned out a few of
the users that might have otherwise made it to a Co-Sysop level or along
that line. This is kind of a test of trust here. I was very surprized at the
info I gained from this.

Like what users travel in packs or cliques. What users won't keep anything
to themselves and other "personality" traits. It was worth the mod just for
that part of it if anything.

If you like the mod, give us a call at the number listed up top.
We do voice call you, and we validate pretty quickly (within 3 days tops)
and Other WWIV sysops are welcome to contact us...

Or just Netmail us and say hi.

Sam Kerns
Wichita's Tornado Alley BBS
Kansas ONLY WWIVnet System


Newuser Notification Mod
by Sam Kerns 1@3650

Awhile back on the Modifications net, someone, and I am sorry, I don't
remember who, suggested this as an idea to ID newuser logons. When you log
on you are shown, such and such read your mail... in the same place, this
mod will, after the stats, show you that "John Doe #200 Registered on (Date)
in the same fashion. This has proved very helpful, especially when the butts
don't log any feedback. I then send them a form letter asking them if they
are handicapped and can't understand english or what their problems are in
that they didn't send Newuser feedback to our sysop 4.

========================== Load up NEWUSER.C ============================

-- nl();
-- pl("Please wait..."); <---------- Search for this statement!!!!
-- nl();
-- read_user(0,&u);
-- l1=(filelength(userfile)) / ((long) sizeof(userrec))-1;
-- if (l1==(long) status.users) {
-- usernum=status.users+1;
-- } else {
-- usernum=1;
-- do {
-- read_user(usernum,&u);
-- if ((u.inact & inact_deleted)==0)
-- ++usernum;
-- } while (((u.inact & inact_deleted)==0) && ((long)usernum<=l1));
-- }
-- write_user(usernum,&thisuser);
-- close_user();
-- isr(usernum,;
+ strcpy(s,nam(&thisuser,usernum)); /* Add */
+ strcat(s, "Registered on "); /* Add */
+ strcat(s,date()); /* Add */
+ ansic(6); /* Add whatever color you want */
+ ssm(1,0,(s)); <--------------- This would send to User #1
+ ssm(4,0,(s)); <--------------- Use the # of your other Sysops here
-- ok=0;
-- topscreen();
-- do {
-- nl();
-- nl();
-- ansic(2);

========================= Recompile to OBJ and Link ========================

Now the -- is normal unmodified code lines. The + is the additions.
It is that simple.

I need to thank MrBill for putting up with me sending these very often
mundane and trivial mods for his VARIOUS3.MOD file. I hope that they do some
good someplace.

Sam Kerns
Wichita's Tornado Alley BBS
(316) 524-4016


Registration Code II
by Sam Kerns 1@3650

Here are some new mods that sysops may impliment. The first mod, a mod
to create and log a Registration code to all New users. This was issued
by a sysop previous. We altered it so that the Registration code would
be written to the callers.log. On Tornado Alley, we use this as a second
form of validation information.


The entire 'void input_code()' goes in the NEWUSER.C module just before
the function 'void input_name()'. This version of the previous mod just
adds the write to the callers log. When checking on new users a sysop can
SEE the Registration Code that was entered by the Newuser during his/her
logon. This is very handy to ask a user when voice validating them. We
have come to believe this is part of the reason for the cut down in false
accounts on Tornado Alley BBS.
Again, my thanks to the original author of the mod. We just took a good
idea and made it work a little better for us.
Hope you can use this one.


void input_code()
int i,i2,i3,ok,count;
char s[81],n[11],code[11],ch;


do {

if (i2<6500) i3=4;
else if (i2<13000) i3=5;
else if (i2<19500) i3=6;
else if (i2<26000) i3=7;
else if (i2<32500) i3=8;
else i3=9;

for (i=0; i ch=rand() % 36;
if (ch<10)

prt(2,"Registration Code: ");
strcpy(s,"Account Registration Code: "); /* added by TA to write to log */
strcat(s,code); /* added to original mod */
sl1(0,""); /* added to original mod */
sl1(0,s); /* added to original mod */
prt(3,"Please enter the above Registration Code");
prt(2,"REMEMBER THIS NUMBER as you will need "); /* added to mod */
nl(); /* added to mod */
prt(2,"it when you are voice validated. "); /* added to mod */
if ((strcmp(code,n)==0))
else ok=0;
if (!ok) {
prt(2,"That is not correct! ");
if (count==3)
} while ((!ok) && (!hangup));

void input_name() <------------ Original source code lines
{ <------------
int ok,count; <------------


Edit User Password
by Sam Kerns 1@3650

This mod, was written way back when I found I could not do any Password
changes from Uedit. It is very simple and just goes in the 'void uedit()'
area of SYSOPF.C. It can be put in any area of the 'case' statements and
does not require a total recompile. Just compile the SYSOPF.C module and
re-link your EXE file and that is it....


case 'E':
prt(2,"New Exemption? ");
if ((i>=0) && (i<=255) && (s[0])) {
break; < ------------------- Original source code
case 'W': /* add */
nl(); /* add */
prt(3,"ENTER Users NEW Password "); "
outstr(": "); "
input(s,8); "

if (s[0]) { "
strcpy(,s); "
write_user(un,&u); "
} "
break; "
case 'Y': < ------------------ Original source code...

Brad Havel, sysop of @5750 did one of these which reminded me of the
mod in the begining. He has released a similar mod for this but we felt
we would kick this one out anyway... His works slightly different than
this one does and that is the only difference in the two mods if you
should run across them.



Storm Warning Modification
by Sam Kerns 1@3650

Here is a very minor modification that can do alot of good. This mod
will interupt a user online and send a file called "STORM.MSG" to the user
and give them 10 seconds to read the small file before the BBS automatically
logs them offline to allow you to shut down your computer during Severe or
dangerous weather. All to often you get stuck with either pulling the plug,
sending them garbage or whatever. If they are a sysop, you often have to do
a chat interupt to talk to them to tell them why they are about to be taken
offline. This will let them know and kill the carrier in 10 seconds all with
the single stroke of Ctrl-F1.

=========================== Load up CONIO.C ==============================

Find the function "void skey (...". Just below the int definitions add
the line: "char s[81];". Then search for "case 88:".
Add the below code in place where the number "94" would fall in order and
save the file. Compile it to a CONIO.OBJ file and link it with your other
OBJ files into your EXE.
That's it..... You are now ready to hit the Ctrl-F1 key to send a call
to the users saying it's time to get off...

Remember, make your file "STORM.MSG" and it is best to make it a short
one as the users only have 10 seconds to see it before they are knocked
offline from the BBS. Put it in the GFILES dir. If you use FSED a simple
E command from WFC will do the job for you.

case 94: /* Ctrl-F1 */ <-------------------------+
strcpy(s,syscfg.gfilesdir); :
printfile("STORM.MSG"); :
wait(10.0); :-- Added Code
hangup=1; :
dtr(0); :
break; <----------------------------------------+
case 98: /* Ctrl-F5 */ <------- Normal code resumes here.
pl("Call back later when you are there.");

We openly invite all WWIV sysops to call Tornado Alley BBS and your
company is always welcome. You should also call the many, many other fine
WWIV systems nationwide.
If you are a NEW WWIV sysop and you need help, you should know that the
WWIV systems nationwide have sysops that will bend over backwards to help
you in your endeavors. Feel free to contact one of your nearby WWIV Boards
for technical help or assistance.
WWIV Sysops pride themselves in their open ability to help new starts.
We are not like Wildcat, PCBoard, RBBS, QBBS, or any of the others. We
welcome you to the world of WWIV. Get ready...get registered (Obviously)
and the universe is at your fingertips. With the many modifications out for
WWIV you need not be a TurboC programming wizard. Our docs are simple and
easy to follow so the many modifications that NEW Sysops will find are very
quickly installed if followed as written by the authors.

We don't hit you for bucks....we ask your loyalty to WWIV and WWIVnet.
For us, the sysops of WWIV, that is enough.

Sam Kerns Tornado Alley BBS


Break in and Terminate Mod
by Sam Kerns 1@3650

Sometimes, for a sysop, an emergency comes up in which you need online to
your board right then, right there. You don't really feel like a chat to a
user that may drag on or out longer than you wish and you don't really want
to slam a user offline. I have encountered that and here is the solution I
came up with.

========================= LOAD CONIO.C Module ============================

Search for "case 88:"

Below that, preferably in a numeric order, place the following code:

case 95: /* Ctrl -F2 */ /* SK */ /* Add */
strcpy(s,syscfg.gfilesdir); /* Add */
printfile("BREAK.MSG"); /* Add */
wait(20.0); /* Add */
hangup=1; /* Add */
dtr(0); /* Add */
case 98: /* Ctrl-F5 */ <--------- Normal WWIV code begins again.

Now, if you did not use the Storm.Mod contained in this edition of
Mr.Bill's Various3.Mod, then at the begining of this function you must
add the following line right below the "int" definitions:

char s[81];

That is it. Compile this to an OBJ file and re-link to your EXE. You do
not have to recompile the entire file, although that is the best thing to
do, it is not needed to make this work.

Take your ANSI animator, text editor or FSED (Best way) and make your
file "BREAK.MSG" that tells your users you are sorry for interupting them
and whatever...I would also tell them they are being logged of in 20 seconds
from this interupt..and when the board clears them off...well then... just
do what you needed to do.


Sam Kerns
Tornado Alley BBS

If you have problems, contact any one of the Twilight Node boards that
are listed in the MODNET2.ZIP file that is available on most all of your
WWIV boards nationwide.

Good luck, and happy modifications to you!!!!


New Scan Notification Mod v1.0
by Robert Miller 1 @ 7302

The following mod was made at the suggestion of The Knack a user on my
system. His complaint was that since he called the system frequently and
would do a newscan of the messages and had the transfer area default to a
newscan that if there were no new uploads he was never sure that an newscan
had been done and would then go to the transfer area and run it again to
be sure. He felt that a simple message stating that a newscan was in
progress would be sufficient.

What this mod does is print a message stating the following whenever a
newscan is done either at the end of a new message scan or in the transfer

Now searching for files that have been uploaded since MM/DD/YY

MM/DD/YY will be replaced by either the current limiting date for the user.


To install the mod (a very simple one it is too) do the following:

1. Load XFER.C
2. Search for void nscanll()
3. In the procedure add the eight (8) lines where indicated.


void nscanall()
int abort,i,i1;
char s[81];
/* add */ struct date d;
/* add */ struct time t;

/* add */ nl();
/* add */ unixtodos(nscandate,&d,&t);
/* add */ prt(3,"Now scanning for files that have been uploaded since ");
/* add */ sprintf(s,"%02d/%02d/%02d",d.da_mon,d.da_day,(d.da_year-1900));
/* add */ prt(2,s);;
/* add */ nl();
for (i=0; (i<64) && (!abort) && (udir[i].subnum!=-1); i++) {
if (i1>=32) {
if (thisuser.nscn2 & (1L << (i1-32)))
} else {
if (thisuser.nscn1 & (1L << i1))
if ((num_listed) && (!abort)) {
sprintf(s,"Files listed: %d",num_listed);


If you have any questions or problems or suggestions for improvements
you can reach me via netmail.

Robert W. Miller
Vint Hill Farms

No Title Needed Mod v1.0
by Robert Miller 1 @ 7302

The following mod was suggested by a number of users on my system who
don't like thinking up titles to their posts. What this mod will do is
when a user enters a blank line for a title it will substitute 1 of 10
randomly chosen titles.

To install this mod do the following steps:

1. Load MSGBASE.C into your favorite editor.
2. Search for void inmsg(messagerec *m1, char *title, int *anony,
3. In the variable declarations add the following variable to the string
of integer variables already declared:
4. Search for the following line in void inmsg:
5. Insert the following code AFTER helpl=6;

if (okansi()) { /* add this */
prt(2,"Title: ");
} else {
pl(" (---=----=----=----=----=----=----=----=----=----=----=----)");
outstr("Title: ");
if (title[0]==0) {
rnd_msg = (rand() % 10);
if (rnd_msg == 0) {
strcpy(title,"This message is brought to you by "); }
if (rnd_msg == 1) {
strcpy(title,"This space for rent by "); }
if (rnd_msg == 2) {
strcpy(title,"I really HATE thinking of titles "); }
if (rnd_msg == 3) {
strcpy(title,"..."); }
if (rnd_msg == 4) {
strcpy(title,"Here's a REALLY important message by "); }
if (rnd_msg == 5) {
strcpy(title,"Random message #5 has been generated for "); }
if (rnd_msg == 6) {
strcpy(title,"Ditto, ditto, ditto..."); }
if (rnd_msg == 7) {
strcpy(title,"For a good time call 703-754-0884..."); }
if (rnd_msg == 8) {
strcpy(title,"Generic Title for a Generic Message by Generic User "); }
if (rnd_msg == 9) {
strcpy(title,"Boy am I having FUN now....."); }

6. Immediately after the new code remove or comment out the following

if ((title[0]==0) && (needtitle)) {
if (!fsed)
farfree((void *)lin);

7. Load TurboC hit F9 and you are done.

A small warning about this mod. If a user decides to send mail or
accidentally hits the P)ost command they can no longer abort the message
by simply leaving the title blank. They have to wait until the editor loads
and then abort from the editor. This is not really a major problem except
for the very, very new users and for new users who are registering since they
may not know how to abort the editor. Of course this does force new users
into the editor for a validation message and might encourage a few more
new users to send validation messages.

If you have any questions, suggestions or problems feel free to contact
me via the network.

Robert W. Miller
Vint Hill Farms


Page Mod version 2.1
by Robert W. Miller and Tony Geisler

The following mod is an update to my original mod to change the normal
screeching sound that a user page generates. Version 1.1 played a series
of rising and descending tones and that was it. This new version was very
much improved by Tony (1@7312) and now has the following features:

1. The page plays for 30 seconds.
2. The page may be aborted by the user at anytime during the 30 seconds.
3. The Sysop may hit F4 to turn off the page without informing the user.
4. When the sysop responds and chats with the user the page counter resets.
5. After 5 page attempts the system will prompt the user to send email.
6. After 10 attempts 5 audible and 5 written the user will be logged off
for being annoying and awarded some ass points.

To Install the mod you need to do the following steps:

Step 1:
Add the following to your VARS.H include file:

int page_reqs;

Step 2:
Add this to the end of the external variables at the beginning of the
BBSUTL.C file:

extern int page_reqs;

Step 3:
Now search for void getuser() and add the following at the top following
the variable declarations:


it should be placed just before this line:

thisuser.sysstatus &= (~sysstatus_ansi);

Step 4:
While still in BBSUTL.C search for void reqchat() and replace the entire
void with the following void:

void reqchat() /* mod - change entire void - */
int ok,count,k,abtchat;
char s[81],ch;

if (restrict_chat & thisuser.restrict)
if (ok) {
prt(2,"Reason: ");
if (s[0]) {
strcpy(chatreason,"Chat: ");
for (ok=strlen(chatreason); ok<80; ok++)
if ((page_reqs>5) && (page_reqs<=10)) {
prt(2,"The sysop is not available - please use feedback instead.");
strcpy(irt,"Tried Paging.");
} else if (page_reqs>10) {
prt(3,"Page attempts limit exceeded...logging you off.");
strcpy(s,"### PAGING VIOLATION for ");
} else if (page_reqs<=5) {
prt(2,"Sysop page will end in 30 seconds. Press [SPACE] to abort.");
nl(); nl();
prt(1,"Paging Sysop.");
while ((count<60) && (!(abtchat)) && (page_reqs))
count ++;
if (chatcall) sound(2500); delay(125);
if (chatcall) sound(2600); delay(125);
if (chatcall) sound(2500); delay(125);
if (chatcall) sound(2600); delay(125);
switch (ch) {
case 3:
case 24:
case 32:
if (abtchat)
prt(1,"Sysop Page cancelled.");
prt(1,"Sysop Page deactivated.");
} else {
prt(2,"The sysop is not available - please use feedback instead.");
strcpy(irt,"Tried Paging.");

Step 5:
Now load up the CONIO.C file and the following line to the end of the
variable declarations at the beginning of the file.

extern int page_reqs;

Step 6:
While still in CONIO.C search for void skey(char ch) and make the following
additions or changes:

case 62: /* F4 */
nosound(); /* mod - add */

case 68: /* F10 */
if (chatting==0) {
page_reqs=0; /* mod - add */
nosound(); /* mod - add */
if (syscfg.sysconfig & sysconfig_2_way)

case 103: /* Ctrl-F10 */
if (chatting==0) { /* mod - change */
page_reqs=0; /* mod - add */
nosound(); /* mod - add */
} else /* mod - change */

Step 7:
Recompile the BBS and prior to running it re-run INIT and turn off the
BEEP FOR CHAT option; otherwise you will still get the old style paging.


If you have any questions, suggestions or problems please feel free to
contact either me or Goose via the network.

Robert W. Miller | Tony Geisler
1@7302 | 1@7312
Vint Hill Farms | Manassas
Virginia | Virginia

Chuser Mod v1.2
by Robert Miller 1 @ 7302

I don't know about the rest of the sysops around here but I have 2 or 3
accounts that I use on my system. I have one that has my handle and is the
number 1 account (1@7302) and I have a real name account and also a couple
of test accounts that I use to test out new mods or troubleshoot possible
system problems. Anyways, I found the constant need to enter the command
//chuser and then the system password to be annoying. I constantly change
my system password and it sometimes takes me a couple of tries to remember
what the current new one is. The result is that I end up having to enter
//chuser and the password two or three times.

This mod bypasses the //chuser and password requirements. For security
the mod is only available to sysop level accounts and is only available
from the system console. To use the mod you simply press SHIFT-F2 and it
will ask you for the username/account and then move you there.

To install the mod do the following:

1. Load up CONIO.C.
2. Seach for void skey(char ch)
3. At the beginning of the void there is one line of variable declarations
after that one line (int i,i1;) add the following declaration:

char s[81];

4. Search for case 71: /* HOME */
5. Insert the following case statement after case 71.

case 85: /* SHIFT-F2 */
if (so()) {
prt(2,"User to change to? ");
if (i>0) {;
strcpy(s,"#*#*#* Changed to ");
} else {
prt(6,"Unknown user.");

4. Recompile the BBS and there you go.

If you have any questions, suggestions or problems with this mod please
feel free to contact me via the network.

Robert W. Miller
Vint Hill Farms

Message Read Prompt Mod
by Harry Mudd (1@7304)

Seems that no one understood what Read:(1-100,^100).? : meant. The ^ was
messing them up. So I thought, why not replace it with a "C/R=(next message
number)? Problem with that was, when you got to the last message, say 75, it
would still say Read:(1-75,C/R=76) when there was no 76. This also blew
people's minds. So I finally got off my duff and finished it up. It wasn't
great coding, and I'm sure it could be better, but here it is...

Search for: /* Read Prompt */

do (
switch(optype) {
case 0: /* Read Prompt */
sprintf(s,"Read:(1-%d,^%d),? :",nummsgs,msgnum);

Add/modify the following lines:

do (
switch(optype) {
case 0: /* Read Prompt */
if (msgnum+1 <= nummsgs)
strcat(s,"),? :");

Harry Mudd - Sysop: Starship BBS (@7304)


/*- Revised Logon Information -*/
/*- by Fletcher Christian -*/
/*- -*/
/*- I got the idea for this mod from Genesis Deluxe and just -*/
/*- decided to write it up for a while. It doesn't do anything -*/
/*- fancy except make your board look a little different. Included-*/
/*- in this mod are a few others: -*/
/*- -*/
/*- MrBill's FROM Mod -*/
/*- Shai Hulad's PEPPERII Mod (the ONLY Post/Call Ratio Mod) -*/
/*- Anyone's GOLD Mod (there are at least a dozen) -*/
/*- -*/
/*- I suppose I originally could have done this so that you -*/
/*- could install it in an unmodified board, but those of you -*/
/*- who will put this in, already have modified boards and hope- -*/
/*- fully already have these mods in so it will save you some time.-*/
/*- There's not much too this. Tests have shown that the -*/
/*- average chimp can install it in under 5 minutes. I just added -*/
/*- a new void call (because it was easier to work with all the -*/
/*- variables, so the directions are simple. Block read in one -*/
/*- section then add a line. Done. n -*/
/*- As usual, if you have any problems with this (besides the -*/
/*- sloppy code) contact me at #28@7300 (Billy's House) (will be up -*/
/*- on Sept 1). The board is completely modified and you either -*/
/*- hate it or love it. I had my board down all summer and did -*/
/*- nothing but modify it (most of which I can't even try to -*/
/*- release since I've no idea what it used to look like). Enjoy. -*/

in void logon()

if (live_user) {
if (okansi()) /* Add Line */
stats(); /* Add Line */
else { /* Add Line */
print("Name: ",nam(&thisuser,usernum),"");
print("Time allowed on: ",s,"");
if (thisuser.illegal) {
print("Illegal logons : ",s,"");
. /* Further Down in void logon */
sprintf(s1,"Forwarding mail to #%d @%d.",
sprintf(s1,"Forwarding mail to user #%d.",thisuser.forwardusr);
} /* Add Line */

before void logon() block read in the following:

void stats()
char s[81],s1[81],s2[81],s3[81],s4[25],s5[10];
int i;

sprintf(s," ³%-40s%-30s³",syscfg.systemname,;
sprintf(s," ³ WWIVNet Node: @%-4s ÕÍÍ͸ Name: %-20s ³",s1,thisuser.realname);
if (syscfg.wwiv_reg_number)
sprintf(s," ³ %-4s Reg %6s ³ ³ From: %-20s ³",VERSION_NUMBER,s5,thisuser.citystate);
sprintf(s," ³ Users: %-4s Calls: %-5s ³ ³ Fone: %12s ³",s1,s3,;
sprintf(s," ³ Today's Statistics ³ ³ Age: %-2s Sex: %c ³",s2,;
sprintf(s," ³ Calls: %-2s Active: %-3s ³ ³ On: %-4s Time: %-4sm ³",s1,s2,s4,s3);
sprintf(s," ³ UL's: %-2s Posts: %-3s ³ ³ Last: %-8s Gold: %-5s ³",s1,s2,thisuser.laston,s3);
sprintf(s," ³ EMail: %-3s Feedback: %-3s ³ ³ P/CR: %-5.3f Mail: %-2s ³",s1,s3,mratio(),s4);
sprintf(s," ³ ÔÍÍ; ³");
if (sysop2()) {
strcpy(s2,"Alive and Available");
} else {
strcpy(s2,"Asleep now & NOT Available");
sprintf(s," ³ The Sysop is: %-26s ³",s2);

As usual, you don't have to do this, but the Surgeon Generl has warned that
failing to update your header files is deterimental to your health sooooo...

void getuser(); /* Existing Code */
void beginday(); /* " " */
void stats(); /* Add this Line */
void logon(); /* Existing Code */
void logoff(); /* " " */

The only problem you might have with this mod is the spacing (which MrBill
has constantly bitched at me about). This version should work (with v4.10!).
can't really block the thing out of my code since it doesn't really look
anything like this....other mods are in it. If you have any problems just

As usual, this code is by no strech of the imagination, guaranteed to work,
it works on my board, that's all I guarentee. Also, you will notice that this
1) Does not contain my name, address and life history
2) Is not distributed in OBJ code or some such nonsense (as if it could be!)
3) Has never been previously released in the WWIV arena

C'mon guys, I know who wrote each and every mod on my board and you all
have my eternal gratitude but you don't have all your names splattered all
over my board and those of you who have release .OBJ code aren't even there.
Sheesh, I don't really care if some user in Redneck, Ca knows who I am. Most
users have no clue as to who Wayne Bell is, let alone ME!
If you like the mod (heck even if you don't), all I ask, is that you
gimme a call at The Bounty. If you have any problem with this mod or any
other WWIV mod, I will be glad to help you out with it(I've put most every
mod ever written in my board and know most of them pretty well). That's
all I ask. Heck, it's PCPable and everything! Sysops have the run of the
place and you'll get to see all the other mods I've done but am too lazy
to write up.

Fletcher Christian

Logon SL Mod
by Flavor

It is true.... this is the first OFFICIAL mod (hehe) by Drennen
Brown alias Flavor Flav.... this will allow the SL level of a
user to be recorded in the 'Log of the Day' in place of the 'times
called today....' like this...

Flavor #1 KB - [255]
or something like that anyway.... well this is like MEGA simple to
do.. and I am sure unless you have recently had a lobotomy, that
you can figure it out.... this is written in C or use with
Wayne's WWIV 4.xx boards... well here goes....

First... (and last) heh:
Goto the file BBSUTL.C
Search for void logon() around line 910 or so.... and do this...

existing line.. -- strcat(s," ");
" " -- strcat(s,curspeed);
Add line -- strcat(s," [");
Change line -- itoa(,&(s[strlen(s)]),10);
Add line -- strcat(s,"] ");
existing line -- strcpy(s1,syscfg.gfilesdir);


Well.... if you couldn't figure that out.. YOU ARE A MORON! hehe
I hope that you like this little addition that should add a small
bit of individuality to your board.... till later....

--Flavor... if you have any problems with this mod
(Hahahaha) you can call me at my Board "Altered States" (301)


Total Gold Mod
by Flavor

Okay here it is.... this is Flavor/Drennen Brown's second
WWIV board mod.... it really can only be used with the SALT.MOD
that already exists though.... this will allow users to see their
total amount of gold each time that they have it subracted or taken
away.... this will cut down on a bothersome Y:our Information
check all the time.... okay... it is pretty darn simple so unless
you have some kind of mental defect... you should have NO


Goto the Source file MSGBASE1.C, in the 'void post()' around
line 175....

Existing line -- strcat(s,subboards[curlsub].name);
" " -- sysoplog(s);
" " -- nl();nl();
" " -- prt(3,"sluggo gave you some gold...);
" " -- nl();
" " -- thisuser += xx.x;
ADD LINE -- prt(3,"Bringing your total to ");
" " -- itoa((int),s,10);
" " -- ansic(1);
" " -- print" ",s,"");
Existing line -- nl();


Goto the source file BBSUTL1.C, in 'void do_chains()' around
line 1440.....

Existing line -- run_chain(map[i-1]);
" " -- nl();
" " -- prt(3,"Sluggo stole some gold....);
" " -- nl();
" " -- -= xx.x;
ADD LINE -- prt(3,"Busting you down to ");
ADD LINE -- itoa((int),s,10);
" " -- ansic(1);
" " -- print(" ",s,"");
Existing line -- nl();

Well.... Hoped you liked it... I think it is pretty cool
myself.. hahah it just makes it easier for the users to tell just
how much gold they have... As i did, you will probably get alot
of user feedback regarding this new mod....

-=Altered States=- 2400/1200/300 (301)939-5195
--Flavor Flav( The Flav of All Flavors.)

Redisplay Feedback Questions
by The Doctor #1 @2457

This is the first MOD i have written so its not very good...well
it works but..its not some GREAT and SPECTACULAR MOD written by
a programmer..well I'm a programmer..but only APPLE BASIC...hmm

The purpose for this MOD is to allow NEW users to RE-DISPLAY the
Feedback Questionair...this would be usefull for boards that have
long questionairs that scroll off the screen and require the user
to answer ALL of the questions. All this is is an extra command
that is available to people whos last time on is 0...This MOD adds
The command /QU for QUestionair. I have also added a bit to the
//HELP command to display the command only to newusers. Well on
with the show!!!

O.K. first step. Load MSGBASE.C and add this stuph:

/* LEGEND */
/* > = look for */
/* + = add */

> while (!done) {
> inli(s,ro,160,1);
> if (hangup)
> done=1;
> savel=1;
> if (s[0]=='/') {
> if (stricmp(s,"/HELP")==0) {
> savel=0;
> printmenu(2);
+ if (thisuser.Feedback==0) {
+ pl("/QU - Relist FeedBack Questions") /* !!see note!! */
+ }
> }
+ if ((stricmp(s,"/QU")==0) && (thisuser.fedback==0)) { /* !!see note!! */
+ nl(); /* You can replace "/QU" with */
+ printfile(feedback.msg); /* a command of yer choice. */
+ nl();
+ pl("continue...");
> }

NOTE: you may replace '/QU' with any command you want as
long as it isn't the same as any other commands.

If you have any trouble with this new command or have something
better then PLEASE tell me... I'm user 1@2457 if you can get to
a WWIVNet board and write me. And of course any DONATIONS to
a young aspiring programmer and his board (specificaly ME) would
be greatly apreciated...Pluss i will send ya any MODs i make in
the future (I have many Ideas lurking in the vast space between
my ears.) And you'll get a lot of accessto my board if you happen
to call it..the number is:

PCPersuitable at TXDAL

Well catch ya later with my next MOD..which i may do tonight!
cause I'm in the process of MODing mine right now...bye!!!


Beep! Mod
by Viper 25@8101

Hello, I hope you don't mind if I make one suggestion for WWIV. Well, on the
PCBOARD systems, I tend to enjoy the little "beep" at the beginning, so I
wrote a one-liner mod (wow) for WWIV that you might find somewhat useful, and
I'd appreciate it if maybe you would consider putting it in your next
wonderful copy of 'various%d.mod'. Well, in the file 'BBSUTL.C', right after
the line "outstr("Can you support ANSI graphics? ");" you would add the line
"print("\x7");" so that it would beep remotely, and if you wanted it to beep
locally as well, then "printf("\x7");" would most likely suffice. Well thanks
for your time in reading this message...

1@"Ultimate Fusion BBS (801)-278-8208 // 300/1200/2400 bps."


Multi-Validation Feedback
by Boko Kaboni #12@8411

There has been a little intrest by some sysops to have the validation feedback
be sent to the Co-Sysops as well as the Sysops, well here is a mod to do
just that. It is very easy to do, and all I ask is that yo email me if you
use it so I can know if it is really being used.

The legeng for this mod is as following : "--" is an existing line, "-#" is
a modified existion line, "**" is a deleted line, & "##" is an added line.

First, open the file NEWUSER.C and search for the function void newuesr()
and make the following code changes.

-- void newuser()
-- {
#- int u1[50],numu,i,ok;
-- char s[81],s1[81],ch;
-- userrec u;
-- long l1,l2;
-- if (incom) {
-- if (printfile("FEEDBACK.MSG"))
-- sl1(0,"#Aborted FEEDBACK.MSG");
** strcpy(irt,"Validation Feedback.");
** email(1,0,1,0);
## u1[0] = 1; /* Sysop */
## u1[1] = n1; /* n1=num of first Co-Sysop */
## u1[2] = n2; /* n2=num of second Co-Sysop */
## numu = 3; /* set this to the number of people recieving the */
## /* feedback */
## multimail(u1,numu);
-- }
-- }

Note: you need one element in the u1 array for each person's user number
that is going to recieve the Feedback, numu must have the proper number
of persons to mail to or there will be some problems.

Second, load the file MSGBASE1.C ans search for the following code in
the function void multimail(int *un, int numu) and make the following
code changes.

-- if (ss.ability & ability_email_anony)
-- i=anony_enable_anony;
-- else
-- i=0;
-- m.msg.storage_type=EMAIL_STORAGE;
## if ( == 10)
## strcpy(irt,"Multi-Validation Feedback");
## else
-- strcpy(irt,"Multi-Mail");
-- inmsg(&m.msg,t,&i,1,"EMAIL",ALLOW_FULLSCREEN);
-- if (m.msg.stored_as==0xffffffff)

Now recompile the BBS and you are done. I hope that you like the Mod, and
if there are any questions about it E-mail me at #12@8411.

Well, that brings us to an end of another Various Mods, hope you
enjoyed it as much as we did!

Me Again

  3 Responses to “Category : BBS Programs+Doors
Archive   : WWIVMODS.ZIP
Filename : WWIVMOD3.MOD

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: