home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / games / vmsnet / vmsspace / part01 < prev    next >
Text File  |  1993-06-06  |  35KB  |  1,146 lines

  1. Path: uunet!mcsun!chsun!pega!dr_who
  2. From: dr_who@pegasus.ch (Sysop of PEGASUS)
  3. Newsgroups: vmsnet.sources.games
  4. Subject: SPCEMP.C   Part 01/06
  5. Message-ID: <1993Jun7.092834.122@pegasus.ch>
  6. Date: 7 Jun 93 09:28:34 +0200
  7. Organization: Pegasus BBS, Switzerland
  8. Lines: 1135
  9. Xref: uunet vmsnet.sources.games:734
  10.  
  11. ----> START OF PART 1 <----
  12. /***********************************************************************/
  13. /**         VAX-SUPER SPACE EMPIRE           (c) by DR_WHO,MOMO  1993  */
  14. /***********************************************************************/
  15. /*  call PEGASUS for HELP : ++41 (0)71715577 (c) by R.Sieber & N.Kuemin*/
  16. /***********************************************************************/
  17. /* V0.96a     New prgversion - temporary userdata has been changed     */ 
  18. /*      b     Used Transport capacity                                  */
  19. /*      c     GET_DATAS(INT NR) is the routine to read datas now       */
  20. /*            PUT_DATAS(INT NR) is the routine to write datas now      */
  21. /*            GET_SCORE(INT NR) Calculates scores now                  */
  22. /*            New Highscore                                            */
  23. /*      d     Sell_item has been removed (CHEAT PROTECTION)            */
  24. /* V0.97a     New spy/covert option menu also new possibilities        */ 
  25. /*      b     Steal freighters and bug fixed                           */ 
  26. /* V0.98a     Races added                                              */ 
  27. /*      b     Price Range from 80 to 120 %                             */ 
  28. /*      c     Starfighters and Deathstars added                        */
  29. /*      d     Destruction Report / Lottery higher / news for stealing  */
  30. /*      e     some bugs fixed / Agents get killed in battles           */
  31. /*            steal option only gets 10% of the availble freighters    */
  32. /*            or ywings                                                */
  33. /*      f     Missile Bug removed                                      */
  34. /*                                                                     */
  35. /* THINGS TO DO : ALLIANCES ... (may I`ll never include this one)      */
  36. /*                DELETE_FILE (should be fixed checkit would work then */
  37. /*                NEW SCORE-LIST with structure and top 10             */
  38. /*                                                                     */
  39. /* KNOWN BUGS: none ?                                                  */
  40. /*                                                                     */
  41. /*                                                                     */
  42. /* NOTE: Sorry its a smaller spagetti-code but we`re cleaning it up    */
  43. /*       (It's our first C code ;-)                                    */
  44. /* PRIVS: Nessesary privs: READALL, WORLD for the Page()               */
  45. /*        Install it with PRIVS: readall,shared and world              */
  46. /*                                                                     */
  47. /* ASSIGNS: -> SPCEMP: for the Mainprogramm and main-datas             */
  48. /*          -> SPCEMP_PLAYERS: player datas (#.sdat / #.trade          */
  49. /*                                           MSG_#.txt)                */
  50. /*                                                                     */
  51. /***********************************************************************/
  52. /* Config File  : [ SPCEMP:EMPIRE.CFG ]                                */
  53. /*                                                                     */
  54. /* LINE 1 : Welcometext                                                */
  55. /* LINE 2 : Name of the Bank                                           */
  56. /* LINE 3 : Lottery after # turns (0=no lottery)                       */
  57. /* LINE 4 : New Player Protection Moves                                */
  58. /* LINE 5 : New Player Moves                                           */
  59. /* LINE 6 : Moves per day    (NOT IN USE after V0.93)                  */
  60. /* LINE 7 : Max. Money transfer (max: 2mio)                            */
  61. /* LINE 8 : How many moves to access the uridium throne                */
  62. /* LINE 9 : Score limit to access the throne                           */
  63. /* LINE 10: Multiuser 0=No 1=Yes (NOT USED)                            */
  64. /***********************************************************************/
  65. /* Programm creates the following files:                               */
  66. /*                                                                     */
  67. /* SPCEMP:EMPIRE.DAT     -> Empire Datafile                            */
  68. /*        EMPIRE.CFG     -> see above                                  */
  69. /*        LOTTERY.USER                                                 */
  70. /*        LOTTERY.DAT                                                  */
  71. /*        IN.USE         -> Somebody is playin the game                */
  72. /*        BUSY.STATUS    -> Who played last                            */
  73. /*        PLAYERS.SCORES -> High-Score                                 */
  74. /*        HIGH.SCORES    -> File listed at the beginning of the game   */
  75. /*                                                                     */
  76. /*        USERS.SDAT     -> not in use yet                             */
  77. /*        TEAMS.SDAT     -> not in use yet                             */
  78. /*                                                                     */
  79. /* SPCEMP_PLAYERS:#.SDAT    -> Userdatas (structure)                   */
  80. /*                MSG_#.TXT -> News text for player #                  */
  81. /*                #.TRADE   -> Trade Datasof player #                  */
  82. /*                                                                     */
  83. /***********************************************************************/
  84. /*                                                                     */
  85. /*  GameMgrMenu Access code : Var long supervisor : 343434             */
  86. /*                                                                     */
  87. /***********************************************************************/
  88. /*                                                                     */
  89. /* BugReports, Suggestions, Money and Food (?), Spaceships (????) to : */
  90. /* MAIL : R.Sieber, Hauptstr. 102, 9434 Au/SG, Switzerland             */
  91. /* EMAIL: DR_WHO@PEGASUS.CH or RSIEBER@PEGASUS.CH                      */
  92. /* FAX  : ++41 [0]71712787                                             */
  93. /* PHONE: ++41 [0]71717042                                             */
  94. /* or:                                                                 */
  95. /* EMAIL: MOMO@PEGASUS.CH                                              */
  96. /*                                                                     */
  97. /***********************************************************************/
  98.  
  99. /* #include usenet.h */           /* by sunshine */
  100.  
  101. #include brkdef
  102. #include descrip
  103. #include dvidef
  104. #include iodef
  105. #include jpidef
  106. #include lnmdef
  107. #include rmsdef
  108. #include secdef
  109. #include signal
  110. #include ssdef
  111. #include stdio
  112. #include stdlib
  113. #include string
  114. #include time
  115.  
  116. #define YES            1
  117. #define NO           0
  118. #define SUCCESS         1
  119. #define FAIL            0
  120. #define MORE            1
  121. #define NO_MORE         0
  122. #define TRUE            1
  123. #define FALSE           0
  124.  
  125. #define TT_RESET        0
  126. #define TT_BOLD         1
  127. #define TT_UNDERLINE    2
  128. #define TT_BLINKING     3
  129. #define TT_NEGATIV      4
  130. #define TT_INVISIBLE    5
  131. #define TT_CLS          6
  132. #define TT_FORBLACK     7
  133. #define TT_FORRED       8
  134. #define TT_FORGREEN     9
  135. #define TT_FORYELLOW    10
  136. #define TT_FORBLUE      11
  137. #define TT_FORDARKRED   12
  138. #define TT_FORCYAN      13
  139. #define TT_FORWHITE     14
  140. #define TT_BACKBLACK    15
  141. #define TT_BACKRED      16
  142. #define TT_BACKGREEN    17
  143. #define TT_BACKYELLOW   18
  144. #define TT_BACKBLUE     19
  145. #define TT_BACKDARKRED  20
  146. #define TT_BACKCYAN     21
  147. #define TT_BACKWHITE    22
  148. #define TT_SAVECSR      23
  149. #define TT_RESTORECSR   24
  150. #define TT_UP           25
  151. #define TT_DOWN         26
  152. #define TT_LEFT         27
  153. #define TT_RIGHT        28
  154. #define TT_DELLINE      29
  155.  
  156. #define planet_price    10000
  157.  
  158. #define price_soldiers  1000
  159. #define price_pilots    3000
  160. #define price_agents    5000
  161.  
  162. static int price_fighters=1800;
  163. static int price_ywings=1900;
  164. static int price_defense=2000;
  165. static int price_cruisers=4000;
  166. static int price_carriers=8000;
  167. static int price_freighters=5000;
  168. static int price_missiledefense=5000;
  169. static long price_deathstars=10000000;
  170. static int price_starfighters=10000;
  171.  
  172. long  int status;
  173.  
  174. struct descriptor {long int len;
  175.                    char    *adr;};
  176.  
  177. struct    user_str {
  178.     struct    user_str    *link;
  179.     char            username[12+1];
  180.     char            owner[31+1+1];
  181.     int            newmail;
  182.     };
  183.  
  184. struct    user_str    *user_lh = 0;
  185.  
  186. struct item_list_3 {
  187.      unsigned short  buffer_length;
  188.      unsigned short  item_code;
  189.      union           {  char   *char_type;
  190.                         int    *int_type;
  191.                         short  *word_type;
  192.                      } buffer_address;
  193.      int             *return_length;
  194.      int             terminator;
  195.   };
  196.  
  197. /***********************************************************************************/
  198.  
  199. static int racecount=12;
  200.  
  201. static struct aliens    {char name[20];
  202.              int dexterity;            /*-for foodneed            */
  203.              int knowledge;            /*-for techlevel & battle    */
  204.              int mechanical;        /*-for the prices of the ships     */
  205.              int perception;        /*-for spying & health      */             
  206.              int strength;            /*-for battle             */
  207.              int technical; };        /*-for techlevel         */
  208.  
  209. static struct aliens race[]=    {"NAME",10,10,10,10,15,10,
  210.                  "Ewok",14,6,8,18,12,8,
  211.                  "Gamorrean",18,6,6,12,24,6,
  212.                  "Ithorian",12,14,7,13,12,8,
  213.                  "Jawa",12,12,18,6,6,18,
  214.                  "Mon Calamari",12,12,13,7,12,13,
  215.                  "Quarren",12,7,12,13,13,8,
  216.                  "Sand People",13,12,6,12,20,6,
  217.                  "Sullustan",12,7,18,12,12,8,
  218.                  "Twi`lek",12,12,8,19,6,12,
  219.                  "Wookie",12,6,12,6,25,8,
  220.                  "Human",10,6,6,6,12,6,
  221.                  "Vulcan",14,12,18,13,24,13};
  222.  
  223. /***********************************************************************************/
  224.  
  225. struct  user_struct {
  226.             int    nr;        /* Usernummer - 50? */
  227.             char    username[30];    /* Username on System */
  228.             char    player[30];    /* Player Name in Game */
  229.             int    terminal;
  230.             int    tax;
  231.             int    space_lord;
  232.  
  233.             long    credits;    /* Credits */
  234.             long    acredits;    /* Credits on Bank */
  235.             int    moves;        /* Free Moves */
  236.             int    played_moves;    /* Played Moves */
  237.             char    last_game[12];    /* Last played */
  238.             time_t    last_time;      /* systemtime */
  239.             int    protection;    /* Protected Moves left */
  240.             long    score;
  241.             long    score_modifier;
  242.  
  243.             long     food;        
  244.             long    population;
  245.             int    harmony;
  246.             int    harmony_modifier;
  247.             int    morale;
  248.             int    morale_modifier;
  249.             int    health;
  250.             int    health_radioactivity;
  251.             int    tech_level;
  252.             int    tech_support;
  253.  
  254.             int    orep;
  255.             int    foodp;
  256.             int    defensep;
  257.             int    tradep;
  258.             int    tourismp;
  259.             int    supplyp;
  260.             int    governp;
  261.             
  262.             int    soldiers;
  263.             int    fighters;
  264.             int    ywings;
  265.             int    defense;
  266.             int    carriers;
  267.             int    cruisers;
  268.             int    agents;
  269.             int    freighters;
  270.             int    pilots;
  271.             int    missiledefense;
  272.             
  273.             int    teamleader;
  274.             char    teamname[30];
  275.             int    team_defense;
  276.             int    team_soldiers;
  277.             int    team_cruisers;
  278.             int    team_num;
  279.             int    team_apply;
  280.  
  281.             int    alive;
  282.             char    pchar[2];
  283.             int    race;
  284.             int    deathstars;
  285.             int    starfighters;
  286.             char    dummy3[77];
  287.             time_t    dummy4;
  288.  
  289.             };
  290.  
  291. static struct user_struct player[50];
  292.  
  293. /***********************************************************************************/
  294.  
  295. static long usedtransport=0;
  296.  
  297. /* for checkit() */
  298. static char sendto[13];
  299. static unsigned status2;
  300. char message[80];
  301. static struct dsc$descriptor_s  message_struct = {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, message};
  302. static struct dsc$descriptor_s  sendto_struct = {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, sendto};
  303.  
  304. static FILE *busy_fp;  /* for the new checkit() */
  305.  
  306. static char date[12];
  307. static char filename[80];
  308. static char version[6]="0.98f";
  309. static char file_ver[10]="2";
  310. static char reldate[9]="28.05.93";
  311. static char mainpath[20]="SPCEMP:";
  312. static char username[30]="USER";
  313. static int debug=FALSE;
  314. static long supervisor=121212;
  315.  
  316. /* Data from the Config-file */
  317.  
  318. static char welcometxt[78]="MSG from Galactic Advisor : Good luck, new Emperor.";
  319. static char BankName[78]="Beeblebrox bank";
  320. static int lottery_turn=0;
  321. static long original_prot=20;
  322. static long new_moves=20;
  323. static long old_moves=5;
  324. static int uridium_turn=0;
  325. static int uridium_limit=0;
  326. static long max_transfer=1000000;
  327. static int multiuser=0;
  328.  
  329. /****/
  330.  
  331. static int attacking=TRUE;
  332. static int rocket_use=TRUE;
  333.  
  334. static char dummy[80];
  335. static int lord_count=0;
  336. static int lord_days=0;
  337. static char lord_name[80]="Nobody";
  338.  
  339. static float zins1=0.05;
  340. static float zins2=0.04;
  341. static float zins3=0.03;
  342.  
  343. /* PLAYER SPECIFIC VARS */
  344.  
  345. static int pn=0;
  346. static int epn=1;
  347.  
  348. static long sol_work=0;
  349. static long cov_work=0;
  350.  
  351. static long pop_increase=0;
  352.  
  353. static float def_soldiers=0;
  354. static float def_fighters=0.18;
  355. static float def_defense=0.4;
  356. static float def_cruisers=0.4;
  357. static float def_carriers=0;
  358. static float def_freighters=0;
  359. static float def_pilots=0;
  360.  
  361. static char enemy[20]="NONE";
  362.  
  363. /***/
  364.  
  365.  
  366. static long e_sol_work=0;
  367. static long e_cov_work=0;
  368.  
  369. static char e_teamname[20]="NONE";
  370. static long e_team_num=0;
  371. static long e_team_apply=0;
  372. static long e_team_defense=0;
  373. static long e_team_soldiers=0;
  374. static long e_team_cruisers=0;
  375. static int  e_teamleader=FALSE;
  376.  
  377.  
  378. static long textiles,minerals,aloys,machines,computers,silver,gems;
  379. static int p_food,p_textiles,p_minerals,p_aloys,p_machines,p_computers,p_silver,p_gems;
  380. static unsigned long transport,free_transport;
  381.  
  382. /********************************************************************/
  383. delete_file(char *filename)
  384. {
  385. delete(filename);
  386. /*
  387. unsigned int status;
  388. char file[80];
  389. unsigned int context = 0;
  390. struct dsc$descriptor_s file_spec = 
  391.  
  392.     {0,DSC$K_DTYPE_T,DSC$K_CLASS_S, file};
  393.  
  394.     sprintf(file,"%s;*", filename);
  395.     file_spec.dsc$w_length=strlen(filename);
  396.     do
  397.         {
  398.         status= LIB$DELETE_FILE(&file_spec,0,0,0,0,0,0,0,&context);
  399.         if((status != SS$_NORMAL) && ( status != RMS$_NMF) && (status != RMS$_FNF))
  400.             LIB$STOP(status);
  401.         }
  402.     while((status!= RMS$_NMF) && (status != RMS$_FNF));
  403.     LIB$FILE_SCAN_END(0,&context);
  404. return(SUCCESS);
  405. */
  406. }
  407.  
  408. /********************************************************************/
  409. char *ansi(int command)
  410. {
  411. switch(player[pn].terminal) {
  412.   case 0 : return("");
  413.   case 1 : {
  414.            switch(command) {
  415.              case TT_RESET : return("");
  416.              case TT_CLS : return("H");
  417.              case TT_BOLD : return("");
  418.              case TT_UNDERLINE : return("");
  419.              case TT_BLINKING : return("");
  420.              case TT_NEGATIV : return("");
  421.              case TT_INVISIBLE : return("");
  422.              case TT_FORBLACK : return("");
  423.              case TT_SAVECSR : return("");
  424.              case TT_RESTORECSR : return("");
  425.              case TT_UP : return("A");
  426.              case TT_DOWN : return("B");
  427.              case TT_RIGHT : return("C");
  428.              case TT_LEFT : return("D");
  429.              default : return("");
  430.              }
  431.            }
  432.   case 2 : {
  433.            switch(command) {
  434.              case TT_RESET : return("");
  435.              case TT_CLS : return("H");
  436.              case TT_BOLD : return("");
  437.              case TT_UNDERLINE : return("");
  438.              case TT_BLINKING : return("");
  439.              case TT_NEGATIV : return("");
  440.              case TT_INVISIBLE : return("");
  441.              case TT_SAVECSR : return("s");
  442.              case TT_RESTORECSR : return("u");
  443.              case TT_FORBLACK : return("");
  444.              case TT_FORRED : return("");
  445.              case TT_FORGREEN : return("");
  446.              case TT_FORYELLOW : return("");
  447.              case TT_FORBLUE : return("");
  448.              case TT_FORDARKRED : return("");
  449.              case TT_FORCYAN : return("");
  450.              case TT_FORWHITE : return("");
  451.              case TT_BACKBLACK : return("");
  452.              case TT_BACKRED : return("");
  453.              case TT_BACKGREEN : return("");
  454.              case TT_BACKYELLOW : return("");
  455.              case TT_BACKBLUE : return("");
  456.              case TT_BACKDARKRED : return("");
  457.              case TT_BACKCYAN : return("");
  458.              case TT_BACKWHITE : return("");
  459.              case TT_UP : return("A");
  460.              case TT_DOWN : return("B");
  461.              case TT_RIGHT : return("C");
  462.              case TT_LEFT : return("D");
  463.              default : return("");
  464.              }
  465.            }
  466.   default : return("");
  467.   }
  468. }
  469.  
  470. /********************************************************************/
  471. char *gotoxy(int y,int x)
  472. {
  473.  
  474. if(player[pn].terminal>0)
  475.   return("\033[%d;%dH",y,x);
  476.  else
  477.   return("");
  478.  
  479. }
  480.  
  481. /********************************************************************/
  482. char *harmony_level(int type,int level)
  483. {
  484.  
  485. if(type==1) /* Morale */ 
  486.     { 
  487.     if( (level>-3) && (level<3) ) 
  488.         return "average";
  489.     if( level > 20) 
  490.         return "very high";
  491.     if( level > 8) 
  492.         return "high";
  493.     if( level > 2) 
  494.         return "above average";
  495.     if( level < -20) 
  496.         return "very low";
  497.     if( level < -8) 
  498.         return "low";
  499.     if( level < -2) 
  500.         return "below average";
  501.     }
  502.  
  503. if(type==2)  /* Population Harmony */ 
  504.     { 
  505.     if( (level>-3) && (level<3) ) 
  506.         return "Satisfied";
  507.     if( level > 20 ) 
  508.         return "Exalted";
  509.     if( level > 8 ) 
  510.         return "Happy";
  511.     if( level > 2 ) 
  512.         return "Content";
  513.     if( level < -20) 
  514.         return "Enraged";
  515.     if( level < -8 ) 
  516.         return "Restless";
  517.     if( level < -2 ) 
  518.         return "Discontent";
  519.     }
  520. if(type==3)  /* Population health */ 
  521.     { 
  522.     if( level ==0 ) 
  523.         return "Normal";
  524.     if( level > 4 ) 
  525.         return "Very healthy";
  526.     if( level >= 1 ) 
  527.         return "Healthy";
  528.     if( level < -5) 
  529.         return "Severe health problems";
  530.     if( level < -2 ) 
  531.         return "Bigger health problems";
  532.     if( level < 0 ) 
  533.         return "Health problems";
  534.     }
  535. if(type==4)  /* Player Tech-level */ 
  536.     { 
  537.     if( level > 25 ) 
  538.         return "Galaxy-Age";
  539.     if( level > 8 ) 
  540.         return "Universe-Age";
  541.     if( level > 4 ) 
  542.         return "Solaris-Age";
  543.     if( level >  0 ) 
  544.         return "Space-Age";
  545.     if( level < -10) 
  546.         return "DO RESEARCH";
  547.     if( level < -5 ) 
  548.         return "Tech-Age";
  549.     if( level <= 0 ) 
  550.         return "HighTech-Age";
  551.     }
  552.  
  553. }
  554.  
  555. /********************************************************************/
  556. strip_crlf(char *string)
  557. {
  558. int x,y;
  559. x=strlen(string);
  560. for(y=0; y<=x; y++) 
  561.     {
  562.     if((string[y]=='\r')||(string[y]=='\n')) string[y]=0;
  563.     }
  564. }
  565.  
  566.  
  567. /********************************************************************/
  568. /* page(user,text)        pages the user if he is in the game */
  569. /*   user    = pointer to userstring  (0-terminated)                */
  570. /*   text    = pointer to text        (0-terminated)                */
  571. /********************************************************************/
  572. page(user,text)
  573. char *user;
  574. char *text;
  575.    {
  576.    int                     channel;
  577.    int                     textlen;
  578.    char                    *image;
  579.    char                       imagename[100];
  580.    unsigned short          length;
  581.    unsigned                sndtyp;
  582.    char            proc_name[15];
  583.    unsigned short        proc_name_length=0;
  584.    struct item_list_3        itmlst;
  585.    unsigned            pid;
  586.    unsigned            old_pid;
  587.    struct dsc$descriptor_s proc_name_struct = {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 
  588. proc_name};
  589.    unsigned             master_pid=0;
  590.  
  591.    if (multiuser==FALSE)
  592.       return;
  593.  
  594.    textlen=strlen(text);
  595.    if (textlen==0)
  596.       return;
  597.  
  598.    /* search the process */
  599.    pid = -1;
  600.    do
  601.     {
  602.      old_pid = pid;
  603.      itmlst.buffer_length            = 15;
  604.      itmlst.item_code                = JPI$_USERNAME;
  605.      itmlst.buffer_address.char_type = &proc_name;
  606.      itmlst.return_length            = &proc_name_length;
  607.      itmlst.terminator               = 0;
  608.      status = SYS$GETJPI(0, &pid, 0, &itmlst, 0, 0, 0);
  609.      if((status==SS$_NORMAL)&&(proc_name_length>0))
  610.       {
  611.        for (; (proc_name[proc_name_length]<33) && (proc_name_length>0); 
  612.          proc_name[proc_name_length]=0, proc_name_length--);
  613.       }
  614.      if ((status==SS$_NORMAL) && (strcmp(&proc_name, user)==0))
  615.       {
  616.        /***** GET DEVICE-NAME INTO SENDTO-string ******/
  617.        proc_name_struct.dsc$w_length = proc_name_length;
  618.        itmlst.item_code = JPI$_MASTER_PID;
  619.        itmlst.buffer_address.int_type = &master_pid;
  620.        status = SYS$GETJPI(0, &old_pid, 0, &itmlst, 0, 0, 0);
  621.        if (status != SS$_NORMAL)  /* don't find user anymore... perhaps he is currently 
  622.                                      switching the channel or he just logged out */
  623.          return;
  624.        itmlst.item_code = JPI$_TERMINAL;
  625.        itmlst.buffer_address.char_type = &sendto;
  626.        itmlst.buffer_length = 7;
  627.        status = SYS$GETJPI(0, &master_pid, 0, &itmlst, 0, 0, 0);
  628.        if (status != SS$_NORMAL)  /* don't find user anymore... perhaps he is currently 
  629.                                      switching the channel or he just logged out */
  630.          return;
  631.        sendto_struct.dsc$w_length = proc_name_length;
  632.        sndtyp = BRK$C_DEVICE;
  633.        channel = BRK$C_GENERAL;
  634.  
  635.        /* User found now look if he is playing space empire */
  636.        itmlst.buffer_length            = 99;
  637.        itmlst.item_code                = JPI$_IMAGNAME;
  638.        itmlst.terminator               = 0;
  639.        itmlst.return_length            = &length;
  640.        itmlst.buffer_address.char_type = &imagename;
  641.        status = SYS$GETJPI(0, &master_pid, 0, &itmlst, 0, 0, 0);
  642.        if (status != SS$_NORMAL)  /* don't find user anymore... perhaps he is currently 
  643.                                      switching the channel or he just logged out */
  644.          return;
  645.  
  646.        /* User is in VMS */
  647.        if(length>0)
  648.         {
  649.          imagename[length]=0;
  650.          for (; (imagename[length]!='.') && (length>0); 
  651.              imagename[length]=0, length--);
  652.          if (length>0)
  653.           {
  654.            imagename[length]=0;
  655.            image=strrchr(imagename,']');
  656.            if (image!=0)
  657.              image++;
  658.           }
  659.          if (strcmp(image,"EMPIRE")==0)
  660.            break;
  661.         }
  662.       }
  663.     }
  664.    while (status != SS$_NOMOREPROC);
  665.    if (status==SS$_NOMOREPROC)
  666.      return;
  667.    message_struct.dsc$a_pointer = text;
  668.    message_struct.dsc$w_length = textlen;
  669.  
  670.    /* check if user is currently in the game */
  671.    /* send the message */
  672.    if (((status = SYS$BRKTHRUW(0, &message_struct, &sendto_struct, sndtyp,
  673.               0, 32, 0, channel, 0, 0, 0)) & 1) != 1)
  674.       LIB$STOP(status);
  675.    }  /* end of page */
  676.  
  677.  
  678.  
  679. /********************************************************************/
  680. /* checkit()        check if empire is allready running         */
  681. /********************************************************************/
  682. int checkit()
  683. {
  684.  
  685.   busy_fp=fopen("SPCEMP:IN.USE;1","a");
  686.   if (busy_fp!=0)
  687.     {
  688.     printf ("Nobody is in the game you're able to play ...\n");
  689.     return(FALSE);
  690.     }
  691.   if (busy_fp==0)
  692.     {
  693.     printf ("Can't open file -> File locked -> You can't play.\n");
  694.     return(TRUE);
  695.     }
  696.  
  697. }
  698.  
  699.  
  700. /********************************************************************/
  701. /* cls()                       Clears the screen*/
  702. /********************************************************************/
  703. cls()
  704. {
  705.     printf("%s",ansi(TT_CLS));
  706. }  /* End of CLS */
  707.  
  708. /********************************************************************/
  709. /* create_files()     creates missing files nessessary to run spcemp*/
  710. /********************************************************************/
  711. create_files()
  712. {
  713. FILE *fp;
  714. char string[78];
  715.  
  716. /*
  717. if (check_file("SPCEMP:TEAMS.DAT")==FALSE)
  718.  {
  719.  printf("SPCEMP:TEAMS.DAT missing ......\n");
  720.  printf("Creating ......\n");
  721.  fp=fopen("SPCEMP:TEAMS.DAT","w");
  722.  printf("");
  723.  fclose(fp);
  724.  }
  725. */
  726.  
  727. if (check_file("SPCEMP:NEWS.TXT")==FALSE)
  728.  {
  729.  printf("SPCEMP:NEWS.TXT missing ......\n");
  730.  printf("Creating ......\n");
  731.  fp=fopen("SPCEMP:NEWS.TXT","w");
  732.  printf("");
  733.  fclose(fp);
  734.  }
  735.  
  736. }
  737.  
  738. /********************************************************************/
  739. /* LOAD_CONFIG()     Loads the configuration from SPCEMP:EMPIRE.CFG */
  740. /********************************************************************/
  741. Load_Config()
  742. {
  743. FILE *fp;
  744. char string[82];
  745.  
  746. if (check_file("SPCEMP:EMPIRE.CFG")==FALSE)
  747.  {
  748.  printf("SPCEMP:EMPIRE.CFG missing ......\n");
  749.  printf("Please check reference manual.\n");
  750.  sleep(10);
  751.  }
  752. else
  753.  {
  754.   fp=fopen("SPCEMP:EMPIRE.CFG","r");
  755.     if(feof(fp)==FALSE)
  756.       {
  757.       fgets(string,78,fp);
  758.       if(strcmp(string," ")>0)
  759.         {
  760.         strcpy(welcometxt,string);
  761.         strip_crlf(welcometxt);
  762.         }
  763.       }
  764.     if(feof(fp)==FALSE)
  765.       {
  766.       fgets(string,78,fp);
  767.       if(strcmp(string," ")>0)
  768.         {
  769.         strcpy(BankName,string);
  770.         strip_crlf(BankName);
  771.         }
  772.       }
  773.     if(feof(fp)==FALSE)
  774.       {
  775.       fgets(string,78,fp);
  776.       if(strcmp(string," ")>0)
  777.         sscanf(string,"%d",&lottery_turn);
  778.       }
  779.     if(feof(fp)==FALSE)
  780.       {
  781.       fgets(string,78,fp);
  782.       if(strcmp(string," ")>0)
  783.         sscanf(string,"%d",&original_prot);
  784.       }
  785.     if(feof(fp)==FALSE)
  786.       {
  787.       fgets(string,78,fp);
  788.       if(strcmp(string," ")>0)
  789.         sscanf(string,"%d",&new_moves);
  790.       }
  791.     if(feof(fp)==FALSE)
  792.       {
  793.       fgets(string,78,fp);
  794.       if(strcmp(string," ")>0)
  795.         sscanf(string,"%d",&old_moves);
  796.       }
  797.     if(feof(fp)==FALSE)
  798.       {
  799.       fgets(string,78,fp);
  800.       if(strcmp(string," ")>0)
  801.         sscanf(string,"%ld",&max_transfer);
  802.       if(max_transfer>2000000)
  803.     max_transfer=2000000;
  804.       }
  805.     if(feof(fp)==FALSE)
  806.       {
  807.       fgets(string,78,fp);
  808.       if(strcmp(string," ")>0)
  809.         sscanf(string,"%d",&uridium_turn);
  810.       }
  811.     if(feof(fp)==FALSE)
  812.       {
  813.       fgets(string,78,fp);
  814.       if(strcmp(string," ")>0)
  815.         sscanf(string,"%d",&uridium_limit);
  816.       }
  817.     if(feof(fp)==FALSE)
  818.       {
  819.       fgets(string,78,fp);
  820.       if(strcmp(string," ")>0)
  821.         sscanf(string,"%d",&multiuser);
  822.       }
  823.   fclose(fp);
  824.  }
  825. }
  826.  
  827. /********************************************************************/
  828. /* GET_USERNAME(name_str, name_length)   outputs username as string */
  829. /********************************************************************/
  830. get_username(name)
  831. char *name;
  832.    {
  833.    unsigned short len_short;
  834.    struct item_list_3 itmlst;
  835.  
  836.    itmlst.buffer_length            = 15;
  837.    itmlst.item_code                = JPI$_USERNAME;
  838.    itmlst.buffer_address.char_type = name;
  839.    itmlst.return_length            = &len_short;
  840.    itmlst.terminator               = 0;
  841.    
  842.    if (((status=SYS$GETJPI(0, 0, 0, &itmlst, 0, 0, 0)) & 1) != 1)
  843.       LIB$STOP(status);
  844.    name[len_short]=0;
  845.    for (; (len_short>=0) && (name[len_short]<33); 
  846.         name[len_short]=0, len_short--);
  847.    }
  848.  
  849. /*****************************************************************/
  850. /* CHECK FILE                                                    */
  851. /*****************************************************************/
  852. check_file(char *filename)
  853.    {
  854.    char  outname[80];
  855.    unsigned long status;
  856.    unsigned long context_dir;
  857.  
  858.    struct dsc$descriptor_s in_name =
  859.          {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0};
  860.    struct dsc$descriptor_s out_name =
  861.          {80, DSC$K_DTYPE_T, DSC$K_CLASS_S, outname};
  862.  
  863.    in_name.dsc$a_pointer = filename;
  864.    in_name.dsc$w_length = strlen(filename);
  865.    context_dir = 0;
  866.    status = LIB$FIND_FILE(&in_name, &out_name, &context_dir, 0, 0, 0, 0);
  867.    LIB$FIND_FILE_END(&context_dir);  /* end file_find */
  868.    if ((status & 1) != 1)  /* file not found */
  869.       return(FALSE);
  870.    else
  871.       return(TRUE);
  872.    }
  873.  
  874.  
  875. /********************************************************************/
  876. int rnd(int x)
  877. {
  878. int r;
  879.  
  880. r=(rand() % (x+1));
  881.  
  882. return(r);
  883. }
  884.  
  885. /********************************************************************/
  886. char rndfile()
  887. {
  888.    char *filechar;
  889.  
  890.    short outlen;
  891.    $DESCRIPTOR (ctr_string, "!%T");
  892.    struct dsc$descriptor_s  outbuffer
  893.        = {20, DSC$K_DTYPE_T, DSC$K_CLASS_S, filename};
  894.  
  895.    SYS$FAO (&ctr_string, &outlen, &outbuffer, 0);
  896.    filename[outlen] = 0;
  897.    filechar = strchr(filename,':');
  898.    *filechar = '$';
  899.    filechar = strchr(filename,':');
  900.    *filechar = '$';
  901. }
  902.  
  903.  
  904. /********************************************************************/
  905. get_date()
  906. {
  907. long outlen;
  908.  
  909.    $DESCRIPTOR (ctr_string, "!11%D");
  910.    struct dsc$descriptor_s  outbuffer
  911.        = {11, DSC$K_DTYPE_T, DSC$K_CLASS_S, date};
  912.  
  913.    SYS$FAO (&ctr_string, &outlen, &outbuffer, 0);
  914.    date[outlen] = 0;
  915.  
  916. }
  917.  
  918.  
  919. /********************************************************************/
  920. check_user(char *username)
  921. {
  922.    struct dsc$descriptor_s id_desc =
  923.          {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0};
  924.    unsigned long id;
  925.    unsigned long status;
  926.  
  927.    id_desc.dsc$a_pointer = username;
  928.  
  929.    for (id_desc.dsc$w_length=0; username[id_desc.dsc$w_length]>32; 
  930.         id_desc.dsc$w_length++);
  931.    status = SYS$ASCTOID(&id_desc, &id, 0);
  932.    if (status==SS$_NORMAL)
  933.       return(YES);
  934.    else
  935.       return(NO);
  936. }  /* end of check_user */
  937.  
  938.  
  939. /********************************************************************/
  940. get_yn(int default_value)
  941. {
  942. char tempstring[80];
  943. int ok;
  944.  
  945.     for(;;)
  946.         {
  947.         gets(tempstring);
  948.         if (strlen(tempstring)==0)
  949.             return(default_value);
  950.         tempstring[0] = toupper(tempstring[0]);
  951.         if (tempstring[0]=='Y')
  952.             return(SUCCESS);
  953.         if (tempstring[0]=='N')
  954.             return(FAIL);
  955.         printf("\nEnter (Y)es or (N)o! [%c] ",(default_value ? 'Y' : 'N'));
  956.         }
  957. }  /* End of Y/N */
  958.  
  959.  
  960. /********************************************************************/
  961. press_return()
  962. {
  963.     char tempstring[80];
  964.     printf(" --- Press [ RETURN ] ...");
  965.     gets(tempstring);
  966. }  /* End of any_key */
  967.  
  968.  
  969. /********************************************************************/
  970. get_letter()
  971. {
  972. char tempstring[80];
  973.  
  974.     for (;;)
  975.     {
  976.         printf ("\n Your choice ? ");
  977.         gets(tempstring);
  978.         if (strlen(tempstring)>0)
  979.             {
  980.             tempstring[0] = toupper(tempstring[0]);
  981.             return(tempstring[0]);
  982.             }
  983.     } /* End for ever loop*/
  984. }  /* End of get_letter */
  985.  
  986.  
  987. /********************************************************************/
  988. strtoup(char *str_ptr)
  989. {
  990.  while (*str_ptr != 0)
  991.   {if ((*str_ptr >= 'a') && (*str_ptr <= 'z')) *str_ptr &= 0xDF;
  992.    str_ptr++;}
  993. }
  994.  
  995. /********************************************************************/
  996. display_file(char *file_name,int more)
  997. {
  998. int  line_count = 0;
  999. FILE *file_stream;
  1000. char text_line[81];
  1001.  
  1002.     file_stream = fopen(file_name, "r");
  1003.     while (fgets(text_line, 81, file_stream) != NULL)
  1004.         {
  1005.         line_count++;
  1006.         printf("%s",text_line);
  1007.         if ((line_count>22) && more)
  1008.             {
  1009.                         press_return();
  1010.             line_count=0;
  1011.             }
  1012.         }
  1013.     fclose(file_stream);
  1014. } /* end of display_file */
  1015.  
  1016. /********************************************************************/
  1017. /********************************************************************/
  1018. /********************************************************************/
  1019. check_busy()
  1020. {
  1021. FILE *fp;
  1022. char string[80];
  1023. char ostring[80];
  1024. char lastplayer[80]="ERROR";
  1025. int busy=TRUE;
  1026.  
  1027. player[pn].terminal=1;
  1028.  
  1029. cls();
  1030. printf(" THIS GAME IS SHAREWARE - IF YOU INSTALL IT, SEND SOME MONEY TO THE PROGRAMMERS.\n");
  1031. printf("                   .                        .              .\n");
  1032. printf("                 +                   SUPER\n");
  1033. printf("                                                                 +\n");
  1034. printf("  *          *          #####  #####   ###  ######  ######                *\n");
  1035. printf("                       ##     ##   #  ## ##  ##     ##          *       .\n");
  1036. printf("        *               ##   ######  #######  ##     ####\n");
  1037. printf("                    ##  ##  ##      ##     ##  ##     ##                   .\n");
  1038. printf("            .       ####   ##      ##       ##   ####  ######\n");
  1039. printf("                                                      *               +\n");
  1040. printf("        .         #####  #### ###  ######   ##   #####    #####              .\n");
  1041. printf("    +             ##      ## ## ##  ##   #  ##  ##   #   ##        .\n");
  1042. printf("         .         ####    ##   ##  ######  ##  #####    ###              *\n");
  1043. printf("   .           +    ##      ##   ##  ##    ##  ##   ##  ##      *           .\n");
  1044. printf("           .         #####  ##   ##  ##    ##  ##   ##  #####          .\n");
  1045. printf("   .                          .                          .               .\n");
  1046. printf(" VAX / OPEN VMS Version %s (27.02.93-%s)  (c)'93  R.Sieber & N.Kuemin\n",version,reldate);
  1047. printf("            For suggestions or BugReports: Email to DR_WHO@PEGASUS.CH\n"); 
  1048. printf("              or call ++41 [0]71715577 or (x.25) ++228 475212574 \n");
  1049. printf("                        dedicated to Eveline Rudigier\n");
  1050. printf("            Thanks to BIG_ONE and FERX for debugging and bugreports.\n");
  1051. printf("\n");
  1052. press_return();
  1053. cls();
  1054. printf("\n");
  1055. if (check_file("SPCEMP:HIGH.SCORES")==TRUE)
  1056.   {
  1057.   display_file("SPCEMP:HIGH.SCORES",NO_MORE);
  1058.   press_return();
  1059.   cls();
  1060.   }
  1061.  
  1062. if (check_file("SPCEMP:BUSY.STATUS")==FALSE)
  1063.  {
  1064.   sleep(1); /* Just wait a second */
  1065.   if (check_file("SPCEMP:BUSY.STATUS")==FALSE)
  1066.    {
  1067.     busy=FALSE;
  1068.    }
  1069.   else
  1070.    {
  1071.     fp=fopen("SPCEMP:BUSY.STATUS","r");
  1072.       if(!feof(fp))
  1073.        {
  1074.         fgets(string,60,fp);
  1075.         sscanf(string,"%d",&busy);
  1076.        }
  1077.       if(!feof(fp))
  1078.        {
  1079.         fgets(string,60,fp);
  1080.         sscanf(string,"%s",&lastplayer);
  1081.        }
  1082.     fclose(fp);
  1083.    }
  1084.  }
  1085. else
  1086.  {
  1087.   fp=fopen("SPCEMP:BUSY.STATUS","r");
  1088.   if(!feof(fp))
  1089.    {
  1090.     fgets(string,60,fp);
  1091.     sscanf(string,"%d",&busy);
  1092.    }
  1093.   if(!feof(fp))
  1094.    {
  1095.     fgets(string,60,fp);
  1096.     sscanf(string,"%s",&lastplayer);
  1097.    }
  1098.   fclose(fp);
  1099.  }
  1100.  
  1101. if(multiuser==FALSE)
  1102.  {
  1103.     if(checkit()==TRUE)
  1104.           {
  1105.       printf("Sorry, it is not possible to play at the moment...\n\n");
  1106.       printf("      1) There is already %s in the game...\n",lastplayer);
  1107.       printf("         Try again later... \n\n\n");
  1108.       printf("Do you want to see the Scores ? (Y/n) ");
  1109.       gets(ostring);
  1110.       if (toupper(ostring[0])!='N')  
  1111.         display_users();
  1112.           exit(0);
  1113.           }
  1114.         else
  1115.           {
  1116.       printf("Last player was %s. ",lastplayer);
  1117.       if(busy==TRUE)
  1118.           printf("(He hung up the line.)");
  1119.       printf("\n");
  1120.       get_username(player[pn].player);
  1121.       get_username(username);
  1122.           if(strcmp(player[pn].player,"GUEST")==0)
  1123.            {
  1124.         printf("Sorry, no access from the GUEST-Account...\n\n\n");
  1125.             exit(0);
  1126.            }
  1127.  
  1128.       busy=TRUE;
  1129.           if(check_file("SPCEMP:BUSY.STATUS")==TRUE)
  1130.             delete_file("SPCEMP:BUSY.STATUS");
  1131.       fp = fopen("SPCEMP:BUSY.STATUS", "w");
  1132.        fprintf(fp,"%d\n",busy);
  1133.        fprintf(fp,"%s\n",player[pn].player);
  1134.           fclose(fp);
  1135.           }
  1136.  }          
  1137. }
  1138. ----> END OF PART 1 <----
  1139. -- 
  1140.       Internet: Dr_who@pegasus.ch         __
  1141.       Phone   : ++41-71-71 70 42         ///
  1142.       FAX     : ++41-71-71 27 87    __  ///    "I'M THE DOCTORE BECAUSE 
  1143.                                     \\\///      IT'S FUN FUN FUN ! "
  1144.      BBS Phone: ++41-71-71 55 77     \XX/       - TOM BAKER 
  1145.       X.25    : +228 4752 1 2574        
  1146.