home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / Dloads / WWIVMODS / PRE412.ZIP / ELRIC35.MOD < prev    next >
Text File  |  1990-06-13  |  20KB  |  620 lines

  1.                 Welcome to...
  2.                             Elrics mod #35
  3.  
  4.                  New restrictions on Message bases
  5.                   Variable Gold per post per base
  6.  
  7.  
  8.  
  9. This mod is a kind of big one, yet it aint all that hard. What it does is
  10. add some more stuff to subs.dat to allow you to have some extra restrictions
  11. per base. To be exact, you may now include:
  12.  
  13.     ==> Maximum age for a base, for kiddie bases. Also allows you to do
  14.         something like an 18-22 only base.
  15.     ==> Sex restrictions on a base, for male or female only bases
  16.     ==> ANSI required for a base, for things like the ANSI art gallery
  17.     ==> Gold, so different bases can earn different gold amounts
  18.  
  19.  
  20. Of course, there is a problem with sticking this in SUBS.DAT, like it
  21. should be. Wayne Bell for good reason won't distribute the source to the net,
  22. and since it needs SUBS.DAT to post the messages, you would be in a world of
  23. trouble if we changed that. So, there are several possible solutions:
  24.  
  25.    ==>Stick it in SUBS.DAT, but drop out of the network/linkwork.
  26.    ==>Stick it in SUBS.DAT, and watch the net trash your drive.
  27.    ==>Create a seperate little file for each sub, with 4 bytes in each one,
  28.       which of course wastes 2K of drive space each.
  29.    ==>Make a new file, call it SUBS2.DAT, and store the extra info in there.
  30.       Then, read in the data in a complicated way involving multiple files,
  31.       arrays, and magic.
  32.    ==>Make a new file, call it SUBS2.DAT. Store all the data in that one, and
  33.       let your BBS use this data file. Then, everytime you run Boardedit,
  34.       update SUBS.DAT with the info the net wants.
  35.  
  36. I chose the last alternative, because it was the only one that made sense.
  37. So, without any further ado, allow me to procede with the mod.
  38.  
  39. ==============================================================================
  40.  
  41. /** this step is indeed a form step, much like a form letter **/
  42. 1. From DOS, in your dir where you keep your source....
  43.  
  44. PKZIP SOURCE *.c *.h
  45.  
  46. If you already have a source zip file, then
  47.  
  48. PKZIP -f source *.c *.h
  49.  
  50. This way you have a copy of everything before you screw it up with a bad mod.
  51. If you decide to take the mod out, it's as easy as
  52. PKUNZIP -x source
  53.  
  54. and hit Y to overwrite any files you changed.
  55.  
  56. /** we now resume our regularly scheduled mod with step 2.... **/
  57.  
  58. ==============================================================================
  59.  
  60. 2. Load up vardec.h
  61. Search down for the declaration for subboardrec. Mark that off (Ctrl-K B
  62. at the beginning of the block, Ctrl-K K at the end.) Copy that block
  63. (Ctrl-K C).
  64. Now, take the first copy and re-name it oldsubboardrec. Take the second copy,
  65. and add four variables to the unsigned chars. maxage, sex, ansi, and gold.
  66. When you are done you should have a block that looks like this.
  67.  
  68.  
  69.  
  70. /* Old MESSAGE BASE INFORMATION   (SUBS.DAT)*/
  71. typedef struct {
  72.     char        name[41],        /* board name */
  73.             filename[9],        /* board database filename */
  74.             key;            /* board special key */
  75.     unsigned char    readsl,            /* sl required to read */
  76.             postsl,            /* sl required to post */
  77.             anony,            /* anonymous board? */
  78.             age;            /* minimum age for sub */
  79.     unsigned short    maxmsgs,        /* max # of msgs */
  80.             ar,            /* AR for sub-board */
  81.             storage_type,        /* how messages are stored */
  82.             type;            /* 4 digit board type */
  83. } oldsubboardrec;
  84.  
  85. /* New MESSAGE BASE INFORMATION   (SUBS2.DAT)*/
  86. typedef struct {
  87.     char        name[41],        /* board name */
  88.             filename[9],        /* board database filename */
  89.             key;            /* board special key */
  90.     unsigned char    readsl,            /* sl required to read */
  91.             postsl,            /* sl required to post */
  92.             anony,            /* anonymous board? */
  93.             age,            /* minimum age for sub */
  94.                         maxage,                 /* maximum age */
  95.                         sex,                    /* Male/Female restrictions */
  96.                         ansi;                   /* ANSI required */
  97.     unsigned short    maxmsgs,        /* max # of msgs */
  98.             ar,            /* AR for sub-board */
  99.             storage_type,        /* how messages are stored */
  100.             type;            /* 4 digit board type */
  101. } subboardrec;
  102.  
  103. Save vardec.h
  104.  
  105. =============================================================================
  106. 3. Ok, now load up Sysopf.C There are several functions to modify here.
  107.  
  108. First, look at void modify_sub.
  109. The first thing to add is the stuff to display these new options.
  110. Right below where you add the new options, you will need to change the prompt
  111. to reflect these changes. Heres what the first part of this function will
  112. look like when you are done.
  113.  
  114.  
  115. void modify_sub(int n)
  116. {
  117.   subboardrec r;
  118.  
  119.  
  120. /**  stuff skipped over **/
  121.  
  122.  
  123.     print("J. Sub Type   : ",s,"");
  124.     itoa(r.storage_type,s,10);
  125.     print("K. Storage typ: ",s,"");
  126.  
  127. /** add these lines **/
  128.  
  129.     itoa(r.maxage,s,10);
  130.     print("L. Max Age    : ",s,"");
  131.     switch (r.sex) {
  132.       case 0:strcpy(s,"Both"); break;
  133.       case 2:strcpy(s,"Male"); break;
  134.       case 1:strcpy(s,"Female"); break;
  135.       }
  136.     print("M. Sex        : ",s,"");
  137.     print("N. ANSI       : ",( r.ansi ? ("Required") : ("Not Required")),"");
  138.     itoa(r.gold,s,10);
  139.     print("O. Gold       : ",s,"");
  140.  
  141. /** change the prompt and the onek statement to add the new letters **/
  142.  
  143.     nl();
  144.     prt(2,"Which (A-O,Q) ? ");  /** change **/
  145.     ch=onek("QABCDEFGHIJKLMNO"); /** change **/
  146.     switch(ch) {
  147.       case 'Q':done=1; break;
  148.       case 'A':
  149.         nl();
  150.  
  151.  
  152.  
  153. Now, you need to scan further down into the code to make these new options
  154. do something. Look for Case 'K', then add these lines below that case.
  155. Heres what you should have when you are done.
  156.  
  157.  
  158.       case 'K':
  159.         nl();
  160.         prt(2,"New Storage Type (0,1,2) ? ");
  161.         input(s,4);
  162.         i=atoi(s);
  163.         if ((s[0]) && (i>=0) && (i<=2))
  164.           r.storage_type=i;
  165.     break;
  166.  
  167. /** add new options on **/
  168.  
  169.       case 'L':
  170.         nl();
  171.     prt(2,"New Max Age? (Enter 0 for none)");
  172.         input(s,3);
  173.         i=atoi(s);
  174.     if ((i>=0) && (i<128) && (s[0]))
  175.       r.maxage=i;
  176.         break;
  177.       case 'M':
  178.         nl();
  179.     prt(2,"New Sex Restriction (M:ale  F:emale  B:oth)?  ");
  180.     ch2=onek("BFM");
  181.     switch (ch2) {
  182.       case 'B':r.sex=0; break;
  183.       case 'F':r.sex=1; break;
  184.       case 'M':r.sex=2; break;
  185.       }
  186.     break;
  187.       case 'N':
  188.     nl();
  189.     prt(2,"ANSI required? ");
  190.     if (yn())
  191.       r.ansi=1;
  192.     else
  193.       r.ansi=0;
  194.     break;
  195.       case 'O':
  196.         nl();
  197.     prt(2,"New Gold per Post? (Enter 0 for none, 10 Max)");
  198.         input(s,3);
  199.         i=atoi(s);
  200.     if ((i>=0) && (i<10) && (s[0]))
  201.       r.gold=i;
  202.         break;
  203.  
  204.   /** end of new options **/
  205.  
  206.     }
  207.   } while ((!done) && (!hangup));
  208.   subboards[n]=r;
  209.   if (!wfc)
  210.     changedsl();
  211. }
  212.  
  213. OK. You are done with modify_sub.
  214.  
  215. ===========================================================================
  216.  
  217. 4. Still in sysopf.c, look down further for insert_sub. You will need to add
  218. a little code to 0 out the new vars we just added. So, down in the middle
  219. somewhere, add the 4 lines indicated
  220.  
  221.  
  222. void insert_sub(int n)
  223. {
  224.   subboardrec r;
  225.  
  226. /** skip down a few lines...**/
  227.  
  228.   r.anony=0;
  229.   r.age=0;
  230.  
  231. /** add these in **/
  232.   r.maxage=0;
  233.   r.sex=0;
  234.   r.ansi=0;
  235.   r.gold=0;
  236. /** end of mod**/
  237.  
  238.   r.maxmsgs=50;
  239.   r.ar=0;
  240.   r.type=0;
  241.  
  242.  
  243. =============================================================================
  244. 5. Still in Sysopf.c, look down a little further to void boardedit. The
  245. first change here is to add in the dec for the old record structure. Just add
  246. this line in like it is below...
  247.  
  248.  
  249. void boardedit()
  250. {
  251.   int i,i1,i2,done,f;
  252.   char s[81],s1[81],s2[81],ch;
  253.   oldsubboardrec oldsubboards[64];  /** add this line **/
  254.  
  255.   if (!checkpw())
  256.     return;
  257.  
  258.  
  259.  
  260. Now, next look down a little further where it saves subs.dat. Change that line
  261. to say SUBS2.DAT, and then add the rest of the indicated lines to save the
  262. actual SUBS.DAT in the old format. This way, every time you run boardedit,
  263. you save a fresh copy of subs.dat for the network to use.
  264.  
  265.  
  266.   sprintf(s,"%sSUBS2.dat",syscfg.datadir);    /** change this line **/
  267.  
  268.   f=open(s,O_RDWR | O_BINARY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);
  269.   write(f,(void *)&subboards[0], num_subs * sizeof(subboardrec));
  270.   close(f);
  271.  
  272.  
  273. /** now make sure subs.dat is up to date for networking purposes **/
  274. /** add these lines to copy the subs2 data over to the subs.dat array. **/
  275.   for (i=0;i<num_subs;i++) {
  276.     strcpy(oldsubboards[i].name,subboards[i].name); /* Now copy all data over    */
  277.     strcpy(oldsubboards[i].filename,subboards[i].filename);
  278.     oldsubboards[i].key=subboards[i].key;
  279.     oldsubboards[i].readsl=subboards[i].readsl;
  280.     oldsubboards[i].anony=subboards[i].anony;
  281.     oldsubboards[i].age=subboards[i].age;
  282.     oldsubboards[i].maxmsgs=subboards[i].maxmsgs;
  283.     oldsubboards[i].ar=subboards[i].ar;
  284.     oldsubboards[i].storage_type=subboards[i].storage_type;
  285.     oldsubboards[i].type=subboards[i].type;
  286.     }
  287.  
  288. /** now add these to write this file out **/
  289.  
  290.   sprintf(s,"%sSUBS.dat",syscfg.datadir);
  291.   f=open(s,O_RDWR | O_BINARY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);
  292.   write(f,(void *)&oldsubboards[0], num_subs * sizeof(oldsubboardrec));
  293.   close(f);
  294. /** end of addition **/
  295. }
  296.  
  297.  
  298. ==========================================================================
  299.  
  300. 6. Now save Sysopf.c, and load up Utility.c. Scan down to void init, and
  301. look for SUBS.DAT. You will need to change that to SUBS2.DAT, so the BBS
  302. reads in the right file.
  303.  
  304.  
  305.     strcpy(s,syscfg.datadir);
  306.     strcat(s,"NAMES.LST");
  307.     i=open(s,O_RDWR | O_BINARY);
  308.     if (i<0) {
  309.       printf("%s NOT FOUND.\n",s);
  310.       end_bbs(noklevel);
  311.     }
  312.     read(i,(void *) (smallist), (sizeof(smalrec) * status.users));
  313.     close(i);
  314.  
  315.     open_string_file();
  316.     strcpy(s,syscfg.datadir);
  317.     strcat(s,"SUBS2.DAT");            /** change this line **/
  318.     i=open(s,O_RDWR | O_BINARY);
  319.     if (i<0) {
  320.       printf("%s NOT FOUND.\n",s);
  321.       end_bbs(noklevel);
  322.     }
  323.     num_subs=(read(i,(void *) (&subboards), (64*sizeof(subboardrec))))/
  324.              sizeof(subboardrec);
  325.  
  326. ==========================================================================
  327. 7.  Still in Utility.c, scan down to changedsl. This routine is the one
  328. that determines which bases a user has available. Since we have added new
  329. restrictions, we need to add checks for these here.
  330.  
  331.  
  332.  
  333. void changedsl()
  334. {
  335.   int i,i1,i2,i3,i4,ok,dp,ddp;
  336.  
  337.   /** skip down a few lines...**/
  338.  
  339.   for (i=0; i<num_subs; i++) {
  340.     ok=1;
  341.     s=subboards[i];
  342.     if (realsl<s.readsl)
  343.       ok=0;
  344.     if (thisuser.age<s.age)
  345.       ok=0;
  346.  
  347. /** add from here down **/
  348.     if ((s.maxage>0) && (thisuser.age>s.maxage))
  349.       ok=0;
  350.     if (((s.sex==2) && (thisuser.sex=='F')) ||
  351.     ((s.sex==1) && (thisuser.sex=='M')))
  352.       ok=0;
  353.     if ((s.ansi) && (!okansi()))
  354.       ok=0;
  355. /** end of addition **/
  356.  
  357.     if ((s.ar!=0) && (((thisuser.ar) & (s.ar))==0))
  358.       ok=0;
  359.  
  360. /** extra mod. Add these two lines, and the #1 sysop will
  361.     always have access to every base on the BBS. If you want to
  362.     include the #2 or #8 or #187 user, then add lines for them too, just
  363.     changing the ==1 to ==2 or ==8 or ==187. **/
  364.  
  365.     if (finduser(thisuser.name)==1)
  366.       ok=1;
  367.  
  368.  
  369. =============================================================================
  370. 8. Now, load up BBSUTL1.C. Look down for list_users. We need to add some checks
  371. here to see if people really do have access to the base.
  372.  
  373.  
  374.  
  375.  
  376. void list_users()
  377. {
  378.  
  379. /** skip a few lines **/
  380.  
  381.   for (i=0; (i<status.users) && (!abort) && (!hangup); i++) {
  382.     read_user(smallist[i].number,&u);
  383.     ok=1;
  384.     if (u.sl<s.readsl)
  385.       ok=0;
  386.     if (u.age<s.age)
  387.       ok=0;
  388.  
  389. /** add from here down **/
  390.     if ((u.age>s.maxage) && (s.maxage>0))
  391.       ok=0;
  392.     if ((u.sex=='F') && (s.sex==2))
  393.       ok=0;
  394.     if ((u.sex=='M') && (s.sex==1))
  395.       ok=0;
  396.     if ((s.ansi) && !(u.sysstatus & sysstatus_ansi))
  397.       ok=0;
  398. /** end of addition **/
  399.  
  400.     if ((s.ar!=0) && ((u.ar & s.ar)==0))
  401.       ok=0;
  402.     if (ok) {
  403.       ansic(2);
  404.  
  405. =========================================================================
  406. 9. If you do not use a gold system, you can skip the next two steps.
  407. Of course, even if you dont use a gold system, you can add these in.
  408. Because, if you leave the gold set at 0, then this has no effect for the
  409. user.
  410.  
  411. To make use of the variable gold, load up MSGBASE1.C, and make these
  412. changes at the bottom of post.
  413.  
  414.  
  415.     sprintf(s,"+%s posted on %s",p.title,subboards[curlsub].name);
  416.     sysoplog(s);
  417.     sprintf(s,"Posted on %s",subboards[curlsub].name);
  418.     save_status();
  419.     pl(s);
  420.  
  421. /** add this to void post  in MSGBASE1.C**/
  422.     if (subboards[curlsub].gold > 0) {
  423.       nl();
  424.       sprintf(s,"Lord Elric gives you %u gold pieces for that post",
  425.     subboards[curlsub].gold);
  426.       prt(3,s); nl();
  427.       thisuser.gold += (float) subboards[curlsub].gold;
  428.       sprintf(s,"You now have %d gold pieces.",(int) thisuser.gold);
  429.       pl(s);
  430.     }
  431.     nl();
  432.  
  433. /** end of addition **/
  434.     if ((subboards[curlsub].type) && (syscfg.systemnumber)) {
  435.       b=readfile(&(p.msg),subboards[curlsub].filename,&len1);
  436.       if (b==NULL)
  437.         return;
  438.       nh.tosys=0;
  439.  
  440. ===========================================================================
  441. 10. Still doing that gold thing, we need to take away the gold if they
  442. remove the post. Bloody lot of good it will do if we dont do this..they can
  443. post, remove, post, remove, post, remove.....
  444.  
  445.       sysoplog(s);
  446.       delete(i);
  447.       savebase();
  448.       nl();
  449.       pl("Message removed.");
  450. /** add this to void remove_post  in MSGBASE1.C**/
  451.       if (subboards[curlsub].gold > 0) {
  452.     nl();
  453.     sprintf(s,"Lord Elric takes back %u gold pieces for removing that post",
  454.     subboards[curlsub].gold);
  455.     prt(3,s); nl();
  456.     thisuser.gold -= (float) subboards[curlsub].gold;
  457.       }
  458.   /** end of addition **/
  459.  
  460.       nl();
  461.     }
  462.   }
  463. }
  464. ============================================================================
  465. 11. A bug in a previous version that was pointed out to me (THANKS once again
  466. to Harb. He is a sysops dream....calls almost every board in town, almost
  467. every day, posts quite a bit, almost never plays games, and he is the one
  468. and only user who consistantly tries out everything he can think of when I say
  469. "I got this new mod up that does this.....would everyone please check this
  470. out and see if you find any bugs..."
  471.  
  472. Anyway, what this does is if the user changes his defaults, it resets his
  473. access to the baords. This ONLY affects the ANSI only bases, but it was
  474. the only flaw I could really find...
  475. Load up BBS.C, and down in mainmenu add one line...
  476.  
  477.  
  478.         helpl=3;
  479.         reqchat();
  480.         break;
  481.       case 'D':
  482.     helpl=4;
  483.     defaults();
  484.     changedsl();    /** add this line **/
  485.         break;
  486.       case 'E':
  487.         send_email();
  488.  
  489.  
  490. ============================================================================
  491. 12. Still in BBS.C, if you are going to use the gold, add this to
  492.  indicate the amount of gold each base is worth in the listing
  493.  
  494. void sublist()
  495. {
  496.   int i,abort;
  497.   char s[80],s2[80];   /** add the s2 **/
  498.  
  499.   abort=0;
  500.   nl();
  501.   pla("Subs available: ",&abort);
  502.   nl();
  503.   i=0;
  504.   while ((i<64) && (usub[i].subnum!=-1)) {  /** this 64 will be 32 if you **/
  505.     strcpy(s,usub[i].keys);                 /** not using the 64 base mod **/
  506.     s[2]=0;
  507.     if (s[1]==0)
  508.       s[1]=32;
  509.     strcat(s," - ");
  510.     if (syscfg.systemnumber)
  511.       if (subboards[usub[i].subnum].type)
  512.     strcat(s,"<LINK> ");
  513.       else
  514.     strcat(s,"       ");
  515.     sprintf(s2,"(%02d) ",subboards[usub[i].subnum].gold);/** add this line **/
  516.     strcat(s,s2);                                        /** add this line **/
  517.     strcat(s,subboards[usub[i].subnum].name);
  518.     pla(s,&abort);
  519.     i++;
  520.   }
  521.   if (i==0)
  522.     pla("None.",&abort);
  523.   nl();
  524. }
  525.  
  526.  
  527. ============================================================================
  528. 13. Now, for that gold thing, load up BBSUTL.C. Add this so when they view
  529. their stats they can see the amount of gold they have.
  530.  
  531. void yourinfo()
  532. {
  533.   char s[81];
  534.  
  535.   outchr(12);
  536.   print("Your name      : ",nam(&thisuser,usernum),"");
  537.   print("Your address   : ",thisuser.street,"");         /* from FROM mod */
  538.   print("From           : ",thisuser.citystate,"");      /* from FROM mod */
  539.   print("Zipcode        : ",thisuser.zip,"");            /* from FROM mod */
  540.   print("Phone number   : ",thisuser.phone,"");
  541.   if (thisuser.waiting) {
  542.     itoa((int)thisuser.waiting,s,10);
  543.     print("Mail waiting   : ",s,"");
  544.   }
  545.   itoa((int)thisuser.sl,s,10);
  546.   print("Sec Lev        : ",s,"");
  547.   itoa((int)thisuser.dsl,s,10);
  548.   print("Transfer SecLev: ",s,"");
  549.   print("Last on        : ",thisuser.laston,"");
  550.   itoa((int)thisuser.logons,s,10);
  551.   print("Times on       : ",s,"");
  552.   itoa((int)thisuser.ontoday,s,10);
  553.   print("On today       : ",s,"");
  554.   itoa((int)thisuser.msgpost,s,10);
  555.   print("Messages posted: ",s,"");
  556.   itoa((int)(thisuser.emailsent+thisuser.feedbacksent+thisuser.emailnet),s,10);
  557.   print("E-mail sent    : ",s,"");
  558.   ltoa((long) ((thisuser.timeon+timer()-timeon)/60.0),s,10);
  559.   print("Time spent on  : ",s," Minutes","");
  560.   sprintf(s,"Gold           : %4.0f",thisuser.gold);  /** add this line **/
  561.   pl(s);                                              /** add this line **/
  562.   nl();
  563. }
  564.  
  565. ============================================================================
  566. 14. You are nearly finished. The only thing left to do is to recompile the
  567. BBS.....Wait, did some sharp little sysop out there notice what I left out?
  568.  
  569. Thats right, you dont have a file called subs2.dat, and I gave you absolutely
  570. no way to create one. Well, you may have noticed a little file included
  571. with this mod called subcon.c. You need to compile this to an exe file, the
  572. memory model really does not matter. Large, I suppose, since WWIV is. Anyway,
  573. thats what I did, and it worked. It may or may not work in other models.
  574.  
  575. Anyway, then run this, such as
  576.  
  577.   SUBCON  \WWIV\DATA\SUBS.LST  \WWIV\DATA\SUBS2.LST
  578.   ^              ^                  ^
  579.   :--File name   : path and name    :  path and name
  580.                  : of old file      :  of new file.
  581.  
  582. That should do it. For further ideas on what to do with gold, check out the
  583. SALT (Sysops Against Little Twerps) mod by MrBill, or one of the other
  584. gold mods. There are casinos, and ways to give gold, spend it on games, etc.
  585. That is not part of my mod. I just have seen other people try to make gold
  586. mods that gave differing amounts of gold for different bases, and I have
  587. watched the bugs fly everywhere. Take for example, GoldSys. Does that really
  588. work right yet?
  589.  
  590. Anyway, much credit should go to DartVader, sysop of Serendipity(?), who
  591. asked me for a mod with the ANSI restriction, and to Deanna Troi, for creating
  592. the Link Sisterhood sub, a female only sub, and a sysops nightmare. Search for
  593. every female user on the BBS, and use another precious AR to only allow them
  594. and only them on it, under threat of DeannaZip. This takes care of that
  595. problem.
  596.  
  597.  
  598. /** hey, it's the form info file **/
  599. As usual, I take no responsibility for hard drive crashes, death in the
  600. family, or end of the world as we know it resulting from this mod.
  601.  
  602. It's your fault if you didn't back up the files before you made the mod.
  603.  
  604. It's your fault if you don't back up your ENTIRE hard drive AT LEAST once
  605. a month.
  606.  
  607. It works on my system with Turbo C 2.0, WWIV 4.1, V20/8088, 640K/640EMS.
  608.  
  609. If you use this, the only payment I ask is that you send me a note through
  610. WWIVLink to 1@18251 saying you are using it...not too much to ask is it?
  611.  
  612. The Kingdom of Melnibone(LINK/NET)
  613. 812-877-3488  24 Hrs a day
  614. 3/12/2400/4800/9600/12,000/14,400 baud HST MNP5
  615. Auto-validation of WWIV sysops on first call
  616. Xmodem, Ymodem, DSZ Zmodem with retry, Ymodem-G
  617.  
  618. WWIV Link  1@18251
  619. WWIV Net   1@8251
  620.