ÛÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛßÛÛÛÜÜ ÜÛÛÛÛßÛÛÛÜ ÜÜÛÛÛÛÛÜÜ ÛÛÛÛÛßÛÛÜ ÜÜÛÛÛßÛÛÛÜÜ ÛÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛ ÛÛÛÛÛÛ ÛÛÛÛÛÛ ÛÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛ²ÛÛ ÛÛÛ²Û ÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÝ ÛÛÛÛÛÛ ÛÛÛ²ÛÛ ÛÛÛÛÛÛ ÛÛÛÛÛ Û²ÛÛÛ ÛÛÛÛÛÛ ÛÛÛ²Û ÛÛÛÛ Û²ÛÛÛ ÛÛÛÛÛ ÛÛÛ²Û ÛÛÛÛÛ ÛÛ²ÛÛÛ ÛÛÛÛÛÛ ÞÛ²ÛÛÛ ÛÛÛÛÝ Û²ÛÛÛ ÛÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛ Û²ÛÛÛ ÛÛÛÛÛ ÛÛÛ²Û ÛÛÛÛÛ ÛÛ²ÛÛÛ ßßßÛÛÛ Ý Ý ÛÛÛÛÛ ÛÛÛÛ Û²ÛÛÛÛÛÛÛÛÛß ÛÛÛÛÛ ÛÛÛÛ Û²ÛÛÛ ÛÛÛÛÛ ÛÛÛ²Û ÛÛÛÛÛ ÛÛ²ÛÛÛÛÛÛÛÜÜ ßÛÛÛÜÛÛß ÛÛÛÛÛßÛÛÛÜ ÛÛÛÛÛ ÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛ ßßßßßßßÛÛÛÛÛÛ Ü²ÛÛÛ ÛÛÛÜ ÛÛÛÛÛ ÛÛÛÛÛ ÜÛÛÛÛÛ ÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛ ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ ÛÛÛÛÛÛ Ý ÞÛ²ÛÛÛ ÛÛÛÛÝ ÛÛÛÛÛ ÛÛÛÛÛÝ ÛÛÛ²Û ÛÛÛÛ ÜÜÜÜÜ ÛÛÛÛÛ ÜÜÜÜÜ ÜÜÜÜÜ ÛÛÛÛÛÛ ÛÛÛÛÛÛ Ý ÝÛÛ²ÛÛÛ ÛÛÛÛÛ Û²ÛÛÛ ÛÛÛ²ÛÛ ÛÛÛ²Û ÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛ ÛÛ²ÛÛÛ ÛÛÛ²ÛÛ Ý ÝÛÛÛÛÛÛ ÛÛÛÛÛ Û²ÛÛÛ ÛÛÛ²ÛÛ ÛÛÛ²Û ÛÛÛÛ Û²ÛÛÛ ÛÛÛÛÛ ÛÛÛ²Û ÛÛÛÛÛ ÛÛ²ÛÛÛ ÛÛÛ²ÛÛ Ý ÛÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛ Û²ÛÛÛ ÛÛÛÛÛ ÛÛÛ²Û ÛÛÛÛÛ ÛÛÛÛÛÛ ÛÛÛÛÛÛ Ý ÝÛÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛ Û²ÛÛÛ ÛÛÛÛÛ ÛÛÛ²Û ÛÛÛÛÝ ÞÛÛÛÛÛ ÛÛÛÛÛÛ Ý ÝÛÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛß Ü ßÛÛÛÛÛÛÛÛÛÛß Ý Ýßßßßßß ßßßßß ßßßßß ßßßßßß ßßßßßßßß ßßßßß ßßßßß ßßßßßßßß Üß ßÜ ßßßßßß ÜÜß ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ßSQUiZZYß ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ÖÄÄÄÄÄÄ[³ [ x R O A D s 1 9 9 7 ! ] ³]ÄÄÄÄÄÄ· ÚÄĺÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄĺÄÄÄ¿ ³ º º ³ ³ º The Desire Development Pack #1 by Rapido/xROADs º ³ ³ º º ³ ÀÄĺÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄĺÄÄÄÙ ÓÄÄÄÄÄÄij ³ÄÄÄÄÄÄÄĽ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Contents 1. How to get started 2. The Doorkit Explained 3. The Newuser Application Viewer 1.1 (Full Pascal Source included!) 4. Notes ÚÄÄÄÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ º º ³ ³ º 1. How to get started º ³ ³ º º ³ ÀÄÄÄÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄÄÄÄÄÄÙ What you need is: Borland Pascal 7.0 and the Desire Doorkit 1.2 (or the most recent version). The Desire Doorkit consists of a set of UNITS for Borland Pascal 7.0, these are: Deskit.TPU this is the 'main' unit. You always need to 'include' this one! (uses Dos,Crt,Deskit,.....;) Desstr.TPU for operations on strings, chars, time, date. This one you can use if you want to use the desire own string/date/time operations, but is not neccessary! Desuart.TPU this one is only by Deskit.TPU for the UART communications. but forget this, you don't need this. Desfos.TPU this one too is only used by Deskit.TPU for the FOSSIL communications, you don't need this one either! Maybe you did some coding for System/X before where you needed 2 different .TPU-files for UART and FOSSIL ? Well Desire supports both at one time, no need to make a FOSSIL and a seperate UART version! Desire doors are both FOSSIL and UART! Dessys.TPU Some System&Keyboard routines, only of you want to use it! ÚÄÄÄÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ º º ³ ³ º 2. The Doorkit Explained º ³ ³ º º ³ ÀÄÄÄÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄÄÄÄÄÄÙ = Deskit.TPU ============================================================== A unit contains VARS, TYPES, PROCEDURES and FUNCTIONS you can access in your program called a 'DOOR' Const ----- Const Version='1.2'; Const STRLINES=200; { number of strings in STRSx.x } Types ----- TYPE ConfigRec = RECORD (* C:\DESIRE\CONFIG. *) LastCall = RECORD (* C:\BBS\DATA\LASTCALL.DAT *) BBSrecord = Record (* C:\BBS\DATA\BBS.DAT *) ConfUserRecord = RECORD (* C:\BBS\CONFDIR\USERS.CNF *) TransferRecord = RECORD (* C:\BBS\DATA\TRANSFER.xxx *) MultiNodeRecord = RECORD (* C:\BBS\DATA\NODE.xxx *) DoorRecord = RECORD (* C:\BBS\DATA\SXDOOR.xxx *) MsgRecord = RECORD (* C:\BBS\MSGBASE\HEADERS.DAT*) FlagRecord = RECORD (* C:\BBS\FILEFLAG.xx *) XferLogRecord = RECORD (* C:\BBS\LOGFILES\UPLOAD.DAT*) StringRecord = RECORD (* C:\BBS\STRSx.xxx *) GlobalFlagRecord = Record { all the above RECORDS structures can be found in STRUCTS.130, in this case STRUCT.130 because Doorkit version 1.2 supports the structures of Desire Version 1.3 (at this point not yet released), and is compatible with any next version of Desire! } InternalRec = RECORD { used internal } StringBaseArray1 = Array[1..50] of StringRecord; StringBaseArray2 = Array[51..99] of StringRecord; StringBaseArray3 = Array[100..150] of StringRecord; StringBaseArray4 = Array[151..STRLINES] of StringRecord; { the above contain all the menuset strings!, as they appear in STRDES.TXT or in the MENUSET.EXE editor! you can access all these strings by the function GetString(Nr:Integer):String; } TYPE MCIRptr = ^MCIRecord; MCIRecord = Record { the above are to pass information into a @MCIx@ MCI-code! If you want to show you own .PCB-file which has variable fields in it, you can build up a list of values for all the @MCIx@-codes that should appear on that position (up to 10 max.) When we show a .PCB-file with the Procedure TypeMCIFile(Name:String) the doorkit looks if there exists a list Control^.MCI^ (or in other words: if Control^.MCI^<>NIL) (Be carefull: Control^.MCI points to the MCIRECORD which hold a pointer to the first element Control^.MCI^^, thats why there is an extra ^ !) For instance: (see NAV.PAS, included in this PACK!) ------------------------------------------------------------------- Var AidMCI:MCIRPTR; Begin GetMem(Control^.MCI^,SizeOf(MCIRecord)); { here it creates the first element of a list } AidMCI:=Control^.MCI^; { AidMCI now points to that first element } AidMCI^.Mcistr:='RAPIDO'; { now fill the 1st record with a string, in this case @MCI1@ will be replaced by RAPIDO! } AidMCI^.NExt:=NIL; { ok, tell the doorkit this was the last element in the list! } TypeMCIFile('NAVSRCH.PCB'); { show the file, @MCI1@ in that file will now be replaced with 'RAPIDO' } AidMCI:=Control^.MCI^; FreeMem(Control^.MCI^,SizeOf(MCIRECORD)); { now free the 1st MCIRECORD, becarefull and don't forget the ^ in Control^MCI^ <---- because it's the 1st element we are removing and NOT the Control^.MCI } CloseAll; End; } TYPE EventRecord = RECORD Time:String[5]; {HH:MM} Action:Byte; { Set Bit 7 OFF-HOOK Bit 6 ON-HOOK Bit 5 ONLINE Bit 4 OFFLINE Bit 3..0 = 0..31 Actions Actions: 0 IDLE 1 RESET DAYSTATS 2 EXIT + 3 RUN DOOR + 4 CD PLAY + 5 CD STOP 6 TYPE + 7 RUN UTIL + 8 BEEP + <# Times> 9 LOGOFF } Extern:String[30]; { DOORNAME } End; { The eventrecord contains a time and a action byte. The action byte contains the information about which action should occure and whether or not the modem should be turned on- or off-hook or if the action may only occur if the bbs is off- or online. the 4 least significant bytes represent the action number as show above. This data is read from the EVENTS.x, for instance: ---------------------------------- 05:40 TYPE WARNING 05:45 OFFHOOK 06:00 RUN NETMAIL 06:15 ONHOOK ---------------------------------- This could be an event-script for the NETMAIL-door. At 5.40 a door is executed while a user might be online. At 5.45 the BBS goes actually OFFLINE. at 6.00 a door called NETMAIL is started. This door could actually take over the modem to communicate with another remote NETMAIL-server/BBS. At 6.15 the board goes online again. Commands for events: TYPE for showing textfiles from the TEXT-dir online. RUN for executing programs offline. RUNDOOR for executing programs online. OFFHOOK for modem-offhook (busy.) ONHOOK for modem-onhook (online.) CDPLAY for playing a cd-track. CDSTOP for stopping the cd. RESET for BBS-reset (usually at 00:00) EXIT for exiting the bbs (reset) QUIT for quiting the bbs (shutdown) While creating a EVENTS.x file make sure you put the line : ---------------------------------- RESET xx:xx ---------------------------------- (Where xx:xx indicates the time of the day statistics reset) Otherwise the statistics reset will be ignored! } TYPE InternalRec = RECORD PosInUserBase : LongInt; { for use with msgindex } { the position of this user in the userbase } CheckPause : Boolean; { check when length of screen is reached ? } Ypos:Byte; { the current number of lines enter without a pause } SysopHangup : Boolean; { ALT - H pressed ? } UserLockOut: Boolean; { ALT - L pressed ? } CorrectLogon:Boolean; { Is this a correct logon ? } Node:Byte; { The current node } Commands:Array [1..MaxDosKey] of String[30]; { The last 20 commands } CommandPtr:Byte; { current command } BaudStr:String; { baudstr returned by modem } Lines:Byte; { howmany lines available on the screen with or without the statistics bar etc. } TimeExpiredWarning:Boolean; { Did we have a warning yet ? } TimeLeft:LongInt; {original timeleft for a user} { Timeleft at start } NextEvent:EventRecord; { HH:MM } { When is the next event ? (see above) } LastEvent:EventRecord; { HH:MM } { What was the last event ? (see above) } StatBarType:Byte; { 1..9 } { which statbar is on ? } InputAvail:Byte; { 0 none , 1 = local , 2 = remote } MainPrompt:String; { what's the current mainprompt in Desire ? } ForceLogoff:Boolean; { Force logoff after event ? } StopOutput:Boolean; { Stop output after 'More Y/N/NS = N' } SysopLogon:Boolean; { Sysoplogin ? } DontSendInit:Boolean; { -L as parameter for Desire ? } DontCheckInit:Boolean; { -DONTCHECK as parameter for Desire ? } DontHangUp:Boolean; { -D as parameter for Desire ? } NoDirCheck:Boolean; { -C as parameter for Desire ? } CheckCarrier:Boolean; { Is carrier checked now ? } CheckTime:Boolean; { Check for timeleft ? } LastLocalAction:String[8]; { HH:MM:SS } { Last time input from keyboard locally } SaveScreen:Boolean; { screensave active ?>! } { Screensaver active ? } DontShowFiles:Boolean; { Is flag G (ALT-G) Up or Down ? } CDTrackPlaying:Integer; { Which CD track is been played now ? } StatBarHelpPos:Byte; { Which help is shown ? } CaptureStart:Boolean; { Is capture on ? } End; PROCEDURES and FUNCTIONS ------------------------ { PUBLIC FUNCTIONS: } Function GetAreaName(No:Byte):String; { get the name of the current CONFERENCE! } Procedure Pause; { prints a Pause, the pause directly from the menuset of the current user! } Procedure More; { prints a More prompt Yes/No/Nonstop etc.. If 'N' then Control^.Int^.StopOutput is set TRUE ! If 'NS' then Control^.Int^.CheckPause is set FALSE! } Function Default(YesIsDefault:Boolean):boolean; { Waits for input (y/n). YesIsDefault means if the key that is pressed was NOT a 'N' (but for instance an Enter) then Default gets TRUE! and the other way around! If Default is set TRUE then 'Yes' appears on the screen and 'NO' otherwise. } { OUTPUT LOCAL : } Procedure LocalWrite(f:string); Procedure LocalWriteln(f:string); { local screen } { Writes locally, including PCB-codes!} Procedure LocalCls; { just a ClrScr } Function TypeMCIFile(filename:string):Boolean; { to show a .PCB file with MCI-codes and ANSI-codes allowed } Function TypeTXTFile(filename:string):Boolean; { to show a plain textfile with no MCI/ANSI-codes allowed } { INPUT LOCAL & REMOTE : } Function AllReadln(Size:Integer):string; { reads input remote&local with a max. Size } Function AllRead(Size:Integer):string; { idem, now it only doesn't enter to the next line } Function AllReadlnFill(Size:Integer;Fill:Char):string; { does the same as AllReadln but fills spaces with Fill-chars, for instance 'ú' } Function AllGetCh:byte; { Waits for input! is used by Function Getch:Byte which does not wait! } Function AllKeypressed:Boolean; { gives True if ANY input is available from remote or local keyboard } Function GetCh:byte; { gives 0 when no key is pressed and the ASCII-value otherwise } Function Edit_String(f:string;size:integer;LF:Boolean):String; { let's you Edit a string. It prints the string on the current position and lets you edit it using Backspace and checks for the maximum size and finally enters if LF is true. } { OUTPUT LOCAL & REMOTE : } Procedure AllBackSpace(L:Byte); { Moves the cursor and Deletes the last L charachters } Procedure Allmoveleft(i:integer); { Moves the cursor left i positions } Procedure AllmoveRight(i:integer); { Moves the cursor right i positions } Procedure Allmoveup(i:integer); { Moves the cursor up i positions } Procedure Allmovedown(i:integer); { Moves the cursor down i positions } Procedure AllCursorXY(x,y:integer); { Moves the cursor to (X,Y) from the top left position } Procedure AllWrite(f:string); { both local & com } { Prints a string f, MCI and ANSI-codes allowed } Procedure AllWriteln(f:string); { both local & com } { Prints a string f with a line-feed, MCI and ANSI-codes allowed } Procedure AllWriteNonMCI(f:string); { both local & com } { Prints a string f, but no MCI/ANSI-codes allowed } Procedure AllWritelnNonMCI(f:string); { both local & com } { Prints a string f with a line-feed, but no MCI/ANSI-codes allowed } Procedure CWriteMCI(f:string); { both local & com } { same as AllWrite, for System/X compatibility } Procedure CWriteMCIln(f:string); { both local & com } { same as AllWriteln, for System/X compatibility } Procedure CWrite(f:string); { both local & com } { same as AllWriteNonMCI, for System/X compatibility } Procedure CWriteln(f:string); { both local & com } { same as AllWritelnNONMCI, for System/X compatibility } { OUTPUT REMOTE } Procedure Com_string(f:string); { sends string f to the modem } Function Com_stringcheck(f:string):boolean; { sends string f to the modem, and checks if the modem is receiving it, in case of Com_string the system would hang until the modem receives the string } Procedure Com_stringcrlf(f:string); { same a Com_string but gives an enter after it } { INPUT REMOTE } Function Com_receive:Char; { wait's for remote input } Function Com_inputavail:boolean; { is set TRUE if the remote user has pressed a key } { COMFUNCTIONS } Procedure Allinit; { Do not use this! it's called once at the start of the doorkit by Deskit.TPU itself to init the comport } Procedure Com_flush; { Flush the comport } Procedure Com_hangup; { Drop the carrier } Procedure Com_Atcmd(f:string); { Send an AT-command to the modem } Procedure CloseAll; (* Always use this as last command !! *) { Close the comport, Always call this last! in your doors!! } { DATAFILES } Procedure WriteDropFile; { Write the current DOOR-record (in memory) to disk If you change values in this DOOR-record and you write it back to disk with WriteDropFile then Desire will notice that it's data has been changed and will read the DOOR-record and will take over it's values! } Procedure ReadDropFile; { read the DOOR-record (user data), this is already read in by Deskit.TPU, so there is no need to execute this procedure unless you intend to } Procedure WriteNodeFile(Status:Byte;ExtStatus:String); { Write's the NODE-file, to tell other nodes what this node is doing. for instance if you made a WHO-door you could call this at the beginning of the door: WriteNodeFile(18,''); 0 - Node Inactive ExtStatus: - 1 - Waiting for Call ExtStatus: - 2 - Ring Detected ExtStatus: - 3 - Receiving Call ExtStatus: - 4 - Logging on ExtStatus: - 5 - Scanning Mail ExtStatus: - 6 - Normal BBS Use/IDLE ExtStatus: - 7 - Account Sequence ExtStatus: - 8 - MultiNode Chat ExtStatus: - 9 - Newuser ExtStatus: NewUserName 10 - Uploading ExtStatus: FileName 11 - Downloading ExtStatus: FileName 12 - Beginning Upload ExtStatus: - 13 - Beginning Download ExtStatus: - 14 - FileCheck ExtStatus: FileName 15 - FileID ExtStatus: FileName 16 - Logging Off ExtStatus: - 17 - Chatting with Sysop ExtStatus: - 18 - WHO ExtStatus: - 19 - Joining Conference ExtStatus: - 20 - Viewing Bulletins ExtStatus: - 21 - Viewing TextFile ExtStatus: - 22 - Sysop Viewing File ExtStatus: - 23 - Viewing Userlist ExtStatus: - 24 - Editing User Setups ExtStatus: - 25 - Posting Message ExtStatus: 26 - Reading Messages ExtStatus: - 27 - Viewing Filelist ExtStatus: - 28 - Scanning New Files ExtStatus: - 29 - Paging Sysop ExtStatus: - 30 - Requested Relogon ExtStatus: - 31 - ZipScan ExtStatus: - 32 - Flagging Files ExtStatus: - } Procedure LogAction(Comment:String); { LogAction logs a comment into the LOGFILE of the current node, LogAction('xROADs' NEWUSERAPPLICATIONVIEWER 1.1 executed.'); results in a line like this: -------------------------------------------------------- 14:00:22 xROADs' NEWUSERAPPLICATIONVIEWER 1.1 executed. -------------------------------------------------------- LogAction('') { with an empty string } results in a line like this: -------------------------03-29-97 14:00:10----------------------------- Function GetString(Nr:Integer):String; { Gives a MENUSET string When the normal Desire menuset(s) are used, GetString(73) would return the string: '@X07Sysop Jumped to DOS, please wait...' and GetString(74) would be: '@X07thanx for waiting...' Now, AllWrite(Getstring(73)) would print: @X07Sysop Jumped to DOS, please wait... See the STRDES.TXT or MENUSET.EXE for the corresponding numbers! } Function GetConferencePath(ConfNumber:Integer):String; { returns the current FULL path to the conference like this: 'C:\DESIRE\CONF1' } = Desstr.TPU ============================================================== Function ShortTIME:string; { prints the time like this: 10:00 } Function DATE:string; { print the date like this: MM-DD-YY } Function TIME:string; { prints the time like this: 10:00:00 } Function StrToInt(Str:string):integer; { converts a string to an integer } Function CutSpacesOff(str:string):string; { cuts the last spaces from a string } Function ToLowcase(Str:String):string; { converts al chars in a string to lowercase } Function LongToStr(i:longint;Width:Integer):String; { converts a LongInt i to a string with a particular Width } Function intToStr(i:integer;Width:Integer):String; { converts a Integer i to a string with a particular Width } Function DoubleToStr(i:double;Width:Integer):String; { converts a Double i to a string with a particular Width and no fraction } Function ToUpcase(Str:String):string; { converts the string Str tp uppercase } Function chobstring(source:string;from_length, to_length:integer;fill:boolean):string; { chobs a part of a string source which had a length of from_length and needs to be resized (either bigger or smaller) to to_length and if it needs to be bigger add it with characters of fill } Function Parameter(f:string;N:byte):String; { returns the f-th parameter in a string, that is the f-th word surrounded by spaces } Function swildcard(name:string):string; { converts a string (filename or username) to a string with length 30 where 'FILE*' would result in 'FILE??????????????????????????' to see if two strings are the same if they are wildcarded (with equal) } Function swildcardsused(f:string):boolean; { return TRUE if f contains a '*' or a '?' } Function equal(name1,name2:string):boolean; { checks if two wildcarded strings are equal to each other Equal(Swildcard('FI*'),Swildcard('*')) = true } Function fwildcard(name:string):string; { same as before, now for files fwildcard ('FIL*.TXT') = 'FIL?????.TXT' } Function fwildcardsused(f:string):boolean; Function FExpandFile(name1:String):String; { shapes a filename 'BLA*.*' into 8.3 ('BLA* .* ') } Function Fequal(name1,name2:string):boolean; { return TRUE if two wildcardeds filenames are the same: Fequal(FWildcard('FIL*'),FWildcard('F*')) = True; } Function LeadingSpace(w : Longint;Width:Byte) : String; { converts a LongInt to a string with a Width an aligns it to the right } Function TimeUsed(LcLogonTime,LastTime:String): LongInt; { returns the amount of seconds between two time-strings : TimeUsed('09:00:00','10:00:00') = 3600 } Function LeadingZerof(w : LongInt) : String; { converts a LongInt to a string and puts zeros in front } LeadingZerof(8) = '00000008' } Function Stripmcicode(var str:string):string; { removes @X00-codes from a string } Function CompileTab(Var f:string):String; { converts #9 into 8 spaces } Function RemoveUnderScore(f:string):String; { removes _ and replaces them by a space ' ' } Function DateToDays(DateSt:String):LongInt; { converts a date to a number of days from 00-00-00 } Function KillEndSlash(f:string):string; { removes the last \ that occurs in filepaths } Function CharInString(St:String;Ch:Char):Boolean; { returns true if character Ch occurs in string St } = Dessys.TPU ============================================================== Procedure Pageon; { turns the screen on from PageOff } Procedure Pageoff; { turns the screen output of and the screen appears black } Function CapsOn: Boolean; { return TRUE when Capslock is on } Function NumOn: Boolean; { return TRUE when Numlock is on } Function ScrollOn: Boolean; { return TRUE when Scrolllock is on } Procedure Set_Caps(On : boolean); { sets Capslock (and the led) on/off } Procedure Set_Num(On : boolean); { sets Numlock (and the led) on/off } Procedure Set_Scroll(On : boolean); { sets Scrolllock (and the led) on/off } ÚÄÄÄÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ º º ³ ³ º Example: 3. The xROADS Newuser Application Viewer 1.1 (FULL SOURCE) º ³ ³ º º ³ ÀÄÄÄÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄÄÄÄÄÄÙ This code is not Optimized and still contains bugs! Find them :) ----------------------------------------------------------------------------- Program NewuserAppViewer; Uses Deskit,Files,DesStr; Var Username,Input,Temp_Str:String; { input strings Temp_Str and Input { output string Username as @MCI1@ in NAVFND.PCB } EndSubLoop,EndLoop:Boolean; { variables to end loops lile WHILE/DO and REPEAT/UNTIL } SearchNode:Byte; { which ANSWERx.TXT file are we reading ? } Found:Boolean; { we just found a user } F:Text; { for textfiles } i:integer; { aid counter } C:Byte; { to read a byte from the user } AidMCI:MCIRPTR; { for the @MCIx@-codes } ShowCont:Boolean; EverFound, { did we ever find a user ? } JustShown:Boolean; { did we just have a user on the screen or were we looking for one ? to estimate the amount of enters at the end } Begin EverFound:=false; If ParamStr(2)<>'' then If Door.SecLvl',') do Begin Username:=Username+Temp_str[i]; Inc(i); End; For i:=1 to (Length(Username)-Length(Input))+1 do If ToUpcase(Copy(Username,i,Length(Input)))= ToUpcase(Input) then Begin { found! } { show it! } EverFound:=True; GetMem(Control^.MCI^,SizeOf(MCIRecord)); AidMCI:=Control^.MCI^; AidMCI^.mcistr:=Username; AidMCI^.NExt:=NIL; TypeMCIFile('NAVFND.PCB'); AidMCI:=Control^.MCI^; AidMCI:=Control^.MCI^; FreeMem(Control^.MCI^,SizeOf(MCIRECORD)); C:=AllGetch; If Upcase(Chr(C))='Q' then Begin; EndLoop:=True; EndSubLoop:=True; AllWriteln('Quit'); AllWriteln(''); AllWriteln(''); End else If Upcase(Chr(C))<>'N' then Begin JustShown:=True; AllWriteln('Yes'); AllWriteln(''); AllWriteln(''); TypeMCIFile('NAVHDR.PCB'); { header } Found:=True; While (Chobstring(Temp_str,5,5,false)<>'\----') and (not Eof(F)) do Begin AllWriteln(Temp_Str); Readln(f,Temp_Str); End; {Show;} TypeMCIFile('NAVCONT.PCB'); { continue searching ? } C:=AllGetch; If (ToUpcase(Chr(C))<>'N') and (ToUpcase(Chr(C))<>'Q') then Begin Allwrite('Yes'); AllWriteln(''); AllWriteln(''); Found:=False; GetMem(Control^.MCI^,SizeOf(MCIRecord)); AidMCI:=Control^.MCI^; AidMCI^.mcistr:=ToUpcase(Input); AidMCI^.NExt:=NIL; TypeMCIFile('NAVSRCH.PCB'); AidMCI:=Control^.MCI^; AidMCI:=Control^.MCI^; FreeMem(Control^.MCI^,SizeOf(MCIRECORD)); End else Begin Allwrite('No'); AllWriteln(''); AllWriteln(''); EndSubloop:=True; EndLoop:=True; End; End else Begin; ShowCont:=False; Found:=False; AllWriteln('No'); AllMoveUp(3); JustShown:=False; End; End End else Readln(f,Temp_str); End; { sub } Close(f); End; { exist } Inc(SearchNode); If SearchNode>Config.Howmanynodes then EndLoop:=True; end; {endloop } If not Found then Begin If (not JustShown) and (Input<>'') and EverFound then Begin AllWriteln(''); AllWriteln(''); AllWriteln(''); AllWriteln(''); End; TypeMCIFile('NAVNOT.PCB'); End; CloseAll; End. ----------------------------------------------------------------------------- ÚÄÄÄÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ º º ³ ³ º 4. Notes º ³ ³ º º ³ ÀÄÄÄÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄÄÄÄÄÄÙ If you have any valuable information that you want to share with other developers, send it to xroads@stack.nl and we'll publish it in the next issue! Thankz, Rapido ----------------------------------------------------------------------------- ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ÖÄÄÄÄÄÄÄÄÄÄÄÄ[³ [*] LEADING FORCE [*] ³]ÄÄÄÄÄÄÄÄÄÄÄÄÄ· ÚÄĺÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄĺÄÄÄ¿ ³ º Rapido Alibabba º ³ ÀÄĺÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄĺÄÄÄÙ ÓÄÄÄÄÄÄÄÄÄÄÄÄÄÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙÄÄÄÄÄÄÄÄÄÄÄÄÄĽ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ÖÄÄÄÄÄÄÄÄÄÄÄÄ[³ [*] ACTIVE MEMBERS [*] ³]ÄÄÄÄÄÄÄÄÄÄÄÄÄ· ÚÄĺÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄĺÄÄÄ¿ ³ º Alibabba, Ampsul, Breakdown, Gannon, Grim, Highl/\nder, Inm º ³ ³ º Ken8, The Killer, Mexx, Mr Bungle, Mushroom, Nighty, Omen, º ³ ³ º Ooze, Pascal, Phreak Klass, Phasia, Predator, Rapido, Ripper, º ³ ³ º Sludge, Squizzy, Star, Thc, Voyage, Wasted º ³ ÀÄĺÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄĺÄÄÄÙ ÓÄÄÄÄÄÄÄÄÄÄÄÄÄÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙÄÄÄÄÄÄÄÄÄÄÄÄÄĽ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ÖÄÄÄÄÄÄÄÄÄÄÄÄ[³ [*] CODING DIVISION [*] ³]ÄÄÄÄÄÄÄÄÄÄÄÄÄ· ÚÄĺÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄĺÄÄÄ¿ ³ º Rapido, Alibabba, Ampsul, Pascal ,Gannon, Inm º ³ ÀÄĺÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄĺÄÄÄÙ ÓÄÄÄÄÄÄÄÄÄÄÄÄÄÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙÄÄÄÄÄÄÄÄÄÄÄÄÄĽ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ÖÄÄÄÄÄÄÄÄÄÄÄÄ[³ x R O A D s H E A D Q U A R T E R S ³]ÄÄÄÄÄÄÄÄÄÄÄÄÄ· ÚÄĺÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄĺÄÄÄ¿ ³ º Eternal Damnation .......1 Node......+31...Davadian........WORLD HQ º ³ ³ º Mystical Places .........6 Nodes.....+31...Thc............. EURO HQ º ³ ³ º Rest In Peace ...........1 Node......+54...Sludge.......... ARG HQ º ³ ³ º Central Park ............3 Nodes.....+61...Mr. Bungle........ OZ HQ º ³ ³ º Point Break .............7 Nodes.....+49...Voyage........ GERMAN HQ º ³ ³ º Magic Affair ............4 Nodes.....+7....Omen......... RUSSIAN HQ º ³ ³ º Dead On Time ............2 Nodes.....+47...Nighty..... NORWEGIAN HQ º ³ ³ º High Resolution .........1 Node......+44...Pascal............ UK HQ º ³ ³ º Dark Forces .............3 Nodes.....+46...Gannon/Phasia SWEDISH HQ º ³ ³ º Killertown ..............7 Nodes.....+32...The Killer... BELGIUM HQ º ³ ³ º Unknown Area ............1 Node .....+48...Vibr8......... POLISH HQ º ³ ³ ºÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄĺ ³ ³ º x R O A D s M E M B E R S I T E S º ³ ³ ºÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄĺ ³ ³ º Sector Seven ............2 Nodes.....+46...Inm/Rawlock. SWEDISH MBR º ³ ³ º Tresor ..................1 Node......+46...Ken8........ SWEDISH MBR º ³ ³ º Fireball ................2 Nodes.....+49...Star......... GERMAN MBR º ³ ÀÄĺÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄĺÄÄÄÙ ÓÄÄÄÄÄÄÄÄÄÄÄÄÄÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙÄÄÄÄÄÄÄÄÄÄÄÄÄĽ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ÖÄÄÄÄÄÄÄÄÄÄÄÄ[³ T H A N K S G R E E T S N O T E S ³]ÄÄÄÄÄÄÄÄÄÄÄÄÄ· ÚÄĺÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄĺÄÄÄ¿ ³ º xROADs thanks & greets the following groups/persons: º ³ ³ º º ³ ³ º Food, Goodspeed, Motiv8, Stf and many others º ³ ³ º º ³ ³ ºÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄĺ ³ ³ º xROADs thanks & greets the following individuals : º ³ ³ º º ³ ³ º Davadian, Darktrooper, Inm, Nighty, Mtl, Cyberkid, The Best º ³ ³ º and all others in #FOOD and #STF º ³ ³ º º ³ ³ ºÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄĺ ³ ³ º N O T E S º ³ ³ ºÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄĺ ³ ³ º º ³ ³ º xROADs is looking for talented people like you for coding doors, º ³ ³ º managing the xROADs doors coding division and for art work. º ³ ³ º if you're interested in getting xROADs back up again email º ³ ³ º to: xroads@stack.nl or join #xroads on Efnet and contact º ³ ³ º one of the leaders! º ³ ³ º º ³ ³ º xROADs changed WHQ! Our new world headquarters will be º ³ ³ º Eternal Damnation +31-765-600721 º ³ ³ º º ³ ³ º Visit us on the Efnet on #XROADS º ³ ³ º and contact one of the council members º ³ ³ º º ³ ³ º You can contact us via E-mail : xroads@stack.nl º ³ ³ º or call the xROADs WHQ at º ³ ³ º +31-765-600721 (28K8) º ³ ³ º º ³ ³ º All new releases can be downloaded from our www-page at º ³ ³ º www.stack.nl/~xroads º ³ ³ º º ³ ³ ºÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄĺ ³ ³ º Nfo & Xrd Logo By SQUiZZY. Nfo Last Updated By RaPiDo on 03/23/97 º ³ ÀÄĺÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄĺÄÄÄÙ ÓÄÄÄÄÄÄÄÄÄÄÄÄij ³ÄÄÄÄÄÄÄÄÄÄÄÄÄĽ ³ Please report bugs! By reporting bugs ³ ³ you help us to improve our work! ³ ³ ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ @BEGIN_FILE_ID.DIZ ÛÛÛ ° ° ° Ä ÄÛ²ÛÄ--Ä[Desire Development Mag #1]Ä-- ° Û²Û ° ° ± ° ° ± ° ° ° ° ± ° ° ±ÜÜÜÜÜÜ ÜÜÜÜÜÜÜ ÜÜÜÜÜÜ ÜÜÜ ÜÜÜÜÜÜ ÜÜÜÜÜÜÜ ÛÛÛßßßß ÛÛÛßßßß ÛÛ²ÛÛÛÛ ßßß ÛÛÛßÛÛÛ ÛÛÛßßßß Û²Û Û²Û Û²Ûßßß Û²±ÛÜÜÜ ÛÛÛ Û²ÛÜÛÛß Û²Ûßßß° Û²Û Û²Û Û²Û Û²Û ÜÜÜ Û²Û Û²Û Û²Û Û²Û Û²Û Û²Û Û²Û Û²Û Û²Û Û²Û Û²Û Û²Û Û²Û Û²Û Û²Û Û²Û Û²Û ±ßßßßßß ±ßßßßßß° ßßßßßß°ßßß° ßß°ßßß± ßßßßßß °.-------------------------------------.sQZ | Desire Development Magazine #1 |² ± | Download XRD-DEV1.ZIP too! |± `-------------------------------------' @END_FILE_ID.DIZ