Skip to content

Instantly share code, notes, and snippets.

@pqnelson
Last active August 29, 2015 14:27
Show Gist options
  • Select an option

  • Save pqnelson/77bb6daf63fe1c624bac to your computer and use it in GitHub Desktop.

Select an option

Save pqnelson/77bb6daf63fe1c624bac to your computer and use it in GitHub Desktop.
Pretty printed version of http://sbs-baseball.com/sbs493-public.txt
'
' #DEBUG ERROR ON
' (If you "uncomment" the statement above, don't forget to un-comment the "ON ERROR GOTO...")
'
' Changed RotRec to 1000 - May 28, 2011 (Teams to keep track of for Pitching Rotations)
' Changed RotRec to 1500 - June 4, 2011
' Changed WLRec to 1500 - June 4, 2011 (Teams to keep track of in Standings)
' If more than 300 teams involved, user needs to use STAT-TEAM-LIMIT= in .CMD
'
'
#COMPILE EXE
#RESOURCE "SBS.PBR"
'
' ** Strategic Baseball Simulator v 4.9.3 for Windows under PB/CC 2.11
' Copyright 1988-2012 David B. Schmidt
'
'#INCLUDE "WIN32API.INC"
'=========================================================================
' Equates and declares extracted from Win32api.inc for following code file
' and all its includes: C:\PBCC21\sbs49\sbs492.bas
' Saved as: C:\PBCC21\sbs49\WinClean.inc
'
' Note: WinClean.inc can be used as direct replacement for Win32api.inc
' in above mentioned code file, but you can also copy and paste the contents
' directly into the above mentioned code file, instead of including it.. :)
'-----------------------------------------------------------
' Equates: 47
'-----------------------------------------------------------
%WINAPI = 1
%TRUE = 1
%FALSE = 0
%NULL = 0
%Black = &H000000???
%Gray = &H808080???
%GMEM_FIXED = &H0
%CREATE_NEW_CONSOLE = &H10
%NORMAL_PRIORITY_CLASS = &H0020
%STARTF_USESHOWWINDOW = &H00000001
%MK_SHIFT = &H4
%MK_CONTROL = &H8
%COLOR_SCROLLBAR = 0
%COLOR_BACKGROUND = 1
%COLOR_ACTIVECAPTION = 2
%COLOR_INACTIVECAPTION = 3
%COLOR_MENU = 4
%COLOR_MSGBOX = 4
%COLOR_WINDOW = 5
%COLOR_WINDOWFRAME = 6
%COLOR_MENUTEXT = 7
%COLOR_MSGBOXTEXT = 7
%COLOR_WINDOWTEXT = 8
%COLOR_CAPTIONTEXT = 9
%COLOR_ACTIVEBORDER = 10
%COLOR_INACTIVEBORDER = 11
%COLOR_APPWORKSPACE = 12
%COLOR_HIGHLIGHT = 13
%COLOR_HIGHLIGHTTEXT = 14
%COLOR_BTNFACE = 15
%COLOR_BTNSHADOW = 16
%COLOR_GRAYTEXT = 17
%COLOR_BTNTEXT = 18
%COLOR_INACTIVECAPTIONTEXT = 19
%COLOR_BTNHIGHLIGHT = 20
%COLOR_3DDKSHADOW = 21
%COLOR_3DLIGHT = 22
%COLOR_INFOTEXT = 23
%COLOR_INFOBK = 24
%IDI_APPLICATION = 32512&
%IDI_HAND = 32513&
%IDI_QUESTION = 32514&
%IDI_EXCLAMATION = 32515&
%IDI_ASTERISK = 32516&
%IDI_WINLOGO = 32517&
%SND_ASYNC = &H1 ' play asynchronously
%SND_MEMORY = &H4 ' lpszSoundName points to a memory file
'-----------------------------------------------------------
' TYPE and UNION: 5
'-----------------------------------------------------------
TYPE SECURITY_ATTRIBUTES
nLength AS DWORD
lpSecurityDescriptor AS LONG
bInheritHandle AS LONG
END TYPE
TYPE PROCESS_INFORMATION
hProcess AS DWORD
hThread AS DWORD
dwProcessId AS DWORD
dwThreadId AS DWORD
END TYPE
TYPE STARTUPINFO
cb AS DWORD
lpReserved AS ASCIIZ PTR
lpDesktop AS ASCIIZ PTR
lpTitle AS ASCIIZ PTR
dwX AS DWORD
dwY AS DWORD
dwXSize AS DWORD
dwYSize AS DWORD
dwXCountChars AS DWORD
dwYCountChars AS DWORD
dwFillAttribute AS DWORD
dwFlags AS DWORD
wShowWindow AS WORD
cbReserved2 AS WORD
lpReserved2 AS BYTE PTR
hStdInput AS LONG
hStdOutput AS LONG
hStdError AS LONG
END TYPE
TYPE SMALL_RECT
xLeft AS INTEGER
xTop AS INTEGER
xRight AS INTEGER
xBottom AS INTEGER
END TYPE
TYPE CONSOLE_CURSOR_INFO
dwSize AS DWORD
bVisible AS LONG
END TYPE
'-----------------------------------------------------------
' Declared Functions: 11
'-----------------------------------------------------------
DECLARE FUNCTION CloseHandle LIB "KERNEL32.DLL" ALIAS "CloseHandle" (BYVAL hObject AS DWORD) AS LONG
DECLARE FUNCTION CreateProcess LIB "KERNEL32.DLL" ALIAS "CreateProcessA" (lpApplicationName AS ASCIIZ, lpCommandLine AS ASCIIZ, lpProcessAttributes AS SECURITY_ATTRIBUTES, lpThreadAttributes AS SECURITY_ATTRIBUTES, _
BYVAL bInheritHandles AS LONG, BYVAL dwCreationFlags AS DWORD, lpEnvironment AS ANY, lpCurrentDirectory AS ASCIIZ, lpStartupInfo AS STARTUPINFO, lpProcessInformation AS PROCESS_INFORMATION) AS LONG
DECLARE FUNCTION GetConsoleCursorInfo LIB "KERNEL32.DLL" ALIAS "GetConsoleCursorInfo" (BYVAL hConsoleOutput AS DWORD, lpConsoleCursorInfo AS CONSOLE_CURSOR_INFO) AS LONG
DECLARE FUNCTION GlobalAlloc LIB "KERNEL32.DLL" ALIAS "GlobalAlloc" (BYVAL wFlags AS DWORD, BYVAL dwBytes AS DWORD) AS LONG
DECLARE FUNCTION GlobalFree LIB "KERNEL32.DLL" ALIAS "GlobalFree" (BYVAL hMem AS DWORD) AS LONG
DECLARE FUNCTION mciSendString LIB "WINMM.DLL" ALIAS "mciSendStringA" (lpstrCommand AS ASCIIZ, lpstrReturnString AS ASCIIZ, BYVAL uReturnLength AS DWORD, BYVAL hwndCallback AS DWORD) AS LONG
DECLARE FUNCTION ReadConsoleOutput LIB "KERNEL32.DLL" ALIAS "ReadConsoleOutputA" (BYVAL hConsoleOutput AS DWORD, BYVAL lpBuffer AS DWORD, BYVAL dwBufferSize AS DWORD, BYVAL dwBufferCoord AS DWORD, lpReadRegion AS SMALL_RECT) AS LONG
DECLARE FUNCTION SetConsoleCursorInfo LIB "KERNEL32.DLL" ALIAS "SetConsoleCursorInfo" (BYVAL hConsoleOutput AS DWORD, lpConsoleCursorInfo AS CONSOLE_CURSOR_INFO) AS LONG
DECLARE FUNCTION SetConsoleCursorPosition LIB "KERNEL32.DLL" ALIAS "SetConsoleCursorPosition" (BYVAL hConsoleOutput AS DWORD, BYVAL dwCursorPosition AS DWORD) AS LONG
DECLARE FUNCTION sndPlaySound LIB "WINMM.DLL" ALIAS "sndPlaySoundA" (lpszSoundName AS ASCIIZ, BYVAL uFlags AS DWORD) AS LONG
DECLARE FUNCTION WriteConsoleOutput LIB "KERNEL32.DLL" ALIAS "WriteConsoleOutputA" (BYVAL hConsoleOutput AS DWORD, BYVAL lpBuffer AS DWORD, BYVAL dwBufferSize AS DWORD, BYVAL dwBufferCoord AS DWORD, lpWriteRegion AS SMALL_RECT) AS LONG
'=========================================================================
#INCLUDE "SCRNIO.INC"
#INCLUDE "\CONTOOLS\CT_STD.INC"
#INCLUDE "\GFXTOOLS\GfxT_Pro.INC"
DECLARE SUB AddToAnnouncer(team&, x$)
DECLARE SUB MyBeep
DECLARE SUB Pauseit
DECLARE SUB LOCATEs (row&, col&)
DECLARE SUB QPRINTs (row&, col&, x$, attr&)
DECLARE FUNCTION ConsoleShell (BYVAL CmdLine$, BYVAL ShowWindState&) AS LONG
DECLARE FUNCTION PitcherCloneUnused (SearchName$, tm&) AS LONG
DECLARE FUNCTION SearchDAT (s1&, s2&, tm&, SearchName$, posit&) AS LONG
DECLARE FUNCTION DrawToRow (row&, wincols&) AS LONG
DECLARE FUNCTION DrawToCol (col&, wincols&) AS LONG
DECLARE FUNCTION InBox (r1&, c1&, r2&, c2&, r&, c&, b&) AS LONG
DECLARE FUNCTION CalcAttr (i&, j&) AS LONG
DECLARE FUNCTION CircularFcn! (x!)
DECLARE FUNCTION HITRATING! (i&, j&)
DECLARE FUNCTION CalcOPS! (i&, j&)
DECLARE FUNCTION FoundInMMList(x$) AS LONG
DECLARE FUNCTION LineSCORE$(t&)
DECLARE FUNCTION Canada (x$) AS LONG
DECLARE FUNCTION FRND (i&) AS LONG
DECLARE FUNCTION FIRSTNAME$(x$)
DECLARE FUNCTION FULLNAME$(x$)
DECLARE FUNCTION LASTNAME$(x$)
DECLARE FUNCTION FLASTNAME$(i&, j&)
DECLARE FUNCTION FLASTNAMER$(i&, j&)
DECLARE FUNCTION BUBuildLine$(j&, t&, k&)
DECLARE FUNCTION FOUNDPOSITION(i&, j&, k&) AS LONG
DECLARE FUNCTION MenuRoutine2$
DECLARE FUNCTION MYINPUT$ (AutoSw&, KeyEscape&, KeyCustomEsc&, KeyAccept&, kc&, fore&, back&, row&, col&, leng&, edit$, lowlim&, uplim&, default$, msx&, msy&)
DECLARE FUNCTION NUMERIC(x$, j&, k&) AS LONG
DECLARE FUNCTION NUMBERON AS LONG
DECLARE FUNCTION PADRIGHT$(x$, i&)
DECLARE FUNCTION PADLEFT$(x$, i&)
DECLARE FUNCTION PADZEROS$(x$, i&)
DECLARE FUNCTION WHOATGUY(i&) AS LONG
DECLARE FUNCTION YesOrNo$(i&, j&, k&, l&, x$)
DECLARE FUNCTION CountGamesInSCH(w$, x$, y$, z$, i&, j&, k&, l&) AS LONG
DECLARE FUNCTION CountGamesInSER AS LONG
DECLARE FUNCTION Subdoublequote$(x$)
DECLARE FUNCTION DefaultDHResponse$
DECLARE FUNCTION ExpectedPitchCount(i&, j&) AS LONG
DECLARE FUNCTION HiSaves(i&) AS LONG
DECLARE FUNCTION Codesum(x$) AS LONG
DECLARE FUNCTION PlayWav(WavFile$) AS LONG
DECLARE FUNCTION JDATE(x$) AS LONG
DECLARE FUNCTION GetDaysOff(i&, j&) AS LONG
DECLARE FUNCTION DHinDAT (i&) AS LONG
DECLARE FUNCTION FindRA$ (RecNum&, fp&, Reclen&, start&, leng&)
DECLARE FUNCTION FFormat$(InValue!, mask$)
DECLARE FUNCTION LFormat$(InValue&, mask$)
DECLARE FUNCTION IFormat$(InValue%, mask$)
DECLARE FUNCTION ReturnLineInTextFile$(f$, k$, start&, leng&)
DECLARE FUNCTION MyRound!(InValue!, DecPts&)
DECLARE FUNCTION DEFSplit!(n&, defp!, adj!)
DECLARE FUNCTION DEFPCT!(i&)
DECLARE FUNCTION TotalBases (Hits&, Doubles&, Triples&, HR&) AS LONG
DECLARE FUNCTION RunsCreated! (TB&, Hits&, BB&, AB&)
DECLARE FUNCTION RunsAllowed! (TB&, Hits&, BB&, INNINGS&, SO&)
DECLARE FUNCTION BattersFacedByPit! (Innings&, Hits&, BB&, SO&)
DECLARE FUNCTION LW! (Hits&, Doubles&, Triples&, HR&, BB&)
DECLARE FUNCTION RunsCreated27! (AB&, Hits&, H2&, H3&, HR&, BB&, HBP&, SH&, SF&, SB&, CS&, GIDP&)
DECLARE FUNCTION FindPP!
'--------------------------------------------------------
TYPE MType 'Messages
mgs AS STRING * 50
END TYPE
TYPE PbyPType
class AS STRING * 2
pos AS STRING * 1
seq AS STRING * 1
trk AS STRING * 2
pndx AS STRING * 3
text AS STRING * 71
END TYPE
TYPE PbyP_OVL
PbyP_Rec AS STRING * 80
END TYPE
TYPE MMType 'Manual manager list
MMFile AS STRING * 8
END TYPE
TYPE ArgType 'Argument list
Arg AS STRING * 25
END TYPE
TYPE WLType 'Simulation Summary
WLTeam AS STRING * 12
WLWins AS LONG
WLLoss AS LONG
WLLeague AS STRING * 1
WLDiv AS STRING * 1
WLPct AS STRING * 4
END TYPE
TYPE HiLiteType
HLGameNo AS LONG
HLMessage AS STRING * 40
END TYPE
TYPE ScoreCardType
SCInn AS INTEGER
SCTeam AS INTEGER
SCRef AS INTEGER
SCCode AS STRING * 1
SCResult AS STRING * 30 'was 10
SCBase1 AS STRING * 2
SCBase2 AS STRING * 2
SCBase3 AS STRING * 2
SCBase4 AS STRING * 2
END TYPE
TYPE List1Type 'Input to sorting routines
ListItem AS STRING * 120 'was 35/50
END TYPE
TYPE PlyListType 'Input to sorting routines
Item AS STRING * 80
Ref AS INTEGER
END TYPE
TYPE PosPoolType
PSlot AS INTEGER
PABbyPos AS SINGLE
PPct AS SINGLE
PRepl AS INTEGER
END TYPE
TYPE RotType
RotTeam AS STRING * 12
RotMeth AS STRING * 2
RotSpot AS STRING * 1
RotIndex AS INTEGER
RotList(5) AS INTEGER
END TYPE
TYPE RefOrgType
RefNo AS INTEGER
RefPos AS INTEGER
END TYPE
TYPE RankType
Criteria AS STRING * 4
Slot AS INTEGER
END TYPE
TYPE PHType
Criteria1 AS STRING * 4
Criteria2 AS STRING * 4
Slot AS INTEGER
END TYPE
TYPE TotPctType
PctOfTot AS SINGLE
Slot AS INTEGER
END TYPE
TYPE StatSummary
VLeague AS STRING * 1
VDiv AS STRING * 1
VNam AS STRING * 12
VRuns AS LONG
VHits AS LONG
VErrs AS LONG
VLOB AS LONG
VDPs AS LONG
HLeague AS STRING * 1
HDiv AS STRING * 1
HNam AS STRING * 12
HRuns AS LONG
HHits AS LONG
HErrs AS LONG
HLOB AS LONG
HDPs AS LONG
WP AS STRING * 14
LP AS STRING * 14
SP AS STRING * 14
SumFil AS STRING * 2
END TYPE
TYPE BatSummary
BLeague AS STRING * 1
BTmNam AS STRING * 12
BNam AS STRING * 16
BBats AS STRING * 1
BGameCtr AS LONG
BGames AS LONG
BABs AS LONG
BABsRHP AS LONG
BABsLHP AS LONG
BRuns AS LONG
BHits AS LONG
BHitsRHP AS LONG
BHitsLHP AS LONG
BRBIs AS LONG
B2Bs AS LONG
B2BsRHP AS LONG
B2BsLHP AS LONG
B3Bs AS LONG
B3BsRHP AS LONG
B3BsLHP AS LONG
BHRs AS LONG
BHRsRHP AS LONG
BHRsLHP AS LONG
BSBs AS LONG
BCSs AS LONG
BBBs AS LONG
BBBsRHP AS LONG
BBBsLHP AS LONG
BHB AS LONG
BKs AS LONG
BKsRHP AS LONG
BKsLHP AS LONG
BErrs AS LONG
BStreak AS LONG
BGDP AS LONG
BSacB AS LONG
BSacF AS LONG
END TYPE
TYPE BatSummaryOVL
BatSummaryRec AS STRING * 162
END TYPE
TYPE PitSummary
PLeague AS STRING * 1
PTmNam AS STRING * 12
PNam AS STRING * 16
PThrows AS STRING * 1
PGameCtr AS LONG
PGames AS LONG
PStarts AS LONG
PCGs AS LONG
PShOs AS LONG
PInns AS LONG
P3rds AS LONG
PRuns AS LONG
PERuns AS LONG
PHits AS LONG
P2Bs AS LONG
P3Bs AS LONG
PHRs AS LONG
PBBs AS LONG
PHB AS LONG
PSOs AS LONG
PWin AS LONG
PLoss AS LONG
PSave AS LONG
PBS AS LONG
PBF AS LONG
PDaysOff AS LONG
PJDate AS LONG
PStreak AS LONG
END TYPE
TYPE PitSummaryOVL
PitSummaryRec AS STRING * 126
END TYPE
TYPE FldSummary
FLeague AS STRING * 1
FTmNam AS STRING * 12
FNam AS STRING * 16
FThrows AS STRING * 1
FCount AS LONG
FGamesByPos (1 TO 12) AS LONG ' 11=PH 12=PR
FErrsByPos (1 TO 10) AS LONG
FPutOutsByPos(1 TO 10) AS LONG
FAssistsByPos(1 TO 10) AS LONG
END TYPE
TYPE FldSummaryOVL
FldSummaryRec AS STRING * 202
END TYPE
TYPE RestartType
ResSCHName AS STRING * 12
ResSCHDate AS STRING * 8
ResSCHSlotPtr AS INTEGER
ResSlotGameCtr AS INTEGER
ResSlotGames AS INTEGER
ResSimGameCtr AS LONG
END TYPE
TYPE VirtualWinType
item AS STRING * 140
END TYPE
TYPE LAvgType 'Stores League Averages for each YYYYL - Not GLOBAL
LAvgYr AS STRING * 4
LAvgLg AS STRING * 1
LAvgBB AS SINGLE
LAvgSO AS SINGLE
LAvgS2 AS SINGLE
LAvg1B AS SINGLE
LAvg2B AS SINGLE
LAvg3B AS SINGLE
LAvgHR AS SINGLE
LAvgRG AS SINGLE
LTeams AS INTEGER
Innings AS LONG
Hits AS LONG
Doubles AS INTEGER
Triples AS INTEGER
HR AS INTEGER
BB AS INTEGER
Rating AS INTEGER
END TYPE
TYPE BufType 'For File-Listing Sub
BufferItem AS STRING * 210
END TYPE
TYPE ScrType
ScrLine AS STRING * 18
END TYPE
TYPE PosiType
ScrLine AS STRING * 1
END TYPE
TYPE PitTblType
ScrLine AS STRING * 39
END TYPE
TYPE STSAnal
ALeague AS STRING * 1
ADiv AS STRING * 1
APct AS STRING * 4
ANam AS STRING * 12
AWins AS LONG
ALosses AS LONG
AHomWins AS LONG
AHomLosses AS LONG
AHRunsS AS LONG
AHRunsA AS LONG
AVisWins AS LONG
AVisLosses AS LONG
AVRunsS AS LONG
AVRunsA AS LONG
ARuns AS LONG
AOppRuns AS LONG
AHits AS LONG
AErrs AS LONG
ALOB AS LONG
ADP AS LONG
END TYPE
TYPE SortStrType
SSItem AS STRING * 29
END TYPE
TYPE BoxType
row1 AS LONG
col1 AS LONG
row2 AS LONG
col2 AS LONG
END TYPE
TYPE ScheduleLineType
Visitor AS STRING * 8
Home AS STRING * 8
Options AS STRING * 12
END TYPE
TYPE ScheduleType
Header AS STRING * 2
SDate AS STRING * 8
Slot(15) AS ScheduleLineType
END TYPE
'GLOBAL ARRAYS
'GLOBAL TYPED ARRAYS:
GLOBAL Announcer() AS MType
GLOBAL MMList() AS MMType
GLOBAL WLRec() AS WLType
GLOBAL HLRec() AS HiLiteType
GLOBAL SCRec() AS ScoreCardType
GLOBAL RefOrg() AS RefOrgType
GLOBAL RefOrgSave() AS RefOrgType
GLOBAL RotRec() AS RotType
GLOBAL VirtualWin() AS VirtualWinType
GLOBAL SSum AS StatSummary
GLOBAL BSum() AS BatSummary
GLOBAL PSum() AS PitSummary
GLOBAL FSum() AS FldSummary
GLOBAL ArgList() AS ArgType
GLOBAL RestartRec AS RestartType
GLOBAL PbyP() AS PbyPType
'GLOBAL STRING ARRAYS:
GLOBAL DataName() AS STRING
GLOBAL DataPlat() AS STRING
GLOBAL DataHand() AS STRING
GLOBAL DataCode() AS STRING
GLOBAL DataHP() AS STRING
GLOBAL NameRef() AS STRING
GLOBAL HandRef() AS STRING
GLOBAL RefByBO() AS STRING
GLOBAL Century() AS STRING
GLOBAL Names() AS STRING
GLOBAL League() AS STRING
GLOBAL TeamLogo() AS STRING
GLOBAL Year() AS STRING
GLOBAL Div() AS STRING
GLOBAL POS() AS STRING
GLOBAL PosDesc() AS STRING
GLOBAL GMMessage() AS STRING
GLOBAL ActiveSTAT() AS STRING
GLOBAL DataFil() AS STRING
GLOBAL DATPath() AS STRING
GLOBAL WildPit() AS STRING
GLOBAL PassedB() AS STRING
GLOBAL HitByPit() AS STRING
GLOBAL AdjustBO() AS STRING * 1
'GLOBAL LONG INTEGER ARRAYS:
GLOBAL DataGByP() AS LONG
GLOBAL DataPosi() AS LONG
GLOBAL SimGames() AS LONG
GLOBAL SimAB() AS LONG
GLOBAL SimHits() AS LONG
GLOBAL SimHR() AS LONG
GLOBAL SimRBI() AS LONG
GLOBAL SimBStreak() AS LONG
GLOBAL SimBB() AS LONG
GLOBAL SimSO() AS LONG
GLOBAL SimHitsAlw() AS LONG
GLOBAL SimERuns() AS LONG
GLOBAL SimWins() AS LONG
GLOBAL SimLosses() AS LONG
GLOBAL SimSaves() AS LONG
GLOBAL SimBBAlw() AS LONG
GLOBAL SimSO_P() AS LONG
GLOBAL SimDaysOff() AS LONG
GLOBAL WarmUpStatus() AS LONG
GLOBAL mpo() AS LONG
GLOBAL mpk() AS LONG
GLOBAL mph() AS LONG
GLOBAL mpw() AS LONG
GLOBAL mpr() AS LONG
GLOBAL mpbf() AS LONG
GLOBAL mper() AS LONG
GLOBAL mp2b() AS LONG
GLOBAL mp3b() AS LONG
GLOBAL mphr() AS LONG
GLOBAL mphb() AS LONG
GLOBAL mpBS() AS LONG
GLOBAL DataRef() AS LONG
GLOBAL DataPos() AS LONG
GLOBAL DataAB() AS LONG
GLOBAL DataHits() AS LONG
GLOBAL Data2B() AS LONG
GLOBAL Data3B() AS LONG
GLOBAL DataHR() AS LONG
GLOBAL DataBB() AS LONG
GLOBAL DataSO() AS LONG
GLOBAL DataRBI() AS LONG
GLOBAL DataSB() AS LONG
GLOBAL DataCS() AS LONG
GLOBAL DataDef() AS LONG
GLOBAL DataSpeed() AS LONG
GLOBAL DataGames() AS LONG
GLOBAL DataPBatAB() AS LONG
GLOBAL DataPBatHi() AS LONG
GLOBAL DataPBatHR() AS LONG
GLOBAL DataPBatBB() AS LONG
GLOBAL DataPBatSO() AS LONG
GLOBAL iused() AS LONG
GLOBAL OrgPos() AS LONG
GLOBAL mab() AS LONG
GLOBAL mabRHP() AS LONG
GLOBAL mabLHP() AS LONG
GLOBAL mruns() AS LONG
GLOBAL mhits() AS LONG
GLOBAL mhitsRHP() AS LONG
GLOBAL mhitsLHP() AS LONG
GLOBAL mrbi() AS LONG
GLOBAL mhr() AS LONG
GLOBAL mhrRHP() AS LONG
GLOBAL mhrLHP() AS LONG
GLOBAL m3b() AS LONG
GLOBAL m3bRHP() AS LONG
GLOBAL m3bLHP() AS LONG
GLOBAL m2b() AS LONG
GLOBAL m2bRHP() AS LONG
GLOBAL m2bLHP() AS LONG
GLOBAL mbb() AS LONG
GLOBAL mbbRHP() AS LONG
GLOBAL mbbLHP() AS LONG
GLOBAL mhb() AS LONG
GLOBAL merr() AS LONG
GLOBAL mso() AS LONG
GLOBAL msoRHP() AS LONG
GLOBAL msoLHP() AS LONG
GLOBAL msb() AS LONG
GLOBAL mcs() AS LONG
GLOBAL mGDP() AS LONG
GLOBAL mSacF() AS LONG
GLOBAL mSacB() AS LONG
GLOBAL iScoreBd() AS LONG
GLOBAL iScore() AS LONG
GLOBAL itruns() AS LONG
GLOBAL ithits() AS LONG
GLOBAL iterrs() AS LONG
GLOBAL GameLOB() AS LONG
GLOBAL ipa() AS LONG
GLOBAL np() AS LONG
GLOBAL iyp() AS LONG
GLOBAL LastPiAd() AS LONG
GLOBAL amgr() AS LONG
GLOBAL ibp() AS LONG
GLOBAL dp() AS LONG
GLOBAL mpp() AS LONG
GLOBAL SoundQ() AS LONG
GLOBAL AutoLineUpSw() AS LONG
GLOBAL DHDATOvr() AS LONG
GLOBAL Gender() AS LONG
GLOBAL TeamAttr() AS LONG
GLOBAL ERRSw() AS LONG
GLOBAL StBSw() AS LONG
GLOBAL NewStyle() AS LONG
GLOBAL NewStyleWithSaves() AS LONG
GLOBAL CloserIn() AS LONG
GLOBAL PitcherBatted() AS LONG
GLOBAL SumErrors() AS LONG
GLOBAL SumAssists() AS LONG
GLOBAL SumPutOuts() AS LONG
GLOBAL pHRind() AS LONG
GLOBAL HoleStatus() AS LONG
GLOBAL BasPatRow() AS LONG
GLOBAL BasPatCol() AS LONG
GLOBAL DupNameTeam() AS LONG
GLOBAL DLN() AS LONG
GLOBAL LeagueRating() AS LONG
GLOBAL StealAttemptsPlayer() AS LONG
GLOBAL StealAttemptsTeam() AS LONG
GLOBAL RemoveReason() AS LONG
'GLOBAL FLOAT ARRAYS:
GLOBAL SimInn() AS SINGLE
GLOBAL PitchersPerGame() AS SINGLE
GLOBAL DefChancesPerGameF() AS SINGLE
GLOBAL TeamSpeed() AS SINGLE
GLOBAL NormDEF() AS SINGLE
GLOBAL pwbaseF() AS SINGLE
GLOBAL pkbaseF() AS SINGLE
GLOBAL psbaseF() AS SINGLE
GLOBAL p1baseF() AS SINGLE
GLOBAL p2baseF() AS SINGLE
GLOBAL p3baseF() AS SINGLE
GLOBAL p4baseF() AS SINGLE
GLOBAL phit1bF() AS SINGLE
GLOBAL phit2bF() AS SINGLE
GLOBAL phit3bF() AS SINGLE
GLOBAL phit4bF() AS SINGLE
GLOBAL RunsPerGame() AS SINGLE
GLOBAL LgTotInns() AS LONG
GLOBAL LgTotHits() AS LONG
GLOBAL LgTot2B() AS LONG
GLOBAL LgTot3B() AS LONG
GLOBAL LgTotHR() AS LONG
GLOBAL LgTotBB() AS LONG
GLOBAL nPitch() AS LONG
GLOBAL P32() AS LONG
GLOBAL P33() AS LONG
GLOBAL P48() AS LONG
GLOBAL P52() AS LONG
GLOBAL FatRnd() AS SINGLE
GLOBAL ParkBatAdj() AS SINGLE
GLOBAL ParkPitAdj() AS SINGLE
'
'GLOBAL BYTE ARRAYS:
GLOBAL GpPos() AS BYTE
GLOBAL PutOuts() AS BYTE
GLOBAL Assists() AS BYTE
'
' --------- GLOBAL VARIABLES
'
'GLOBAL LONG INTEGERS:
GLOBAL SimGameCtr AS LONG
GLOBAL SCx AS LONG
GLOBAL HLx AS LONG
GLOBAL GMx AS LONG
GLOBAL ANx AS LONG
GLOBAL MMx AS LONG
GLOBAL RTx AS LONG
GLOBAL WLx AS LONG
GLOBAL SQx AS LONG
GLOBAL STx AS LONG
GLOBAL WhoAtPos AS LONG
GLOBAL OrgWhoAtPos AS LONG
GLOBAL ir1 AS LONG
GLOBAL ir2 AS LONG
GLOBAL ir3 AS LONG
GLOBAL iout AS LONG
GLOBAL iwin AS LONG
GLOBAL dh AS LONG
GLOBAL RunAnnounced AS LONG
GLOBAL HitType AS LONG
GLOBAL ForceSBAlways AS LONG
GLOBAL WPteam AS LONG
GLOBAL WPpit AS LONG
GLOBAL LPteam AS LONG
GLOBAL LPpit AS LONG
GLOBAL SPteam AS LONG
GLOBAL SPpit AS LONG
GLOBAL ib AS LONG
GLOBAL ip AS LONG
GLOBAL it AS LONG
GLOBAL id AS LONG
GLOBAL inn AS LONG
GLOBAL ref AS LONG
GLOBAL ref2 AS LONG
GLOBAL innct AS LONG
GLOBAL innr AS LONG
GLOBAL innh AS LONG
GLOBAL inne AS LONG
GLOBAL innadverr AS LONG
GLOBAL innLOB AS LONG
GLOBAL ThrowError AS LONG
GLOBAL OneBaseError AS LONG
GLOBAL InfieldHit AS LONG
GLOBAL ResetHitter AS LONG
GLOBAL Tight AS LONG
GLOBAL Errorx AS LONG
GLOBAL BullD AS LONG
GLOBAL BullO AS LONG
GLOBAL Bunt AS LONG
GLOBAL Boxx AS LONG
GLOBAL HitAndRun AS LONG
GLOBAL IGone AS LONG
GLOBAL PH AS LONG
GLOBAL Subx AS LONG
GLOBAL Steal AS LONG
GLOBAL IWalk AS LONG
GLOBAL POut AS LONG
GLOBAL BatPOut AS LONG
GLOBAL PAround AS LONG
GLOBAL ViewHome AS LONG
GLOBAL ViewVisi AS LONG
GLOBAL SwPos AS LONG
GLOBAL PRun AS LONG
GLOBAL HotBull AS LONG
GLOBAL deffor AS LONG
GLOBAL defbac AS LONG
GLOBAL revfor AS LONG
GLOBAL revbac AS LONG
GLOBAL fldfor AS LONG
GLOBAL fldbac AS LONG
GLOBAL labfor AS LONG
GLOBAL labbac AS LONG
GLOBAL drtfor AS LONG
GLOBAL drtbac AS LONG
GLOBAL prmfor AS LONG
GLOBAL prmbac AS LONG
GLOBAL scofor AS LONG
GLOBAL scobac AS LONG
GLOBAL scdfor AS LONG
GLOBAL scdbac AS LONG
GLOBAL dimfor AS LONG
GLOBAL dimbac AS LONG
GLOBAL defattr AS LONG
GLOBAL revattr AS LONG
GLOBAL fldattr AS LONG
GLOBAL drtattr AS LONG
GLOBAL prmattr AS LONG
GLOBAL errattr AS LONG
GLOBAL linattr AS LONG
GLOBAL labattr AS LONG
GLOBAL scoattr AS LONG
GLOBAL scdattr AS LONG
GLOBAL drkattr AS LONG
GLOBAL dimattr AS LONG
GLOBAL skipattr AS LONG
GLOBAL VisiPtr AS LONG
GLOBAL HomePtr AS LONG
GLOBAL VisiReady AS LONG
GLOBAL HomeReady AS LONG
GLOBAL DelFac AS LONG
GLOBAL OrgSimDelFac AS LONG
GLOBAL SoundOn AS LONG
GLOBAL AnnouncerOn AS LONG
GLOBAL LPTNum AS LONG
GLOBAL RegInns AS LONG
GLOBAL fr2 AS LONG
GLOBAL fr3 AS LONG
GLOBAL fr4 AS LONG
GLOBAL fr5 AS LONG
GLOBAL fr6 AS LONG
GLOBAL fr7 AS LONG
GLOBAL STATTEAMLIMIT AS LONG
GLOBAL TRUE AS LONG
GLOBAL FALSE AS LONG
GLOBAL KeyEsc AS LONG
GLOBAL KeyF2 AS LONG
GLOBAL KeyF3 AS LONG
GLOBAL KeyF4 AS LONG
GLOBAL SelX AS LONG
GLOBAL OutfErr AS LONG
GLOBAL NewUI AS LONG
GLOBAL QualSave1IP AS LONG
GLOBAL QualSave1ID AS LONG
GLOBAL QualSave2IP AS LONG
GLOBAL QualSave2ID AS LONG
GLOBAL DPsw AS LONG
GLOBAL SimAtBats AS LONG
GLOBAL SimTotHits AS LONG
GLOBAL SimTotHRs AS LONG
GLOBAL StrictCloserRule AS LONG
GLOBAL GameRnd AS LONG
GLOBAL DaysOffRule AS LONG
GLOBAL WarmUpRule AS LONG
GLOBAL RunsBeforePlay AS LONG
GLOBAL SchedSw AS LONG
GLOBAL SeriesSw AS LONG
GLOBAL CmdDel AS LONG
GLOBAL CmdDelIsOnCommandLine AS LONG
GLOBAL CmdSlotGames AS LONG
GLOBAL SCHSlotPtr AS LONG
GLOBAL SCHGamesPerRecord AS LONG
GLOBAL ProtectSCH AS LONG
GLOBAL SlotGameCtr AS LONG
GLOBAL LastGameThisDate AS LONG
GLOBAL FilterOK AS LONG
GLOBAL SubRecLen AS LONG
GLOBAL SubRecOff AS LONG
GLOBAL VisiOffset AS LONG
GLOBAL HomeOffset AS LONG
GLOBAL OptiOffset AS LONG
GLOBAL zz0 AS LONG
GLOBAL zz1 AS LONG
GLOBAL zz2 AS LONG
GLOBAL zz3 AS LONG
GLOBAL zz4 AS LONG
GLOBAL zz5 AS LONG
GLOBAL zz6 AS LONG
GLOBAL zzzsb AS LONG
GLOBAL zzzcs AS LONG
GLOBAL zzzcer AS LONG
GLOBAL zzzdp AS LONG
GLOBAL zzzprun AS LONG
GLOBAL zzzDSW AS LONG
GLOBAL zzsacok AS LONG
GLOBAL zzsacfa AS LONG
GLOBAL zzzSumR AS SINGLE
GLOBAL zzzSumN AS LONG
GLOBAL zzzPO AS LONG
GLOBAL zzzNoPO AS LONG
GLOBAL zzzWalkAdj AS LONG
GLOBAL zzzNoWalkAdj AS LONG
GLOBAL zzziwalk1 AS LONG
GLOBAL zzziwalk2 AS LONG
GLOBAL zzziwalk3 AS LONG
GLOBAL zzzph AS LONG
GLOBAL zzsabp AS LONG
GLOBAL zzssbp AS LONG
GLOBAL GameIsOver AS LONG
GLOBAL RegDsply AS LONG
GLOBAL PbyP_Cnt AS LONG
GLOBAL AutoCoach AS LONG
GLOBAL AutoDefense AS LONG
GLOBAL ColorScheme AS LONG
GLOBAL BatterOveruse AS LONG
GLOBAL InsideThePark AS LONG
GLOBAL ConsRows AS LONG
GLOBAL ConsCols AS LONG
GLOBAL MidCol AS LONG
GLOBAL MidRow AS LONG
GLOBAL ColO AS LONG
GLOBAL RowO AS LONG
GLOBAL ObsD AS LONG
GLOBAL ObsY AS LONG
GLOBAL ObsH AS LONG
GLOBAL ObsTz AS LONG
GLOBAL ObsTy AS LONG
GLOBAL Gfx AS LONG
GLOBAL TopPitLim AS LONG
GLOBAL ThreadNo AS LONG
GLOBAL AllowStartersInRelief AS LONG
GLOBAL TakeFromAnywhere AS INTEGER
'GLOBAL STRINGS:
GLOBAL mon$
GLOBAL Result$
GLOBAL Result2$
GLOBAL Code2$
GLOBAL nulls$
GLOBAL ARROWS$
GLOBAL EditorSpec$
GLOBAL WordPadSpec$
GLOBAL AuxSpec$
GLOBAL CmdStat$
GLOBAL CmdLinF$
GLOBAL CmdBoxF$
GLOBAL CmdScrF$
GLOBAL CmdStar$
GLOBAL CmdVFil$
GLOBAL CmdHFil$
GLOBAL CmdWritePath$
GLOBAL CmdPath$
GLOBAL CmdSCH$
GLOBAL CmdSER$
GLOBAL CmdVP$
GLOBAL CmdHP$
GLOBAL CmdSP$
GLOBAL CmdSpot$
GLOBAL CmdVSpot$
GLOBAL CmdHSpot$
GLOBAL CmdVAutoMgr$
GLOBAL CmdHAutoMgr$
GLOBAL CmdAutoLU$
GLOBAL CmdVAutoLU$
GLOBAL CmdHAutoLU$
GLOBAL CmdAdjustBO$
GLOBAL CmdVAdjustBO$
GLOBAL CmdHAdjustBO$
GLOBAL CmdFavTeam$
GLOBAL CmdFavLeague$
GLOBAL CmdDateL$
GLOBAL CmdDateH$
GLOBAL CmdFocus$
GLOBAL CmdDeBug$
GLOBAL CmdPauseAftGame$
GLOBAL CmdPauseAftDate$
GLOBAL CmdERA$
GLOBAL CmdCmdFile$
GLOBAL CmdVM$
GLOBAL CmdHM$
GLOBAL CmdSound$
GLOBAL CmdDH$
GLOBAL CmdNoOpt$
GLOBAL CmdPic$
GLOBAL CmdFireworks$
GLOBAL CmdParkEffects$
GLOBAL CmdHomeFieldAdv$
GLOBAL CmdChangePhoto$
GLOBAL CmdHRWav$
GLOBAL CmdAutoExit$
GLOBAL CmdRetroMode$
GLOBAL CmdDeadBallAdj$
GLOBAL BackGroundPic$
GLOBAL CurrentDir$
GLOBAL SCHDate$
GLOBAL SchBuffer$
GLOBAL MenuOpt$
GLOBAL CloseButton$
GLOBAL AbortButton$
GLOBAL LPtr$
GLOBAL RPtr$
GLOBAL UpPtr$
GLOBAL DnPtr$
GLOBAL xUpPtr$
GLOBAL xDnPtr$
GLOBAL xLPtr$
GLOBAL xRPtr$
GLOBAL EnterPtr$
'GLOBAL FLOATS:
GLOBAL p4baseNorm!
GLOBAL p3baseNorm!
GLOBAL p2baseNorm!
GLOBAL p1baseNorm!
GLOBAL pwbaseNorm!
GLOBAL prbaseNorm!
'Constants:
GLOBAL MAXPLAYERS AS LONG
DEFLNG A-Z
'************************************************************
'FUNCTION PBMAIN() AS LONG
FUNCTION WINMAIN(BYVAL hCurInstance AS LONG, _
BYVAL hPrevInstance AS LONG, _
lpszCmdLine AS ASCIIZ PTR, _
BYVAL nCmdShow AS LONG) _
EXPORT AS LONG
' ON ERROR GOTO PBM_ErrorTrap 'Comment this out for production
REGISTER i AS INTEGER
REGISTER zz AS LONG
' GLOBAL:
DIM Announcer(12) AS GLOBAL MType
DIM HLRec(400) AS GLOBAL HiLiteType 'was 150
DIM SCRec(300) AS GLOBAL ScoreCardType
DIM WLRec(1 TO 1500) AS GLOBAL WLType
DIM DataName(51, 2) AS GLOBAL STRING
DIM DataPlat(51, 2) AS GLOBAL STRING
DIM DataHand(51, 2) AS GLOBAL STRING
DIM DataCode(51, 2) AS GLOBAL STRING
DIM DataHP (51, 2) AS GLOBAL STRING
DIM NameRef(51, 2) AS GLOBAL STRING
DIM HandRef(51, 2) AS GLOBAL STRING
DIM RefByBO(9, 2) AS GLOBAL STRING
DIM Century(2) AS GLOBAL STRING
DIM Names(2) AS GLOBAL STRING
DIM League(2) AS GLOBAL STRING
DIM TeamLogo(2) AS GLOBAL STRING
DIM Year(2) AS GLOBAL STRING
DIM Div(2) AS GLOBAL STRING
DIM POS(11) AS GLOBAL STRING
DIM PosDesc(10) AS GLOBAL STRING
DIM GMMessage(5) AS GLOBAL STRING
DIM ActiveSTAT(10) AS GLOBAL STRING
DIM DataFil(2) AS GLOBAL STRING
DIM DATPath(2) AS GLOBAL STRING
DIM WildPit(2) AS GLOBAL STRING
DIM PassedB(2) AS GLOBAL STRING
DIM HitByPit(2) AS GLOBAL STRING
DIM AdjustBO(2) AS GLOBAL STRING * 1
DIM DataRef(51, 2) AS GLOBAL LONG
DIM DataPos(51, 2) AS GLOBAL LONG
DIM DataAB(51, 2) AS GLOBAL LONG
DIM DataHits(51, 2) AS GLOBAL LONG
DIM Data2B(51, 2) AS GLOBAL LONG
DIM Data3B(51, 2) AS GLOBAL LONG
DIM DataHR(51, 2) AS GLOBAL LONG
DIM DataBB(51, 2) AS GLOBAL LONG
DIM DataSO(51, 2) AS GLOBAL LONG
DIM DataRBI(51, 2) AS GLOBAL LONG
DIM DataSB(51, 2) AS GLOBAL LONG
DIM DataCS(51, 2) AS GLOBAL LONG
DIM DataDef(51, 2) AS GLOBAL LONG
DIM DataSpeed(51, 2) AS GLOBAL LONG
DIM DataGames(51, 2) AS GLOBAL LONG
DIM iused(51, 2) AS GLOBAL LONG
DIM OrgPos(51, 2) AS GLOBAL LONG
DIM mab(51, 2) AS GLOBAL LONG
DIM mabRHP(51, 2) AS GLOBAL LONG
DIM mabLHP(51, 2) AS GLOBAL LONG
DIM mruns(51, 2) AS GLOBAL LONG
DIM mhits(51, 2) AS GLOBAL LONG
DIM mhitsRHP(51, 2) AS GLOBAL LONG
DIM mhitsLHP(51, 2) AS GLOBAL LONG
DIM mrbi(51, 2) AS GLOBAL LONG
DIM mhr(51, 2) AS GLOBAL LONG
DIM mhrRHP(51, 2) AS GLOBAL LONG
DIM mhrLHP(51, 2) AS GLOBAL LONG
DIM m3b(51, 2) AS GLOBAL LONG
DIM m3bRHP(51, 2) AS GLOBAL LONG
DIM m3bLHP(51, 2) AS GLOBAL LONG
DIM m2b(51, 2) AS GLOBAL LONG
DIM m2bRHP(51, 2) AS GLOBAL LONG
DIM m2bLHP(51, 2) AS GLOBAL LONG
DIM mbb(51, 2) AS GLOBAL LONG
DIM mbbRHP(51, 2) AS GLOBAL LONG
DIM mbbLHP(51, 2) AS GLOBAL LONG
DIM mhb(51, 2) AS GLOBAL LONG
DIM merr(51, 2) AS GLOBAL LONG
DIM mso(51, 2) AS GLOBAL LONG
DIM msoRHP(51, 2) AS GLOBAL LONG
DIM msoLHP(51, 2) AS GLOBAL LONG
DIM msb(51, 2) AS GLOBAL LONG
DIM mcs(51, 2) AS GLOBAL LONG
DIM mSacF(51, 2) AS GLOBAL LONG
DIM mSacB(51, 2) AS GLOBAL LONG
DIM mGDP(51, 2) AS GLOBAL LONG
DIM StealAttemptsPlayer(51, 2) AS GLOBAL LONG
DIM iScoreBd(2, 10) AS GLOBAL LONG
DIM iScore(2, 30) AS GLOBAL LONG
DIM itruns(2) AS GLOBAL LONG
DIM ithits(2) AS GLOBAL LONG
DIM iterrs(2) AS GLOBAL LONG
DIM GameLOB(2) AS GLOBAL LONG
DIM ipa(2) AS GLOBAL LONG
DIM np(2) AS GLOBAL LONG
DIM iyp(15, 2) AS GLOBAL LONG
DIM LastPiAd(2) AS GLOBAL LONG
DIM amgr(2) AS GLOBAL LONG
DIM ibp(2) AS GLOBAL LONG
DIM dp(2) AS GLOBAL LONG
DIM mpp(9) AS GLOBAL LONG
DIM SoundQ(10) AS GLOBAL LONG
DIM AutoLineUpSw(2) AS GLOBAL LONG
DIM HoleStatus(32) AS GLOBAL LONG
DIM BasPatRow(5) AS GLOBAL LONG
DIM BasPatCol(5) AS GLOBAL LONG
DIM ERRSw(2) AS GLOBAL LONG
DIM StBSw(2) AS GLOBAL LONG
DIM NewStyle(2) AS GLOBAL LONG
DIM NewStyleWithSaves(2) AS GLOBAL LONG
DIM CloserIn(2) AS GLOBAL LONG
DIM PitcherBatted(2) AS GLOBAL LONG
DIM DHDATOvr(2) AS GLOBAL LONG
DIM Gender(2) AS GLOBAL LONG
DIM TeamAttr(2) AS GLOBAL LONG
DIM StealAttemptsTeam(2) AS GLOBAL LONG
DIM SumErrors(10) AS GLOBAL LONG
DIM SumAssists(10) AS GLOBAL LONG
DIM SumPutouts(10) AS GLOBAL LONG
DIM pHRind(2) AS GLOBAL LONG
DIM DupNameTeam(2) AS GLOBAL LONG
DIM LeagueRating(2) AS GLOBAL LONG
DIM LgTotInns(3) AS GLOBAL LONG
DIM LgTotHits(3) AS GLOBAL LONG
DIM LgTot2B(3) AS GLOBAL LONG
DIM LgTot3B(3) AS GLOBAL LONG
DIM LgTotHR(3) AS GLOBAL LONG
DIM LgTotBB(3) AS GLOBAL LONG
DIM P32(10) AS GLOBAL LONG
DIM P33(10) AS GLOBAL LONG
DIM P48(10) AS GLOBAL LONG
DIM P52(10) AS GLOBAL LONG
DIM RemoveReason(10) AS GLOBAL LONG
DIM PitchersPerGame(2) AS GLOBAL SINGLE
DIM DefChancesPerGameF(10) AS GLOBAL SINGLE
DIM TeamSpeed(2) AS GLOBAL SINGLE
DIM NormDEF(10) AS GLOBAL SINGLE
DIM pwbaseF(2) AS GLOBAL SINGLE
DIM pkbaseF(2) AS GLOBAL SINGLE
DIM psbaseF(2) AS GLOBAL SINGLE
DIM p1baseF(2) AS GLOBAL SINGLE
DIM p2baseF(2) AS GLOBAL SINGLE
DIM p3baseF(2) AS GLOBAL SINGLE
DIM p4baseF(2) AS GLOBAL SINGLE
DIM phit1bF(2) AS GLOBAL SINGLE
DIM phit2bF(2) AS GLOBAL SINGLE
DIM phit3bF(2) AS GLOBAL SINGLE
DIM phit4bF(2) AS GLOBAL SINGLE
DIM RunsPerGame(3) AS GLOBAL SINGLE
DIM FatRnd(3) AS GLOBAL SINGLE
' LOCAL:
REDIM LAvg(300) AS LAvgType
DIM Flen(13)
DIM Flitrow(13)
DIM Flitcol(13)
DIM Flit$(13)
DIM Frow(13)
DIM Fcol(13)
DIM Fed$(13)
DIM FContents$(13)
DIM ColorDescTable$(15)
DIM LUAltered(2)
DIM TeamsInLeague(2)
DIM PlayUSA AS ASCIIZ * 40
DIM PlayCAN AS ASCIIZ * 40
DIM StopUSA AS ASCIIZ * 40
DIM StopCAN AS ASCIIZ * 40
DIM HBF!(2)
DIM HPF!(2)
' ===============================================
'First executable line
ConsoleToolsAuthorize &hXXXXXXXX 'Console Tools serial number
InitConsoleTools hCurInstance, 0, 0, 3, 0, 0
GraphicsToolsAuthorize &hXXXXXXXX 'Graphics Tools serial number
ConsoleWindow %HIDE
PAGE 1, 1
CURSOR OFF
RANDOMIZE TIMER
'Set default screen size depending on Windows version
winver = 0
ConsRows = 25
ConsCols = 80
j = WindowsVersion(%WIN_MAJORVERSION)
k = WindowsVersion(%WIN_MINORVERSION)
IF j = 4 AND k = 0 THEN 'Windows 95
ConsRows = 35
ConsCols = 102
winver = 0
END IF
IF j = 4 AND k > 0 THEN 'Windows 98/Me
ConsRows = 44
ConsCols = 102
winver = 1
END IF
IF j = 5 THEN
IF k = 0 THEN '2000
ConsRows = 44
ConsCols = 102
winver = 2
END IF
IF k > 0 THEN 'XP
ConsRows = 44
ConsCols = 102
winver = 3
END IF
END IF
IF j > 5 THEN
IF k = 0 THEN 'Vista ?
ConsRows = 44
ConsCols = 102
winver = 4
END IF
IF k = 1 THEN '7
ConsRows = 44
ConsCols = 102
winver = 5
END IF
END IF
MAXPLAYERS = 51
TopPitLim = 35
TRUE = -1
FALSE = 0
KeyF4 = -62
KeyF3 = -61
KeyF2 = -60
KeyEsc = 27
CloseButton$ = CHR$(254)
AbortButton$ = CHR$(249)
nulls$ = ""
HomeDir$ = UCASE$(CURDIR$)
PlayUSA = "PLAY " + HomeDir$ + "\usan.mid"
PlayCAN = "PLAY " + HomeDir$ + "\canada.mid"
StopUSA = "STOP " + HomeDir$ + "\usan.mid"
StopCAN = "STOP " + HomeDir$ + "\canada.mid"
%directorymask = 16
PosDesc(1) = "the mound"
PosDesc(2) = "the catcher"
PosDesc(3) = "first"
PosDesc(4) = "second"
PosDesc(5) = "third"
PosDesc(6) = "short"
PosDesc(7) = "left"
PosDesc(8) = "center"
PosDesc(9) = "right"
'Increasing numbers yield fewer errors
'Decreasing numbers yield more errors
DefChancesPerGameF(0) = 0.
DefChancesPerGameF(1) = 1.0 'hardcoded later at .952
DefChancesPerGameF(2) = 1.0
DefChancesPerGameF(3) = 2.2
DefChancesPerGameF(4) = 5.7
DefChancesPerGameF(5) = 2.9
DefChancesPerGameF(6) = 4.8
DefChancesPerGameF(7) = 1.85
DefChancesPerGameF(8) = 2.45
DefChancesPerGameF(9) = 1.85
DefChancesPerGameF(10) = 0.
NormDEF(1) = .952
NormDEF(2) = .990
NormDEF(3) = .993
NormDEF(4) = .981
NormDEF(5) = .953
NormDEF(6) = .967
NormDEF(7) = .977
NormDEF(8) = .984
NormDEF(9) = .981
NormDEF(10) = .999
'Outs (exc K's) Pitch Count Distribution average = 3.2
P32(1) = 1
P32(2) = 1
P32(3) = 2
P32(4) = 3
P32(5) = 3
P32(6) = 4
P32(7) = 4
P32(8) = 4
P32(9) = 5
P32(10)= 6
'Hits Pitch Count Distribution average = 3.3
P33(1) = 1
P33(2) = 1
P33(3) = 2
P33(4) = 3
P33(5) = 3
P33(6) = 4
P33(7) = 4
P33(8) = 5
P33(9) = 5
P33(10)= 6
'Strike Out Pitch Count Distribution average = 4.8
P48(1) = 3
P48(2) = 3
P48(3) = 4
P48(4) = 5
P48(5) = 5
P48(6) = 5
P48(7) = 6
P48(8) = 6
P48(9) = 6
P48(10)= 7
'Walk Pitch Count Distribution average = 5.2
P52(1) = 4
P52(2) = 4
P52(3) = 5
P52(4) = 5
P52(5) = 5
P52(6) = 5
P52(7) = 5
P52(8) = 6
P52(9) = 6
P52(10)= 8
'Load Background color descriptions
ColorDescTable$(0) = "BLACK"
ColorDescTable$(1) = "BLUE"
ColorDescTable$(2) = "GREEN"
ColorDescTable$(3) = "CYAN"
ColorDescTable$(4) = "RED"
ColorDescTable$(5) = "MAGENTA"
ColorDescTable$(6) = "BROWN"
ColorDescTable$(7) = "DONTUSE"
ColorDescTable$(8) = "GRAY"
ColorDescTable$(9) = "BRIGHT BLUE" 'bright blue
ColorDescTable$(10) = "BRIGHT GREEN" 'bright green - need dark forground
ColorDescTable$(11) = "BRIGHT CYAN" 'very light(powder) blue - need dark forground
ColorDescTable$(12) = "BRIGHT RED" 'bright red
ColorDescTable$(13) = "BRIGHT MAGENTA" 'almost pink
ColorDescTable$(14) = "YELLOW" 'bright yellow - need dark forground
ColorDescTable$(15) = "WHITE" 'nice
'.SCH file field offset data
SubRecLen = 28
VisiOffset = 1
HomeOffset = 9
OptiOffset = 17
STSOpen = FALSE
Owner$ = " SBS "
FOR i = 1 TO 11
Pos(i) = READ$(i)
NEXT
DATA "P ","C ",1B,2B,3B,SS,LF,CF,RF,DH," "
' Check existense of message file
IF LEN(DIR$("BASEBALL.MSG")) = 0 THEN
GOSUB DeclareConsole
x$ = "The BASEBALL.MSG file was not found in the home directory."
CALL ErrorBox (x$)
GOTO QuickEnd
END IF
Reconfigure:
' Load default League Averages
' Load editor and custom League Averages if desired
HiLvlHits = 5
HiLvlHRs = 3
HiLvlSBs = 4
HiLvlRBIs = 7
HiLvlSOs = 14
HiLvlPHits = 2
HiLvlBStr = 20
LPTNum = 1
RegInns = 9
IF winver < 2 THEN
EditorSpec$ = "\WINDOWS\notepad.exe "
WordPadSpec$ = "\Program Files\Accessories\wordpad.exe "
ELSEIF winver = 2 THEN
EditorSpec$ = "\WINNT\system32\notepad.exe "
WordPadSpec$ = "\Program Files\Windows NT\Accessories\wordpad.exe "
ELSEIF winver > 2 THEN
IF LEN(DIR$("\WINNT\system32\notepad.exe")) THEN
EditorSpec$ = "\WINNT\system32\notepad.exe "
ELSE
EditorSpec$ = "\WINDOWS\system32\notepad.exe "
END IF
WordPadSpec$ = "\Program Files\Windows NT\Accessories\wordpad.exe "
END IF
CmdStar$ = "STARBOX.TXT"
CmdPic$ = "wrigley1.jpg"
CmdFireworks$ = "Y"
CmdParkEffects$ = "Y"
CmdHomeFieldAdv$ = "Y"
CmdAltFont$ = "N"
CmdSound$ = "Y"
CmdDel = 3
CmdRetroMode$ = "N"
CmdPitchersTank$ = "Y"
CmdDeadBallAdj$ = "Y"
ColorScheme = 5
RefreshStandings = 20
ProtectSCH = FALSE
ForceSBAlways = FALSE
Force2TmLineup = FALSE
StrictCloserRule = FALSE
DaysOffRule = FALSE
WarmUpRule = FALSE
BatterOveruse = FALSE
AutoCoach = FALSE
AutoDefense = FALSE
BlockDoubleSwitch = FALSE
AllowStartersInRelief = FALSE
OutOfPositionMsg = TRUE
IF LEN(DIR$("BASEBALL.CFG")) THEN
OPEN "BASEBALL.CFG" FOR INPUT AS #1 LEN = 128
LAvgNdx = 0
DO WHILE NOT EOF(1)
LINE INPUT #1, rec$
rec$ = UCASE$(rec$)
xS$ = MID$(rec$, 1, 4)
yS$ = MID$(rec$, 1, 5)
IF MID$(rec$, 1, 7) = "EDITOR=" THEN
EditorSpec$ = RTRIM$(MID$(rec$, 8)) + " "
ELSEIF MID$(rec$, 1, 13) = "M-MODE-SOUND=" THEN
CmdSound$ = RTRIM$(MID$(rec$, 14, 1))
ELSEIF MID$(rec$, 1, 13) = "M-MODE-DELAY=" THEN
CmdDel = VAL(RTRIM$(MID$(rec$, 14, 1)))
ELSEIF MID$(rec$, 1, 13) = "CONSOLE-ROWS=" THEN
IF MenuOpt$ <> "P" THEN ConsRows = VAL(MID$(rec$, 14, 2))
ELSEIF MID$(rec$, 1, 13) = "CONSOLE-COLS=" THEN
IF MenuOpt$ <> "P" THEN ConsCols = VAL(MID$(rec$, 14))
ELSEIF MID$(rec$, 1, 9) = "TEXT-MODE" THEN
IF MenuOpt$ <> "P" THEN
IF MID$(rec$, 11, 1) <> "N" THEN
ConsRows = 25
ConsCols = 80
END IF
END IF
ELSEIF MID$(rec$, 1, 10) = "RETRO-MODE" THEN
IF MenuOpt$ <> "P" THEN
IF MID$(rec$, 12, 1) <> "N" THEN
ConsRows = 25
ConsCols = 80
CmdRetroMode$ = "Y"
END IF
END IF
ELSEIF MID$(rec$, 1, 8) = "WORDPAD=" THEN
WordPadSpec$ = RTRIM$(MID$(rec$, 9)) + " "
ELSEIF MID$(rec$, 1, 10) = "FIREWORKS=" THEN
CmdFireworks$ = MID$(rec$, 11, 1)
ELSEIF MID$(rec$, 1, 16) = "DISPLAY-FATIGUE=" THEN
CmdPitchersTank$ = MID$(rec$, 17, 1)
ELSEIF MID$(rec$, 1, 12) = "FIELD-PHOTO=" THEN
CmdPic$ = RTRIM$(MID$(rec$, 13))
ELSEIF MID$(rec$, 1, 4) = "AUX=" THEN
AuxSpec$ = RTRIM$(MID$(rec$, 5)) + " "
ELSEIF MID$(rec$, 1, 13) = "HOME-RUN-WAV=" THEN
CmdHRWav$ = MID$(rec$, 14)
ELSEIF MID$(rec$, 1, 4) = "LPT=" THEN
LPTNum = VAL(MID$(rec$, 5, 1))
ELSEIF MID$(rec$, 1, 16) = "STAT-TEAM-LIMIT=" THEN
STATTEAMLIMIT = VAL(MID$(rec$, 17))
ELSEIF MID$(rec$, 1, 10) = "DATA-PATH=" THEN
CmdPath$ = RTRIM$(MID$(rec$, 11))
IF RIGHT$(CmdPath$, 1) <> "\" THEN
CmdPath$ = CmdPath$ + "\"
END IF
ELSEIF MID$(rec$, 1, 11) = "WRITE-PATH=" THEN
CmdWritePath$ = RTRIM$(MID$(rec$, 12))
IF RIGHT$(CmdWritePath$, 1) <> "\" THEN
CmdWritePath$ = CmdWritePath$ + "\"
END IF
ELSEIF MID$(rec$, 1, 19) = "REGULATION-INNINGS=" THEN
RegInns = VAL(MID$(rec$, 20))
ELSEIF MID$(rec$, 1, 13) = "COLOR-SCHEME=" THEN
ColorScheme = VAL(MID$(rec$, 14, 1))
ELSEIF MID$(rec$, 1, 18) = "REFRESH-STANDINGS=" THEN
RefreshStandings = VAL(MID$(rec$, 19))
ELSEIF MID$(rec$, 1, 13) = "PARK-EFFECTS=" THEN
CmdParkEffects$ = MID$(rec$, 14, 1)
ELSEIF MID$(rec$, 1, 15) = "ALTERNATE-FONT=" THEN
CmdAltFont$ = MID$(rec$, 16, 1)
ELSEIF MID$(rec$, 1, 13) = "DEADBALL-ADJ=" THEN
CmdDeadBallAdj$ = MID$(rec$, 14, 1)
ELSEIF MID$(rec$, 1, 11) = "PROTECT-SCH" THEN
IF MID$(rec$, 13, 1) <> "N" THEN
ProtectSCH = TRUE
END IF
ELSEIF MID$(rec$, 1, 16) = "FORCE-SCOREBOARD" THEN
IF MID$(rec$, 18, 1) <> "N" THEN
ForceSBAlways = TRUE
END IF
ELSEIF MID$(rec$, 1, 12) = "FORCE-LINEUP" THEN
IF MID$(rec$, 14, 1) <> "N" THEN
Force2TmLineup = TRUE
END IF
ELSEIF MID$(rec$, 1, 18) = "STRICT-CLOSER-RULE" THEN
IF MID$(rec$, 20, 1) <> "N" THEN
StrictCloserRule = TRUE
END IF
ELSEIF MID$(rec$, 1, 13) = "DAYS-OFF-RULE" THEN
IF MID$(rec$, 15, 1) <> "N" THEN
DaysOffRule = TRUE
END IF
ELSEIF MID$(rec$, 1, 11) = "WARMUP-RULE" THEN
IF MID$(rec$, 13, 1) <> "N" THEN
WarmUpRule = TRUE
END IF
ELSEIF MID$(rec$, 1, 14) = "BATTER-OVERUSE" THEN
IF MID$(rec$, 16, 1) <> "N" THEN
BatterOveruse = TRUE
END IF
ELSEIF MID$(rec$, 1, 9) = "AUTOCOACH" THEN
IF MID$(rec$, 11, 1) <> "N" THEN
AutoCoach = TRUE
END IF
ELSEIF MID$(rec$, 1, 11) = "AUTODEFENSE" THEN
IF MID$(rec$, 13, 1) <> "N" THEN
AutoDefense = TRUE
END IF
ELSEIF MID$(rec$, 1, 19) = "OUT-OF-POSITION-MSG" THEN
IF MID$(rec$, 21, 1) = "N" THEN
OutOfPositionMsg = FALSE
END IF
ELSEIF MID$(rec$, 1, 16) = "NO-DOUBLE-SWITCH" THEN
IF MID$(rec$, 18, 1) <> "N" THEN
BlockDoubleSwitch = TRUE
END IF
ELSEIF MID$(rec$, 1, 20) = "STARTERS-MAY-RELIEVE" THEN
IF MID$(rec$, 22, 1) <> "N" THEN
AllowStartersInRelief = TRUE
END IF
ELSEIF MID$(rec$, 1, 6) = "HILITE" THEN
HiLvlHits = VAL(MID$(rec$, 11, 6))
HiLvlHRs = VAL(MID$(rec$, 18, 6))
HiLvlRBIs = VAL(MID$(rec$, 25, 6))
HiLvlSBs = VAL(MID$(rec$, 32, 6))
HiLvlPHits = VAL(MID$(rec$, 39, 6))
HiLvlSOs = VAL(MID$(rec$, 46, 6))
HiLvlBStr = VAL(MID$(rec$, 53, 6))
IF HiLvlBStr = 0 THEN HiLvlBStr = 20
IF HiLvlHits = 0 OR HiLvlHRs = 0 OR HiLvlRBIs = 0 OR HiLvlSBs = 0 OR HiLvlSOs = 0 THEN
GOSUB DeclareConsole
CALL MyBeep
x$ = "Warning: Problem with HILITE line of BASEBALL.CFG!"
CALL ErrorBox (x$)
END IF
ELSEIF NUMERIC(xS$, FALSE, FALSE) OR LEFT$(xS$, 3) = "DEF" THEN
IF LAvgNdx < 300 THEN INCR LAvgNdx
j = VAL(MID$(rec$, 18, 6)) 'hits
k = VAL(MID$(rec$, 25, 6)) 'doubles
L = VAL(MID$(rec$, 32, 6)) 'triples
m = VAL(MID$(rec$, 39, 6)) 'homers
N = VAL(MID$(rec$, 46, 6)) 'walks
o = VAL(MID$(rec$, 53, 6)) 'strike outs
p = VAL(MID$(rec$, 60, 6)) 'teams in league
q!= VAL(MID$(rec$, 67, 6)) 'runs-per-game (per team)
r = VAL(MID$(rec$, 74, 3)) 'league rating
IF r = 0 THEN r = 100
s = j - k - L - m 'singles
IF j = 0 OR k = 0 OR L = 0 OR m = 0 OR N = 0 THEN
GOSUB DeclareConsole
CALL MyBeep
x$ = "Warning: Problem with League Average data in|"
x$ = x$ + "Line " + yS$ + " of BASEBALL.CFG!"
CALL ErrorBox(x$)
END IF
bD = VAL(MID$(rec$, 11, 6)) 'innings
IF j > 0 THEN
IF bD / j > 1.5 OR bD / j < .5 THEN
GOSUB DeclareConsole
CALL MyBeep
x$ = "Warning: Possible problem with League Average data|"
x$ = x$ + "Line "+ yS$ + " of BASEBALL.CFG! Please check."
CALL ErrorBox(x$)
END IF
END IF
bF! = BattersFacedByPit! (bD, j, N, o)
LAvg(LAvgNdx).LAvgYr = MID$(rec$, 1, 4)
LAvg(LAvgNdx).LAvgLg = MID$(rec$, 5, 1)
LAvg(LAvgNdx).LAvgBB = N / bF!
LAvg(LAvgNdx).LAvgSO = o / (bD * 3) '% of outs that are K's
LAvg(LAvgNdx).LAvgS2 = o / bF!
LAvg(LAvgNdx).LAvg1B = s / bF!
LAvg(LAvgNdx).LAvg2B = k / bF!
LAvg(LAvgNdx).LAvg3B = L / bF!
LAvg(LAvgNdx).LAvgHR = m / bF!
LAvg(LAvgNdx).LTeams = p
LAvg(LAvgNdx).LAvgRG = q!
LAvg(LAvgNdx).Rating = r
LAvg(LAvgNdx).Innings = bD
LAvg(LAvgNdx).Hits = j
LAvg(LAvgNdx).Doubles = k
LAvg(LAvgNdx).Triples = L
LAvg(LAvgNdx).HR = m
LAvg(LAvgNdx).BB = N
END IF
LOOP
CLOSE #1
END IF
'Check for Non-Raster Font option
IF CmdAltFont$ = "N" THEN
LPtr$ = CHR$(17)
RPtr$ = CHR$(16)
UpPtr$ = CHR$(30)
DnPtr$ = CHR$(31)
xUpPtr$ = CHR$(24)
xDnPtr$ = CHR$(25)
xLPtr$ = CHR$(27)
xRPtr$ = CHR$(26)
ARROWS$ = CHR$(27) + CHR$(18) + CHR$(26)
EnterPtr$ = CHR$(32) + CHR$(17) + CHR$(196) + CHR$(217)
ELSE
LPtr$ = "<"
RPtr$ = ">"
UpPtr$ = "^"
DnPtr$ = "v"
xUpPtr$ = "u"
xDnPtr$ = "d"
xLPtr$ = "<"
xRPtr$ = ">"
ARROWS$ = "<|>"
EnterPtr$ = " <" + CHR$(196) + CHR$(217)
END IF
'Check command$ here?
SimGameCtr = 0
SchedSw = FALSE
SeriesSw = FALSE
DspSw = TRUE 'Does not hide the options
NewUI = TRUE
ForceCLS = TRUE
RegDsply = TRUE
'-------------------------------------------
' Check the COMMAND LINE
'-------------------------------------------
xS$ = COMMAND$
CALL ParseCommand (xS$, nargs)
IF CmdCmdFile$ > "!" THEN
IF LEN(DIR$(CmdCmdFile$)) THEN
OPEN CmdCmdFile$ FOR INPUT AS #1
LINE INPUT #1, xS$
CLOSE #1
CALL ParseCommand (xS$, nargs)
END IF
END IF
CALL SetSwitches (nargs)
SavCmdPath$ = CmdPath$
IF MenuOpt$ = "P" THEN GOTO MenuOptions 'Reconfigure
GOSUB DeclareConsole 'Make it visible also
MidRow = ConsRows \ 2
MidCol = ConsCols \ 2
RowO = MidRow - 12
ColO = MidCol - 40
x$ = "Your Windows version is: " + _
LTRIM$(STR$(WindowsVersion(%WIN_MAJORVERSION))) _
+ "." + LTRIM$(STR$(WindowsVersion(%WIN_MINORVERSION))) _
+ "." + LTRIM$(STR$(WindowsVersion(%WIN_BUILDNUMBER)))
defattr = CalcAttr(15, 1)
QPRINTs 1, 1, x$, defattr
QPRINTs 2, 1, "---------------------------------", defattr
QPRINTs 3, 1, "Initializing...", defattr
DIM PbyP(1500) AS GLOBAL PbyPType
CALL LoadPbyP
SLEEP 500
MOUSE 3, DOUBLE, DOWN
MOUSE ON
'Page 2 is supposed to be a clear blue screen
PAGE 2
COLOR 15, 3
CLS
'Back to Page 1
PAGE 1
Gfx = FALSE
BackgroundPic$ = CmdPic$
IF BackgroundPic$ > "!" THEN GOSUB GetPhotoSpecs 'Returns "Gfx" T or F
GOSUB DefineBitmap 'Go here even if not Gfx!
SimTotal = 0
IF SchedSw THEN
IF LEN(DIR$(CmdPath$ + CmdSch$)) = 0 THEN
x$ = "The schedule file was not found."
CALL ErrorBox(x$)
GOTO QuickEnd
END IF
SimTotal = CountGamesInSCH (nulls$, nulls$, nulls$, nulls$, SubRecLen, VisiOffset, HomeOffset, OptiOffset)
REDIM MMList(100) AS GLOBAL MMType
REDIM RotRec(1500) AS GLOBAL RotType
CALL SetRestartData
GOSUB SetAutoMgr
END IF
IF SeriesSw THEN
IF LEN(DIR$(CmdPath$ + CmdSER$)) = 0 THEN
x$ = "The series file was not found."
CALL ErrorBox(x$)
GOTO QuickEnd
END IF
SimTotal = CountGamesInSER
REDIM RotRec(1500) AS GLOBAL RotType
RTx = 0
'Reopen to get first line of .SER file
OPEN CmdPath$ + CmdSER$ FOR INPUT AS #2 LEN = 128
LINE INPUT #2, xS$
CALL ParseCommand (xS$, nargs)
CALL SetSwitches (nargs)
GOSUB SetAutoMgr
END IF
IF CmdStat$ > "!" THEN GOSUB OpenStatFiles
IF CmdVFil$ > "!" AND CmdHFil$ > "!" THEN
'You are always here from the command line because these
'variables are also set in "SetRestartData"
'We will not display the Logo
'Copy the clear blue screen to Page 1
PCOPY 2, 1
REDIM RotRec(1500) AS GLOBAL RotType
RTx = 0
IF CmdSlotGames > 1 THEN
GOSUB SetAutoMgr
ELSE
IF CmdVAutoMgr$ = "Y" THEN amgr(1) = TRUE
IF CmdHAutoMgr$ = "Y" THEN amgr(2) = TRUE
END IF
'Default stuff for command-line
IF CmdSpot$ = nulls$ THEN CmdSpot$ = "N"
IF CmdVSpot$ = nulls$ THEN CmdVSpot$ = "N"
IF CmdHSpot$ = nulls$ THEN CmdHSpot$ = "N"
IF CmdFocus$ = nulls$ THEN CmdFocus$ = "N"
IF amgr(1) AND amgr(2) THEN
GOSUB Normalization
IF CmdDelIsOnCommandLine = FALSE THEN CmdDel = 0
IF CmdDel = 0 AND CmdPauseAftGame$ = "N" _
AND CmdPauseAftDate$ = "N" THEN RegDsply = FALSE
DelFac = CmdDel 'Delay Factor from the command line : auto-manage
GOTO LoadTeamFiles
END IF
'We are not in a series/schedule.
'We are not in a multi-game two-team sim.
'We ARE in a single manual game.
'We know both teams.
'We may or may not know the pitchers.
'Either team or both may be auto-managed.
CmdLine = TRUE
MenuOpt$ = "M"
DataFil(1) = CmdVFil$
DataFil(2) = CmdHFil$
DelFac = CmdDel 'Delay Factor from the command line : not auto-manage (inherits "3" if not given)
GOSUB ClearLineupData
GOSUB ClearGameData
GOTO LoadManual
END IF
'------------------------------------------
' Opening Screen
'------------------------------------------
IF Gfx THEN
GOSUB DefineBigBitmap
ELSE
PCOPY 2, 1 'Copy the blue screen to Page 1
END IF
zS$ = ""
CALL Logo(zS$)
IF Gfx THEN
CALL EliminateHole(32)
END IF
FromLogo = TRUE
IF zS$ = "Q" THEN GOTO QuickEnd
'-------------------------------------------
' Process Menu Option Selection
'-------------------------------------------
MenuOptions:
CLOSE 'Close ALL Files
COLOR 15, 3
CLS
IF Gfx THEN
IF FromLogo = FALSE THEN
FOR n = 1 TO 32
CALL EliminateHole(n)
NEXT
GOSUB DefineBigBitmap
CALL ShowGfx
END IF
ELSE
PCOPY 2, 1
END IF
REDIM amgr(2) AS GLOBAL LONG
STSOpen = FALSE
REDIM BSum(0 TO 1) AS GLOBAL BatSummary
REDIM PSum(0 TO 1) AS GLOBAL PitSummary
REDIM FSum(0 TO 1) AS GLOBAL FldSummary
UseBigP = FALSE
UseBigB = FALSE
CmdPath$ = SavCmdPath$
MenuOpt$ = MenuRoutine2$
FromLogo = FALSE
IF Gfx THEN
COLOR 15, 3
CLS
CALL EliminateHole(32)
GOSUB DefineBitmap
CALL HideGfx
END IF
LOCATE 1, 1
CURSOR OFF 'hide cursor
IF MenuOpt$ = "Q" THEN GOTO QuickEnd
'----------------------
'Options P: Edit BASEBALL.CFG
'----------------------
IF MenuOpt$ = "P" THEN
zS$ = EditorSpec$ + "baseball.cfg"
ShowWindState& = 1
ConsoleShell zS$, ShowWindState& 'this will launch in separate window
SLEEP 1000
CALL DrawFrm(10+rowO, 12+colO, 18+rowO, 68+colO, defattr, nulls$, nulls$, 0, 0, 0)
QPRINTs 12+rowO, 14+colO, " Apply changes now? [y/N] ", defattr
QPRINTs 14+rowO, 14+colO, " Note: Changes to the console window size require ", dimattr
QPRINTs 15+rowO, 14+colO, " shutting down and restarting SBS before they ", dimattr
QPRINTs 16+rowO, 14+colO, " take effect. ", dimattr
LOCATE 12+rowO, 40+colO
IF YESorNO$(revfor, revbac, deffor, defbac, "N") = "Y" THEN
GOTO Reconfigure
ELSE
GOTO MenuOptions
END IF
END IF
'----------------------
'Options R: Read Doc
'----------------------
IF MenuOpt$ = "R" THEN
CALL ShowDoc
GOTO MenuOptions
END IF
'----------------------
'Option F: File Viewer
'----------------------
IF MenuOpt$ = "F" THEN
DO
r1 = 2
r2 = ConsRows - 3
c1 = 4
c2 = ConsCols - 5
QPRINTs MidRow, MidCol-10, " Loading file names... ", defattr
FileLimit = 1500
REDIM List1(1 TO FileLimit) AS List1Type
n = 0
Fil$ = CmdWritePath$ + "*.TXT"
CALL LoadFilesToList1 (Fil$, List1(), FileLimit, n)
Fil$ = CmdWritePath$ + "*.PRN"
CALL LoadFilesToList1 (Fil$, List1(), FileLimit, n)
Fil$ = CmdWritePath$ + "*.LOG"
CALL LoadFilesToList1 (Fil$, List1(), FileLimit, n)
Fil$ = "*.DOC"
CALL LoadFilesToList1 (Fil$, List1(), FileLimit, n)
Fil$ = CmdWritePath$ + "*.RTF"
CALL LoadFilesToList1 (Fil$, List1(), FileLimit, n)
Fil$ = CmdWritePath$ + "*. "
CALL LoadFilesToList1 (Fil$, List1(), FileLimit, n)
ARRAY SORT List1(1) FOR n, FROM 1 TO 12, DESCEND
CALL DrawFrm(r1, c1, r2, c2, defattr, "View Misc. Files", "ENTER:View Del:Delete ESC:Menu", 1, 0, 2)
DO
nr = r2-r1-1
nc = (c2-c1-1) \ 14
CALL PickFromList(List1(), n, nr, nc, 12, r1, c1, r2, c2, dimattr, revattr, Pick, RetKey, nulls$, mous, ms$)
IF RetKey = KeyEsc OR RetKey = KeyF3 THEN EXIT DO
IF Pick > 0 THEN
IF RetKey = -83 THEN 'Delete
CALL DrawFrm(19+rowO, 32+colO, 21+rowO, 50+colO, defattr, nulls$, nulls$, 0, 0, 0)
QPRINTs 20+rowO, 33+colO, " Are you sure? ", defattr
LOCATE 20+rowO, 48+colO
IF YESorNO$(7, 0, deffor, defbac, "N") = "Y" THEN
CALL KillIt(RTRIM$(List1(Pick).ListItem))
END IF
EXIT DO
ELSE
QPush
x$ = RTRIM$(List1(Pick).ListItem)
IF UCASE$(RIGHT$(x$, 4)) = ".DOC" OR UCASE$(RIGHT$(x$, 4)) = ".RTF" THEN
' SHELL WordPadSpec$ + " " + x$
'this will launch in separate window
ShowWindState& = 1
zS$ = WordPadSpec$ + " " + x$
ConsoleShell zS$, ShowWindState&
ELSE
CALL ListFile(CmdWritePath$ + x$)
END IF
QPop
END IF
END IF
RetKey = -99 'forces PickFromList to just wait for input
LOOP
ERASE List1
LOOP WHILE RetKey = -83 'catches "delete" -> redisplays
GOTO MenuOptions
END IF
'----------------------------------------
'Options A: Display and Select Stat Files
'----------------------------------------
IF MenuOpt$ = "A" THEN
PCOPY 2, 1
'Show STAT Files and Pick One
FileLimit = 500
IF CmdWritePath$ > "!" THEN
CurrentDir$ = CmdWritePath$
ELSE
CurrentDir$ = HomeDir$
END IF
IF RIGHT$(CurrentDir$, 1) <> "\" THEN CurrentDir$ = CurrentDir$ + "\"
DO
REDIM List1(1 TO FileLimit) AS List1Type
RetKey = -97
ReadDirsA:
GOSUB LoadDirsToList1 'returns n
'Directory Tree Frame
IF RetKey = -97 THEN
j = 0: c1$ = CHR$(193): c2$ = CHR$(194)
ELSE
j = 1: c1$ = CHR$(208): c2$ = CHR$(210)
END IF
CALL DrawFrm(2+rowO,48+colO, 10+rowO, 78+colO, defattr, "Dbl-click folder", "F4", 0, j, 0)
QPRINTs 5+rowO, 78+colO, c1$, defattr
QPRINTs 6+rowO, 78+colO, UpPtr$, defattr
QPRINTs 7+rowO, 78+colO, DnPtr$, defattr
QPRINTs 8+rowO, 78+colO, c2$, defattr
'Fill instantly return [-97] OR pick a directory
CALL PickFromList(List1(), n, 7, 1, 28, 2+rowO,48+colO, 10+rowO, 78+colO, dimattr, revattr, Pick, RetKey, nulls$, mous, ms$)
IF Pick > 0 THEN
xS$ = RTRIM$(List1(Pick).ListItem)
IF xS$ < "!" THEN GOTO ReadDirsA
IF LEFT$(xS$, 3) = CHR$(192)+CHR$(196)+" " THEN xS$ = MID$(xS$, 4)
CHDIR xS$
CurrentDir$ = UCASE$(CURDIR$)
IF RIGHT$(CurrentDir$, 1) <> "\" THEN CurrentDir$ = CurrentDir$ + "\"
RetKey = -97
GOTO ReadDirsA
END IF
RetKey = 0
'Files Frame
Fil$ = CurrentDir$ + "*.STS"
CALL PickAFile (Fil$, FileLimit, List1(), RetKey, Pick, mous, 1)
IF RetKey = KeyF4 OR (RetKey = KeyEsc AND mous = TRUE) THEN
CALL DrawFrm (2+rowO, 2+colO, 10+rowO, 46+colO, defattr, "Statistics Files", "DEL:Delete ESC:Menu", 0, 0, 0)
GOTO ReadDirsA
END IF
LOOP WHILE RetKey = -83 '[D]elete must redisplay
CHDIR HomeDir$
IF RetKey = KeyEsc OR RetKey = KeyF3 OR Pick = 0 THEN GOTO MenuOptions
CmdStat$ = RTRIM$(List1(Pick).ListItem)
ERASE List1
CALL StatsIO (Flds, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
CmdStat$ = nulls$
GOTO MenuOptions
END IF
'---------------------
'Options M, T, S, E
'---------------------
'Manual / Two-team / Sch / Ser
DisplaySchFiles:
PCOPY 2, 1
IF MenuOpt$ = "T" OR MenuOpt$ = "S" OR MenuOpt$ = "E" THEN
REDIM RotRec(1500) AS GLOBAL RotType
RTx = 0
REDIM MMList(100) AS GLOBAL MMType
MMx = 0
REDIM WLRec(1 TO 1500) AS GLOBAL WLType
WLx = 0
END IF
'-------------------------------------------
'Options S: Display and Select Schedule file
'-------------------------------------------
IF MenuOpt$ = "S" THEN
'Show Schedule Files and Pick One
FileLimit = 150
DO
REDIM List1(1 TO FileLimit) AS List1Type
GOSUB GetCurrentDir 'return CurrentDir$
RetKey = -97
ReadDirsS:
GOSUB LoadDirsToList1 'returns n
'Directory Tree Frame
IF RetKey = -97 THEN
j = 0: c1$ = CHR$(193): c2$ = CHR$(194)
ELSE
j = 1: c1$ = CHR$(208): c2$ = CHR$(210)
END IF
CALL DrawFrm(2+rowO,48+colO, 10+rowO, 78+colO, defattr, "Dbl-click folder", "F4", 0, j, 0)
QPRINTs 5+rowO, 78+colO, c1$, defattr
QPRINTs 6+rowO, 78+colO, UpPtr$, defattr
QPRINTs 7+rowO, 78+colO, DnPtr$, defattr
QPRINTs 8+rowO, 78+colO, c2$, defattr
'Display left frame and instantly return (-97) or pick a directory
CALL PickFromList(List1(), n, 7, 1, 28, 2+rowO,48+colO, 10+rowO, 78+colO, dimattr, revattr, Pick, RetKey, nulls$, mous, ms$)
IF Pick > 0 THEN
xS$ = RTRIM$(List1(Pick).ListItem)
IF xS$ < "!" THEN GOTO ReadDirsS
IF LEFT$(xS$, 3) = CHR$(192)+CHR$(196)+" " THEN xS$ = MID$(xS$, 4)
CHDIR xS$
CurrentDir$ = UCASE$(CURDIR$)
IF RIGHT$(CurrentDir$, 1) <> "\" THEN CurrentDir$ = CurrentDir$ + "\"
RetKey = -97
GOTO ReadDirsS
END IF
RetKey = 0
'Files Frame
Fil$ = CurrentDir$ + "*.SCH"
CALL PickAFile (Fil$, FileLimit, List1(), RetKey, Pick, mous, 1)
IF RetKey = KeyF4 OR (RetKey = KeyEsc AND mous = TRUE) THEN
CALL DrawFrm (2+rowO, 2+colO, 10+rowO, 46+colO, defattr, "Schedule Files", "[E]dit [N]ew ESC:Menu", 0, 0, 0)
GOTO ReadDirsS
END IF
LOOP WHILE RetKey = 78 OR RetKey = 110 '[N]EW must redisplay
CHDIR HomeDir$
IF RetKey = KeyEsc OR RetKey = KeyF3 OR Pick = 0 THEN GOTO MenuOptions
CmdSCH$ = RTRIM$(List1(Pick).ListItem)
CmdPath$ = CurrentDir$
'Opportunity to Pick a Single Team and/or Date Range
CALL SCHDateTeamIO (Keyed, Flds, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
IF Keyed = KeyF3 THEN
ERASE List1
CmdSCH$ = nulls$
CHDIR HomeDir$
GOTO MenuOptions
END IF
SchedSw = TRUE
ERASE List1
'Pick from ActiveSTAT(*)
CALL CountActiveSTATFiles
IF STx > 0 AND ProtectSCH = FALSE THEN
FileLimit = 150
REDIM List1(1 TO FileLimit) AS List1Type
FOR i = 1 TO STx
List1(i).ListItem = ActiveSTAT(i)
NEXT
StatFrame:
CALL DrawFrm(8+rowO, 22+colO, 15+rowO, 57+colO, defattr, "Stat Files for this .SCH", "Dbl-click selection or ENTER", 1, 0, 1)
QPRINTs 14+rowO, 27+colO, "F10:Reset ESC:None", dimattr
COLOR deffor, defbac
CALL PickFromList(List1(), STx, 5, 2, 8, 8+rowO, 22+colO, 15+rowO, 57+colO, dimattr, revattr, Pick, RetKey, nulls$, mous, ms$)
IF Pick > 0 THEN
CmdStat$ = RTRIM$(List1(Pick).ListItem)
END IF
ERASE List1
'Special Case (F10) to Clear the STAT File List
IF RetKey = -68 THEN CALL ClearActiveSTATRec
END IF
'Pick Rotation Scheme for Schedule Runs
CALL RotationMethIO (Flds, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
IF CmdSP$ = nulls$ THEN CmdSCH$ = nulls$: SchedSw = FALSE: GOTO DisplaySchFiles
'Set DH option
GOSUB SkedAskDH
CALL StatRecordSetup (Flds, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
CALL StatRecordIO (RetKey, Flds, 3, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
SimTotal = CountGamesInSCH (CmdFavLeague$, CmdFavTeam$, CmdDateL$, CmdDateH$, SubRecLen, VisiOffset, HomeOffset, OptiOffset)
CALL SetRestartData
IF CmdStat$ > "!" THEN GOSUB OpenStatFiles
END IF
'-------------------------------------------
'Options E: Display and Select Serial file
'-------------------------------------------
IF MenuOpt$ = "E" THEN
'Show Series Files and Pick One
FileLimit = 150
REDIM List1(1 TO FileLimit) AS List1Type
GOSUB GetCurrentDir 'return CurrentDir$
RetKey = -97
ReadDirsE:
GOSUB LoadDirsToList1 'returns n
'Directory Tree Frame
IF RetKey = -97 THEN
j = 0: c1$ = CHR$(193): c2$ = CHR$(194)
ELSE
j = 1: c1$ = CHR$(208): c2$ = CHR$(210)
END IF
CALL DrawFrm(2+rowO,48+colO, 10+rowO, 78+colO, defattr, "Dbl-click folder", "F4", 0, j, 0)
QPRINTs 5+rowO, 78+colO, c1$, defattr
QPRINTs 6+rowO, 78+colO, UpPtr$, defattr
QPRINTs 7+rowO, 78+colO, DnPtr$, defattr
QPRINTs 8+rowO, 78+colO, c2$, defattr
'Display left frame and instantly return (-97) or pick a directory
CALL PickFromList(List1(), n, 7, 1, 28, 2+rowO,48+colO, 10+rowO, 78+colO, dimattr, revattr, Pick, RetKey, nulls$, mous, ms$)
IF Pick > 0 THEN
xS$ = RTRIM$(List1(Pick).ListItem)
IF xS$ < "!" THEN GOTO ReadDirsE
IF LEFT$(xS$, 3) = CHR$(192)+CHR$(196)+" " THEN xS$ = MID$(xS$, 4)
CHDIR xS$
CurrentDir$ = UCASE$(CURDIR$)
IF RIGHT$(CurrentDir$, 1) <> "\" THEN CurrentDir$ = CurrentDir$ + "\"
RetKey = -97
GOTO ReadDirsE
END IF
RetKey = 0
'Files Frame
Fil$ = CurrentDir$ + "*.SER"
CALL PickAFile (Fil$, FileLimit, List1(), RetKey, Pick, mous, 1)
IF RetKey = KeyF4 OR (RetKey = KeyEsc AND mous = TRUE) THEN
CALL DrawFrm (2+rowO, 2+colO, 10+rowO, 46+colO, defattr, "Series Files", "[V]iew [E]dit [N]ew ESC:Menu", 0, 0, 0)
GOTO ReadDirsE
END IF
CHDIR HomeDir$
IF RetKey = KeyEsc OR RetKey = KeyF3 OR Pick = 0 THEN GOTO MenuOptions
CALL RotationMethIO (Flds, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
IF CmdSP$ = nulls$ THEN GOTO DisplaySchFiles
CmdSER$ = RTRIM$(List1(Pick).ListItem)
FILPath$ = CurrentDir$
SeriesSw = TRUE
ERASE List1
GOSUB SkedAskDH
CALL StatRecordSetup (Flds, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
CALL StatRecordIO (RetKey, Flds, 3, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
CmdPath$ = FILPath$
SimTotal = CountGamesInSER
'Parse 1st line of .SER
OPEN CmdPath$ + CmdSER$ FOR INPUT AS #2 LEN = 128
LINE INPUT #2, xS$
CALL ParseCommand (xS$, nargs)
CALL SetSwitches (nargs)
IF CmdStat$ > "!" THEN GOSUB OpenStatFiles
END IF
'------------------------
'Schedule/Serial Settings
'Options S and E
'------------------------
IF MenuOpt$ = "S" OR MenuOpt$ = "E" THEN
CALL MoreOptionsIO (8, Flds, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
GOSUB Normalization
ForceCLS = TRUE
IF DelFac = 0 AND CmdPauseAftGame$ = "N" _
AND CmdPauseAftDate$ = "N" THEN
RegDsply = FALSE
ELSE
RegDsply = TRUE
END IF
GOSUB SetAutoMgr
END IF
'------------------------------------------------
' Normal ReEntry point for new .sch/.ser lines
' Applies to Options: M, T, S, E
'------------------------------------------------
LoadTeamFiles:
LL = 1
GOSUB ClearLineupData
GOSUB ClearGameData
SaveMMGameStatus = MMGame
MMGame = FALSE
LastPic$ = BackgroundPic$
BackgroundPic$ = CmdPic$
'------------------------------------------------
' Sched / sEries / Command-line
'------------------------------------------------
IF CmdVFil$ > "!" AND CmdHFil$ > "!" THEN
'Load team files from disk
DataFil(1) = CmdVFil$
DataFil(2) = CmdHFil$
REDIM DLN(MAXPLAYERS, 2) AS GLOBAL LONG '"Duplicate Last Name"
REDIM HBF!(2)
REDIM HPF!(2)
REDIM ParkBatAdj(2) AS GLOBAL SINGLE
REDIM ParkPitAdj(2) AS GLOBAL SINGLE
FOR it = 1 TO 2
GOSUB LoadDATFile
IF Abort THEN EXIT FOR
NEXT
IF Abort THEN
Abort = FALSE
GOTO ReturnToDOS
END IF
IF CmdParkEffects$ = "Y" THEN GOSUB SetParkEffects
'Mark MM teams
REDIM MMTeam(2)
FOR it = 1 TO 2
IF MMx THEN
IF FoundInMMList(DataFil(it)) THEN MMTeam(it) = TRUE
END IF
NEXT
IF MMTeam(1) OR MMTeam(2) THEN
IF SimGameCtr > 0 THEN
CALL DrawFrm(19+rowO, 21+colO, 24+rowO, 63+colO, defattr, nulls$, nulls$, 0, 0, 1)
xS$ = "The next game is 'Manually-Managed'."
xS$ = SubDoubleQuote$ (xS$)
QPRINTs 21+rowO, 23+colO, xS$, dimattr
xS$ = "Hit 'Q' if you would like to quit now."
xS$ = SubDoubleQuote$ (xS$)
QPRINTs 22+rowO, 23+colO, xS$, dimattr
xS$ = WAITKEY$
IF LEN(xS$)= 4 THEN
msx = MOUSEX
msy = MOUSEY
xS$ = CHR$(SCREEN(msy, msx))
CALL FlashField (msy, msx, 1, 2, 100, 0)
END IF
'Quit before M-M game option
IF UCASE$(xS$) = "Q" THEN
IF CmdStat$ > "!" THEN
GOSUB SaveStatsToDisk
END IF
IF MenuOpt$ = "S" THEN
CALL SetSCHBookMark
CALL UpdSCHRecord1 (" ")
END IF
GOTO QuickEnd
END IF
END IF
END IF
'Get Starting Pitchers from pre-defined rotation
CALL GetNextPitchers 'ipa(tm) <-- N
'AutoLineup
FOR it = 1 TO 2
c = 0
IF MMx THEN
'Dont mess with lineups on MM teams
IF MMTeam(it) = FALSE THEN
IF AutoLineUpSw(it) THEN CALL AutoLineUp (it, c)
END IF
ELSE
IF AutoLineUpSw(it) THEN CALL AutoLineUp (it, c)
END IF
LUAltered(it) = c
NEXT
'DH & "Pitcher Hitting Stats" (if no DH)
CALL SetDH
'Insert Platoon players
CALL SetPlatoon
'Batting Order adjustment
FOR it = 1 TO 2
IF AdjustBO(it) = "Y" OR AdjustBO(it) = "C" OR AdjustBO(it) = "F" THEN
IF MMx THEN
'Dont mess with lineups on MM teams
IF MMTeam(it) = FALSE THEN
IF AdjustBO(it) = "Y" OR _
AdjustBO(it) = "F" OR _
(AdjustBO(it) = "C" AND LUAltered(it)) THEN CALL AdjustBattingOrder (it)
END IF
ELSE
IF AdjustBO(it) = "Y" OR _
AdjustBO(it) = "F" OR _
(AdjustBO(it) = "C" AND LUAltered(it)) THEN CALL AdjustBattingOrder (it)
END IF
END IF
NEXT
IF MMx THEN 'Checks for Manually Managed option
FOR id = 1 TO 2
IF MMTeam(id) THEN
MMGame = TRUE
PCOPY 2, 1
'Opportunity to change starting pitcher!
CALL DrawFrm(4+rowO, 10+colO, 21+rowO, 70+colO, defattr, "Manual Manage Options", nulls$, 1, 0, 1)
QPRINTs 6+rowO, 12+colO, SchDate$, dimattr
IF SimTotal THEN
i = SimGameCtr + 1
x$ = " This is game " + STR$(i) + " of" + STR$(SimTotal)
QPRINTs 6+rowO, 28+colO, x$, dimattr
END IF
'Display Visitor on top : Home on botton
IF id = 1 THEN row = 8+rowO ELSE row = 13+rowO
p = ipa(id)
xS$ = DataName(p, id)
QPRINTs row, 12+colO, "Scheduled to start for YOUR " + RTRIM$(Names(id)) + ":", defattr
QPRINTs row + 1, 15+colO, " W L ERA", defattr
xF! = DataRBI(p, id) / 100
a$ = SPACE$(38)
IF CmdStat$ > "!" AND DaysOffRule = TRUE THEN
m = GetDaysOff (p, id)
IF m THEN
MID$(a$, 22, 1) = LFORMAT$(m, "#")
END IF
END IF
MID$(a$, 1, 20) = FULLNAME$(xS$)
MID$(a$, 24, 2) = DataHand(p, id)
MID$(a$, 27, 2) = LFORMAT$(DataDef(p, id), "##")
MID$(a$, 30, 2) = LFORMAT$(DataSB(p, id), "##")
MID$(a$, 33, 5) = FFORMAT$(xF!, "#0.##")
QPRINTs row + 2, 15+colO, a$, defattr
CALL PitchersWLS (id, p, w, l, s, era!)
a$ = SPACE$(38)
MID$(a$, 27, 2) = LFORMAT$(w, "##")
MID$(a$, 30, 2) = LFORMAT$(l, "##")
MID$(a$, 33, 5) = FFORMAT$(era!, "#0.##")
QPRINTs row + 3, 15+colO, a$ + " [SIM]", defattr
IF row = 8+rowO THEN row = 13+rowO ELSE row = 8+rowO
it = 3 - id
p = ipa(it)
xS$ = DataName(p, it)
QPRINTs row, 12+colO, "Starting for " + RTRIM$(Names(it)) + ":", dimattr
QPRINTs row + 1, 15+colO, " W L ERA", dimattr
xF! = DataRBI(p, it) / 100
a$ = SPACE$(38)
IF CmdStat$ > "!" AND DaysOffRule = TRUE THEN
m = GetDaysOff (p, it)
IF m THEN
MID$(a$, 22, 1) = LFORMAT$(m, "#")
END IF
END IF
MID$(a$, 1, 20) = FULLNAME$(xS$)
MID$(a$, 24, 2) = DataHand(p, it)
MID$(a$, 27, 2) = LFORMAT$(DataDef(p, it), "##")
MID$(a$, 30, 2) = LFORMAT$(DataSB(p, it), "##")
MID$(a$, 33, 5) = FFORMAT$(xF!, "#0.##")
QPRINTs row + 2, 15+colO, a$, dimattr
CALL PitchersWLS (it, p, w, l, s, era!)
a$ = SPACE$(38)
MID$(a$, 27, 2) = LFORMAT$(w, "##")
MID$(a$, 30, 2) = LFORMAT$(l, "##")
MID$(a$, 33, 5) = FFORMAT$(era!, "#0.##")
QPRINTs row + 3, 15+colO, a$ + " [SIM]", dimattr
QPRINTs 19+rowO, 12+colO, "Want to change your starting pitcher? [y/N]", defattr
LOCATE 19+rowO, 56+colO
IF YESorNO$(revfor, revbac, deffor, defbac, "N") = "Y" THEN
DO
CALL PickTheStarter(id, 4, N) '[N]
LOOP WHILE N = 0 'you gotta pick one
ipa(id) = N
np(id) = 1
iyp(1, id) = N
CALL AssignFatigue (id)
CALL SetDH 'Sets Pitcher Hitting Stats also
END IF
'Display Lineup and accept changes
DO
CALL Lineup(id, rv)
CALL DefSwitchSetup (kc, Flds, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
LOOP WHILE kc = KeyF3
IF FContents$(1) = "Y" THEN
PCOPY 2, 1
CALL DefSwitch(4, id)
END IF
END IF 'END Found in MM List
LOCATE 1, 1
CURSOR OFF
NEXT 'Check both teams for Manually Managed option
'Opportunity to mess with opponent's lineup
tm = 0
IF MMTeam(1) = TRUE AND MMTeam(2) = FALSE THEN tm = 2
IF MMTeam(2) = TRUE AND MMTeam(1) = FALSE THEN tm = 1
IF tm THEN
CALL DrawFrm(11+rowO, 21+colO, 15+rowO, 65+colO, defattr, nulls$, nulls$, 0, 0, 0)
QPRINTs 13+rowO, 23+colO, " Want to access your opponent's lineup? ", defattr
LOCATE 13+rowO, 63+colO
IF YESorNO$(7, 0, deffor, defbac, "N") = "Y" THEN
'Display Lineup and accept changes
PCOPY 2, 1
DO
CALL Lineup(tm, rv)
CALL DefSwitchSetup (kc, Flds, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
LOOP WHILE kc = KeyF3
IF FContents$(1) = "Y" THEN
PCOPY 2, 1
CALL DefSwitch(4, tm)
END IF
END IF
END IF
'Set switches for RegDsply and ForceCLS
IF MMGame = FALSE THEN
'This game isn't an MM game, but we are in an MM Schedule
'WAS IF CmdDel = 0 AND etc.
IF CmdPauseAftGame$ = "N" AND CmdPauseAftDate$ = "N" THEN
RegDsply = FALSE
ELSE
RegDsply = TRUE
END IF
IF SaveMMGameStatus = TRUE THEN 'Must CLS if LAST game was MM
SaveMMGameStatus = FALSE
ForceCLS = TRUE
END IF
ELSE 'This game IS an Manually Managed schedule game
RegDsply = TRUE
ForceCLS = TRUE
END IF
END IF
'Save original lineups
CALL SnapShot
'Prepare background photo (assigned in .DAT)
IF (Gfx OR BitmapNRF) AND RegDsply THEN
' x$ = "Back: " + BackgroundPic$ + " Last: " + LastPic$
' CALL ErrorBox (x$)
IF (BackgroundPic$ <> LastPic$) OR MMGame THEN
LastPic$ = BackgroundPic$
COLOR fldfor, fldbac
CLS
IF BackgroundPic$ > "!" THEN GOSUB GetPhotoSpecs
GOSUB DefineBitmap
END IF
END IF
GOTO StartUp
END IF
'--------- MANUAL / TWO-TEAM ----
'New location Statistics Recording
'Options M and T
'---------------------------
IF NOT CmdLine THEN
PCOPY 2, 1
CALL StatRecordSetup (Flds, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
CALL StatRecordIO (RetKey, Flds, 3, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
IF RetKey = KeyF3 THEN
GOTO MenuOptions
ELSE
PCOPY 2, 1
END IF
IF CmdStat$ > "!" THEN GOSUB OpenStatFiles
END IF
'--------------------------------
'Load and sort list of .DAT files
'Options: Manual and Two-team
'--------------------------------
REM QPRINTs 11, 42, " Loading file names... ", defattr
r1 = ((ConsRows - 20) \ 5) + 1 'replaces 2
r2 = ConsRows - r1 'replaces 22
c1 = (ConsCols - 78) \ 2 'replaces 1
c2 = ConsCols - c1 'replaces 79
CmdSlotGames = 0
FileLimit = 1500
REDIM List1(1 TO FileLimit) AS List1Type
GOSUB GetCurrentDir 'return CurrentDir$
tm = 0
RetKey = -97
ReadDirs:
GOSUB LoadDirsToList1
'FOLDER Frame (right)
IF RetKey = -97 THEN
j = 0: c1$ = CHR$(193): c2$ = CHR$(194)
ELSE
j = 1: c1$ = CHR$(208): c2$ = CHR$(210)
END IF
IF tm = 0 THEN
a$ = " Dbl-click (or Enter) VISITING TEAM "
ELSE
a$ = " Dbl-click (or Enter) HOME TEAM "
END IF
CALL DrawFrm(r1, c2-20, r2, c2, defattr, "Dbl-click folder", nulls$, 0, j, 0)
QPRINTs MidRow-1, c2, c1$, defattr
QPRINTs MidRow , c2, UpPtr$, defattr
QPRINTs MidRow+1, c2, DnPtr$, defattr
QPRINTs MidRow+2, c2, c2$, defattr
'FILENAME Frame (left)
CALL DrawFrm(r1, c1, r2, c2-21, defattr, "[V]iew [E]dit [A]ux PgUp/PgDn", a$, 0, (1-j), 2)
'Change attributes for emphasis
attr = CalcAttr(14, 1) 'Yellow on dark blue
CALL ReadFromScreen (r2, 1, ConsCols, field$, " ", Valid$)
ii = INSTR(field$, "VISIT")
IF ii = 0 THEN ii = INSTR(field$, "HOME")
IF ii THEN CALL ChangeAttribute (r2, ii, 13, attr)
j = 1 - j
IF j = 0 THEN
c1$ = CHR$(193): c2$ = CHR$(194)
ELSE
c1$ = CHR$(208): c2$ = CHR$(210)
END IF
QPRINTs MidRow-1, c2-21, c1$, defattr
QPRINTs MidRow , c2-21, UpPtr$, defattr
QPRINTs MidRow+1, c2-21, DnPtr$, defattr
QPRINTs MidRow+2, c2-21, c2$, defattr
'Fill FOLDER frame and instantly return (-97) or pick a directory
CALL PickFromList(List1(), n, r2-r1-1, 1, 17, r1, c2-20, r2, c2, dimattr, revattr, Pick, RetKey, nulls$, mous, ms$)
IF Pick > 0 THEN
xS$ = RTRIM$(List1(Pick).ListItem)
IF xS$ < "!" THEN GOTO ReadDirs
IF LEFT$(xS$, 3) = CHR$(192)+CHR$(196)+" " THEN xS$ = MID$(xS$, 4)
CHDIR xS$
CurrentDir$ = UCASE$(CURDIR$)
IF RIGHT$(CurrentDir$, 1) <> "\" THEN CurrentDir$ = CurrentDir$ + "\"
RetKey = -97
GOTO ReadDirs
END IF
RetKey = 0
'Fill FILENAME Frame
Fil$ = CurrentDir$ + "*.DAT"
n = 0
CALL LoadFilesToList1 (Fil$, List1(), FileLimit, n) ' [n]
TeamsOnFile = n
ARRAY SORT List1(1) FOR n, FROM 1 TO 12, ASCEND
IF n = 1 THEN
IF RTRIM$(List1(1).ListItem) = ".." OR _
RTRIM$(List1(1).ListItem) = "C:\" THEN
TeamsOnFile = 0
END IF
END IF
DO
DO
CALL PickFromList(List1(), TeamsOnFile, r2-r1-1, 4, 12, r1, c1, r2, c2-21, dimattr, revattr, Pick, RetKey, nulls$, mous, ms$)
CALL ExitPickForDAT(List1(), Pick, RetKey)
LOOP WHILE RetKey = -99
IF RetKey = KeyF4 OR (mous AND RetKey = KeyEsc AND ms$ <> CHR$(249)) THEN GOTO ReadDirs
IF ms$ = CHR$(249) OR RetKey = KeyF3 OR RetKey = KeyEsc OR Pick = 0 THEN
CHDIR HomeDir$
GOTO MenuOptions
END IF
INCR tm
DataFil(tm) = RTRIM$(List1(Pick).ListItem)
DATPath(tm) = CurrentDir$
IF tm = 1 THEN
QPRINTs r2+2, c1+11, SPACE$(28), prmattr
QPRINTs r2+2, c1+12, "Visiting Team: " + DataFil(tm) + " ", prmattr
CALL ReadFromScreen (r2, 1, ConsCols, field$, " ", Valid$)
ii = INSTR(field$, "VISIT")
IF ii THEN QPRINTs r2, ii, "HOME TEAM ", defattr
CALL ChangeAttribute (r2, ii, 9, attr)
ELSE
QPRINTs r2+2, c1+39, SPACE$(28), prmattr
QPRINTs r2+2, c1+39, " Home Team: " + DataFil(tm), prmattr
EXIT DO
END IF
LOOP
CHDIR HomeDir$
'----------------------------------------
'Load two selected files into team arrays
'Options M and T [manual command line enters here]
'----------------------------------------
LoadManual:
SavePath$ = CmdPath$
REDIM DLN(MAXPLAYERS, 2) AS GLOBAL LONG
REDIM HBF!(2)
REDIM HPF!(2)
REDIM ParkBatAdj(2) AS GLOBAL SINGLE
REDIM ParkPitAdj(2) AS GLOBAL SINGLE
FOR it = 1 TO 2
IF DATPath(it) > "!" THEN CmdPath$ = DATPath(it)
GOSUB LoadDATFile
NEXT
IF CmdParkEffects$ = "Y" THEN GOSUB SetParkEffects
CmdPath$ = SavePath$
IF NOT CmdLine THEN
QPRINTs r2, c1+9, STRING$(48, CHR$(205)), defattr
END IF
'---------------------------
'Pick the starting pitchers:
'Options M and T
'---------------------------
PickStarters:
COLOR deffor, defbac
FOR tm = 1 TO 2
IF MenuOpt$ = "M" THEN 'Manual
IF tm = 1 THEN
IF CmdVP$ = nulls$ THEN
CALL PickTheStarter(tm, 2, N)
ELSE
N = VAL(CmdVP$) + 9
END IF
END IF
IF tm = 2 THEN
IF CmdHP$ = nulls$ THEN
CALL PickTheStarter(tm, 2, N)
ELSE
N = VAL(CmdHP$) + 9
END IF
END IF
ELSE
PCOPY 2, 1
CALL TwoTeamStarters(tm, N) 'Two team
CmdVP$ = nulls$
CmdHP$ = nulls$
END IF
IF N = 0 THEN 'Back up - no selection made
PCOPY 2, 1
GOTO LoadTeamFiles 'Clear arrays and re-load from disk
END IF
ipa(tm) = N
np(tm) = 1
iyp(1, tm) = N
CALL AssignFatigue (tm)
NEXT
IF NOT CmdLine THEN ERASE List1 'Don't need list of .DAT files any more
'----------------------
'Additional Settings
'Options M and T
'----------------------
IF MenuOpt$ = "T" THEN
PCOPY 2, 1
'set CmdSlotGames
'set Auto-Lineup for each team
'set CmdDH$
'set CmdSpot$
row = 5
CALL TwoTeamSetup (row, Flds, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
CALL TwoTeamIO (RetKey, Flds, 1, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
CmdSlotGames = VAL(FContents$(1))
AutoLineUpSw(1) = (FContents$(2) = "Y")
AutoLineUpSw(2) = (FContents$(3) = "Y")
AdjustBO(1) = FContents$(4)
AdjustBO(2) = FContents$(5)
CmdDH$ = FContents$(6)
CmdSpot$ = FContents$(7)
ELSE
'Manual:
xS$ = DefaultDHResponse$
IF NOT CmdLine THEN
CALL DrawFrm(13+rowO, 22+colO, 15+rowO, 56+colO, defattr, nulls$, nulls$, 1, 0, 0)
QPRINTs 14+rowO, 23+colO, " Use Designated Hitter? [y/N] ", dimattr
LOCATE 14+rowO, 53+colO
CmdDH$ = YESorNO$(revfor, revbac, deffor, defbac, xS$)
ELSE
IF CmdDH$ = nulls$ THEN CmdDH$ = xS$
END IF
COLOR deffor, defbac
END IF
CALL SetDH
CALL SetPlatoon
'---------------------------------
'Display Lineup and accept changes
'Options M and T
'---------------------------------
FOR id = 1 TO 2
IF amgr(id) = 0 THEN
IF (AutoLineUpSw(id) = 0) OR Force2TmLineup THEN
COLOR 15, 3 'Get a sky-blue background
PCOPY 2, 1
DO
CALL Lineup(id, rv)
CALL DefSwitchSetup (kc, Flds, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
LOOP WHILE kc = KeyF3
IF FContents$(1) = "Y" THEN
PCOPY 2, 1
CALL DefSwitch(4, id)
END IF
LOCATE 1, 1
CURSOR OFF
END IF
END IF
NEXT
IF MenuOpt$ = "M" OR MenuOpt$ = "T" THEN
CALL SnapShot
END IF
IF MenuOpt$ = "T" THEN
GOSUB SetAutoMgr
SoundOn = FALSE
PCOPY 2, 1
CALL MoreOptionsIO (6, Flds, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
GOSUB Normalization
ForceCLS = TRUE
IF DelFac = 0 AND CmdPauseAftGame$ = "N" _
AND CmdPauseAftDate$ = "N" THEN
RegDsply = FALSE
ELSE
RegDsply = TRUE
END IF
GOTO StartUp
END IF
'-----------------------------------------------------
' Final Ground Rules - questions to set up Manual Game
' Option M only
'-----------------------------------------------------
IF NOT CmdLine THEN
DelFac = CmdDel
IF DelFac < 2 THEN DelFac = 3
PCOPY 2, 1
CALL GroundRulesIO (Flds, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
Gfx = FALSE
IF ConsRows <> 25 AND ConsCols <> 80 THEN
IF BackgroundPic$ <> "--NONE--" AND BackgroundPic$ > "!" THEN
IF amgr(1) = 0 OR amgr(2) = 0 THEN
r = 17 + rowO
c = 20 + colO
QPRINTs r, c, " One moment please, stretching photograph... ", defattr
END IF
GOSUB GetPhotoSpecs 'sets Gfx to TRUE
END IF
END IF
END IF
GOSUB Normalization
ForceCLS = TRUE
RegDsply = TRUE
'GOSUB DefineBitmap
IF CmdLine OR (amgr(1) AND amgr(2)) THEN 'SetCmdWinData
GOSUB DefineBitmap
GOTO StartUp
END IF
CALL DrawFrm(14+rowO, 7+colO, 22+rowO, 77+colO, defattr, nulls$, nulls$, 1, 0, 1)
xS$ = "V"
yS$ = "H"
NewUI = TRUE
r = 15 + rowO
c = 9 + colO
IF NOT amgr(1) AND NOT amgr(2) THEN
QPRINTs r, c, "The computer is not managing either team.", defattr
QPRINTs r+1, c, "Are there two players involved here?", defattr
QPRINTs r+2, c, "[i.e., do you need to conceal your strategy?] [y/N] ", defattr
LOCATE r+2, 61+colO
IF YESorNO$(revfor, revbac, deffor, defbac, "N") = "Y" THEN
DspSw = FALSE
NewUI = FALSE
xS$ = "S"
yS$ = "5"
END IF
r = 18 + rowO
END IF
IF NOT amgr(1) THEN
QPRINTs r, c, "Visiting team: Press " + CHR$(34) + xS$ + CHR$(34) + " to pop up Strategy window.", defattr
INCR r
END IF
IF NOT amgr(2) THEN
QPRINTs r, c, "Home team : Press " + CHR$(34) + yS$ + CHR$(34) + " to pop up Strategy window.", defattr
INCR r
END IF
INCR r
QPRINTs r, c, "Tip: Click on any empty area on the bottom row of screen to pitch.", defattr
xS$ = CHR$(180) +" Hit/Click Any Key to Begin " + CHR$(195)
QPRINTs 22+rowO, 28+colO, xS$, defattr
COLOR deffor, defbac
LOCATE 1, 1
CURSOR OFF
GOSUB DefineBitmap
PauseIt
'----------------------------------------------------------
' Game starts here
' Special Re-entry point for /N: (more games on same .sch/.ser card)
'----------------------------------------------------------
StartUp:
IF RegDsply AND Gfx THEN
FOR n = 1 TO 32
CALL EliminateHole(n)
NEXT
END IF
LL = 10
GameIsOver = FALSE
Silence = FALSE
GameRnd = FRND(10)
REDIM SimDaysOff(10 TO TopPitLim, 2) AS GLOBAL LONG
' (We use this array both with and without stat files)
IF CmdStat$ > "!" THEN
REDIM SimGames(MAXPLAYERS, 2) AS GLOBAL LONG
REDIM SimAB(MAXPLAYERS, 2) AS GLOBAL LONG
REDIM SimHits(MAXPLAYERS, 2) AS GLOBAL LONG
REDIM SimHR(MAXPLAYERS, 2) AS GLOBAL LONG
REDIM SimRBI(MAXPLAYERS, 2) AS GLOBAL LONG
REDIM SimBStreak(MAXPLAYERS, 2) AS GLOBAL LONG
REDIM SimBB(MAXPLAYERS, 2) AS GLOBAL LONG
REDIM SimSO(MAXPLAYERS, 2) AS GLOBAL LONG
REDIM SimHitsAlw(10 TO TopPitLim, 2) AS GLOBAL LONG
REDIM SimERuns(10 TO TopPitLim, 2) AS GLOBAL LONG
REDIM SimWins(10 TO TopPitLim, 2) AS GLOBAL LONG
REDIM SimLosses(10 TO TopPitLim, 2) AS GLOBAL LONG
REDIM SimSaves(10 TO TopPitLim, 2) AS GLOBAL LONG
REDIM SimBBAlw(10 TO TopPitLim, 2) AS GLOBAL LONG
REDIM SimSO_P(10 TO TopPitLim, 2) AS GLOBAL LONG
REDIM SimInn(10 TO TopPitLim, 2) AS GLOBAL SINGLE
FOR tm = 1 TO 2
CALL LoadSimData (tm)
NEXT
END IF
LL = 20
IF CmdStat$ > "!" AND STSOpen = FALSE THEN
'Re-Open #3 .STS
OPEN CmdWritePath$ + CmdStat$ + ".STS" FOR RANDOM AS #3 LEN = LEN(SSum)
n = LOF(3) / LEN(SSum)
SEEK #3, n + 1 'position random file to append
STSOpen = TRUE
END IF
IF MMx THEN
SoundOn = FALSE
DelFac = OrgSimDelFac
FOR i = 1 TO 2
IF FoundInMMList(DataFil(i)) THEN
amgr(i) = FALSE
DelFac = CmdDel
IF CmdSound$ <> "N" THEN SoundOn = TRUE
END IF
NEXT
END IF
IF RegDsply THEN
COLOR fldfor, fldbac
ELSE
COLOR deffor, defbac
DelFac = 0
END IF
IF ForceCLS THEN
ForceCLS = FALSE
CLS
IF RegDsply THEN it = 1: CALL ScoreBrd (TRUE, TRUE)
CALL Prompt(0)
ELSE
IF RegDsply THEN CALL Prompt(0) 'experiment 2009
END IF
IF CmdSlotGames THEN GOSUB PrintButtons
IF RegDsply AND Gfx THEN
CALL ShowGfx
CALL UnfreezeAndRefresh
END IF
REDIM ibp(2) AS GLOBAL LONG
inn = 1
AnthemPlayed = FALSE
ErasedScbd = FALSE
'If 25x80 mode:
'Draw part of the defense that we may not ever need to draw again.
IF RegDsply AND (ConsRows = 25 AND ConsCols = 80) AND Gfx = FALSE THEN
xS$ = CHR$(249)
tr = MidRow + 5
r = tr: c = MidCol - 10: GOSUB PrintDOT
r = tr: c = MidCol + 8: GOSUB PrintDOT
r = tr+1: c = MidCol - 7: GOSUB PrintDOT
r = tr+1: c = MidCol + 5: GOSUB PrintDOT
IF CmdStat$ = nulls$ THEN
r = tr+2: c = MidCol - 4: GOSUB PrintDOT
r = tr+2: c = MidCol + 2: GOSUB PrintDOT
END IF
END IF
'Record starting positions for both sides in Games-by-Position
FOR id = 1 TO 2
x$ = "~Lineup: " + Names(id)
CALL AddToScoreCrd(0, 0, "X", x$)
FOR p = 1 TO 9
ref = DataRef(p, id)
ps = DataPos(p, id)
IF ps <> 1 THEN
GpPos(ref, id, ps) = 1
END IF
'Record starting lineups in scorecard
CALL AddToScoreCrd(id, ref, "0", Pos(ps))
NEXT
ref = ipa(id)
GpPos(ref, id, 1) = 1
NEXT
LL = 30
'----------------------------------
'Top 1/2 of each inning begins here
'----------------------------------
TopOfInning:
'Check if Visiting team wins
IF inn > RegInns THEN
IF itruns(1) > itruns(2) THEN
inn = inn - 1
IF RegDsply AND Gfx THEN
CALL UnfreezeAndRefresh
END IF
GOTO GameOver
END IF
END IF
it = 1
DO WHILE it <= 2 'Switch sides
'Home team wins (no need to play last 1/2 inning)
IF inn >= RegInns THEN
IF itruns(2) > itruns(1) AND it = 2 THEN
IF RegDsply AND Gfx THEN
CALL UnfreezeAndRefresh
END IF
GOTO GameOver
END IF
END IF
CurrentGamePoint = (inn * 10) + it
PitcherBatted(it) = FALSE
ResetHitter = FALSE
SaveState = FALSE
GOSUB ResetBatterCounters
ANx = 0
innr = 0: innh = 0: inne = 0: innadverr = 0: iout = 0
ir1 = 0: ir2 = 0: ir3 = 0
innLOB = 0
REDIM mpp(9) AS GLOBAL LONG 'Reset which pitcher is responsible
IF RegDsply THEN 'for each baserunner
IF Gfx THEN GfxWindow NOT %GFX_FREEZE 'unfreeze
CALL BatOrd
CALL BasPat
IF Gfx THEN GfxRefresh 0 'refresh (remain unfrozen)
END IF
IF inn < 11 THEN
innct = inn
ELSEIF inn > 10 AND inn < 21 THEN
innct = inn - 10
ELSEIF inn > 20 THEN
innct = inn - 20
END IF
IF inn = 1 OR inn = 11 OR inn = 21 OR inn = 31 THEN
IF it = 1 AND NOT ErasedScbd THEN
ErasedScbd = TRUE
REDIM iScoreBd(2, 10) AS GLOBAL LONG
END IF
ELSE
ErasedScbd = FALSE
END IF
id = 3 - it 'Toggles defensive team from 1 to 2 or 2 to 1
ip = ipa(id) 'pointer to defensive team's current pitcher
IF inn = 1 THEN
IF iout = 0 THEN
IF NUMBERON = 0 THEN
CALL AddToScoreCrd (it, ip, "A", "[Starter] ")
END IF
END IF
END IF
'Do we HAVE to have a new pitcher? (Did we pinch-hit/run for pitcher in the last 1/2 inning?)
InvalidPit = FALSE
NeedNewPitcher = FALSE
i = 1
k = 0
ivp = 0
DO 'Scan defense for pitcher and his reference number
IF DataPos(i, id) = 1 THEN
INCR k
'Was he the last pitcher?
LastRealPitcher$ = DataName(iyp(np(id), id), id)
IF LastRealPitcher$ <> DataName(i, id) THEN
IF amgr(id) = TRUE THEN
'Can the new guy pitch anyway?
'i.e. is DataName(i, id) found among the pitchers?
SearchName$ = DataName(i, id)
N = SearchDAT (10, LastPiAd(id), id, SearchName$, 0)
IF N > 0 THEN
'Pitcher pinch-hitting for last pitcher
IF DataGames(N, id) > 0 THEN
CALL CountAvPitchers(id, AvP, LastGuy)
IF ((DataGbyP(N, id, 1) / DataGames(N, id) < .26) AND RND < .5) OR AvP < 3 THEN
'starts / games < .26
'He's primarily a reliever OR we're low on pitchers
'Leave him in to pitch
CALL Bullpen(N, id, N, 0)
ivp = 0
ELSE
'He's primarily a starter - he should not stay in the game to pitch
ivp = i
END IF
ELSE
'We don't have data on "games", so better not let him stay in and pitch
ivp = i
END IF
ELSE
'No, he has no pitching data
ivp = i
END IF
ELSE
ivp = i
END IF
InvalidPit = TRUE
END IF
END IF
INCR i
LOOP UNTIL i > 9
IF k > 1 THEN
x$ = "More than one pitcher in batting order! "
CALL ErrorBox (x$)
END IF
LL = 40
IF InvalidPit THEN
IF ivp THEN NeedNewPitcher = TRUE
COLOR deffor, defbac
'Found an invalid pitcher in slot number "ivp"
IF amgr(id) = FALSE THEN
CALL GetScreen(Scr1$, 10+rowO, 2+colO, 15+rowO, 78+colO)
IF Gfx THEN CALL GraphHole (32, 10+rowO, 2+colO, 15+rowO, 78+colO)
CALL DrawFrm(10+rowO, 2+colO, 15+rowO, 78+colO, defattr, nulls$, nulls$, 0, 0, 0)
QPRINTs 11+rowO, 4+colO, "You have pinch hit/run for your pitcher.", defattr
'List positions he can play
nn = 1
p$ = ""
FOR nn = 1 TO 4
m = DataPosi(ivp, id, nn)
IF m > 0 THEN
IF nn = 1 THEN p$ = " [" ELSE p$ = p$ + "/"
p$ = p$ + Pos(m)
END IF
NEXT
IF LEN(p$) THEN p$ = p$ + "]"
SaveDaysOffRule = DaysOffRule
DaysOffRule = FALSE
CALL CountAvPitchers(id, AvP, LastGuy)
DaysOffRule = SaveDaysOffRule
IF AvP > 0 THEN
x$ = "Do you want " + LASTNAME$(DataName(ivp, id)) + p$ + " to remain in the game? [y/N] "
QPRINTs 12+rowO, 4+colO, x$, defattr
LOCATE 12+rowO, 4+colO+LEN(x$)
xS$ = YESorNO$(revfor, revbac, deffor, defbac, "N")
ELSE
x$ = LASTNAME$(DataName(ivp, id)) + " will remain in the game. "
QPRINTs 12+rowO, 4+colO, x$, defattr
xS$ = "Y"
SLEEP 2500
END IF
ELSE
xS$ = "N" 'SBS Manager
END IF
IF xS$ = "Y" THEN
'Does name in pitcher's slot correspond to an actual pitcher?
'If so, this is a pitcher pinch-hitting for another pitcher.
SearchName$ = DataName(ivp, id)
N = SearchDAT (10, LastPiAd(id), id, SearchName$, 0)
IF N THEN
'Pitcher pinch-hitting for pitcher
NeedNewPitcher = FALSE
QPRINTs 13+rowO, 4+colO, "This player will be the new pitcher.", defattr
SLEEP 2500
CALL Bullpen(N, id, N, 0)
ELSE
'Non-pitcher pinch-hitting for pitcher
DO
QPRINTs 13+rowO, 4+colO, "At which position? ", defattr
QPRINTs 14+rowO, 4+colO, "Enter a position: C 1B 2B SS 3B LF CF RF ", defattr
yS$ = MYINPUT$(FALSE, KeyEscape, CustomEscKey, KeyAccept, kc, revfor, revbac, 14+rowO, 49+colO, 2, "XR", 0, 0, nulls$, msx, msy)
'(we don't really want to support the mouse on this one)
COLOR deffor, defbac
yS$ = UCASE$(yS$)
IF yS$ = " C" THEN yS$ = "C "
IF yS$ = " P" THEN yS$ = "P "
j = 1
DO UNTIL j > 9
IF Pos(j) = yS$ AND yS$ <> "P " THEN EXIT DO
INCR j
LOOP
LOOP WHILE j > 9
'We want the pinch-hitter to stay in and play
'defensive position "j"
'What slot is THAT in the line-up?
k = 1
DO UNTIL k > 9 'Scan defense for defensive position j
IF DataPos(k, id) = j THEN EXIT DO
INCR k
LOOP
'Well, the guy in slot "k" is playing position "j"
yS$ = "** " + FLASTNAME$(ivp, id) + " stays in at " + Pos(j)
CALL AddToScoreCrd(0, 0, "X", yS$)
yS$ = "** for " + FLASTNAME$(k, id)
CALL AddToScoreCrd(0, 0, "X", yS$)
IF k < 10 THEN SWAP DataPos(ivp, id), DataPos(k, id)
END IF
END IF
SuspendWarmUpRule = FALSE
IF amgr(id) = FALSE THEN
IF WarmUpRule AND NeedNewPitcher THEN
'Check if anybody's warm
N = 0
FOR i = 10 TO LastPiAd(id)
IF WarmUpStatus(i, id) > 0 AND _
iused(i, id) = 0 AND _
PitcherCloneUnused(DataName(i, id), id) AND _
i <> iyp(np(id), id) THEN
N = -1
'Debug:
' x$ = "Last Real Pitcher=" + STR$( iyp(np(id),id) ) + "|"
' x$ = x$ + "i=" + STR$(i) + "|"
' x$ = x$ + "WarmUpStatus(i, id)=" + STR$( WarmUpStatus(i,id) ) + "|"
' x$ = x$ + "iused(i, id)=" + STR$( iused(i, id) ) + "|"
' x$ = x$ + DataName(i, id)
' CALL ErrorBox (x$)
EXIT FOR
END IF
NEXT
IF N = 0 THEN
'Oops - Nobody is warm - this rarely happens, but just in case...
'Clone-pitcher pinch-hits or pinch-runs for pitcher but is then replaced before the
'clone-pitcher actually pitches in next 1/2 inning.
'
' -OR-
'Clone-pitcher pinch-hits or pinch-runs for pitcher and the next 1/2 inning the manual
'manager elects not to keep clone-pitcher in game
'
'Suspend WarmUpRule temporarily so we don't get stuck in the Bullpen without a "warm"
'pitcher
SuspendWarmUpRule = TRUE
WarmUpRule = FALSE
END IF
END IF
CALL PutScreen(Scr1$, 10+rowO, 2+colO, 15+rowO, 78+colO)
IF Gfx THEN
CALL EliminateHole(32)
GfxRefresh 0
END IF
END IF
'Must select a pitcher
IF NeedNewPitcher THEN
CALL ClearInpBuffer
N = 0
DO
CALL Bullpen(N, id, 0, 0)
IF N = 0 AND amgr(id) = TRUE THEN
'AutoManager ran out of pitchers!
x$ = "AutoManager is out of pitchers!"
CALL ErrorBox (x$)
END IF
LOOP UNTIL N
IF SuspendWarmUpRule THEN WarmUpRule = TRUE
IF Gfx THEN GfxRefresh 0 'refresh (remain unfrozen)
'Option for player to double-switch
IF amgr(id) = FALSE AND dh = 0 THEN
HotBull = TRUE
END IF
END IF
LineUpChangeDef = TRUE
GpPos(N, id, 1) = 1
CALL AddToScoreCrd (it, N, "A", "[Relief] ")
IF amgr(id) = FALSE THEN
COLOR fldfor, fldbac
IF NOT Gfx THEN CLS
CALL ScoreBrd (TRUE, TRUE)
CALL BatOrd 'Reset color to field
CALL Prompt(0)
ELSE
IF RegDsply THEN 'Re-draw batting order
CALL BatOrd
END IF
END IF
END IF 'InvalidPitcher
'Draw the Defense
ip = ipa(id)
IF RegDsply THEN
CALL Defens(60) 'still unfrozen
IF Gfx THEN
CALL EliminateHole(6) 'reset stat holes
CALL EliminateHole(7)
GfxRefresh 0 'refresh
ELSE
IF ConsRows > 27 AND ConsCols > 83 THEN 'non-graphics
xS$ = SPACE$(41)
QPRINTs 9, 2, xS$, fldattr
QPRINTs 10, 2, xS$, fldattr
QPRINTs 11, 2, xS$, fldattr
QPRINTs 9, ConsCols - 41, xS$, fldattr
QPRINTs 10, ConsCols - 41, xS$, fldattr
QPRINTs 11, ConsCols - 41, xS$, fldattr
END IF
END IF
'Display Year/League Normalization
IF CmdEra$ > "!" THEN
IF CmdEra$ <> "N" THEN
GOSUB PrintERA
END IF
END IF
END IF
'Play National Anthem if you haven't already
IF inn = 1 AND it = 1 THEN
IF RegDsply THEN
CALL ScoreBrd (TRUE, TRUE)
'Messes up first line of graphic box
IF Gfx THEN
GfxRefresh 0
GfxWindow %GFX_FREEZE
END IF
DrawSBFrame = FALSE
GenerateAllSB = FALSE
IF NOT AnthemPlayed THEN
IF DelFac THEN
IF SoundOn THEN
AddToAnnouncer it, "Our National Anthem..."
CALL PostAnnouncer (TRUE, FALSE)
SLEEP 1000
ELSE
AddToAnnouncer it, "We're set for the first pitch..."
CALL PostAnnouncer (FALSE, FALSE)
SLEEP 1500
END IF
END IF
IF DelFac > 0 AND SoundOn THEN
'Save screen area and print message
IF Gfx THEN CALL GraphHole(30, ConsRows-2, 24+colO, ConsRows-2, 59+colO)
CALL GetScreen(Scr1$, ConsRows-2, 24+colO, ConsRows-2, 59+colO)
QPRINTs ConsRows-2, 24+colO, "Click or hit any key to continue...", errattr
IF CANADA(Names(1)) AND CANADA(Names(2)) THEN
'Play O-Canada
MCISendString "open type midiaudio", BYVAL 0, 0, 0
MCISendString PlayCAN, BYVAL 0, 0, 0
x$ = WAITKEY$
MCISendString STOPCAN, BYVAL 0, 0, 0
MCISendString "CLOSE type midiaudio", BYVAL 0, 0, 0
ELSEIF CANADA(Names(1)) AND NOT CANADA(Names(2)) THEN
'Play O-Canada
MCISendString "open type midiaudio", BYVAL 0, 0, 0
MCISendString PlayCAN, BYVAL 0, 0, 0
x$ = WAITKEY$
MCISendString StopCAN, BYVAL 0, 0, 0
MCISendString "CLOSE type midiaudio", BYVAL 0, 0, 0
'Play SSB
MCISendString "open type midiaudio", BYVAL 0, 0, 0
MCISendString PlayUSA, BYVAL 0, 0, 0
x$ = WAITKEY$
MCISendString StopUSA, BYVAL 0, 0, 0
MCISendString "CLOSE type midiaudio", BYVAL 0, 0, 0
ELSEIF NOT CANADA(Names(1)) AND CANADA(Names(2)) THEN
'Play SSB
MCISendString "open type midiaudio", BYVAL 0, 0, 0
MCISendString PlayUSA, BYVAL 0, 0, 0
x$ = WAITKEY$
MCISendString StopUSA, BYVAL 0, 0, 0
MCISendString "CLOSE type midiaudio", BYVAL 0, 0, 0
'Play O-Canada
MCISendString "open type midiaudio", BYVAL 0, 0, 0
MCISendString PlayCAN, BYVAL 0, 0, 0
x$ = WAITKEY$
MCISendString StopCAN, BYVAL 0, 0, 0
MCISendString "CLOSE type midiaudio", BYVAL 0, 0, 0
ELSE
'Play SSB
MCISendString "open type midiaudio", BYVAL 0, 0, 0
MCISendString PlayUSA, BYVAL 0, 0, 0
x$ = WAITKEY$
MCISendString StopUSA, BYVAL 0, 0, 0
MCISendString "CLOSE type midiaudio", BYVAL 0, 0, 0
END IF
'Restore screen area
CALL PutScreen(Scr1$, ConsRows-2, 24+colO, ConsRows-2, 59+colO)
IF Gfx THEN
CALL EliminateHole(30)
CALL UnfreezeAndRefresh
END IF
END IF
END IF
AnthemPlayed = TRUE
IF SoundOn AND DelFac > 0 THEN SLEEP 1000: L = PlayWav("4540.wav"): SLEEP 1000 'Play Ball!
END IF
END IF
IF InvalidPit AND RegDsply AND DelFac > 0 THEN
ANx = 0
CALL AddToAnnouncer (id, "Now pitching for '" + RTRIM$(Names(id)) + ":")
CALL Msg ("29", "0", "0", "13", ip, id, man2, team2)
CALL PostAnnouncer (TRUE, FALSE) 'was FALSE
SLEEP DelFac * 1800
END IF
'Display note if a def. player is out of position
IF RegDsply AND DelFac > 0 THEN CALL DefCheck (OutOfPositionMsg)
LL = 50
NextHitter:
IF DelFac = 0 THEN
SoundOn = FALSE
ELSE
IF CmdPitchersTank$ = "Y" THEN GOSUB DisplayPitchersTank
END IF
'New location: 3/27/00
'Check for sudden victory for home team
IF inn >= RegInns AND itruns(2) > itruns(1) AND it = 2 THEN GOTO GameOver
IF iout > 2 THEN
IF ir1 THEN innLOB = innLOB + 1
IF ir2 THEN innLOB = innLOB + 1
IF ir3 THEN innLOB = innLOB + 1
GameLOB(it) = GameLOB(it) + innLOB
IF RegDsply AND DelFac > 0 THEN
Qpush
IF Gfx THEN CALL GraphHole(5, 7+rowO, 30+colO, 19+rowO, 53+colO)
'CALL GetScreen(Scr3$, 7+rowO, 30+colO, 19+rowO, 53+colO)
CALL DrawFrm(7+rowO, 30+colO, 19+rowO, 53+colO, defattr, "Inning Summary", nulls$, 0, 0, 0)
CALL Innsum (9+rowO, 34+colO)
SLEEP 2500
'CALL PutScreen(Scr3$, 7+rowO, 30+colO, 19+rowO, 53+colO)
Qpop
IF Gfx THEN
CALL EliminateHole(5)
CALL UnfreezeAndRefresh
END IF
END IF
GOTO SwitchSides
END IF
'Bump up current hitter pointer
INCR ibp(it)
IF ibp(it) = 10 THEN ibp(it) = 1
IF it = 1 THEN k = 3 ELSE k = ConsCols - 16
IF RegDsply AND DelFac > 0 THEN 'change color attr in batting order
tr = ConsRows - 12
leng = 15
CALL ChangeAttribute (ibp(it) + tr, k, leng, scdattr) 'grey on black
'Restore last guy to regular color attribute
IF ibp(it) = 1 THEN
CALL ChangeAttribute (ConsRows-3, k, leng, revattr) 'black on grey
ELSE
CALL ChangeAttribute (ibp(it) + tr - 1, k, leng, revattr)
END IF
END IF
ib = ibp(it)
IF SaveState = FALSE THEN Tight = FALSE
ExtraTalk = FALSE
IGone = FALSE
Errorx = FALSE
DPsw = FALSE
OutFErr = FALSE
OneBaseError = FALSE
ThrowError = FALSE
RunsBeforePlay = itruns(it)
LL = 60
AnnounceHitter:
GOSUB PrintStats
IF RegDsply = FALSE THEN GOTO ResetPlaySwitches
'Test update scoreboard here:
CALL ScoreBrd (DrawSBFrame, GenerateALLSB) 'Usually does not erase announcer
'Announce hitter, pause for keyboard input
'Throw in some box score history
BLN$ = LASTNAME$(DataName(ib, it))
IF NOT ExtraTalk THEN ANx = 0
ref = DataRef(ib, it) 'hitter's reference number for box
'Do not change "ref" after this point!
IF DelFac > 0 OR amgr(1) = 0 OR amgr(2) = 0 THEN
IF ResetHitter THEN 'Back from SB or POut
CALL AddToAnnouncer(it, BLN$ + " steps back in...")
GOTO DisplayAnnouncer
ELSE
CALL Msg ("01", "0", "0", "00", ib, it, man2, team2) 'Here comes...
END IF
IF ExtraTalk THEN GOTO DisplayAnnouncer
IF mab(ref, it) > 0 THEN
IF mhits(ref, it) = 0 AND mab(ref, it) > 2 THEN
CALL AddToAnnouncer(it, BLN$ + "'s hitless in" + STR$(mab(ref, it)) + " tries.")
ELSE
xS$ = BLN$ + "'s" + STR$(mhits(ref, it)) + " for" + STR$(mab(ref, it))
IF mrbi(ref, it) = 1 THEN
xS$ = xS$ + " with an RBI."
ELSEIF mrbi(ref, it) > 1 THEN
xS$ = xS$ + " with" + STR$(mrbi(ref, it)) + " RBI's!"
ELSE
xS$ = xS$ + "."
END IF
AddToAnnouncer it, xS$
END IF
IF mhr(ref, it) = 1 THEN
IF RND < .5 THEN xS$ = "And a Home Run!" ELSE xS$ = "Including a Homer!"
AddToAnnouncer it, xS$
ELSEIF mhr(ref, it) > 1 THEN
xS$ = "And" + STR$(mhr(ref, it)) + " Home Runs!"
AddToAnnouncer it, xS$
END IF
ELSEIF CmdStat$ > "!" THEN 'a stat file exists
IF SimBStreak(ref, it) > 3 THEN
xS$ = STR$(SimBStreak(ref, it))
CALL AddToAnnouncer (it, "He's got a" + xS$ + "-game Hitting Streak.")
END IF
END IF
END IF
LL = 80
DisplayAnnouncer:
CALL PostAnnouncer (TRUE, FALSE) 'was FALSE
IF DelFac THEN
IF ExtraTalk THEN SLEEP 500 'a little extra time to read stuff
END IF
ANx = 0
GOSUB BatterOnScreen
IF Gfx THEN
CALL UnfreezeAndRefresh
END IF
LL = 90
ResetPlaySwitches: 'RegDsply either way
ref = DataRef(ib, it) 'hitter's reference number
'don't change "ref" after this point!
OldColorScheme = ColorScheme
WhoAtPos = 0
OrgWhoAtPos = 0
ref2 = 0
ExtraTalk = FALSE
RunAnnounced = FALSE
Boxx = FALSE
Help = FALSE
ScoreCard = FALSE
ResetHitter = FALSE
IWalk = FALSE
BullD = FALSE
BullO = FALSE
Subx = FALSE
SwPos = FALSE
PH = FALSE
PRun = FALSE
IF SaveState = FALSE THEN
POut = FALSE
PAround = FALSE
Bunt = FALSE
Steal = FALSE
HitAndRun = FALSE
END IF
SavPOut = POut
SavPAround = PAround
SavBunt = Bunt
SavSteal = Steal
SavHitAndRun = HitAndRun
LL = 100
ScanInput:
ViewHome = FALSE
ViewVisi = FALSE
'Check if "O" has been pressed (for Options)
IF amgr(1) AND amgr(2) THEN 'Don't know which display we're on
a$ = INKEY$
IF LEN(a$) = 0 THEN
IF DelFac THEN SLEEP DelFac * 1000
GOTO AutoManage
END IF
IF LEN(a$) = 4 THEN
msx = MOUSEX
msy = MOUSEY
IF msy = ConsRows THEN
a$ = CHR$(SCREEN(msy, msx))
CALL FlashField (msy, msx, 1, 2, 100, 0)
ELSE
a$ = nulls$
END IF
ELSE
a$ = UCASE$(a$)
msx = 0
msy = 0
END IF
'We have a key pressed.
'Both teams are auto-managed.
'We do not know what the "delay" is.
OldDelFac = DelFac
IF a$ = "O" AND CmdNoOpt$ <> "Y" THEN
QPush
CALL OptionSetup (row, Flds, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
IF Gfx AND RegDsply THEN CALL GraphHole(30, 7+rowO, 22+colO, Flds+8+rowO, 54+colO)
CALL DrawFrm(7+rowO, 22+colO, Flds+8+rowO, 54+colO, defattr, "Options", "ESC (or close) to Exit", 0, 0, 1)
CALL OptionWindow (Flds, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
QPop
IF Gfx AND RegDsply THEN
CALL EliminateHole(30)
CALL UnfreezeAndRefresh
END IF
LOCATE 1, 1
CURSOR OFF 'hide the cursor somewhere
ELSEIF a$ = "R" THEN
IF WLx > 0 THEN
IF Gfx AND RegDsply THEN CALL HideGfx
QPush
COLOR deffor, defbac
CLS
CALL ShowStandings (TRUE)
QPop
IF Gfx AND RegDsply THEN CALL ShowGfx
END IF
ELSEIF a$ = "B" THEN
CALL Box
IF Gfx AND RegDsply THEN CALL HideGfx
QPush
CALL ListFile(CmdWritePath$ + "~BOX.PRN")
QPop
IF Gfx AND RegDsply THEN CALL ShowGfx
ELSEIF a$ = "C" THEN
QPush
GOSUB ShowScoreCard
QPop
IF Gfx AND RegDsply THEN CALL UnfreezeAndRefresh
ELSEIF a$ = "Q" AND CmdNoOpt$ <> "Y" THEN
GOSUB CheckForQuit
ELSEIF a$ = "T" THEN 'Toggle
IF DelFac = 0 THEN
IF RegDsply = TRUE AND (CmdPauseAftGame$ = "Y" OR CmdPauseAftDate$ = "Y") THEN
'Can't switch to Standings Mode if PauseAfterGame=Y
CALL PopMsg(18+rowO, 12+colO, "Can't switch to Standings Mode if either 'PauseAfter' = Y", errattr, 0, kc)
ELSE
RegDsply = NOT RegDsply
IF RegDsply = FALSE THEN
'Switch to Standings
IF BitmapNRF THEN Gfx = TRUE
IF Gfx THEN CALL HideGfx
COLOR deffor, defbac
CLS
CALL ShowStandings (FALSE)
CALL Prompt(0)
ELSE
'Switch to Field
'Prepare background photo (assigned in .DAT)
IF Gfx THEN
IF MenuOpt$ = "S" OR MenuOpt$ = "E" OR MenuOpt$ = "T" THEN
COLOR fldfor, fldbac
CLS
IF BackgroundPic$ > "!" THEN GOSUB GetPhotoSpecs
GOSUB DefineBitmap
END IF
END IF
'Redraw entire screen
GOSUB RebuildFieldScreen
END IF
END IF
END IF
END IF
'We changed from zero-delay to delay in "O"
IF (DelFac > 0 AND OldDelFac = 0) OR _
(RegDsply = FALSE AND CmdPauseAftGame$ = "Y") OR _
(RegDsply = FALSE AND CmdPauseAftDate$ = "Y") THEN
RegDsply = TRUE
GOSUB RebuildFieldScreen
END IF
'Allow change of field color scheme
IF ColorScheme <> OldColorScheme THEN
OldColorScheme = ColorScheme
CALL SetColors(ColorScheme)
IF RegDsply THEN GOSUB RebuildFieldScreen
END IF
'Allow change of background photo
IF RegDsply = TRUE AND CmdChangePhoto$ = "Y" THEN GOSUB ChangePhotoManually
IF DelFac THEN SLEEP DelFac * 800
GOTO AutoManage
END IF
CALL ChangeAttribute(ConsRows, 2, 3, prmattr)
'Function to clear keyboard and mouse buffer here
CALL ClearInpBuffer
VisiPtr = 1
HomePtr = 1
VisiPopped = FALSE
HomePopped = FALSE
HomeReady = (NOT amgr(1) AND amgr(2))
VisiReady = (NOT amgr(2) AND amgr(1))
StatLineDisplayed = FALSE
DO UNTIL (VisiReady AND HomeReady)
IF Gfx AND StatLineDisplayed = FALSE THEN
CALL UnfreezeAndRefresh
END IF
IF HomePopped = FALSE AND VisiPopped = FALSE AND StatLineDisplayed = FALSE THEN
SLEEP 40
CALL FlashField (ConsRows, 2, 3, 4, 100, 0) 'Flash enter prompt
END IF
INPUT FLUSH
a$ = WAITKEY$ 'Display current screen / wait for input
IF StatLineDisplayed = TRUE THEN
'Clean up previous stat mess no matter if next input is mouse or keyboard
CALL PutScreen(Scr4$, sr1, sc1, sr2+1, sc2+2)
IF Gfx THEN CALL EliminateHole(30)
StatLineDisplayed = FALSE
ITERATE DO
END IF
IF LEN(a$) = 4 THEN
msx = MOUSEX
msy = MOUSEY
IF msy = ConsRows THEN 'mouse clicks on option menu row
a$ = CHR$(SCREEN(msy, msx))
CALL FlashField (msy, msx, 1, 2, 100, 0)
ELSE
a$ = nulls$ 'random mouse clicks
'Batting order box borders
'Left
b1r1 = ConsRows - 12
b1c1 = 2
b1r2 = b1r1 + 10
b1c2 = 18
'Right
b2r1 = ConsRows - 12
b2c1 = ConsCols - 17
b2r2 = b2r1 + 10
b2c2 = ConsCols - 1
'Is click inside a lineup box?
'Figure out which player
IF Inbox(b1r1, b1c1, b1r2, b1c2, msy, msx, 0) THEN
StatLineDisplayed = TRUE
p = msy - b1r1
tm = 1
CALL FlashField (msy, 3, 15, 2, 100, 0)
ELSEIF Inbox(b2r1, b2c1, b2r2, b2c2, msy, msx, 0) THEN
StatLineDisplayed = TRUE
p = msy - b1r1
tm = 2
CALL FlashField (msy, b2c1+1, 15, 2, 100, 0)
END IF
IF StatLineDisplayed THEN
sr1 = 8 + rowO
sc1 = 9 + colO
sr2 = 14 + rowO
sc2 = 72 + colO
IF CmdStat$ > "!" THEN sr2 = sr2 + 7
'Save screen area
CALL GetScreen(Scr4$, sr1, sc1, sr2+1, sc2+2)
IF Gfx THEN CALL GraphHole(30, sr1, sc1, sr2+1, sc2+2)
'Build and display stat line
CALL DrawFrm(sr1, sc1, sr2, sc2, defattr, DataName(p,tm), "", 1, 0, 0)
QPRINTs sr1+2, sc1+26, ".DAT File", defattr
x$ = " Avg G AB Hit 2B 3B HR RBI BB SO S SB CS"
QPRINTs sr1+3, sc1+2, x$, defattr
IF DataAB(p, tm) = 0 THEN
BAF! = 0
ELSE
BAF! = DataHits(p, tm) / DataAB(p, tm)
END IF
a$ = SPACE$(58)
MID$(a$, 1, 4) = FFORMAT$(BAF!, ".###")
MID$(a$, 6, 4) = LFORMAT$(DataGames(p, tm), "####")
MID$(a$, 11, 5) = LFORMAT$(DataAB(p, tm), "#####")
MID$(a$, 17, 4) = LFORMAT$(DataHits(p, tm), "####")
MID$(a$, 22, 4) = LFORMAT$(Data2B(p, tm), "####")
MID$(a$, 27, 3) = LFORMAT$(Data3B(p, tm), "###")
MID$(a$, 31, 3) = LFORMAT$(DataHR(p, tm), "###")
MID$(a$, 35, 4) = LFORMAT$(DataRBI(p, tm), "####")
MID$(a$, 40, 4) = LFORMAT$(DataBB(p, tm), "####")
MID$(a$, 45, 4) = LFORMAT$(DataSO(p, tm), "####")
MID$(a$, 50, 1) = LFORMAT$(DataSpeed(p, tm), "#")
MID$(a$, 52, 3) = LFORMAT$(DataSB(p, tm), "###")
MID$(a$, 56, 3) = LFORMAT$(DataCS(p, tm), "###")
QPRINTs sr1+4, sc1+2, a$, dimattr
'Sim Data
IF CmdStat$ > "!" THEN
rf = DataRef(p, tm)
Find$ = League(tm) + PADRIGHT$(Names(tm), 12) + PADRIGHT$(NameRef(rf, tm), 16)
TotalRecs = BSum(0).BGameCtr
FA = 0
CALL BinarySearchB (BSum(), 1, 29, 1, TotalRecs, Find$, FA, mini)
IF FA THEN
QPRINTs sr1+6, sc1+26, "Sim Stats", defattr
x$ = " Avg G AB Hit 2B 3B HR RBI BB SO SB CS"
QPRINTs sr1+7, sc1+2, x$, defattr
SiAB = BSum(FA).BABs + mab(rf, tm)
SiH = BSum(FA).BHits + mhits(rf, tm)
IF SiAB > 0 THEN
BASF! = SiH / SiAB
IF BASF! > .999 THEN BASF! = .999
ELSE
BASF! = 0
END IF
a$ = SPACE$(58)
MID$(a$, 1, 4) = FFORMAT$(BASF!, ".###")
MID$(a$, 6, 4) = LFORMAT$(BSum(FA).BGames + 1, "####")
MID$(a$, 11, 5) = LFORMAT$(SiAB, "#####")
MID$(a$, 17, 4) = LFORMAT$(SiH, "####")
MID$(a$, 22, 4) = LFORMAT$(BSum(FA).B2Bs + m2b(rf, tm), "####")
MID$(a$, 27, 3) = LFORMAT$(BSum(FA).B3Bs + m3b(rf, tm), "###")
MID$(a$, 31, 3) = LFORMAT$(BSum(FA).BHRs + mhr(rf, tm), "###")
MID$(a$, 35, 4) = LFORMAT$(BSum(FA).BRBIs + mrbi(rf, tm), "####")
MID$(a$, 40, 4) = LFORMAT$(BSum(FA).BBBs + mbb(rf, tm), "####")
MID$(a$, 45, 4) = LFORMAT$(BSum(FA).BKs + mso(rf, tm), "####")
MID$(a$, 52, 3) = LFORMAT$(BSum(FA).BSBs + msb(rf, tm), "###")
MID$(a$, 56, 3) = LFORMAT$(BSum(FA).BCSs + mcs(rf, tm), "###")
QPRINTs sr1+8, sc1+2, a$, dimattr
'Expanded individual batting statistics
TB = BSum(FA).BHits + BSum(FA).B2Bs + 2 * BSum(FA).B3Bs + 3 * BSum(FA).BHRs
IF BSum(FA).BABs > 0 THEN
OnBase! = (BSum(FA).BBBs + BSum(FA).BHB + BSum(FA).BHits) / _
(BSum(FA).BBBs + BSum(FA).BHB + BSum(FA).BABs)
ELSE
OnBase! = 0.0
END IF
IF BSum(FA).BABs > 0 THEN
Slug! = TB / BSum(FA).BABs
ELSE
Slug! = 0.0
END IF
IF BSum(FA).BABs > 0 THEN
HRPct! = BSum(FA).BHRs / BSum(FA).BABs * 100
ELSE
HRPct! = 0.0
END IF
Prod! = OnBase! + Slug!
IF (BSum(FA).BCSs + BSum(FA).BABs - BSum(FA).BHits) > 0 THEN
TotAvg! = (TB + BSum(FA).BSBs + BSum(FA).BBBs + BSum(FA).BHB) / _
(BSum(FA).BCSs + BSum(FA).BABs - BSum(FA).BHits)
ELSE
TotAvg! = 0.0
END IF
rc27! = RunsCreated27!((BSum(FA).BABs), (BSum(FA).BHits), (BSum(FA).B2Bs),_
(BSum(FA).B3Bs), (BSum(FA).BHRs), (BSum(FA).BBBs), (BSum(FA).BHB), _
(BSum(FA).BSacB), (BSum(FA).BSacF), (BSum(FA).BSBs), _
(BSum(FA).BCSs), (BSum(FA).BGDP))
x$ = " TB SH SF HB GIDP OB SLG HR% OPS TAvg RC/27"
QPRINTs sr1+10, sc1+2, x$, defattr
a$ = SPACE$(60)
MID$(a$, 1, 5) = LFORMAT$(TB, "#####")
MID$(a$, 7, 4) = LFORMAT$(BSum(FA).BSacB, "####")
MID$(a$, 12, 4) = LFORMAT$(BSum(FA).BSacF, "####")
MID$(a$, 17, 4) = LFORMAT$(BSum(FA).BHB, "####")
MID$(a$, 22, 4) = LFORMAT$(BSum(FA).BGDP, "####")
MID$(a$, 27, 5) = FFORMAT$(OnBase!, "#.###")
MID$(a$, 33, 5) = FFORMAT$(Slug!, "#.###")
MID$(a$, 39, 4) = FFORMAT$(HRPct!, "#0.#")
MID$(a$, 44, 5) = FFORMAT$(Prod!, "#.###")
MID$(a$, 50, 5) = FFORMAT$(TotAvg!, "#.###")
MID$(a$, 56, 5) = FFORMAT$(rc27!, "##.##")
QPRINTs sr1+11, sc1+2, a$, dimattr
END IF
END IF
ITERATE DO
END IF 'Click was inside batting order box
END IF 'Click was not on last row
ELSE 'No click
'Keyboard input
a$ = UCASE$(a$)
msx = 0
msy = 0
END IF
IF a$ = "B" THEN Boxx = TRUE: EXIT DO
IF a$ = "D" AND VisiPopped = FALSE THEN Help = TRUE: EXIT DO
IF a$ = "C" THEN ScoreCard = TRUE: EXIT DO
'Force specific outcomes for testing purposes:
'Ground ball:
' IF a$ = "G" THEN
' COLOR fldfor, fldbac
' fr7 = 100
' fr7 = 201 'shallow fly
' CALL OutOrError
' fr7 = 0
' GOTO WRAPUPTHISAB
' END IF
'Wild Pitch:
' IF a$ = "T" THEN COLOR fldfor, fldbac: GOTO WildPitch
'Home Run:
' IF a$ = "H" THEN
' fr7 = 404
' a$ = CHR$(13)
' END IF
'Single:
' IF a$ = "1" THEN
' fr7 = 401
' a$ = CHR$(13)
' END IF
IF a$ = "Q" AND CmdNoOpt$ <> "Y" THEN
IF VisiPopped THEN 'check UI?
CALL PutScreen(Scr1$, 10+rowO, 8+colO, 21+rowO, 40+colO)
VisiPopped = FALSE
END IF
IF HomePopped THEN
CALL PutScreen(Scr2$, 10+rowO, 42+colO, 21+rowO, 74+colO)
HomePopped = FALSE
END IF
GOSUB CheckForQuit
GOTO AnnounceHitter
END IF
IF a$ = CHR$(13) OR a$ = CHR$(32) OR a$ = CHR$(17) OR a$ = CHR$(196) _
OR a$ = CHR$(217) THEN
IF VisiPopped = FALSE AND HomePopped = FALSE THEN
EXIT DO
END IF
END IF
IF a$ = "O" AND CmdNoOpt$ <> "Y" THEN
IF VisiPopped = FALSE AND HomePopped = FALSE THEN
QPush
CALL OptionSetup (row, Flds, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
'CALL GetScreen(Scr3$, 7+rowO, 22+colO, Flds+8+rowO, 54+colO)
IF Gfx THEN CALL GraphHole(30, 7+rowO, 22+colO, Flds+8+rowO, 54+colO)
CALL DrawFrm(7+rowO, 22+colO, Flds+8+rowO, 54+colO, defattr, "Options", "ESC to Exit", 0, 0, 1)
CALL OptionWindow(Flds, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
'CALL PutScreen(Scr3$, 7+rowO, 22+colO, Flds+8+rowO, 54+colO)
QPop
IF Gfx THEN
CALL EliminateHole(30)
CALL UnfreezeAndRefresh
END IF
CALL Prompt(0)
IF amgr(1) AND amgr(2) THEN
GenerateAllSB = TRUE
EXIT DO
END IF
'Allow change of field color scheme
IF ColorScheme <> OldColorScheme THEN
OldColorScheme = ColorScheme
CALL SetColors(ColorScheme)
IF RegDsply THEN GOSUB RebuildFieldScreen
END IF
'Allow change of background photo
IF RegDsply = TRUE AND CmdChangePhoto$ = "Y" THEN GOSUB ChangePhotoManually
VisiReady = FALSE: HomeReady = FALSE
IF amgr(1) = FALSE AND amgr(2) = TRUE THEN HomeReady = TRUE
IF amgr(2) = FALSE AND amgr(1) = TRUE THEN VisiReady = TRUE
END IF
END IF
IF amgr(1) THEN GOTO ScanHome
IF NewUI THEN
IF a$ = "V" THEN
IF it = 1 THEN VLastRow = 22 ELSE VLastRow = 23
CALL GetScreen(Scr1$, 10+rowO, 8+colO, VLastRow+rowO, 40+colO)
IF Gfx THEN CALL GraphHole(17, 10+rowO, 8+colO, VLastRow+rowO, 40+colO)
CALL VisitorOptions(Pick)
CALL PutScreen(Scr1$, 10+rowO, 8+colO, VLastRow+rowO, 40+colO)
IF Gfx THEN
CALL EliminateHole(17)
CALL UnfreezeAndRefresh
END IF
IF amgr(2) THEN VisiReady = TRUE
IF Pick > 0 AND Pick < 6 THEN
VisiReady = TRUE
HomeReady = TRUE
END IF
GOTO ScanAgain
END IF
ELSE
IF a$ = "S" AND NOT VisiPopped THEN
IF it = 1 THEN VLastRow = 23 ELSE VLastRow = 24
CALL GetScreen(Scr1$, 10+rowO, 13+colO, VLastRow+rowO, 36+colO)
IF Gfx THEN CALL GraphHole(17, 10+rowO, 13+colO, VLastRow+rowO, 36+colO)
IF it = 1 THEN
CALL DrawFrm(10+rowO, 13+colO, VLastRow+rowO, 36+colO, defattr, "Offense", " W\X A-D ", 0, 0, 0)
ELSE
CALL DrawFrm(10+rowO, 13+colO, VLastRow+rowO, 36+colO, defattr, "Defense", " W\X A-D ", 0, 0, 0)
END IF
CALL PopWindow(10+rowO, 13+colO, VLastRow+rowO, 36+colO, it)
QPRINTs 11+rowO+VisiPtr, 14+colO, CHR$(175), defattr
VisiPopped = TRUE
END IF
IF VisiPopped THEN
IF a$ = "W" THEN CALL MovePtrVisi("U", 11+rowO, 14+colO)
IF a$ = "X" THEN CALL MovePtrVisi("D", 11+rowO, 14+colO)
IF a$ = "A" THEN CALL SetVisiTorF("T", DspSw)
IF a$ = "D" THEN CALL SetVisiTorF("F", DspSw)
IF ASC(a$) = 27 AND amgr(2) THEN VisiReady = TRUE
END IF
IF VisiReady AND VisiPopped THEN
CALL PutScreen(Scr1$, 10+rowO, 13+colO, VLastRow+rowO, 36+colO)
VisiPopped = FALSE
IF Gfx THEN
CALL EliminateHole(17)
CALL UnfreezeAndRefresh
END IF
END IF
END IF
LL = 110
ScanHome:
IF amgr(2) THEN GOTO ScanAgain
IF NewUI THEN
IF a$ = "H" THEN
IF it = 1 THEN HLastRow = 22 ELSE HLastRow = 21
CALL GetScreen(Scr2$, 10+rowO, 42+colO, HLastRow+rowO, 74+colO)
IF Gfx THEN CALL GraphHole(18, 10+rowO, 42+colO, HLastRow+rowO, 74+colO)
CALL HomeOptions(Pick)
CALL PutScreen(Scr2$, 10+rowO, 42+colO, HLastRow+rowO, 74+colO)
IF Gfx THEN
CALL EliminateHole(18)
CALL UnfreezeAndRefresh
END IF
IF amgr(1) THEN HomeReady = TRUE
IF Pick > 0 AND Pick < 6 THEN
VisiReady = TRUE
HomeReady = TRUE
END IF
GOTO ScanAgain
END IF
ELSE
IF a$ = "5" AND NOT HomePopped THEN
IF it = 1 THEN HLastRow = 24 ELSE HLastRow = 23
CALL GetScreen(Scr2$, 10+rowO, 44+colO, HLastRow+rowO, 67+colO)
IF Gfx THEN CALL GraphHole(18, 10+rowO, 44+colO, HLastRow+rowO, 67+colO)
IF it = 1 THEN
CALL DrawFrm(10+rowO, 44+colO, HLastRow+rowO, 67+colO, defattr, "Defense", " 8|2 4-6 ", 0, 0, 1)
ELSE
CALL DrawFrm(10+rowO, 44+colO, HLastRow+rowO, 67+colO, defattr, "Offense", " 8|2 4-6 ", 0, 0, 1)
END IF
CALL PopWindow(10+rowO, 44+colO, HLastRow+rowO, 67+colO, 3 - it)
QPRINTs 11+rowO+HomePtr, 45+colO, CHR$(175), defattr
HomePopped = TRUE
END IF
IF HomePopped THEN
IF a$ = "8" THEN CALL MovePtrHome("U", 11+rowO, 45+colO)
IF a$ = "2" THEN CALL MovePtrHome("D", 11+rowO, 45+colO)
IF a$ = "4" THEN CALL SetHomeTorF("T", DspSw)
IF a$ = "6" THEN CALL SetHomeTorF("F", DspSw)
IF ASC(a$) = 27 AND amgr(1) THEN HomeReady = TRUE
END IF
IF HomeReady AND HomePopped THEN
CALL PutScreen(Scr2$, 10+rowO, 44+colO, HLastRow+rowO, 67+colO)
HomePopped = FALSE
IF Gfx THEN
CALL EliminateHole(18)
CALL UnfreezeAndRefresh
END IF
END IF
END IF
ScanAgain:
LOOP
'Clean up any loose ends
IF Boxx OR Help OR ScoreCard THEN
'Handle different UI's
IF NewUI THEN
IF VisiPopped THEN CALL PutScreen(Scr1$, 10+rowO, 8+colO, VLastRow+rowO, 40+colO)
IF HomePopped THEN CALL PutScreen(Scr2$, 10+rowO, 42+colO, HLastRow+rowO, 74+colO)
ELSE
IF VisiPopped THEN CALL PutScreen(Scr1$, 10+rowO, 13+colO, VLastRow+rowO, 36+colO)
IF HomePopped THEN CALL PutScreen(Scr2$, 10+rowO, 44+colO, HLastRow+rowO, 67+colO)
END IF
IF Gfx THEN
IF HoleStatus(17) THEN CALL EliminateHole(17)
IF HoleStatus(18) THEN CALL EliminateHole(18)
END IF
END IF
IF NOT amgr(1) OR NOT amgr(2) THEN
CALL ChangeAttribute(ConsRows, 2, 3, prmattr)
END IF
LL = 120
AutoManage:
'Never allow a Delay in the Standings Display
IF RegDsply = FALSE THEN
DelFac = 0
END IF
'Check automatic manager to set proper switches
mo = 0
md = 0
runner = 0
IF SaveState = TRUE THEN
SaveState = FALSE
ELSE
IF amgr(1) OR amgr(2) THEN CALL Manage(mo, md, runner)
END IF
'Because of "throw to first" multiple switces can be on at once
'This is supposed to activate ONLY the LAST one turned on
IF Bunt = TRUE AND SavBunt = FALSE THEN
Steal = FALSE
HitAndRun = FALSE
END IF
IF Steal = TRUE AND SavSteal = FALSE THEN
HitAndRun = FALSE
Bunt = FALSE
END IF
IF HitAndRun = TRUE AND SavHitAndRun = FALSE THEN
Steal = FALSE
Bunt = FALSE
END IF
'Generate some random numbers for future reference
fr2 = FRND(2)
fr3 = FRND(3)
fr4 = FRND(4)
fr5 = FRND(5)
fr6 = FRND(6)
' ** PULL THE INFIELD IN (Tight) **
IF Tight AND RegDsply AND DelFac > 0 THEN
CALL Msg ("20", "0", "0", "01", 0, id, 0, 0)
CALL PostAnnouncer (TRUE, FALSE)
SLEEP DelFac * 800
ANx = 0
END IF
' ** PITCH AROUND **
IF PAround AND RegDsply AND DelFac > 0 THEN
AddtoAnnouncer it, "They'll pitch carefully to this guy..."
CALL PostAnnouncer (TRUE, FALSE)
SLEEP DelFac * 800
ANx = 0
END IF
' ELSEIF TightAtCorners THEN
' AddtoAnnouncer id, "Infield tight at the corners"
' CALL ScoreBrd
' SLEEP DelFac * 1000
' ANx = 0
' ** HELP SCREEN **
IF Help THEN
QPush
IF Gfx AND RegDsply THEN CALL HideGfx
CALL ShowDoc
IF Gfx AND RegDsply THEN CALL ShowGfx
QPop
GOTO AnnounceHitter
END IF
' ** SCORE CARD **
IF ScoreCard THEN
QPush
GOSUB ShowScoreCard
QPop
IF Gfx AND RegDsply THEN CALL UnfreezeAndRefresh
GOTO AnnounceHitter
END IF
' ** BOX SCORE **
IF Boxx THEN
CALL Box
IF Gfx AND RegDsply THEN CALL HideGfx
QPush
CALL ListFile (CmdWritePath$ +"~BOX.PRN")
QPop
IF Gfx AND RegDsply THEN CALL ShowGfx
itag = 1
GOTO AnnounceHitter
END IF
' ** BULLPEN **
IF BullO THEN
tm = it
GOSUB DisplayPitchCount 'corrupts n, m
CALL ClearInpBuffer
CALL Bullpen(0, it, 0, -1)
IF Gfx AND RegDsply THEN CALL UnfreezeAndRefresh
GOTO AnnounceHitter
END IF
IF BullD THEN
IF amgr(id) = 0 THEN
tm = id
GOSUB DisplayPitchCount
CALL ClearInpBuffer
END IF
ipsv = ip
CALL Bullpen(md, id, 0, 0)
IF Gfx AND RegDsply AND DelFac > 0 THEN
CALL UnfreezeAndRefresh
END IF
IF md = 0 THEN
Bull = FALSE
ELSE
HotBull = TRUE
DidDoubleSwitch = FALSE
CALL AddToScoreCrd (it, ip, "A", "[Relief] ")
'Consider Double-Switch
IF amgr(id) AND BlockDoubleSwitch = FALSE THEN
IF dh = FALSE THEN
DoIt = 2
IF inn = 9 AND iout = 0 THEN
IF ExpectedPitchCount(ip, id) < 22 THEN '1.4 innings
DoIt = FALSE
END IF
ELSEIF ExpectedPitchCount(ip, id) > 32 THEN '2 innings
DoIt = TRUE
END IF
IF DoIt = 2 THEN
IF RND < .50 THEN 'was .75 4.01
DoIt = TRUE
ELSE
DoIt = FALSE
END IF
END IF
IF DoIt THEN CALL DoubleSwitch (DidDoubleSwitch, inplayer, outplayer)
END IF
END IF
IF DidDoubleSwitch THEN zzzDSW = zzzDSW + 1
IF RegDsply THEN
CALL Msg ("26", "0", "0", "01", ipsv, id, 0, 0)
CALL Msg ("26", "0", "0", "02", ip, id, 0, 0)
CALL PostAnnouncer (TRUE, FALSE) 'was FALSE
CALL Defens(0)
CALL BatOrd
CALL BasPat
IF Gfx THEN
CALL UnfreezeAndRefresh
END IF
SLEEP DelFac * 1300
ANx = 0
IF DidDoubleSwitch THEN
CALL Msg ("20", "0", "0", "04", 0, id, 0, 0)
CALL Msg ("20", "0", "0", "05", inplayer, id, outplayer, id)
CALL PostAnnouncer (TRUE, FALSE)
SLEEP DelFac * 1300
ANx = 0
END IF
END IF
LineUpChangeDef = TRUE
GpPos(ip, id, 1) = 1
END IF
GOTO AnnounceHitter
END IF
' ** PINCH RUNNER **
IF PRun THEN
CALL PinchRun(mo, runner)
IF RegDsply THEN
CALL BatOrd
CALL BasPat
END IF
IF mo = 0 THEN GOTO AnnounceHitter
IF Gfx AND RegDsply THEN
CALL UnfreezeAndRefresh
END IF
'(runner, it) is new player in lineup
'(mo, it) is player now out
IF DelFac THEN
CALL Msg ("27", "0", "0", "03", 0, it, 0, 0)
CALL Msg ("27", "0", "0", "04", runner, it, mo, it)
ExtraTalk = TRUE
END IF
'Mark to check Defense-by-Position next inning
LineUpChangeOff = TRUE
'Record this guy in slot "12" - pinch runner category
r = DataRef(runner, it)
GpPos(r, it, 12) = 1
INCR zzzprun
IF DataPos(runner, it) = 1 THEN 'new guy is in pitcher's slot
IF WarmUpRule = TRUE AND amgr(it) = 0 THEN
'Is the pinch-runner for the pitcher also a pitcher?
SearchName$ = DataName(ib, it)
N = SearchDAT (10, LastPiAd(it), it, SearchName$, 0)
'If so, warm up the pinch-running pitcher
IF N THEN
WarmUpStatus(N, it) = 1
ipa(it) = N '?????
ELSE
GOSUB GoBullPenIfNoWarm
END IF
END IF
END IF
GOTO AnnounceHitter
END IF
' ** PINCH HITTER **
IF PH AND PHinProgress = FALSE THEN
CALL PinchHit(mo)
IF RegDsply THEN
CALL BatOrd
END IF
IF mo = 0 THEN GOTO AnnounceHitter
IF Gfx AND RegDsply THEN
CALL UnfreezeAndRefresh
END IF
'(ib, it) is new player in lineup
'(mo, it) is player now out
IF DelFac THEN
CALL Msg ("27", "0", "0", "01", 0, it, 0, 0)
CALL Msg ("27", "0", "0", "02", ib, it, mo, it)
ExtraTalk = TRUE
END IF
PHinProgress = TRUE
'Mark to check Defense-by-Position next inning
LineUpChangeOff = TRUE
'Record this guy in slot "11" - pinch hitter category
r = DataRef(ib, it)
GpPos(r, it, 11) = 1
IF DataPos(ib, it) = 1 THEN 'somebody is hitting in pitcher's slot
IF WarmUpRule = TRUE AND amgr(it) = 0 THEN
'Is the pinch-hitter for the pitcher also a pitcher?
SearchName$ = DataName(ib, it)
N = SearchDAT (10, LastPiAd(it), it, SearchName$, 0)
'If so, warm up the pinch-hitting pitcher
IF N THEN
WarmUpStatus(N, it) = 1
ipa(it) = N '?????
ELSE
GOSUB GoBullPenIfNoWarm
END IF
END IF
END IF
GOTO AnnounceHitter
END IF
' ** DEFENSIVE SUBSTITITION **
IF Subx THEN
QPush
CALL Lineup(id, rv)
QPop
LineUpChangeDef = TRUE
'Rebuild entire screen after a CLS
IF Gfx THEN
CALL UnfreezeAndRefresh
END IF
CALL ScoreBrd (TRUE, TRUE)
CALL BatOrd
CALL Prompt(0)
GOSUB PrintEra
GOSUB PrintButtons
GOSUB PrintStats
CALL Defens(0)
CALL BasPat
IF rv <> 0 THEN
CALL Msg ("28", "0", "0", "01", 0, id, 0, 0)
ExtraTalk = TRUE
END IF
GOTO AnnounceHitter
END IF
' ** VIEW LINEUP **
IF ViewHome OR ViewVisi THEN
IF ViewHome THEN N = 2 ELSE N = 1
IF Gfx THEN CALL GraphHole(30, 1+rowO, 2+colO, 24+rowO, 79+colO)
QPush
CALL DrawFrm(1+rowO, 2+colO, 23+rowO, 77+colO, defattr, "'" + RTRIM$(Names(N)) + " Lineup", LPtr$ + " " + RPtr$, 1, 0, 1)
QPRINTs 16+rowO, 77+colO, CHR$(193), defattr
QPRINTs 17+rowO, 77+colO, UpPtr$, defattr
QPRINTs 18+rowO, 77+colO, DnPtr$, defattr
QPRINTs 19+rowO, 77+colO, CHR$(194), defattr
CALL BuildTeamWin (N, 1, MAXPLAYERS, TRUE, pend)
RowOff = 0: ColOff = 0
DO
CALL ShowVirtWin (1, 10, RowOff, ColOff, 3+rowO, 4+colO, 10, 20, 72)
QPRINTs 13+rowO, 3+colO, STRING$(26, CHR$(196)) + " Pitchers and Bench " + STRING$(28, CHR$(196)), defattr
CALL ShowVirtWin (11, 9, RowOff, ColOff, 14+rowO, 4+colO, 0, 20, 72)
CALL GetScrollKey (kc, RowOff, ColOff)
LOOP UNTIL kc = 13 OR kc = 27
ERASE VirtualWin
QPop
IF Gfx THEN
CALL EliminateHole(30)
CALL UnfreezeAndRefresh
END IF
GOTO AnnounceHitter
END IF
' ** SWAP DEFENSIVE POSITIONS **
IF SwPos THEN
QPush
CALL DefSwitch(3, id)
QPop
IF Gfx THEN
CALL UnfreezeAndRefresh
END IF
LineUpChangeDef = TRUE
CALL BatOrd
CALL Defens(0)
CALL BasPat
GOTO AnnounceHitter
END IF
'ACTION -- we're actually throwing a pitch at this point,
'-or- throwing to first -or- issuing a free pass
'If a line-up change was made last inning, record it here.
'(PinchHitter or PinchRunner who stayed in game, bullpen,
'defensive substitution or position swap).
'The manager has had an opportunity to replace the pinch-player
'if desired, who then would not be recorded in the GpPos.
IF LineUpChangeDef THEN
FOR p = 1 TO 9
r = DataRef(p, id)
ps = DataPos(p, id)
IF ps <> 1 THEN
IF GpPos(r, id, ps) = 0 THEN GpPos(r, id, ps) = 1
END IF
NEXT
LineUpChangeDef = FALSE
END IF
'1st pitch of half-inning - scan defense
IF CurrentGamePoint <> SaveGamePoint THEN
IF LineUpChangeOff THEN
FOR p = 1 TO 9
r = DataRef(p, id)
ps = DataPos(p, id)
IF ps <> 1 THEN
IF GpPos(r, id, ps) = 0 THEN GpPos(r, id, ps) = 1
END IF
NEXT
IF PHinProgress = FALSE THEN LineUpChangeOff = FALSE
END IF
SaveGamePoint = CurrentGamePoint
END IF
IF DelFac > 0 AND RegDsply THEN
ANx = 0
IF RND < .3 THEN
'The sign
CALL Msg ("32", "0", "1", "00", ip, id, man2, team2)
END IF
i = NUMBERON
IF RND < .3 THEN
'Check runners
IF i = 1 THEN
CALL Msg ("32", "0", "2", "01", ip, id, man2, team2)
ELSEIF i > 1 THEN
CALL Msg ("32", "0", "2", "02", ip, id, man2, team2)
END IF
END IF
IF RND < .3 THEN
'Stretch/windup
IF i THEN t$ = "01" ELSE t$ = "02"
CALL Msg ("32", "0", "3", t$, ip, id, man2, team2)
END IF
'Pitch
IF ANx > 0 THEN t$ = "01" ELSE t$ = "02"
CALL Msg ("32", "0", "4", t$, ip, id, man2, team2)
CALL PostAnnouncer(TRUE, FALSE)
SLEEP (DelFac / 2) * 1000
ANx = 0
END IF
LL = 130
' ** INTENTIONAL WALK **
IF IWalk THEN
CALL WalkRoutine
INCR mpbf(ip, id)
GOSUB ResetBatterCounters
GOTO WrapUpThisAB
END IF
'** Throw to First / Pick-Off (new location)
xF! = RND
IF ir1 <> 0 AND ir2 = 0 THEN '.0012
RunsAhead = itruns(id) - itruns(it)
IF ABS(RunsAhead) < 3 THEN
IF DataSpeed(ir1, it) > 4 THEN
IF xF! < .0005 * DataSpeed(ir1, it) THEN GOTO PickOff
IF xF! < .0250 * DataSpeed(ir1, it) THEN GOTO HoldRunner
END IF
END IF
END IF
' ** PITCH OUT
IF NUMBERON THEN
IF POut THEN
IF BatPOut + WildPitchCount = 3 THEN
CALL WalkRoutine
INCR mpbf(ip, id)
GOSUB ResetBatterCounters
GOTO WrapUpThisAB
ELSE
AddToAnnouncer id, "Pitch Out..."
INCR BatPOut
IF NOT Steal AND NOT Bunt AND NOT HitAndRun THEN
IF SoundOn THEN CALL WavPopMitt
AddToAnnouncer it, "Runner not going..."
CALL ResetBatter 'Same hitter still up
GOTO WrapUpThisAB
END IF
END IF
END IF
END IF
'If POut is TRUE, then the only way to get here is if
'it's a STEAL, BUNT, or HITANDRUN
' ** BUNT/SQUEEZE **
' "Batters Faced" maintained inside BuntRoutine
IF Bunt THEN 'you could bunt a pitchout?
CALL BuntRoutine
GOSUB ResetBatterCounters
GOTO WrapUpThisAB
END IF
' ** STEAL IN PROGRESS
IF Steal THEN
'Who is lead runner?
LR = 0
IF ir3 = 0 THEN
IF ir2 = 0 THEN
IF ir1 > 0 THEN LR = ir1
ELSE
LR = ir2
END IF
ELSE
LR = ir3
END IF
'Sum up attemps by player and team
IF LR THEN
INCR StealAttemptsTeam(it)
runref = DataRef(LR, it)
INCR StealAttemptsPlayer(runref, it)
END IF
'Couldn't get a jump...
IF RND < .12 AND LR > 0 THEN
IF DelFac THEN CALL Msg ("31", "0", "0", "14", ir1, it, man2, team2)
IF POut THEN
'Abort play...
IF SoundOn THEN CALL WavPopMitt
CALL ResetBatter
GOTO WrapUpThisAB
END IF
'Continue with play,,,
ELSE
'Runner takes off...
IF SoundOn THEN CALL WavPopMitt
CALL StealRoutine
GOTO WrapUpThisAB
END IF
END IF
' ** HIT-AND-RUN
IF HitAndRun THEN
IF POut THEN
CALL StealRoutine
GOTO WrapUpThisAB
END IF
'Find the percentage of strike-outs
hsoF! = DataSO(ib, it) / (DataAB(ib,it) + 1.09 * DataBB(ib,it))
bfF! = BattersFacedByPit! (DataAB(ip,id), DataHits(ip,id), DataBB(ip,id), DataSO(ip,id))
psoF! = DataSO(ip, id) / bfF!
x! = hsoF! * (psoF! / psbaseF(id))
bpkF! = x! / (x! + ( (1-hsoF!)*(1-psoF!)/(1-psbaseF(id)) ) )
xF! = RND
IF xF! < bpkF! THEN 'Strike Out plus steal attempt
CALL StrikeOutRoutine
INCR mpbf(ip, id) 'Bump up "Batters Faced"
IF iout < 3 THEN
fr7 = 0
CALL StealRoutine
'fr7 = 90 (from StealRoutine) signals runner was caught stealing
IF fr7 = 90 THEN
Result$ = Result$ + " DP"
INCR dp(id)
fr7 = 0
END IF
'StealRoutine (above) resets hitter so we've got to undo that
'because we're done with this batter!
ResetHitter = FALSE
INCR ibp(it)
INCR mab(ref, it)
IF UCASE$(DataHand(ip, id)) = "L" THEN
INCR mabLHP(ref, it)
ELSE
INCR mabRHP(ref, it)
END IF
END IF
GOTO WrapUpThisAB
'Swing-and-a-miss and steal attempt - same batter
ELSEIF xF! < bpkF! + .15 THEN
IF SoundOn THEN CALL WavWhiff
AddToAnnouncer it, "Swing and a miss...."
CALL StealRoutine 'Resets Hitter
GOTO WrapUpThisAB
END IF
END IF
' ** Wild Pitch / Passed Ball **
IF ir1 OR ir2 OR ir3 THEN
xF! = RND
yF! = DataBB(ip,id) / BattersFacedByPit! (DataAB(ip,id), DataHits(ip,id), DataBB(ip,id), DataSO(ip,id))
wp! = .017 * (yF! / pwbaseF(id))
IF ir3 THEN wp! = wp! / 2
IF xF! < wp! THEN GOTO WildPitch 'was .01 .008
nn = WHOATGUY(2)
defperF! = DEFPCT!(nn)
zF! = (1.0 - defperF!) * .07 'was .1
IF xF! < wp! + zF! THEN GOTO PassedBall
END IF
' ** HR Tease / Foul Ball **
IF DelFac THEN
IF RND < DataHR(ib, it) / (DataAB(ib, it) * 10) THEN
'Decide which foul line
IF DataHand(ib, it) = "R" THEN
WhoAtPos = 7
ELSEIF DataHand(ib, it) = "L" THEN
WhoAtPos = 9
ELSE
'Switch hitter
IF UCASE$(DataHand(ip, id)) = "L" THEN
WhoAtPos = 7
ELSE
WhoAtPos = 9
END IF
END IF
'Occasionally hit to opposite field
IF RND < .15 THEN
IF WhoAtPos = 7 THEN
WhoAtPos = 9
ELSE
WhoAtPos = 7
END IF
END IF
IF SoundOn THEN CALL WavBigFly
wag = WHOATGUY(WhoAtPos)
CALL Msg ("09", "0", "1", "01", wag, id, man2, team2)
IF RND < .1 THEN t$ = "02" ELSE t$ = "01"
CALL Msg ("09", "0", "2", t$, wag, id, man2, team2)
AddToAnnouncer it, "Foul ball!"
CALL ResetBatter
GOTO WrapUpThisAB
END IF
END IF
'Execute play
IF WarmUpRule THEN
IF amgr(id) = 0 THEN
'Decrement Defense's pitchers warmup status
FOR i = 10 TO TopPitLim
IF WarmUpStatus(i, id) > 0 THEN
DECR WarmUpStatus(i, id)
IF WarmUpStatus(i, id) = 0 AND SimDaysOff(i, id) < 0 THEN '2/18/07
SimDaysOff(i, id) = 0 - SimDaysOff(i, id)
END IF
END IF
NEXT
END IF
IF amgr(it) = 0 THEN
'Decrement Offense's pitchers warmup status (to a point)
FOR i = 10 TO TopPitLim
IF WarmUpStatus(i, it) > 2 THEN DECR WarmUpStatus(i, it)
NEXT
END IF
END IF
INCR mpbf(ip, id) 'Bump up "Batters Faced"
CALL Engine
GOSUB ResetBatterCounters
'Erase Batter's name from batters box
IF DelFac > 0 AND RegDsply = TRUE THEN
CALL BatterName(BLN$, "", TRUE)
IF Gfx THEN
CALL UnfreezeAndRefresh
END IF
END IF
LL = 140
WrapUpThisAB:
'Scorecard reporting
IF ResetHitter = FALSE THEN
IF PHinProgress THEN xS$ = "8" ELSE xS$ = " "
CALL AddToScoreCrd(it, ref, xS$, Result$)
'The following extra line reports
'runners thrown out during play, etc.
IF ref2 THEN
RunsBeforePlay = itruns(it)
'Causes runs to zero-out - we just reported runs this play above
CALL AddToScoreCrd(it, ref2, Code2$, Result2$)
ref2 = 0
END IF
PHinProgress = FALSE
END IF
INCR mab(ref, it)
IF UCASE$(DataHand(ip, id)) = "L" THEN
INCR mabLHP(ref, it)
ELSE
INCR mabRHP(ref, it)
END IF
IF RegDsply THEN
CALL PostAnnouncer (TRUE, TRUE) 'flashes defense
CALL ScoreBrd (DrawSBFrame, GenerateAllSB)
DrawSBFrame = FALSE
GenerateAllSB = FALSE
CALL BasPat
IF Gfx THEN
CALL UnfreezeAndRefresh
END IF
END IF
IF DelFac THEN
SLEEP DelFac * 900 'Allow user time to read the messages, etc. 800
END IF
IF IGone = TRUE AND DelFac > 0 THEN
QPush
CALL Gone
QPop
IF Gfx THEN
CALL EliminateHole(30)
CALL UnfreezeAndRefresh
END IF
END IF
HotBull = FALSE
GOTO NextHitter
WildPitch:
IF DelFac THEN
CALL Msg ("29", "0", "0", "08", 0, id, 0, 0)
IF NUMBERON > 1 THEN x$ = "05" ELSE x$ = "04"
CALL Msg ("31", "0", "0", x$, 0, id, 0, 0)
IF SoundOn THEN
'J-u-s-t a bit outside...
IF RND < .33 THEN
SLEEP 1000
L = PlayWav("15533.wav")
END IF
END IF
END IF
Errorx = TRUE 'So RBI will not be credited
CALL Advanc(1, 1, 1)
Errorx = FALSE
CALL AddToScoreCrd(it, 0, "5", "WP")
WildPit(id) = WildPit(id) + PADZEROS$(LTRIM$(STR$(ip)), 2)
zzzwp = zzzwp + 1
INCR WildPitchCount 'Did we just walk him also?
IF WildPitchCount + BatPOut > 3 THEN
CALL WalkRoutine
INCR mpbf(ip, id)
GOSUB ResetBatterCounters 'We are done with this batter
GOTO WrapUpThisAB
ELSE
CALL ResetBatter
GOTO WrapUpThisAB
END IF
PassedBall:
IF DelFac THEN
AddToAnnouncer id, "The pitch gets by the catcher..."
AddToAnnouncer id, "That will be a passed ball!"
IF NUMBERON > 1 THEN x$ = "05" ELSE x$ = "04"
CALL Msg ("31", "0", "0", x$, 0, it, 0, 0)
END IF
Errorx = TRUE 'So RBI will not be credited
CALL Advanc(1, 1, 1)
Errorx = FALSE
CALL AddToScoreCrd(it, 0, "5", "PB")
i = WHOATGUY(2)
PassedB(id) = PassedB(id) + PADZEROS$(LTRIM$(STR$(DataRef(i, id))), 2)
zzzpb = zzzpb + 1
CALL ResetBatter
GOTO WrapUpThisAB
PickOff:
LL = 150
IF DelFac THEN
AddToAnnouncer id, "Throw to first..."
CALL Msg ("31", "0", "0", "07", ir1, it, 0, 0)
CALL Msg ("40", "0", "0", "00", 0, it, 0, 0)
END IF
i = ir1
ir1 = 0
CALL AddToScoreCrd(it, DataRef(i, it), "1", "1-3 PkOff")
INCR iout
INCR mpo(ip, id)
INCR Assists(ip, id, 1)
INCR PutOuts(DataRef(WHOATGUY(3), id), id, 3)
CALL ResetBatter
GOTO WrapUpThisAB
HoldRunner:
IF DelFac THEN
AddToAnnouncer id, "Throw to first..."
AddToAnnouncer it, "The runner back..."
END IF
CALL ResetBatter
SaveState = TRUE
GOTO WrapUpThisAB
SwitchSides: 'End of 1/2 inning
INCR it
LOOP
'Start top of NEW inning
INCR inn
GOTO TopOfInning
'---------------------
'Game is over.
'---------------------
GAMEOVER:
IF dh THEN
Atotpitchers = Atotpitchers + np(1) + np(2)
AGames = AGames + 2
ELSE
Ntotpitchers = Ntotpitchers + np(1) + np(2)
NGames = NGames + 2
END IF
IF CmdDeBug$ = "Y" THEN
FOR i = 1 TO 2
zzzSumR = zzzSumR + TeamSpeed(i)
zzzSumN = zzzSumN + 1
NEXT
FOR p = 1 TO 9
FOR i = 1 TO MAXPLAYERS
FOR j = 1 TO 2
k = Assists(i,j,p)
IF k THEN SumAssists(p) = SumAssists(p) + k
l = PutOuts(i,j,p)
IF l THEN SumPutOuts(p) = SumPutOuts(p) + l
NEXT
NEXT
NEXT
END IF
LL = 160
GameIsOver = TRUE
zzzdp = zzzdp + dp(1) + dp(2)
'Mark last pitchers as used (for DaysOff logic)
i = iyp(np(1), 1)
j = iyp(np(2), 2)
iused(i, 1) = TRUE
iused(j, 2) = TRUE
'pit per game
zzzpitpergame = zzzpitpergame + (PitchersPerGame(1) + PitchersPerGame(2)) / 2
zzzgames = zzzgames + 1
IF itruns(2) > itruns(1) THEN iwin = 2 ELSE iwin = 1
' Did anyone earn a "save"?
' If the Last Pitcher on the winning team is not the winning pitcher,
' then give a save to the last pitcher - maybe
lastpit = iyp(np(iwin), iwin)
IF lastpit <> WPpit THEN
i = mpo(lastpit, iwin) 'outs records by last pitcher
IF (lastpit = QualSave1IP AND iwin = QualSave1ID) THEN
SPteam = iwin
SPpit = lastpit
END IF
IF (lastpit = QualSave2IP AND iwin = QualSave2ID) AND i > 2 THEN
SPteam = iwin
SPpit = lastpit
END IF
IF i > 8 THEN
SPteam = iwin
SPpit = lastpit
END IF
END IF
'Enforce 5 inning rule for starting pitchers
IF iyp(1, iwin) = WPpit THEN
IF mpo(WPpit, iwin) < 15 THEN
WPpit = iyp(2, iwin)
END IF
END IF
'Record Exceptional Performances
ExSw = FALSE
GMx = 0
FOR it = 1 TO 2
ref = 10
DO
IF mpk(ref, it) >= HiLvlSOs THEN
xS$ = STR$(mpk(ref, it)) + " K's"
GOSUB BuildHiLiteMsg
GOSUB SaveHiLite
END IF
ref = ref + 1
IF ref > LastPiAd(it) THEN EXIT DO
LOOP UNTIL ref > TopPitLim
NEXT
FOR it = 1 TO 2
ref = 1
DO
IF mhits(ref, it) >= HiLvlHits THEN
xS$ = STR$(mhits(ref, it)) + " hits"
GOSUB BuildHiLiteMsg
GOSUB SaveHiLite
END IF
IF mrbi(ref, it) >= HiLvlRBIs THEN
xS$ = STR$(mrbi(ref, it)) + " RBI's"
GOSUB BuildHiLiteMsg
GOSUB SaveHiLite
END IF
IF mhr(ref, it) > 0 AND m3b(ref, it) > 0 AND m2b(ref, it) > 0 THEN
IF mhits (ref, it) > (mhr(ref, it) + m3b(ref, it) + m2b(ref, it)) THEN
xS$ = " hit for cycle"
GOSUB BuildHiLiteMsg
GOSUB SaveHiLite
END IF
END IF
IF mhr(ref, it) >= HiLvlHRs THEN
xS$ = STR$(mhr(ref, it)) + " HR's"
GOSUB BuildHiLiteMsg
GOSUB SaveHiLite
END IF
IF msb(ref, it) >= HiLvlSBs THEN
xS$ = STR$(msb(ref, it)) + " SB's"
GOSUB BuildHiLiteMsg
GOSUB SaveHiLite
END IF
IF ref = 9 THEN ref = LastPiAd(it)
ref = ref + 1
LOOP WHILE ref <= MAXPLAYERS
NEXT
FOR it = 1 TO 2
IF ithits(it) <= HiLvlPHits THEN
id = 3 - it
IF ithits(it) = 0 THEN zS$ = "No" ELSE zS$ = LTRIM$(STR$(ithits(it)))
IF np(id) = 1 THEN
Message$ = FULLNAME$(NameRef(iyp(1, id), id)) + ", " + zS$ + "-Hitter"
GOSUB SaveHiLite
ELSEIF ithits(it) = 0 THEN
Message$ = RTRIM$(Names(id)) + ", multi-pit. " + zS$ + "-Hitter"
GOSUB SaveHiLite
END IF
END IF
NEXT
'Former position of the dump star file
IF (MenuOpt$ = "T" OR MenuOpt$ = "E") AND DelFac > 0 THEN
PauseSw = TRUE
END IF
'Former position of showstandings
IF CmdPauseAftGame$ = "Y" THEN PauseSw = TRUE
IF CmdPauseAftDate$ = "Y" THEN
IF LastGameThisDate = TRUE THEN
LastGameThisDate = FALSE
PauseSw = TRUE
END IF
END IF
'Record-keeping
IF CmdStat$ > "!" THEN
GOSUB UpdateStats 'appends to .STS (#3) leaves #3 open
'updates bat and pit in memory
IF MenuOpt$ = "M" OR MMGame OR QuitPending OR PauseSw THEN
GOSUB SaveStatsToDisk 'opens and closes #4 for both bat & pit
Silence = TRUE
END IF
END IF
'Append LineScore to CmdLinF$ file
IF CmdLinF$ > "!" THEN
IF LEFT$(CmdLinF$, 3) = "LPT" THEN
OPEN CmdLinF$ FOR OUTPUT AS #6 LEN = 80
ELSE
OPEN CmdWritePath$ + CmdLinF$ FOR APPEND AS #6 LEN = 80
END IF
PRINT #6, DATE$; " "; TIME$;
PRINT #6, " #"; SimGameCtr + 1;
PRINT #6, STRING$(41, "-");
IF LEN(SCHDate$) THEN
PRINT #6, " "; SCHDate$
ELSE
PRINT #6, STRING$(10, "-"); " "
END IF
xS$ = LINESCORE$(1)
PRINT #6, SPACE$(LEN(xS$) - 9) + " R H E"
PRINT #6, xS$
xS$ = LINESCORE$(2)
PRINT #6, xS$
CLOSE #6
END IF
'Build box-score and append it to CmdStar$ file
IF ExSw AND CmdStar$ > "!" THEN
IF DelFac THEN
QPush
CALL DrawFrm(11, 16, 13 + GMx, 66, defattr, nulls$, nulls$, 1, 0, 0)
FOR i = 1 TO GMx
QPRINTs 11 + i, 18, GMMessage(i), dimattr
NEXT
QPRINTs 12 + GMx, 18, "The Box Score will be saved in " + CmdStar$, dimattr
SLEEP 1500
QPop
IF Gfx THEN
CALL UnfreezeAndRefresh
END IF
END IF
'ForceCLS = TRUE
CALL Box
n = 1
xS$ = CmdStar$
GOSUB AppendBox
REDIM GMMessage(5) AS GLOBAL STRING
END IF
'Build box-score and append it to CmdBoxF$ file
IF CmdBoxF$ > "!" THEN
CALL Box
n = 0
xS$ = CmdBoxF$
GOSUB AppendBox
END IF
'Append Score Card to CmdScrF$ file
IF CmdScrF$ > "!" THEN
REDIM List1(1 TO 300) AS List1Type
CALL LoadScoreCardToList1 (List1(), j) ' j returns items in list
IF LEFT$(CmdScrF$, 3) = "LPT" THEN
xS$ = CmdScrF$
ELSE
xS$ = CmdWritePath$ + CmdScrF$
END IF
CALL DumpList(List1(), j, xS$, TRUE)
ERASE List1
END IF
'Record win or loss for "Standings" - updates WLRec(), WLx, etc.
CALL SearchStandingsTable (League(1), Div(1), Names(1), j)
CALL SearchStandingsTable (League(2), Div(2), Names(2), k)
IF itruns(2) > itruns(1) THEN
WLRec(k).WLWins = WLRec(k).WLWins + 1
WLRec(j).WLLoss = WLRec(j).WLLoss + 1
ELSE
WLRec(j).WLWins = WLRec(j).WLWins + 1
WLRec(k).WLLoss = WLRec(k).WLLoss + 1
END IF
'Count Total Shutouts
IF itruns(1) = 0 OR itruns(2) = 0 THEN
INCR zzzshutouts
END IF
IF RegDsply = FALSE THEN
IF CmdSch$ < "!" THEN 'no .sch file so must be .ser or two-team or CMD-line
IF SimGameCtr MOD RefreshStandings = 0 THEN
IF CmdAutoExit$ <> "Y" THEN CALL ShowStandings (FALSE)
END IF
ELSE '.sch file
IF MMx THEN
CALL ShowStandings (FALSE)
ELSEIF SaveSCHDate$ <> SCHDate$ THEN
IF CmdAutoExit$ <> "Y" THEN CALL ShowStandings (FALSE)
SaveSCHDate$ = SCHDate$
END IF
END IF
END IF
'Temporarily Pause the action under the following conditions
IF PauseSw THEN GOTO ManualPromptLoop
IF MMGame THEN GOTO ManualPromptLoop
IF QuitPending THEN GOTO ManualPromptLoop
'--------------------------------------------------------------
'If there's more games to play on the schedule or two-team sim,
'Go back to "LoadTeamFiles", (unless this is a double-header
'in which case you get next pitchers and go to "Startup").
'Go to "MultiPromptLoop" if done.
'--------------------------------------------------------------
'SIMULATION: T/S/E/Command-Line
MultiGames:
LL = 170
IF CmdSlotGames > 0 THEN
SlotGameCtr = SlotGameCtr + 1 'counts /n: games in this "slot"
SimGameCtr = SimGameCtr + 1 'total number of games
'More Games in this Slot?
IF SlotGameCtr < CmdSlotGames THEN 'Double Header?: T/S/E/Command-Line
IF MMGame THEN
GOTO LoadTeamFiles
ELSE
CALL RestFrSnapShot 'restores Dat arrays from RefOrgSave array
GOSUB ClearGameData
CALL GetNextPitchers 'ipa(*)
IF AutoLineUpSw(1) THEN CALL AutoLineUp (1, c1)
IF AutoLineUpSw(2) THEN CALL AutoLineUp (2, c2)
IF NOT dh THEN CALL PutPitHitStatsInBO
CALL SetPlatoon 'Will over-ride a fixed lineup
IF AdjustBO(1) = "Y" OR _
AdjustBO(1) = "F" OR _
(AdjustBO(1) = "C" AND c1) THEN CALL AdjustBattingOrder (1)
IF AdjustBO(2) = "Y" OR _
AdjustBO(2) = "F" OR _
(AdjustBO(2) = "C" AND c2) THEN CALL AdjustBattingOrder (2)
'Rebuild RefOrg for box score purposes
REDIM RefOrg(MAXPLAYERS, 2) AS GLOBAL RefOrgType
FOR tm = 1 TO 2
FOR i = 1 TO MAXPLAYERS
RefOrg(i, tm).RefNo = DataRef(i, tm)
RefOrg(i, tm).RefPos = DataPos(i, tm)
NEXT
NEXT
CALL SetRefByBO 'Builds RefByBO array
GOTO StartUp
END IF
'We need to read the next .SER record
ELSEIF SeriesSw THEN
IF NOT EOF(2) THEN
SlotGameCtr = 0
DO
LINE INPUT #2, xS$
L = LEN(xS$)
LOOP WHILE xS$ = SPACE$(L) AND NOT EOF(2)
IF xS$ <> SPACE$(L) THEN
CALL ParseCommand (xS$, nargs)
CALL SetSwitches (nargs)
GOTO LoadTeamFiles 'Load new .dat files, etc.
ELSE
CLOSE #2
GOTO MultiPromptLoop
END IF
ELSE
CLOSE #2
GOTO MultiPromptLoop 'no more cards to read - we are done
END IF
'We need to look at the next "slot" in the .SCH record
ELSEIF SchedSw THEN
SlotGameCtr = 0
CmdVFil$ = nulls$: CmdHFil$ = nulls$
DO WHILE SchSlotPtr < SchGamesPerRecord
SchSlotPtr = SchSlotPtr + 1
IF MMx THEN CALL SetSCHBookMark
CALL ReadSCHSlot
IF CmdVFil$ > "!" AND CmdHFil$ > "!" AND FilterOK = TRUE THEN
GOSUB SetAutoMgr
GOTO LoadTeamFiles
END IF
LOOP
'The Date has changed so,
'We need to read the next .SCH date record: S/Command-line
DO
GET #2 ,, SchBuffer$
IF EOF(2) THEN EXIT DO
IF MID$(SchBuffer$, 1, 1) = "D" THEN ITERATE DO
SCHDate$ = MID$(SchBuffer$, 3, 8)
SchSlotPtr = 0
DO WHILE SchSlotPtr < SchGamesPerRecord
SchSlotPtr = SchSlotPtr + 1
IF MMx THEN CALL SetSCHBookMark
CALL ReadSCHSlot
IF CmdVFil$ > "!" AND CmdHFil$ > "!" AND FilterOK = TRUE THEN
GOSUB SetAutoMgr
GOTO LoadTeamFiles
END IF
LOOP
LOOP
CALL SetSCHBookMark
CALL UpdSCHRecord1 ("DEL")
IF EOF(2) THEN CLOSE #2
GOTO MultiPromptLoop 'No more cards to read - we are done
ELSE 'No more games left:
GOTO MultiPromptLoop 'T/Command-Line w/no .sch
END IF
END IF
'--------------------------------------------------
'End of Manual Game (or manually managed .sch game)
'--------------------------------------------------
'MANUAL single-game mode closing
' (never go here without closing and saving STB and STP)
ManualPromptLoop:
r = MidRow
c = MidCol - 19
IF PauseSw OR MMGame THEN n = r+4 ELSE n = r+3
IF HoleStatus(32) THEN CALL EliminateHole(32)
IF Gfx THEN CALL GraphHole(32, r-1, c-5, n, c+44)
CALL DrawFrm(r-1, c-5, n, c+44, defattr, nulls$, nulls$, 0, 0, 0)
QPRINTs r, c+10, "That's the ballgame!", dimattr
QPRINTs r+1, c+10, "WINNER: '" + Names(iwin), defattr
QPRINTs r+2, c, "Select an Option from the Menu Bar below.", dimattr
IF SoundOn THEN
'Purge Announcer queue
ANx = 0
AddToAnnouncer id, "That's the ballgame!"
AddToAnnouncer id, RTRIM$(Names(iwin)) + " takes this one."
CALL PostAnnouncer (TRUE, FALSE)
END IF
IF PauseSw OR MMGame THEN
QPRINTs r+3, c, "Hit ENTER to continue your simulation.", dimattr
END IF
CALL Prompt(1)
IF CmdStat$ > "!" THEN
CLOSE #3 'Close .STS
STSOpen = FALSE 'bat & pit (#4) already saved & closed
END IF
'Wait until a menu key is pressed...
DO
i = 0
DO
IF Gfx AND RegDsply THEN
CALL UnfreezeAndRefresh
END IF
zS$ = WAITKEY$
IF LEN(zS$) = 4 THEN
msx = MOUSEX
msy = MOUSEY
IF msy = ConsRows THEN
zS$ = CHR$(SCREEN(msy, msx))
CALL FlashField (msy, msx, 1, 2, 100, 0)
ELSE
zS$ = nulls$
END IF
ELSE
zS$ = UCASE$(zS$)
msx = 0
msy = 0
END IF
i = INSTR("BCNRSDQ " + CHR$(27) + CHR$(13), zS$)
LOOP UNTIL i
SELECT CASE zS$
CASE "B"
IF Gfx AND RegDsply THEN CALL HideGfx
QPush
CALL Box
CALL ListFile (CmdWritePath$ + "~BOX.PRN")
COLOR deffor, defbac
QPop
IF Gfx AND RegDsply THEN CALL ShowGfx
CASE "C"
QPush
GOSUB ShowScoreCard
QPop
CASE "N", CHR$(27), CHR$(13), CHR$(32)
IF PauseSw THEN
PauseSw = FALSE
ForceCLS = TRUE
GOTO MultiGames
END IF
IF MMGame OR QuitPending THEN '.SCH Files only
CALL Button(17+rowO, 20+colO, errattr, " Want to continue the Simulation? [Y/n] ", 0)
LOCATE 17+rowO, 60+colO
IF YESorNO$(revfor, revbac, deffor, defbac, "Y") = "N" THEN
SlotGameCtr = SlotGameCtr + 1 'counts /n: games in this slot
SimGameCtr = SimGameCtr + 1 'total number of games
CALL SetSCHBookMark
CALL UpdSCHRecord1 (" ")
'Start over with a "clean slate"
GOSUB ResetData
GOTO MenuOptions 'closes all files
ELSE
QuitPending = FALSE
ForceCLS = TRUE
GOTO MultiGames
END IF
END IF
'Normal manual mode
IF STSOpen THEN
CLOSE #3
STSOpen = FALSE
END IF
QPush
CALL SameTeamsSetup (kc, Flds, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
IF kc = KeyF3 THEN
QPop
ELSE
IF FContents$(1) = "Y" THEN
CALL RestFrSnapShot
GOSUB ClearGameData
RANDOMIZE TIMER
REDIM amgr(2) AS GLOBAL LONG
QPop
IF Gfx THEN CALL EliminateHole(32)
IF Gfx THEN CALL HideGfx
PCOPY 2, 1
GOTO PickStarters
ELSE
GOSUB ResetData
QPop
GOTO MenuOptions
END IF
END IF
CASE "R"
IF Gfx AND RegDsply THEN CALL HideGfx
QPush
COLOR deffor, defbac
CLS
CALL ShowStandings (TRUE)
CALL Prompt(1)
QPop
IF Gfx AND RegDsply THEN CALL ShowGfx
CASE "S"
QPush
IF CmdStat$ > "!" THEN
CALL StatsIO (Flds, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
ELSE
CALL Button(18+rowO, 15+colO, errattr, " You didn't specify a statistics file during setup. ", 0)
SLEEP 2000
END IF
QPop
CASE "D"
QPush
CALL ShowDoc
QPop
CASE "Q"
IF MMGame OR QuitPending OR PauseSw THEN
SlotGameCtr = SlotGameCtr + 1 'counts /n: games in this "slot"
SimGameCtr = SimGameCtr + 1 'total number of games
IF SchedSw THEN
CALL SetSCHBookMark
CALL UpdSCHRecord1 (" ")
END IF
END IF
GOTO ReturnToDOS
END SELECT
LOOP
'----------------------------------------------
'Simulation Ends
'Go back to MenuOptions if you want to continue
'----------------------------------------------
' Two-Team / Schedule / Series/ Command-line closing
MultiPromptLoop:
'DrawSBFrame = TRUE
ForceCLS = TRUE
'Debug screen. Use command line switch /debug to get here.
IF CmdDeBug$ = "Y" THEN
CLS
LOCATE 2, 45
PRINT "SB Attempts by Succ.Rate";
LOCATE 3, 45
PRINT "< 40%", zz0;
LOCATE 4, 45
PRINT "40-50:",zz1;
LOCATE 5, 45
PRINT "50-60:",zz2;
LOCATE 6, 45
PRINT "60-70:",zz3;
LOCATE 7, 45
PRINT "70-80:",zz4;
LOCATE 8, 45
PRINT "80-90:",zz5;
LOCATE 9, 45
PRINT "90-99:",zz6;
j = 0
k = 0
LOCATE 2, 2
PRINT "Pos ERR Chances %Err %Chances";
FOR i = 1 TO 9
LOCATE 2+i, 2
Chances = SumErrors(i) + SumPutouts(i) + SumAssists(i)
PRINT i; ":"; SumErrors(i); Chances;
j = j + SumErrors(i)
k = k + Chances
NEXT
LOCATE 12, 2
PRINT "Tot:"; j; k;
FOR i = 1 TO 9
LOCATE 2+i, 23
PRINT FFORMAT$(SumErrors(i) / j * 100, "###.#");
Chances = SumErrors(i) + SumPutouts(i) + SumAssists(i)
PRINT FFORMAT$(Chances / k * 100, "###.#");
NEXT
LOCATE 16, 2
PRINT "SB:"; zzzsb;
LOCATE 17, 2
PRINT "CS:"; zzzcs;
LOCATE 18, 2
PRINT "Catcher Throw. Errs:"; zzzcer;
LOCATE 19, 2
PRINT "DP:"; zzzdp;
LOCATE 20, 2
PRINT "WP:"; zzzwp;
LOCATE 21, 2
PRINT "PB:"; zzzpb;
LOCATE 22, 2
PRINT "PRun:"; zzzprun;
LOCATE 23, 2
PRINT "Dbl-Sw:"; zzzDSW;
LOCATE 3, 68
PRINT "SacOK:"; zzsacok;
LOCATE 4, 68
PRINT "SacFail:"; zzsacfa;
LOCATE 5, 68
PRINT "I-Walk1:"; zzziwalk1;
LOCATE 6, 68
PRINT "I-Walk2:"; zzziwalk2;
LOCATE 7, 68
PRINT "I-Walk3:"; zzziwalk3;
LOCATE 8, 68
PRINT "P-Hit:"; zzzPH;
LOCATE 9, 68
PRINT "St-Att-P:"; zzsabp;
LOCATE 10, 68
PRINT "St-Suc-P:"; zzssbp;
LOCATE 16, 30
PRINT "AvgTeamSpeed:"; zzzSumR / zzzSumN;
LOCATE 17, 30
PRINT "Walk Adj:"; zzzWalkAdj;
LOCATE 18, 30
PRINT "No Walk Adj:"; zzzNoWalkAdj;
LOCATE 19, 30
PRINT "PitchOut:"; zzzPO;
LOCATE 20, 30
PRINT "No PitchOut:"; zzzNoPO;
LOCATE 21, 30
PRINT "Tot shutouts:"; zzzshutouts;
LOCATE 22, 30
PRINT "Pit-p-Game(DAT):"; zzzpitpergame / zzzgames;
LOCATE 15, 65
PRINT "Start. Pit. Removal";
FOR i = 1 TO 8
LOCATE i+15, 64
PRINT i; RemoveReason(i);
NEXT
IF ConsCols > 99 THEN
LOCATE 16, 75: PRINT "Bombed early";
LOCATE 17, 75: PRINT "Bombed (7+)";
LOCATE 18, 75: PRINT "Bombed other";
LOCATE 19, 75: PRINT "Pitch Count";
LOCATE 20, 75: PRINT "C.G. Reduction";
LOCATE 21, 75: PRINT "PH - Gen Reliever";
LOCATE 22, 75: PRINT "PH - Closer";
LOCATE 23, 75: PRINT "PH (All)";
END IF
x$ = WAITKEY$
CLS
END IF
IF RegDsply THEN
COLOR deffor, defbac
IF HoleStatus(32) THEN CALL EliminateHole(32)
IF Gfx THEN CALL GraphHole(32, 11+rowO, 16+colO, 14+rowO, 65+colO)
CALL DrawFrm(11+rowO, 16+colO, 14+rowO, 65+colO, defattr, nulls$, nulls$, 1, 0, 0)
QPRINTs 12+rowO, 21+colO, "Your" + STR$(SimGameCtr) + " game simulation is complete! ", dimattr
QPRINTs 13+rowO, 21+colO, "Select an Option from the list below.", dimattr
ELSE
IF CmdAutoExit$ <> "Y" THEN
QPRINTs 19+rowO, 21+colO, "Your" + STR$(SimGameCtr) + " game simulation is complete! ", defattr
IF Gfx THEN CALL HideGfx
CALL ShowStandings (FALSE)
END IF
END IF
IF CmdAutoExit$ <> "Y" THEN CALL Prompt(1)
IF CmdStat$ > "!" THEN
CLOSE #3 'closes .STS
STSOpen = FALSE
GOSUB SaveStatsToDisk 'opens #4 - dumps pit & bat -- closes #4
END IF
IF CmdAutoExit$ = "Y" THEN GOTO QuickEnd
DO
i = 0
DO
IF Gfx AND RegDsply THEN
CALL UnfreezeAndRefresh
END IF
zS$ = WAITKEY$
IF LEN(zS$) = 4 THEN
msx = MOUSEX
msy = MOUSEY
IF msy = ConsRows THEN
zS$ = CHR$(SCREEN(msy, msx))
CALL FlashField (msy, msx, 1, 2, 100, 0)
ELSE
zS$ = nulls$
END IF
ELSE
zS$ = UCASE$(zS$)
msx = 0
msy = 0
END IF
i = INSTR("BCNRSDQ " + CHR$(27), zS$)
LOOP UNTIL i
SELECT CASE zS$
CASE "B"
IF Gfx THEN CALL HideGfx
QPush
CALL Box
CALL ListFile (CmdWritePath$ + "~BOX.PRN")
COLOR deffor, defbac
QPop
IF Gfx AND RegDsply THEN CALL ShowGfx
CASE "C"
QPush
GOSUB ShowScoreCard
QPop
CASE "N", CHR$(27), CHR$(32)
'Reset vital information and go back to menu
GOSUB ResetData
GOTO MenuOptions
CASE "R"
IF Gfx AND RegDsply THEN CALL HideGfx
QPush
COLOR deffor, defbac
CLS
CALL ShowStandings (TRUE)
CALL Prompt(1)
QPop
IF Gfx AND RegDsply THEN CALL ShowGfx
CASE "S"
QPush
IF CmdStat$ > "!" THEN
CALL StatsIO (Flds, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
ELSE
CALL Button(18+rowO, 15+colO, errattr, " You didn't specify a statistics file during setup. ", 0)
SLEEP 2000
END IF
QPop
CASE "D"
QPush
CALL ShowDoc
QPop
CASE "Q"
GOTO LastChance
END SELECT
LOOP
ReturnToDOS:
IF CmdStat$ > "!" THEN
GOSUB SaveStatsToDisk
END IF
'One Last Chance to return to main menu if this is a schedule situation
LastChance:
CALL Button(17+rowO, 25+colO, defattr, " Return to Main Menu? [y/N] ", 0)
LOCATE 17+rowO, 53+colO
IF YESorNO$(revfor, revbac, deffor, defbac, "N") = "Y" THEN
GOSUB ResetData
GOTO MenuOptions
END IF
QuickEnd:
CLOSE
IF Gfx = FALSE THEN
COLOR 7, 0
END IF
EXIT FUNCTION
' ********************* GOSUBS begin here **************************
SetAutoMgr:
amgr(1) = TRUE
amgr(2) = TRUE
RETURN
DisplayPitchersTank:
n = nPitch(id)
m = (n / ExpectedPitchCount(ipa(id), id)) * 100
pc$ = "(" + LTRIM$(STR$(m)) + "%)"
L = LEN(pc$)
IF L < 6 THEN pc$ = pc$ + SPACE$(6 - L)
QPRINTs ConsRows, ConsCols - 17, pc$, scdattr
RETURN
AppendBox:
OPEN CmdWritePath$ + "~BOX.PRN" FOR INPUT AS #40
IF LEFT$(xS$, 3) = "LPT" THEN
OPEN xS$ FOR OUTPUT AS #20 LEN = 80
ELSE
OPEN CmdWritePath$ + xS$ FOR APPEND AS #20
END IF
PRINT #20, DATE$; " "; TIME$;
PRINT #20, " #"; SimGameCtr + 1;
PRINT #20, STRING$(42, "-");
IF LEN(SCHDate$) THEN
PRINT #20, " "; SCHDate$
ELSE
PRINT #20, STRING$(10, "-"); " "
END IF
IF n = 1 THEN FOR i = 1 TO GMx: PRINT #20, GMMessage(i): NEXT
DO UNTIL EOF(40)
LINE INPUT #40, field$
IF LEFT$(field$, 1) = "~" THEN field$ = MID$(field$, 2)
PRINT #20, field$
LOOP
CLOSE #20
CLOSE #40
RETURN
BuildHiLiteMsg:
IF ref <= MAXPLAYERS THEN Message$ = FULLNAME$(NameRef(ref, it)) + "," + xS$
RETURN
SaveHiLite:
IF HLx < 400 THEN
ExSw = TRUE
HLx = HLx + 1
HLRec(HLx).HLGameNo = SimGameCtr + 1
HLRec(HLx).HLMessage = Message$
END IF
IF CmdStat$ > "!" THEN
'Save the Hi-Lite Message to a file .STH
OPEN CmdWritePath$ + CmdStat$ + ".STH" FOR APPEND AS #6 LEN = 128
PRINT #6, PADRIGHT$(LTRIM$(STR$(SimGameCtr + 1)), 6) + Message$
CLOSE #6
END IF
IF GMx < 5 THEN
GMx = GMx + 1
GMMessage(GMx) = Message$
END IF
RETURN
DisplayPitchCount:
n = nPitch(tm)
m = (n / ExpectedPitchCount(ipa(tm), tm)) * 100
x$ = "Current pitcher's pitch-count:" + STR$(n) + " (" + LTRIM$(STR$(m)) + "%)"
CALL PopMsg(12+rowO, 22+colO, x$, errattr, 0, kc)
RETURN
UpdateStats:
'Game Summary File
SSum.VLeague = League(1)
SSum.VDiv = Div(1)
SSum.VNam = Names(1)
SSum.VRuns = itruns(1)
SSum.VHits = ithits(1)
SSum.VErrs = iterrs(1)
SSum.VLOB = GameLOB(1)
SSum.VDPs = dp(1)
SSum.HLeague = League(2)
SSum.HDiv = Div(2)
SSum.HNam = Names(2)
SSum.HRuns = itruns(2)
SSum.HHits = ithits(2)
SSum.HErrs = iterrs(2)
SSum.HLOB = GameLOB(2)
SSum.HDPs = dp(2)
SSum.WP = DataName(WPpit, WPteam)
SSum.LP = DataName(LPpit, LPteam)
IF SPpit > 0 AND SPpit <= TopPitLim AND SPteam > 0 THEN
SSum.SP = DataName(SPpit, SPteam)
ELSE
SSum.SP = nulls$
END IF
PUT #3,, SSum
'Batting/Fielding/Base-Running
FOR it = 1 TO 2
'List each person (ref #) to appear in this spot "s" in the batting order
'Does not catch pitchers when DH active
REDIM NameList$(MAXPLAYERS)
Lx = 0
FOR s = 1 TO 9
L = LEN(RefByBO(s, it))
FOR p = 1 TO L - 1 STEP 2
ref = VAL(MID$(RefByBO(s, it), p, 2))
GOSUB UpdateBSum
NEXT
NEXT
IF dh THEN
FOR N = 1 TO np(it)
ref = iyp(N, it)
GOSUB UpdateBSum
NEXT
END IF
NEXT
'Pitching
FOR it = 1 TO 2
FOR N = 1 TO np(it)
p = iyp(N, it)
'Did we already do pitcher "p"?
'It's possible a pitcher can enter a game more than once...
i = 1
Found = FALSE
DO WHILE i < N
IF p = iyp(i, it) THEN
Found = TRUE
EXIT DO
END IF
INCR i
LOOP
IF Found THEN ITERATE FOR
Find$ = League(it) + PADRIGHT$(Names(it), 12) + PADRIGHT$(NameRef(p, it), 16)
TotalRecs = PSum(0).PGameCtr
CALL BinarySearchP (PSum(), 1, 29, 1, TotalRecs, Find$, FoundAt, mini)
IF FoundAt = 0 THEN
IF TotalRecs >= DimmedPit THEN
DimmedPit = DimmedPit + 540 'was 1020
REDIM PRESERVE PSum(0 TO DimmedPit) AS GLOBAL PitSummary
END IF
'Adjust PSum() - Make a space for a new record
FOR zz = TotalRecs + 1 TO mini + 1 STEP -1
PSum(zz) = PSum(zz - 1)
NEXT
'Update TotalRecs
PSum(0).PGameCtr = TotalRecs + 1
'Insert Default Record in slot mini
PSum(mini).PLeague = League(it)
PSum(mini).PTmNam = Names(it)
PSum(mini).PNam = NameRef(p, it)
PSum(mini).PThrows = UCASE$(HandRef(p, it))
PSum(mini).PGameCtr = 0
PSum(mini).PGames = 0
PSum(mini).PStarts = 0
PSum(mini).PCGs = 0
PSum(mini).PShOs = 0
PSum(mini).PInns = 0
PSum(mini).P3rds = 0
PSum(mini).PRuns = 0
PSum(mini).PERuns = 0
PSum(mini).PHits = 0
PSum(mini).P2Bs = 0
PSum(mini).P3Bs = 0
PSum(mini).PHRs = 0
PSum(mini).PBBs = 0
PSum(mini).PSOs = 0
PSum(mini).PHB = 0
PSum(mini).PWin = 0
PSum(mini).PLoss = 0
PSum(mini).PSave = 0
PSum(mini).PBS = 0
PSum(mini).PBF = 0
PSum(mini).PDaysOff = 0
PSum(mini).PJDate = 0
PSum(mini).PStreak = 0
FoundAt = mini
END IF
'Update Memory "Record"
PSum(FoundAt).PGameCtr = SimGameCtr
PSum(FoundAt).PGames = PSum(FoundAt).PGames + 1
PSum(FoundAt).PInns = PSum(FoundAt).PInns + INT(mpo(p, it) / 3)
PSum(FoundAt).P3rds = PSum(FoundAt).P3rds + mpo(p, it) MOD 3
PSum(FoundAt).PRuns = PSum(FoundAt).PRuns + mpr(p, it)
PSum(FoundAt).PERuns = PSum(FoundAt).PERuns + mper(p, it)
PSum(FoundAt).PHits = PSum(FoundAt).PHits + mph(p, it)
PSum(FoundAt).P2Bs = PSum(FoundAt).P2Bs + mp2b(p, it)
PSum(FoundAt).P3Bs = PSum(FoundAt).P3Bs + mp3b(p, it)
PSum(FoundAt).PHRs = PSum(FoundAt).PHRs + mphr(p, it)
PSum(FoundAt).PBBs = PSum(FoundAt).PBBs + mpw(p, it)
PSum(FoundAt).PSOs = PSum(FoundAt).PSOs + mpk(p, it)
PSum(FoundAt).PHB = PSum(FoundAt).PHB + mphb(p, it)
PSum(FoundAt).PBS = PSum(FoundAt).PBS + mpBS(p, it)
PSum(FoundAt).PBF = PSum(FoundAt).PBF + mpbf(p, it)
'Pitching "Streak"
INCR PSum(FoundAt).PStreak
'Record W/L/S
IF WPteam = it AND WPpit = p THEN
PSum(FoundAt).PWin = PSum(FoundAt).PWin + 1
ELSEIF LPteam = it AND LPpit = p THEN
PSum(FoundAt).PLoss = PSum(FoundAt).PLoss + 1
ELSEIF SPteam = it AND SPpit = p THEN
PSum(FoundAt).PSave = PSum(FoundAt).PSave + 1
END IF
'Set "DaysOff" counter and Starts for used pitchers
'Save old DaysOff
prv = PSum(FoundAt).PDaysOff
'Calculate new DaysOff
innp! = mpo(p, it) / 3.0
IF N = 1 THEN
PSum(FoundAt).PStarts = PSum(FoundAt).PStarts + 1
now = INT(SQR(3 * innp! / 4) + 1)
ELSE
i = INT(SQR(4 * innp!) - 1.4)
IF i < 0 THEN i = 0
now = i
END IF
'On used pitchers, DaysOff cannot go down, but can go up
IF now <= prv THEN
PSum(FoundAt).PDaysOff = prv
ELSE
PSum(FoundAt).PDaysOff = now
END IF
'Penalty for pitching 3 games in a row
IF PSum(FoundAt).PStreak = 3 THEN
INCR PSum(FoundAt).PDaysOff
END IF
'Set Julian Date for Schedules
IF CmdSch$ > "!" THEN
PSum(FoundAt).PJDate = JDATE(SchDate$)
END IF
'Complete Games/Shutouts
IF np(it) = 1 THEN 'there was only ONE pitcher so he gets a CG
PSum(FoundAt).PCGs = PSum(FoundAt).PCGs + 1
IF mpr(p, it) = 0 THEN 'Shutout too
PSum(FoundAt).PShOs = PSum(FoundAt).PShOs + 1
END IF
END IF
NEXT
'For UN-used pitchers, decrement "DaysOff" counter, zero PStreak counter
FOR p = 10 TO LastPiAd(it)
IF iused(p, it) = FALSE THEN
Find$ = League(it) + PADRIGHT$(Names(it), 12) + PADRIGHT$(NameRef(p, it), 16)
TotalRecs = PSum(0).PGameCtr
CALL BinarySearchP (PSum(), 1, 29, 1, TotalRecs, Find$, FoundAt, mini)
IF FoundAt THEN
PSum(FoundAt).PStreak = 0
IF PSum(FoundAt).PDaysOff > 0 THEN
IF CmdSch$ > "!" THEN
nn = JDATE(SchDate$)
m = nn - PSum(FoundAt).PJDate
IF m < 0 THEN m = m + 365
IF m > 5 THEN m = 5
PSum(FoundAt).PDaysOff = MAX(PSum(FoundAt).PDaysOff - m, 0)
PSum(FoundAt).PJDate = nn
ELSE
DECR PSum(FoundAt).PDaysOff
END IF
END IF
END IF
END IF
NEXT
NEXT
'Fielding
FOR it = 1 TO 2
REDIM NameList$(MAXPLAYERS)
Lx = 0
FOR ref = 1 TO MAXPLAYERS
FOR ps = 1 TO 12
'Ignore pitchers in lineup so you don't update them twice
IF ref > 9 OR ps <> 1 THEN
IF GpPos(ref, it, ps) > 0 THEN GOSUB UpdateFSum
END IF
NEXT
NEXT
NEXT
RETURN
UpdateBSum:
Find$ = League(it) + PADRIGHT$(Names(it), 12) + PADRIGHT$(NameRef(ref, it), 16)
TotalRecs = BSum(0).BGameCtr
CALL BinarySearchB (BSum(), 1, 29, 1, TotalRecs, Find$, FoundAt, mini)
IF FoundAt = 0 THEN
IF TotalRecs >= DimmedBat THEN
DimmedBat = DimmedBat + 1020
REDIM PRESERVE BSum(0 TO DimmedBat) AS GLOBAL BatSummary
END IF
'Adjust BSum() - Make space for new record
FOR zz = TotalRecs + 1 TO mini + 1 STEP -1
BSum(zz) = BSum(zz - 1)
NEXT
'Update TotalRecs in the array
BSum(0).BGameCtr = TotalRecs + 1
'Insert Default Record in slot mini
BSum(mini).BLeague = League(it)
BSum(mini).BTmNam = Names(it)
BSum(mini).BNam = NameRef(ref, it)
IF HandRef(ref, it) = "r" THEN
BSum(mini).BBats = "L"
ELSEIF HandRef(ref, it) = "l" THEN
BSum(mini).BBats = "R"
ELSE
BSum(mini).BBats = HandRef(ref, it)
END IF
BSum(mini).BGameCtr = 0
BSum(mini).BGames = 0
BSum(mini).BABs = 0
BSum(mini).BABsRHP = 0
BSum(mini).BABsLHP = 0
BSum(mini).BRuns = 0
BSum(mini).BHits = 0
BSum(mini).BHitsRHP = 0
BSum(mini).BHitsLHP = 0
BSum(mini).BRBIs = 0
BSum(mini).B2Bs = 0
BSum(mini).B2BsRHP = 0
BSum(mini).B2BsLHP = 0
BSum(mini).B3Bs = 0
BSum(mini).B3BsRHP = 0
BSum(mini).B3BsLHP = 0
BSum(mini).BHRs = 0
BSum(mini).BHRsRHP = 0
BSum(mini).BHRsLHP = 0
BSum(mini).BSBs = 0
BSum(mini).BCSs = 0
BSum(mini).BBBs = 0
BSum(mini).BBBsRHP = 0
BSum(mini).BBBsLHP = 0
BSum(mini).BKs = 0
BSum(mini).BKsRHP = 0
BSum(mini).BKsLHP = 0
BSum(mini).BHB = 0
BSum(mini).BGDP = 0
BSum(mini).BSacF = 0
BSum(mini).BSacB = 0
BSum(mini).BErrs = 0
BSum(mini).BStreak = 0
FoundAt = mini
END IF
'Update Memory "Record"
BSum(FoundAt).BGameCtr = SimGameCtr
'Increment Games (if player has more than one ref number, only update games once)
'Search NameList$ to see if we've already done his name
Found = FALSE
i = 1
DO
IF NameRef(ref, it) = NameList$(i) THEN
Found = TRUE
EXIT DO
END IF
INCR i
LOOP UNTIL i > Lx
IF NOT Found THEN
INCR Lx
NameList$(Lx) = NameRef(ref, it)
BSum(FoundAt).BGames = BSum(FoundAt).BGames + 1
END IF
BSum(FoundAt).BABs = BSum(FoundAt).BABs + mab(ref, it)
BSum(FoundAt).BABsRHP = BSum(FoundAt).BABsRHP + mabRHP(ref, it)
BSum(FoundAt).BABsLHP = BSum(FoundAt).BABsLHP + mabLHP(ref, it)
BSum(FoundAt).BRuns = BSum(FoundAt).BRuns + mruns(ref, it)
BSum(FoundAt).BHits = BSum(FoundAt).BHits + mhits(ref, it)
BSum(FoundAt).BHitsRHP = BSum(FoundAt).BHitsRHP + mhitsRHP(ref, it)
BSum(FoundAt).BHitsLHP = BSum(FoundAt).BHitsLHP + mhitsLHP(ref, it)
BSum(FoundAt).BRBIs = BSum(FoundAt).BRBIs + mrbi(ref, it)
BSum(FoundAt).B2Bs = BSum(FoundAt).B2Bs + m2b(ref, it)
BSum(FoundAt).B2BsRHP = BSum(FoundAt).B2BsRHP + m2bRHP(ref, it)
BSum(FoundAt).B2BsLHP = BSum(FoundAt).B2BsLHP + m2bLHP(ref, it)
BSum(FoundAt).B3Bs = BSum(FoundAt).B3Bs + m3b(ref, it)
BSum(FoundAt).B3BsRHP = BSum(FoundAt).B3BsRHP + m3bRHP(ref, it)
BSum(FoundAt).B3BsLHP = BSum(FoundAt).B3BsLHP + m3bLHP(ref, it)
BSum(FoundAt).BHRs = BSum(FoundAt).BHRs + mhr(ref, it)
BSum(FoundAt).BHRsRHP = BSum(FoundAt).BHRsRHP + mhrRHP(ref, it)
BSum(FoundAt).BHRsLHP = BSum(FoundAt).BHRsLHP + mhrLHP(ref, it)
BSum(FoundAt).BSBs = BSum(FoundAt).BSBs + msb(ref, it)
BSum(FoundAt).BCSs = BSum(FoundAt).BCSs + mcs(ref, it)
BSum(FoundAt).BBBs = BSum(FoundAt).BBBs + mbb(ref, it)
BSum(FoundAt).BBBsRHP = BSum(FoundAt).BBBsRHP + mbbRHP(ref, it)
BSum(FoundAt).BBBsLHP = BSum(FoundAt).BBBsLHP + mbbLHP(ref, it)
BSum(FoundAt).BKs = BSum(FoundAt).BKs + mso(ref, it)
BSum(FoundAt).BKsRHP = BSum(FoundAt).BKsRHP + msoRHP(ref, it)
BSum(FoundAt).BKsLHP = BSum(FoundAt).BKsLHP + msoLHP(ref, it)
BSum(FoundAt).BErrs = BSum(FoundAt).BErrs + merr(ref, it)
BSum(FoundAt).BHB = BSum(FoundAt).BHB + mhb(ref, it)
BSum(FoundAt).BGDP = BSum(FoundAt).BGDP + mGDP(ref, it)
BSum(FoundAt).BSacF = BSum(FoundAt).BSacF + mSacF(ref, it)
BSum(FoundAt).BSacB = BSum(FoundAt).BSacB + mSacB(ref, it)
IF mhits(ref, it) > 0 THEN
BSum(FoundAt).BStreak = BSum(FoundAt).BStreak + 1
ELSE
IF mab(ref, it) > 0 THEN
i = BSum(FoundAt).BStreak
IF i >= HiLvlBStr THEN
xS$ = STR$(i) + "-game streak ends"
GOSUB BuildHiLiteMsg
GOSUB SaveHiLite
END IF
BSum(FoundAt).BStreak = 0
END IF
END IF
RETURN
'TYPE FldSummary
' FLeague AS STRING * 1
' FTmNam AS STRING * 12
' FNam AS STRING * 16
' FThrows AS STRING * 1
' FCount AS INTEGER
' FGamesByPos (1 TO 12) AS LONG ' 11=PH 12=PR
' FErrsByPos (1 TO 10) AS LONG ' 20
' FPutOutsByPos(1 TO 10) AS LONG ' 20
' FAssistsByPos(1 TO 10) AS LONG ' 20
'END TYPE
UpdateFSum:
'Feed this ref, it, ps
Find$ = League(it) + PADRIGHT$(Names(it), 12) + PADRIGHT$(NameRef(ref, it), 16)
TotalRecs = FSum(0).FCount
CALL BinarySearchF (FSum(), 1, 29, 1, TotalRecs, Find$, FoundAt, mini)
IF FoundAt = 0 THEN
IF TotalRecs >= DimmedFld THEN
DimmedFld = DimmedFld + 1020 '540
REDIM PRESERVE FSum(0 TO DimmedFld) AS GLOBAL FldSummary
END IF
'Adjust FSum() - Make space for new record
FOR zz = TotalRecs + 1 TO mini + 1 STEP -1
FSum(zz) = FSum(zz - 1)
NEXT
'Update TotalRecs in the array
FSum(0).FCount = TotalRecs + 1
'Insert Default Record in slot mini
FSum(mini).FLeague = League(it)
FSum(mini).FTmNam = Names(it)
FSum(mini).FNam = NameRef(ref, it)
FSum(mini).FThrows = UCASE$(HandRef(ref, it))
FSum(mini).FCount = 0
FOR i = 1 TO 12
FSum(mini).FGamesByPos(i) = 0
NEXT
FOR i = 1 TO 10
FSum(mini).FErrsByPos(i) = 0
FSum(mini).FPutOutsByPos(i) = 0
FSum(mini).FAssistsByPos(i) = 0
NEXT
FoundAt = mini
END IF
'Update Memory "Record"
INCR FSum(FoundAt).FGamesByPos(ps)
FSum(FoundAt).FErrsByPos(ps) = FSum(FoundAt).FErrsByPos(ps) + _
GpPos(ref, it, ps) - 1
IF ps < 11 THEN
'Only update "count" once per player - he may have two "ref" numbers, multiple "ps"
'Search NameList$ to see if we've already done his name
Found = FALSE
i = 1
DO
IF NameRef(ref, it) = NameList$(i) THEN
Found = TRUE
EXIT DO
END IF
INCR i
LOOP UNTIL i > Lx
IF NOT Found THEN
INCR Lx
NameList$(Lx) = NameRef(ref, it)
INCR FSum(FoundAt).FCount
END IF
FSum(FoundAt).FPutOutsByPos(ps) = FSum(FoundAt).FPutOutsByPos(ps) + _
PutOuts(ref, it, ps)
FSum(FoundAt).FAssistsByPos(ps) = FSum(FoundAt).FAssistsByPos(ps) + _
Assists(ref, it, ps)
END IF
RETURN
SaveStatsToDisk:
IF Silence = FALSE THEN CALL PopMsg(17+rowO, 29+colO, "Saving stats to disk...", defattr, 1, kc)
OPEN CmdWritePath$ + CmdStat$ + ".STB" FOR RANDOM AS #4 LEN=LEN(BSum(0))
Recs = BSum(0).BGameCtr
BSum(0).BGames = SimGameCtr
FOR n = 0 TO Recs
PUT #4,, BSum(n)
NEXT
CLOSE #4
OPEN CmdWritePath$ + CmdStat$ + ".STP" FOR RANDOM AS #4 LEN=LEN(PSum(0))
Recs = PSum(0).PGameCtr
FOR n = 0 TO Recs
PUT #4,, PSum(n)
NEXT
CLOSE #4
OPEN CmdWritePath$ + CmdStat$ + ".STF" FOR RANDOM AS #4 LEN=LEN(FSum(0))
Recs = FSum(0).FCount
FOR n = 0 TO Recs
PUT #4,, FSum(n)
NEXT
CLOSE #4
RETURN
Normalization:
'this part could be anywhere after CmdEra$ is set:
p4baseNorm! = 0
IF LEN(CmdEra$) = 5 THEN
arg$ = CmdEra$
GOSUB SearchLAvg 'return FoundSw, ndx for "Norm" year
IF FoundSw THEN
p4baseNorm! = LAvg(ndx).LAvgHR
p3baseNorm! = LAvg(ndx).LAvg3B
p2baseNorm! = LAvg(ndx).LAvg2B
p1baseNorm! = LAvg(ndx).LAvg1B
pwbaseNorm! = LAvg(ndx).LAvgBB
prbaseNorm! = LAvg(ndx).LAvgRG
LgTotInns(3) = LAvg(ndx).Innings
LgTotHits(3) = LAvg(ndx).Hits
LgTot2B(3) = LAvg(ndx).Doubles
LgTot3B(3) = LAvg(ndx).Triples
LgTotHR(3) = LAvg(ndx).HR
LgTotBB(3) = LAvg(ndx).BB
RunsPerGame(3) = LAvg(ndx).LAvgRG
END IF
END IF
RETURN
'************ This is the GOSUB that reads in the .DAT files. ************
LoadDATFile:
'Requires "it"
LastPiAd(it) = 0
DHDATOvr(it) = 0
Gender(it) = 0 'Default is male
TeamAttr(it) = 0
IF INSTR(DataFil(it), ".") = 0 THEN DataFil(it) = DataFil(it) + ".DAT"
IF LEN(DIR$(CmdPath$ + DataFil(it))) = 0 THEN
MyBeep
x$ = "Team Data-File: " + CmdPath$ + DataFil(it) + " not found!|"
x$ = x$ + "Hit any key to Abort."
CALL ErrorBox(x$)
Abort = TRUE
RETURN
END IF
OPEN CmdPath$ + DataFil(it) FOR INPUT AS #1 LEN = 128
z = 0
i = 0
DO WHILE NOT EOF(1)
LDF1:
LINE INPUT #1, rec$
L = LEN(rec$)
'Ignore blank lines
IF L = 0 THEN
IF EOF(1) THEN
EXIT DO
ELSE
GOTO LDF1
END IF
END IF
'Ignore semicolon lines
IF LEFT$(rec$, 1) = ";" THEN
IF EOF(1) THEN
EXIT DO
ELSE
GOTO LDF1
END IF
END IF
IF MID$(rec$, 1, 2) = "##" THEN EXIT DO
IF L < 100 THEN rec$ = rec$ + SPACE$(100 - L)
' Check for Header record
IF MID$(rec$, 1, 1) = "*" AND i = 0 THEN
League(it) = UCASE$(MID$(rec$, 2, 1))
Div(it) = UCASE$(MID$(rec$, 10, 1))
Century(it) = MID$(rec$, 11, 2)
Year(it) = MID$(rec$, 11, 4)
Names(it) = MID$(rec$, 13, 12)
arg$ = MID$(rec$, 11, 4) + League(it)
GOSUB SearchLAvg 'return FoundSw, ndx - points to DEF if necessary
IF FoundSw THEN
pwbaseF(it) = LAvg(ndx).LAvgBB
pkbaseF(it) = LAvg(ndx).LAvgSO
psbaseF(it) = LAvg(ndx).LAvgS2
p1baseF(it) = LAvg(ndx).LAvg1B
p2baseF(it) = LAvg(ndx).LAvg2B
p3baseF(it) = LAvg(ndx).LAvg3B
p4baseF(it) = LAvg(ndx).LAvgHR
TeamsInLeague(it) = LAvg(ndx).LTeams
RunsPerGame(it) = LAvg(ndx).LAvgRG
LeagueRating(it) = LAvg(ndx).Rating
LgTotInns(it) = LAvg(ndx).Innings
LgTotHits(it) = LAvg(ndx).Hits
LgTot2B(it) = LAvg(ndx).Doubles
LgTot3B(it) = LAvg(ndx).Triples
LgTotHR(it) = LAvg(ndx).HR
LgTotBB(it) = LAvg(ndx).BB
' LOCATE 8, 37
' PRINT arg$; " = "; LAvg(ndx).LAvgYr; LAvg(ndx).LAvgLg;
' SLEEP 10000
ELSE
'Load Default Case - No .CFG data found
pwbaseF(it) = .0815
pkbaseF(it) = .230
psbaseF(it) = .140
p1baseF(it) = .1575
p2baseF(it) = .0385
p3baseF(it) = .0053
p4baseF(it) = .019
TeamsInLeague(it) = 0
RunsPerGame(it) = 5.0
LeagueRating(it) = 100
LgTotInns(it) = 23107
LgTotHits(it) = 23624
LgTot2B(it) = 4622
LgTot3B(it) = 516
LgTotHR(it) = 2997
LgTotBB(it) = 9847
' LOCATE 8, 37
' PRINT arg$; " = SYS ";
' SLEEP 9000
END IF
' Percentage of hits which are singles, doubles, etc. for this league
bF! = p1baseF(it) + p2baseF(it) + p3baseF(it) + p4baseF(it)
phit1bF(it) = p1baseF(it) / bF!
phit2bF(it) = p2baseF(it) / bF!
phit3bF(it) = p3baseF(it) / bF!
phit4bF(it) = p4baseF(it) / bF!
'Check Column headers for clues to interpret data
x$ = UCASE$(MID$(rec$, 65, 3))
y$ = UCASE$(MID$(rec$, 68, 3))
IF INSTR(x$, "SB") AND INSTR(y$, "CS") THEN
StBSw(it) = -1
ELSEIF INSTR(x$, "SB") THEN
StBSw(it) = 1
ELSE
StBSw(it) = 0
END IF
ERRSw(it) = (UCASE$(MID$(rec$, 62, 2)) = "ER") 'Errors instead of Def. Percentage
END IF
'Second occurence of "*" is ignored (*Pitchers)
'Third occurence of "*" is start of bench (*Bench)
'Fourth occurence of "*" is start of optional information
IF MID$(rec$, 1, 1) = "*" THEN
IF i > 9 THEN 'was 11 for 3 pitchers
IF LastPiAd(it) = 0 THEN
LastPiAd(it) = i
ELSE
x$ = UCASE$(RTRIM$(MID$(rec$, 2)))
IF LEN(x$) THEN
n = PARSECOUNT(x$)
FOR nn = 1 TO n
p$ = RTRIM$(LTRIM$(PARSE$(x$, nn)))
pp$ = LEFT$(p$, 3)
IF pp$ = "PE=" THEN
j = INSTR(p$, "/")
IF j THEN
HBF!(it) = VAL(MID$(p$, 4, j-4)) / 100
HPF!(it) = VAL(MID$(p$, j+1)) / 100
ELSE
HBF!(it) = VAL(MID$(p$, 4)) / 100
HPF!(it) = HBF!(it)
END IF
'Test de-magnification (20% - use .8)
HBF!(it) = 1.00 + (HBF!(it) - 1) * .8
HPF!(it) = 1.00 + (HPF!(it) - 1) * .8
IF HBF!(it) < .20 THEN HBF!(it) = .2
IF HBF!(it) > 5. THEN HBF!(it) = 5.0
IF HPF!(it) < .20 THEN HPF!(it) = .2
IF HPF!(it) > 5. THEN HPF!(it) = 5.0
IF it = 2 THEN
CurrParkBF! = HBF!(2)
CurrParkPF! = HPF!(2)
END IF
END IF
IF it = 2 THEN
IF pp$ = "PH=" THEN
z$ = MID$(p$, 4)
IF LEN(DIR$(z$)) > 0 THEN BackgroundPic$ = z$
END IF
END IF
IF LEFT$(p$, 4) = "DH=Y" THEN
DHDATOvr(it) = -1
END IF
IF LEFT$(p$, 4) = "DH=N" THEN
DHDATOvr(it) = 1
END IF
IF LEFT$(p$, 5) = "GEN=F" THEN
Gender(it) = -1
END IF
IF LEFT$(p$, 4) = "COL=" THEN
z$ = MID$(p$, 5)
j = 0
DO
IF ColorDescTable$(j) = z$ THEN EXIT DO
INCR j
LOOP WHILE j < 16
IF j < 16 THEN
'Foreground color is always 15(bright) unless background is similar
'IF j = 7 OR j = 15 THEN m = 0 ELSE m = 15
SELECT CASE j
CASE 7, 10, 11, 14, 15
m = 0
CASE ELSE
m = 15
END SELECT
TeamAttr(it) = CALCATTR(m, j)
END IF
IF it = 2 THEN
IF TeamAttr(1) = TeamAttr(2) THEN
TeamAttr(1) = CALCATTR(0, 7) 'black on grey
END IF
END IF
END IF
IF LEFT$(p$, 5) = "LOGO=" THEN
z$ = MID$(p$, 6)
IF LEN(DIR$(z$)) > 0 THEN TeamLogo(it) = z$
END IF
NEXT
END IF
END IF
END IF
END IF
'Regular data line:
IF MID$(rec$, 1, 1) <> "*" AND i < MAXPLAYERS THEN
INCR i
DataRef(i, it) = i
DataPlat(i, it) = MID$(rec$, 5, 1)
DataPos(i, it) = VAL(MID$(rec$, 7, 2))
'In case somebody puts a pitcher on the bench, change the position!
IF LastPiAd(it) > 0 AND DataPos(i, it) = 1 THEN DataPos(i, it) = 9
xS$ = MID$(rec$, 10, 18)
IF LEN(FIRSTNAME$(xS$)) THEN
DataName(i, it) = LASTNAME$(xS$) + ", " + FIRSTNAME$(xS$)
ELSE
DataName(i, it) = LASTNAME$(xS$)
END IF
DataAB(i, it) = VAL(MID$(rec$, 28, 3))
IF DataAB(i, it) = 0 THEN DataAB(i, it) = 1
DataHits(i, it) = VAL(MID$(rec$, 32, 3))
Data2B(i, it) = VAL(MID$(rec$, 36, 3))
Data3B(i, it) = VAL(MID$(rec$, 40, 3))
DataHR(i, it) = VAL(MID$(rec$, 44, 3))
DataBB(i, it) = VAL(MID$(rec$, 48, 3))
DataHP(i, it) = MID$(rec$, 51, 1)
DataSO(i, it) = VAL(MID$(rec$, 52, 3))
DataRBI(i, it) = VAL(MID$(rec$, 56, 3))
DataHand(i, it) = MID$(rec$, 60, 1)
DataDef(i, it) = VAL(MID$(rec$, 62, 3)) '/Wins
DataSB(i, it) = VAL(MID$(rec$, 65, 3)) '/Losses (old speed)
DataCS(i, it) = VAL(MID$(rec$, 68, 3)) '/Saves
DataGames(i, it)= VAL(MID$(rec$, 72, 3))
DataCode(i, it) = MID$(rec$, 81, 1) 'Pit. Hit. Code
FOR n = 1 TO 4 '/n=1 Starts
DataGbyP(i, it, n) = VAL(MID$(rec$, 70 + (n * 6), 3))
IF DataGbyP(i, it, n) > 0 THEN
cS$ = MID$(rec$, 74 + (n * 6), 1)
IF UCASE$(cS$) = "D" THEN
DataPosi(i, it, n) = 10
ELSE
DataPosi(i, it, n) = VAL(cS$)
END IF
ELSE
DataPosi(i, it, n) = 0
END IF
NEXT
'Get rid of any games listed as pitcher
FOR n = 1 TO 4
IF DataPosi(i, it, n) = 1 THEN
nn = n
DO WHILE nn < 4
DataPosi(i, it, nn) = DataPosi(i, it, nn+1)
DataGbyP(i, it, nn) = DataGbyP(i, it, nn+1)
INCR nn
LOOP
DataPosi(i, it, 4) = 0
DataGbyP(i, it, 4) = 0
END IF
NEXT
'Batting stats for pitchers
IF i > 9 AND i <= TopPitLim THEN
IF LastPiAd(it) = 0 AND DataPos(i, it) = 1 THEN
DataPBatAB(i, it) = VAL(MID$(rec$, 83, 3)) 'AB
DataPBatHi(i, it) = VAL(MID$(rec$, 87, 3)) 'Hits
DataPBatHR(i, it) = VAL(MID$(rec$, 91, 2)) 'HR
DataPBatBB(i, it) = VAL(MID$(rec$, 94, 3)) 'BB
DataPBatSO(i, it) = VAL(MID$(rec$, 98, 3)) 'SO
END IF
END IF
'Reference attributes
NameRef(i, it) = DataName(i, it)
OrgPos(i, it) = DataPos(i, it)
HandRef(i, it) = DataHand(i, it)
END IF
LOOP
CLOSE #1
Last = i
'Scan pitchers to determine MgrStyle and Data format
pHRind(it) = FALSE
NewStyle(it) = FALSE
NewStyleWithSaves(it) = FALSE
PitchersPerGame(it) = 2.5
l = 0: m = 0: n = 0
FOR i = 10 TO LastPiAd(it)
IF DataHR(i, it) THEN pHRind(it) = TRUE
l = l + DataGames(i, it) 'games
m = m + DataGbyP(i, it, 1) 'starts
n = n + DataCS(i, it) 'saves
NEXT
IF l > 0 AND m > 0 THEN
NewStyle(it) = TRUE
IF n > 0 THEN NewStyleWithSaves(it) = TRUE
PitchersPerGame(it) = l / m
'x$ = "Team" + STR$(it) + " - PitchersPerGame:" + STR$(PitchersPerGame(it))
'CALL ErrorBox (x$)
END IF
'Scan hitters for speed rating (Sum CS for non-pitchers)
m = 0
FOR i = 1 TO 9
IF DataPos(i, it) > 1 THEN m = m + DataCS(i, it)
NEXT
l = 0 'sum speed-ratings
p = 0 'player counter
FOR i = 1 TO Last
IF DataPos(i, it) > 1 THEN
'Calculate a speed-rating
xF! = DataHits(i, it) + DataBB(i, it) - Data2B(i, it) - Data3B(i, it) - DataHR(i, it)
IF xF! < 1 THEN xF! = 1
IF StBSw(it) <> 0 THEN 'Header is "SB & CS" or "SB"
IF m > 0 THEN
n = DataCS(i, it)
ELSE
n = DataSB(i, it) * .27
END IF
'SB%
SpS1! = ((DataSB(i, it) + 3)/(DataSB(i, it) + n + 7) - 0.4) * 20
'Attempts
SpS2! = SQR( (DataSB(i, it) + n) / xF! ) / 0.07
'Triples
SpS3! = Data3B(i, it) / (DataAB(i, it) - DataHR(i, it) - DataSO(i, it) ) / 0.02 * 10
'Some old-timer seasons have so many triples is makes everyone a speed demon...
IF SpS3! > 11. THEN SpS3! = 11.
'Weighted-average with triples 40% less important than
'the other two factors
DataSpeed(i, it) = (SpS1! * 10 + SpS2! * 10 + SpS3! * 6) / 26
IF DataSpeed(i, it) > 9 THEN DataSpeed(i, it) = 9
IF DataSpeed(i, it) < 1 THEN DataSpeed(i, it) = 1
ELSE 'Header is presumably "S"
DataSpeed(i, it) = VAL(MID$(rec$, 66, 2))
DataSB(i, it) = 0
DataCS(i, it) = 0
IF DataSpeed(i, it) < 1 THEN DataSpeed(i, it) = 1
END IF
l = l + DataSpeed(i, it)
INCR p
END IF
NEXT
TeamSpeed(it) = l / p
IF TeamSpeed(it) < 1.0 THEN TeamSpeed(it) = 1.0 '2.5
'LOCATE 10, 20
'print " ";
'locate 10, 20
'print "team speed "; DataFil(it); TeamSpeed(it);
'PauseIt
'Scan for Duplicate Last Names and record them in the DLN array
FOR i = 1 TO Last - 1
xS$ = LASTNAME$(NameRef(i, it))
FOR j = (i + 1) TO Last
yS$ = LASTNAME$(NameRef(j, it))
IF xS$ = yS$ THEN
DLN(i, it) = TRUE
DLN(j, it) = TRUE
END IF
NEXT
NEXT
'See if any pitchers are also on the bench or in lineup in the .DAT
DupNameTeam(it) = FALSE
FOR i = 10 TO LastPiAd(it)
SearchName$ = DataName(i, it)
c3 = SearchDAT(1, 9, it, SearchName$, 0)
IF c3 THEN DupNameTeam(it) = TRUE: EXIT FOR
c4 = SearchDAT(LastPiAd(it) + 1, Last, it, SearchName$, 0)
IF c4 THEN DupNameTeam(it) = TRUE: EXIT FOR
NEXT
'Is there a pitcher's slot (or DH) in the starting lineup?
m = FALSE
FOR i = 1 TO 9
IF DataPos(i, it) = 1 OR DataPos(i, it) = 10 THEN m = TRUE : EXIT FOR
NEXT
IF m = FALSE THEN
MyBeep
x$ = "Team Data-File: " + CmdPath$ + DataFil(it) + "|"
x$ = x$ + "No pitcher or DH in Lineup|"
x$ = x$ + "This is a problem. Please correct the .DAT file.|"
x$ = x$ + "(Make sure a '1' is in column 8 in the pitcher's batting|"
x$ = x$ + "slot if a DH is not used in your default line-up.)"
CALL ErrorBox(x$)
END IF
RETURN
SearchLAvg:
' LAvg must be DIMed
' In: arg$
' Out: ndx, FoundSw
' Don't use "i" in here!
FoundSw = FALSE
ndx = 1
DO UNTIL ndx > LAvgNdx OR ndx > 300
xS$ = LAvg(ndx).LAvgYr + LAvg(ndx).LAvgLg
IF arg$ = xS$ THEN FoundSw = TRUE: RETURN
ndx = ndx + 1
LOOP
' "YYYYL" not found in table. Does "DEF L" exist in table?
newarg$ = "DEF " + MID$(arg$, 5, 1)
ndx = 1
DO UNTIL ndx > LAvgNdx OR ndx > 300
xS$ = LAvg(ndx).LAvgYr + LAvg(ndx).LAvgLg
IF newarg$ = xS$ THEN FoundSw = TRUE: RETURN
ndx = ndx + 1
LOOP
RETURN
ShowScoreCard:
REDIM List1(1 TO 300) AS List1Type
CALL LoadScoreCardToList1 (List1(), j) 'j returns items in list
rr = ConsRows - 9
re = ConsRows - 2
c1 = (ConsCols - 78) \ 2 '68
c2 = ConsCols - c1
IF Gfx THEN CALL GraphHole(30, 6, c1, re, c2)
CALL DrawFrm(6, c1, re, c2, defattr, "Score Card", "ESC PgUp PgDown [P]rint [F]ile", 0, 0, 1)
QPRINTs MidRow, c2, CHR$(193), defattr
QPRINTs MidRow+1, c2, UpPtr$, defattr
QPRINTs MidRow+2, c2, DnPtr$, defattr
QPRINTs MidRow+3, c2, CHR$(194), defattr
RetKey = -98 'Display List only
IF CmdScrF$ < "!" THEN xS$ = "SCORECRD.LOG" ELSE xS$ = CmdScrF$
' 32, 6, c1, re, c2, dimattr, revattr, Pick, RetKey, xS$, mous, ms$)
CALL PickFromList(List1(), j, rr, 2, 37, 6, c1, re, c2, dimattr, revattr, Pick, RetKey, xS$, mous, ms$)
IF Gfx THEN CALL EliminateHole(30)
ERASE List1
RETURN
OpenStatFiles:
REDIM NameList$(MAXPLAYERS)
'If CmdStat$ already exists, check for current format
IF LEN(DIR$(CmdWritePath$ + CmdStat$ + ".STP")) THEN
CALL CheckForValidFile (CmdWritePath$ + CmdStat$ + ".STP", 126, Valid1)
ELSE
Valid1 = TRUE
END IF
IF LEN(DIR$(CmdWritePath$ + CmdStat$ + ".STB")) THEN
CALL CheckForValidFile (CmdWritePath$ + CmdStat$ + ".STB", 162, Valid2)
ELSE
Valid2 = TRUE
END IF
IF NOT Valid1 OR NOT Valid2 THEN
MyBeep
x$ = " Hmmm. The stat file you selected appears to have been | generated from "
x$ = x$ + "an older version of SBS and cannot be used | with this version. "
x$ = x$ + "Returning to the main menu."
CALL ErrorBox(x$)
CmdStat$ = nulls$
CLOSE
GOTO MenuOptions
END IF
'Game Summary File
OPEN CmdWritePath$ + CmdStat$ + ".STS" FOR RANDOM AS #3 LEN = LEN(SSum)
n = LOF(3) / LEN(SSum)
SEEK #3, n + 1 'position random file to append
STSOpen = TRUE
'Batter File (memory)
'Does the Batter Array exist on disk?
IF LEN(DIR$(CmdWritePath$ + CmdStat$ + ".STB")) THEN
'Read directly back into array if possible
OPEN CmdWritePath$ + CmdStat$ + ".STB" FOR RANDOM AS #4 LEN=LEN(BatSummary)
Recs = LOF(4) / LEN(BatSummary)
n = (Recs \ 1020) + 1
DimmedBat = 1020 * n
REDIM BSum(0 TO DimmedBat) AS GLOBAL BatSummary
FOR n = 0 TO Recs - 1
GET #4,, BSum(n)
NEXT
CLOSE #4
ELSE
REDIM BSum(0 TO 1020) AS GLOBAL BatSummary
DimmedBat = 1020
'Initialize new array - Store record count in 0th record
BSum(0).BGameCtr = 1
'Create record #1
BSum(1).BLeague = STRING$(1, "Z")
BSum(1).BTmNam = STRING$(12,"Z")
BSum(1).BNam = STRING$(16,"Z")
END IF
'Pitchers (memory)
'Does the Pitcher Array exist on disk?
IF LEN(DIR$(CmdWritePath$ + CmdStat$ + ".STP")) THEN
OPEN CmdWritePath$ + CmdStat$ + ".STP" FOR RANDOM AS #4 LEN=LEN(PitSummary)
Recs = LOF(4) / LEN(PitSummary)
n = (Recs \ 540) + 1
DimmedPit = 540 * n
REDIM PSum(0 TO DimmedPit) AS GLOBAL PitSummary
FOR n = 0 TO Recs - 1
GET #4,, PSum(n)
NEXT
CLOSE #4
ELSE
'Initialize new array - Store record count in 0th record
REDIM PSum(0 TO 540) AS GLOBAL PitSummary
DimmedPit = 540
PSum(0).PGameCtr = 1
'Create 1st record in PSum Array
PSum(1).PLeague = STRING$(1, "Z")
PSum(1).PTmNam = STRING$(12,"Z")
PSum(1).PNam = STRING$(16,"Z")
END IF
'Fielding File (memory)
'Does the Field Array exist on disk?
IF LEN(DIR$(CmdWritePath$ + CmdStat$ + ".STF")) THEN
'Read directly back into array if possible
OPEN CmdWritePath$ + CmdStat$ + ".STF" FOR RANDOM AS #4 LEN=LEN(FldSummary)
Recs = LOF(4) / LEN(FldSummary)
n = (Recs \ 1020) + 1
DimmedFld = 1020 * n
REDIM FSum(0 TO DimmedFld) AS GLOBAL FldSummary
FOR n = 0 TO Recs - 1
GET #4,, FSum(n)
NEXT
CLOSE #4
ELSE
'Initialize new array - Store record count in 0th record
REDIM FSum(0 TO 1020) AS GLOBAL FldSummary
DimmedFld = 1020
FSum(0).FCount = 1
'Create record #1
FSum(1).FLeague = STRING$(1, "Z")
FSum(1).FTmNam = STRING$(12,"Z")
FSum(1).FNam = STRING$(16,"Z")
END IF
RETURN
SkedAskDH:
CALL DrawFrm(14+rowO, 12+colO, 17+rowO, 66+colO, defattr, nulls$, nulls$, 1, 0, 1)
DO
'This only loops on invalid input and redisplays the default every time
QPRINTs 15+rowO, 14+colO, " Use Designated Hitter? ", dimattr
QPRINTs 16+rowO, 14+colO, " [H]ome Team Rules [A]lways [E]ither [N]ever ", dimattr
xS$ = DefaultDHResponse$
yS$ = MYINPUT$(FALSE, KeyEscape, CustomEscKey, KeyAccept, kc, revfor, revbac, 15+rowO, 39+colO, 1, "X?", 0, 0, xS$, msx, msy)
IF msx > 0 AND msy > 0 THEN
yS$ = CHR$(SCREEN(msy, msx))
IF yS$ = CloseButton$ THEN
yS$ = DefaultDHResponse$
END IF
END IF
LOOP UNTIL INSTR("HAEYN", yS$)
CmdDH$ = yS$
RETURN
CheckForQuit:
IF SchedSw THEN
IF RegDsply = 0 THEN
QuitPending = TRUE
CALL Button(2+rowO, 33+colO, errattr, " Quit Pending ", 0)
ELSE
xS$ = " Hit 'Q' again to CANCEL this game NOW; any other to finish this game. "
xS$ = SubDoubleQuote$ (xS$)
CALL PopMsg(18+rowO, 5+colO, xS$, errattr, 0, kc)
IF kc = 81 OR kc = 113 THEN 'Q
IF CmdStat$ > "!" THEN
GOSUB SaveStatsToDisk
END IF
CALL SetSCHBookMark
CALL UpdSCHRecord1 (" ")
GOTO QuickEnd
END IF
QuitPending = TRUE
END IF
RETURN
END IF
'Not involved with a .SCH
xS$ = " Hit 'Q' again to Quit; 'N' for Main Menu; otherwise continue "
xS$ = SubDoubleQuote$ (xS$)
CALL PopMsg(18+rowO, 9+colO, xS$, errattr, 0, kc)
xS$ = UCASE$(CHR$(kc))
IF xS$ = "Q" OR xS$ = "N" THEN
IF CmdStat$ > "!" THEN
GOSUB SaveStatsToDisk
END IF
IF xS$ = "N" THEN
GOSUB ResetData
GOTO MenuOptions
ELSE
GOTO QuickEnd
END IF
END IF
RETURN
ResetData:
CLOSE 'CLOSE any OPEN files
SaveSCHDate$ = "qwertyui"
STSOpen = FALSE
SchedSw = FALSE
SeriesSw = FALSE
QuitPending = FALSE
PauseSw = FALSE
MMGame = FALSE
CmdSlotGames = 0
SlotGameCtr = 0
SimGameCtr = 0
SimTotal = 0
CmdLine = 0
CmdVFil$ = nulls$
CmdHFil$ = nulls$
CmdStat$ = nulls$
CmdBoxF$ = nulls$
CmdScrF$ = nulls$
CmdLinF$ = nulls$
CmdSCH$ = nulls$
CmdSER$ = nulls$
CmdFavTeam$ = nulls$
CmdFavLeague$ = nulls$
CmdDateL$ = nulls$
CmdDateH$ = nulls$
SCHDate$ = nulls$
CmdPauseAftGame$ = "N"
CmdPauseAftDate$ = "N"
CmdEra$ = nulls$
CmdVP$ = nulls$
CmdHP$ = nulls$
CmdVAutoLU$ = nulls$
CmdHAutoLU$ = nulls$
CmdVAdjustBO$ = nulls$
CmdHAdjustBO$ = nulls$
CmdVAutoMgr$ = nulls$
CmdHAutoMgr$ = nulls$
CmdVSpot$ = nulls$
CmdHSpot$ = nulls$
BackgroundPic$ = CmdPic$
'Erase WL-results array
REDIM WLRec(1 TO 1500) AS GLOBAL WLType
REDIM HLRec(400) AS GLOBAL HiLiteType
REDIM AutoLineUpSw(2) AS GLOBAL LONG
WLx = 0
HLx = 0
MMx = 0
RETURN
PrintDOT:
QPRINTs r, c, xS$, fldattr
RETURN
ClearLineupData:
'Redefine the arrays which clears them:
'Always do this just before loading files from disk
'REDIM GLOBAL ARRAYS
REDIM SCRec(300) AS GLOBAL ScoreCardType
REDIM DataGbyP(MAXPLAYERS, 2, 4) AS GLOBAL LONG
REDIM DataPosi(MAXPLAYERS, 2, 4) AS GLOBAL LONG
REDIM DataName(51, 2) AS GLOBAL STRING
REDIM DataPlat(51, 2) AS GLOBAL STRING
REDIM DataHand(51, 2) AS GLOBAL STRING
REDIM DataCode(51, 2) AS GLOBAL STRING
REDIM DataHP (51, 2) AS GLOBAL STRING
REDIM NameRef(51, 2) AS GLOBAL STRING
REDIM HandRef(51, 2) AS GLOBAL STRING
REDIM RefByBO(9, 2) AS GLOBAL STRING
REDIM Century(2) AS GLOBAL STRING
REDIM Names(2) AS GLOBAL STRING
REDIM League(2) AS GLOBAL STRING
REDIM TeamLogo(2) AS GLOBAL STRING
REDIM Year(2) AS GLOBAL STRING
REDIM Div(2) AS GLOBAL STRING
REDIM DataRef(51, 2) AS GLOBAL LONG
REDIM DataPos(51, 2) AS GLOBAL LONG
REDIM DataAB(51, 2) AS GLOBAL LONG
REDIM DataHits(51, 2) AS GLOBAL LONG
REDIM Data2B(51, 2) AS GLOBAL LONG
REDIM Data3B(51, 2) AS GLOBAL LONG
REDIM DataHR(51, 2) AS GLOBAL LONG
REDIM DataBB(51, 2) AS GLOBAL LONG
REDIM DataSO(51, 2) AS GLOBAL LONG
REDIM DataRBI(51, 2) AS GLOBAL LONG
REDIM DataDef(51, 2) AS GLOBAL LONG
REDIM DataSpeed(51, 2) AS GLOBAL LONG
REDIM DataSB(51, 2) AS GLOBAL LONG
REDIM DataCS(51, 2) AS GLOBAL LONG
REDIM DataGames(51, 2) AS GLOBAL LONG
REDIM OrgPos(51, 2) AS GLOBAL LONG
REDIM DataPBatAB(10 TO TopPitLim, 2) AS GLOBAL LONG
REDIM DataPBatHi(10 TO TopPitLim, 2) AS GLOBAL LONG
REDIM DataPBatHR(10 TO TopPitLim, 2) AS GLOBAL LONG
REDIM DataPBatBB(10 TO TopPitLim, 2) AS GLOBAL LONG
REDIM DataPBatSO(10 TO TopPitLim, 2) AS GLOBAL LONG
RETURN
ClearGameData:
'REDIM GLOBAL ARRAYS
i = 10
j = TopPitLim
REDIM mpo(i TO j, 2) AS GLOBAL LONG
REDIM mpk(i TO j, 2) AS GLOBAL LONG
REDIM mph(i TO j, 2) AS GLOBAL LONG
REDIM mpw(i TO j, 2) AS GLOBAL LONG
REDIM mpr(i TO j, 2) AS GLOBAL LONG
REDIM mpbf(i TO j, 2) AS GLOBAL LONG
REDIM mper(i TO j, 2) AS GLOBAL LONG
REDIM mp2b(i TO j, 2) AS GLOBAL LONG
REDIM mp3b(i TO j, 2) AS GLOBAL LONG
REDIM mphr(i TO j, 2) AS GLOBAL LONG
REDIM mphb(i TO j, 2) AS GLOBAL LONG
REDIM mpBS(i TO j, 2) AS GLOBAL LONG
REDIM WarmUpStatus(i TO j, 2) AS GLOBAL LONG
'REDIM OTHER GLOBAL ARRAYS
REDIM iused(51, 2) AS GLOBAL LONG
REDIM mab(51, 2) AS GLOBAL LONG
REDIM mabRHP(51, 2) AS GLOBAL LONG
REDIM mabLHP(51, 2) AS GLOBAL LONG
REDIM mruns(51, 2) AS GLOBAL LONG
REDIM mhits(51, 2) AS GLOBAL LONG
REDIM mhitsRHP(51, 2) AS GLOBAL LONG
REDIM mhitsLHP(51, 2) AS GLOBAL LONG
REDIM mrbi(51, 2) AS GLOBAL LONG
REDIM mhr(51, 2) AS GLOBAL LONG
REDIM mhrRHP(51, 2) AS GLOBAL LONG
REDIM mhrLHP(51, 2) AS GLOBAL LONG
REDIM m3b(51, 2) AS GLOBAL LONG
REDIM m3bRHP(51, 2) AS GLOBAL LONG
REDIM m3bLHP(51, 2) AS GLOBAL LONG
REDIM m2b(51, 2) AS GLOBAL LONG
REDIM m2bRHP(51, 2) AS GLOBAL LONG
REDIM m2bLHP(51, 2) AS GLOBAL LONG
REDIM mbb(51, 2) AS GLOBAL LONG
REDIM mbbRHP(51, 2) AS GLOBAL LONG
REDIM mbbLHP(51, 2) AS GLOBAL LONG
REDIM mhb(51, 2) AS GLOBAL LONG
REDIM merr(51, 2) AS GLOBAL LONG
REDIM mso(51, 2) AS GLOBAL LONG
REDIM msoRHP(51, 2) AS GLOBAL LONG
REDIM msoLHP(51, 2) AS GLOBAL LONG
REDIM msb(51, 2) AS GLOBAL LONG
REDIM mcs(51, 2) AS GLOBAL LONG
REDIM mGDP(51, 2) AS GLOBAL LONG
REDIM mSacF(51, 2) AS GLOBAL LONG
REDIM mSacB(51, 2) AS GLOBAL LONG
REDIM StealAttemptsPlayer(51, 2) AS GLOBAL LONG
REDIM iScore(2, 30) AS GLOBAL LONG
REDIM itruns(2) AS GLOBAL LONG
REDIM ithits(2) AS GLOBAL LONG
REDIM iterrs(2) AS GLOBAL LONG
REDIM ipa(2) AS GLOBAL LONG
REDIM np(2) AS GLOBAL LONG
REDIM iyp(15, 2) AS GLOBAL LONG
REDIM ibp(2) AS GLOBAL LONG
REDIM dp(2) AS GLOBAL LONG
REDIM GameLOB(2) AS GLOBAL LONG
REDIM CloserIn(2) AS GLOBAL LONG
REDIM PitcherBatted(2) AS GLOBAL LONG
REDIM WildPit(2) AS GLOBAL LONG
REDIM PassedB(2) AS GLOBAL LONG
REDIM HitByPit(2) AS GLOBAL LONG
REDIM nPitch(2) AS GLOBAL LONG
REDIM StealAttemptsTeam(2) AS GLOBAL LONG
REDIM GpPos(1 TO 51, 1 TO 2, 1 TO 12) AS GLOBAL BYTE
REDIM PutOuts(1 TO 51, 1 TO 2, 1 TO 10) AS GLOBAL BYTE
REDIM Assists(1 TO 51, 1 TO 2, 1 TO 10) AS GLOBAL BYTE
'DO NOT RESET: amgr, LastPiAd, DHDATOvr, Gender, TeamAttr
WPteam = 0: WPpit = 0: LPteam = 0: LPpit = 0: SPteam = 0: SPpit = 0
QualSave1IP = 0: QualSave1ID = 0: QualSave2IP = 0: QualSave2ID = 0
iwin = 0
inn = 0
SCx = 0
LineupChangeOff = FALSE
IGone = FALSE
SaveState = FALSE
RETURN
ResetBatterCounters:
BatPOut = 0
WildPitchCount = 0
RETURN
GetCurrentDir:
'Return "CurrentDir$"
IF CmdPath$ > "!" THEN
CurrentDir$ = CmdPath$
ELSE
CurrentDir$ = UCASE$(CURDIR$)
END IF
IF RIGHT$(CurrentDir$, 1) <> "\" THEN CurrentDir$ = CurrentDir$ + "\"
RETURN
LoadDirsToList1:
'Return List1(), n
'uses i, ii, f$
'Erase first part of List1
FOR i = 1 TO 20
List1(i).ListItem = " "
NEXT
IF RIGHT$(CURDIR$, 1) <> "\" THEN
' Not Root Directory
List1(1).ListItem = ".."
List1(2).ListItem = CurrentDir$
i = 2
ELSE
' Root Directory
List1(1).ListItem = CurrentDir$
i = 1
END IF
ii = i
f$ = UCASE$(DIR$(CurrentDir$, %directorymask))
DO UNTIL LEN(f$) = 0
IF (GETATTR (f$) AND %directorymask) THEN
INCR i
List1(i).ListItem = CHR$(192)+CHR$(196)+" " + f$
END IF
f$ = UCASE$(DIR$)
LOOP
n = i
IF n > ii THEN ARRAY SORT List1(ii+1) FOR n-ii, FROM 1 TO 12, ASCEND
RETURN
PrintButtons:
ii = SimGameCtr + 1
IF SchedSw OR SeriesSw THEN
IF SimTotal THEN
IF RegDsply THEN
x$ = " Game:" + STR$(ii) + " of" + STR$(SimTotal) + " "
L = LEN(x$)
IF Gfx THEN CALL GraphHole (1, 7, 2, 7, 1+L)
QPRINTs 7, 2, x$, defattr
IF SchedSw THEN
IF Gfx THEN CALL GraphHole (2, 7, ConsCols-10, 7, ConsCols-3)
QPRINTs 7, ConsCols-10, SCHDate$, defattr
END IF
ELSE
QPRINTs 1, 1, "Game:" + STR$(ii) + " of" + STR$(SimTotal) + " ", defattr
IF SchedSw THEN QPRINTs 1, ConsCols-8, SCHDate$, defattr
END IF
END IF
ELSE
IF CmdSlotGames THEN
IF RegDsply THEN
x$ = " Game:" + STR$(ii) + " of" + STR$(CmdSlotGames) + " "
L = LEN(x$)
IF Gfx THEN CALL GraphHole (1, 7, 2, 7, 1+L) 'was hole 3 ??
QPRINTs 7, 2, x$, defattr
ELSE
QPRINTs 1, 1, "Game:" + STR$(ii) + " of" + STR$(CmdSlotGames) + " ", defattr
END IF
END IF
END IF
RETURN
PrintEra:
IF CmdEra$ < "!" OR CmdEra$ = "N" THEN RETURN
IF Gfx THEN CALL GraphHole (8, 6, ConsCols-17, 6, ConsCols-1)
IF p4baseNorm! > 0 THEN
x$ = "NORM YR/L = " + CmdEra$
QPRINTs 6, ConsCols-17, x$, fldattr
ELSE
IF CmdEra$ = "V" THEN 'Visitor
i = 1
ELSEIF CmdEra$ = "H" THEN 'Home
i = 2
ELSE 'Both
i = id
END IF
x$ = "NORM YR/L = " + Year(i) + League(i)
QPRINTs 6, ConsCols-17, x$, fldattr
END IF
RETURN
PrintStats:
'Analyze Sim Pitching Data
IF CmdStat$ > "!" THEN
ref = DataRef(ip, id)
InnsF! = SimInn(ref, id)
InnsF! = InnsF! + mpo(ref, id) / 3
IF InnsF! = 0 THEN InnsF! = .33
ERAF! = (SimERuns(ref, id) + mper(ref, id)) / InnsF! * 9!
IF ERAF! > 99.99 THEN ERAF! = 99.99
m = SimHitsAlw(ref,id) + mph(ref,id)
j = SimBBAlw(ref,id) + mpw(ref,id)
k = SimSO_P(ref,id) + mpk(ref,id)
l = SimSaves(ref,id)
IF NOT UseBigP THEN
IF InnsF! > 999 OR j > 999 OR k > 999 OR l > 99 THEN
UseBigP = TRUE
IF Gfx THEN CALL EliminateHole(6)
END IF
END IF
END IF
'Team Colors
koloroff = fldattr
kolordef = fldattr
IF TeamAttr(it) THEN koloroff = TeamAttr(it)
IF TeamAttr(id) THEN kolordef = TeamAttr(id)
'Print Season (.DAT) Pitching Data
'Print Sim Pitching Data
IF RegDsply THEN
xF! = DataRBI(ip, id) / 100 'Pitchers ERA
IF UseBigP THEN
IF ConsRows > 27 AND ConsCols > 90 THEN
r = 9
s = 0
IF it = 2 THEN
cp = 2
PitHole = 6
ELSE
cp = ConsCols - 46
PitHole = 7
END IF
attr = kolordef
ELSEIF ConsRows > 27 AND ConsCols > 83 THEN
r = 9
s = 5
IF it = 2 THEN
cp = 2
PitHole = 6
ELSE
cp = ConsCols - 46 + s
PitHole = 7
END IF
attr = kolordef
ELSE
r = 17+rowO
cp = 19+colO
s = 2
PitHole = 6
attr = labattr
END IF
IF CmdStat$ > "!" THEN rr = 2 ELSE rr = 1
IF Gfx THEN CALL GraphHole (PitHole, r, cp, r+rr, cp+45-s)
x$ = " G Inn Hit BB SO W L S ERA"
IF s > 0 THEN x$ = RIGHT$(x$, 46 - s)
QPRINTs r, cp, x$, attr
a$ = SPACE$(46)
MID$(a$, 1, 5) = ".DAT "
IF DataGames(ip, id) > 0 THEN
MID$(a$, 6, 3) = LFORMAT$(DataGames(ip, id), "###")
ELSE
MID$(a$, 6, 3) = " -"
END IF
MID$(a$, 10, 4) = LFORMAT$(DataAB(ip, id), "####")
MID$(a$, 15, 4) = LFORMAT$(DataHits(ip, id), "####")
MID$(a$, 20, 4) = LFORMAT$(DataBB(ip, id), "####")
MID$(a$, 25, 4) = LFORMAT$(DataSO(ip, id), "####")
MID$(a$, 30, 3) = LFORMAT$(DataDef(ip, id), "###")
MID$(a$, 34, 3) = LFORMAT$(DataSB(ip, id), "###")
MID$(a$, 38, 3) = LFORMAT$(DataCS(ip, id), "###")
MID$(a$, 42, 5) = FFORMAT$(xF!, "#0.##")
IF s = 2 THEN a$ = "DT " + RIGHT$(a$, 41)
IF s = 5 THEN a$ = RIGHT$(a$, 41)
QPRINTs r+1, cp, a$, revattr
IF s < 5 THEN CALL ChangeAttribute (r+1, cp, 5-s, attr)
IF CmdStat$ > "!" THEN
a$ = SPACE$(46)
MID$(a$, 1, 5) = " Sim "
MID$(a$, 6, 3) = LFORMAT$(SimGames(ref, id) + 1, "###")
MID$(a$, 10, 4) = LFORMAT$(INT(InnsF!), "####")
MID$(a$, 15, 4) = LFORMAT$(m, "####")
MID$(a$, 20, 4) = LFORMAT$(j, "####")
MID$(a$, 25, 4) = LFORMAT$(k, "####")
MID$(a$, 30, 3) = LFORMAT$(SimWins(ref, id), "###")
MID$(a$, 34, 3) = LFORMAT$(SimLosses(ref, id), "###")
MID$(a$, 38, 3) = LFORMAT$(SimSaves(ref, id), "###")
MID$(a$, 42, 5) = FFORMAT$(ERAF!, "#0.##")
IF s = 2 THEN a$ = "Sm " + RIGHT$(a$, 41)
IF s = 5 THEN a$ = RIGHT$(a$, 41)
QPRINTs r+2, cp, a$, revattr
IF s < 5 THEN CALL ChangeAttribute (r+2, cp, 5-s, attr)
END IF
ELSE
IF ConsRows > 27 AND ConsCols > 90 THEN
r = 9
IF it = 2 THEN
cp = 2
PitHole = 6
ELSE
cp = ConsCols - 39
PitHole = 7
END IF
attr = kolordef
ELSE
r = 17+rowO
cp = 21+colO
PitHole = 6
attr = labattr
END IF
IF CmdStat$ > "!" THEN rr = 2 ELSE rr = 1
IF Gfx THEN CALL GraphHole (PitHole, r, cp, r+rr, cp+38)
QPRINTs r, cp, " G Inn Hit BB SO W L S ERA", attr
a$ = SPACE$(39)
MID$(a$, 1, 5) = ".DAT "
IF DataGames(ip, id) > 0 THEN
MID$(a$, 6, 3) = LFORMAT$(DataGames(ip, id), "###")
ELSE
MID$(a$, 6, 3) = " -"
END IF
MID$(a$, 10, 3) = LFORMAT$(DataAB(ip, id), "###")
MID$(a$, 14, 3) = LFORMAT$(DataHits(ip, id), "###")
MID$(a$, 18, 3) = LFORMAT$(DataBB(ip, id), "###")
MID$(a$, 22, 3) = LFORMAT$(DataSO(ip, id), "###")
MID$(a$, 26, 2) = LFORMAT$(DataDef(ip, id), "##")
MID$(a$, 29, 2) = LFORMAT$(DataSB(ip, id), "##")
MID$(a$, 32, 2) = LFORMAT$(DataCS(ip, id), "##")
MID$(a$, 35, 5) = FFORMAT$(xF!, "#0.##")
' QPRINTs r+1, cp, a$, revattr
' CALL ChangeAttribute (r+1, cp, 5, attr)
QPRINTs r+1, cp, ".DAT ", attr
QPRINTs r+1, cp+5, MID$(a$, 6), revattr
IF CmdStat$ > "!" THEN
a$ = SPACE$(39)
MID$(a$, 1, 5) = " Sim "
MID$(a$, 6, 3) = LFORMAT$(SimGames(ref, id) + 1, "###")
MID$(a$, 10, 3) = LFORMAT$(INT(InnsF!), "###")
MID$(a$, 14, 3) = LFORMAT$(m, "###")
MID$(a$, 18, 3) = LFORMAT$(j, "###")
MID$(a$, 22, 3) = LFORMAT$(k, "###")
MID$(a$, 26, 2) = LFORMAT$(SimWins(ref, id), "##")
MID$(a$, 29, 2) = LFORMAT$(SimLosses(ref, id), "##")
MID$(a$, 32, 2) = LFORMAT$(SimSaves(ref, id), "##")
MID$(a$, 35, 5) = FFORMAT$(ERAF!, "#0.##")
' QPRINTs r+2, cp, a$, revattr
' CALL ChangeAttribute (r+2, cp, 5, attr)
QPRINTs r+2, cp, " Sim ", attr
QPRINTs r+2, cp+5, MID$(a$, 6), revattr
END IF
END IF
END IF
'Analyze Sim BATTING Data
SimAtBats = 0 'global
SimTotHits = 0 'global
SimTotHRs = 0 'global
IF CmdStat$ > "!" THEN
ref = DataRef(ib, it)
SimAtBats = SimAB(ref, it) + mab(ref, it)
SimTotHits = SimHits(ref, it) + mhits(ref, it)
m = SimBB(ref, it) + mbb(ref, it)
j = SimSO(ref, it) + mso(ref, it)
SimTotHRs = SimHR(ref, it) + mhr(ref, it)
IF SimAtBats > 0 THEN
BASF! = SimTotHits / SimAtBats
IF BASF! > .999 THEN BASF! = .999
ELSE
BASF! = 0
END IF
IF NOT UseBigB THEN
IF SimAtBats > 999 THEN
UseBigB = TRUE
IF Gfx THEN
IF it = 1 THEN CALL EliminateHole(6)
IF it = 2 THEN CALL EliminateHole(7)
END IF
END IF
END IF
END IF
IF RegDsply = TRUE THEN
'Print Season (.DAT) BATTING Data
'Print Sim Batting Data
IF DataAB(ib, it) THEN
BAF! = DataHits(ib, it) / DataAB(ib, it)
IF BAF! > .999 THEN BAF! = .999
ELSE
BAF! = 0
END IF
IF UseBigB THEN
IF ConsRows > 27 AND ConsCols > 90 THEN
s = 0
r = 9
IF it = 1 THEN
cb = 2
BatHole = 6
ELSE
cb = ConsCols - 43
BatHole = 7
END IF
attr = koloroff
ELSEIF ConsRows > 27 AND ConsCols > 83 THEN
s = 5
r = 9
IF it = 1 THEN
cb = 2
BatHole = 6
ELSE
cb = ConsCols - 43 + s
BatHole = 7
END IF
attr = koloroff
ELSE
s = 0
r = 22+rowO
cb = 19+colO
BatHole = 7
attr = labattr
END IF
IF CmdStat$ > "!" THEN rr = 2 ELSE rr = 1
IF Gfx THEN CALL GraphHole (BatHole, r, cb, r+rr, cb+42-s)
x$ = " G AB Hit BB SO HR RBI Avg"
IF s > 0 THEN x$ = RIGHT$(x$, 43 - s)
QPRINTs r, cb, x$, attr
a$ = SPACE$(43)
MID$(a$, 1, 5) = ".DAT "
IF DataGames(ib, it) > 0 THEN
MID$(a$, 6, 4) = LFORMAT$(DataGames(ib, it), "####")
ELSE
MID$(a$, 6, 4) = " -"
END IF
MID$(a$, 11, 4) = LFORMAT$(DataAB(ib, it), "####")
MID$(a$, 16, 4) = LFORMAT$(DataHits(ib, it), "####")
MID$(a$, 21, 4) = LFORMAT$(DataBB(ib, it), "####")
MID$(a$, 26, 4) = LFORMAT$(DataSO(ib, it), "####")
MID$(a$, 31, 3) = LFORMAT$(DataHR(ib, it), "###")
MID$(a$, 35, 4) = LFORMAT$(DataRBI(ib, it), "####")
MID$(a$, 40, 4) = FFORMAT$(BAF!, ".###")
IF s = 5 THEN a$ = RIGHT$(a$, 38)
QPRINTs r+1, cb, a$, revattr
IF s < 5 THEN CALL ChangeAttribute (r+1, cb, 5-s, attr)
IF CmdStat$ > "!" THEN
a$ = SPACE$(43)
MID$(a$, 1, 5) = " Sim "
MID$(a$, 6, 4) = LFORMAT$(SimGames(ref, it) + 1, "####")
MID$(a$, 11, 4) = LFORMAT$(SimAtBats, "####")
MID$(a$, 16, 4) = LFORMAT$(SimTotHits, "####")
MID$(a$, 21, 4) = LFORMAT$(m , "####")
MID$(a$, 26, 4) = LFORMAT$(j , "####")
MID$(a$, 31, 3) = LFORMAT$(SimTotHRs, "###")
MID$(a$, 35, 4) = LFORMAT$(SimRBI(ref, it) + mrbi(ref, it), "####")
IF BASF! = 0 THEN
MID$(a$, 40, 4) = ".000"
ELSE
MID$(a$, 40, 4) = FFORMAT$(BASF!, ".###")
END IF
IF s = 5 THEN a$ = RIGHT$(a$, 38)
QPRINTs r+2, cb, a$, revattr
IF s < 5 THEN CALL ChangeAttribute (r+2, cb, 5-s, attr)
END IF
ELSE
IF ConsRows > 27 AND ConsCols > 90 THEN
r = 9
IF it = 1 THEN
cb = 2
BatHole = 6
ELSE
cb = ConsCols - 37
BatHole = 7
END IF
attr = koloroff
ELSE
r = 22+rowO '19
cb = 22+colO
BatHole = 7
attr = labattr
END IF
IF CmdStat$ > "!" THEN rr = 2 ELSE rr = 1
IF Gfx THEN CALL GraphHole (BatHole, r, cb, r+rr, cb+36)
QPRINTs r, cb, " G AB Hit BB SO HR RBI Avg", attr
a$ = SPACE$(37)
MID$(a$, 1, 5) = ".DAT "
IF DataGames(ib, it) > 0 THEN
MID$(a$, 6, 3) = LFORMAT$(DataGames(ib, it), "###")
ELSE
MID$(a$, 6, 3) = " -"
END IF
MID$(a$, 10, 3) = LFORMAT$(DataAB(ib, it), "###")
MID$(a$, 14, 3) = LFORMAT$(DataHits(ib, it), "###")
MID$(a$, 18, 3) = LFORMAT$(DataBB(ib, it), "###")
MID$(a$, 22, 3) = LFORMAT$(DataSO(ib, it), "###")
MID$(a$, 26, 3) = LFORMAT$(DataHR(ib, it), "###")
MID$(a$, 30, 3) = LFORMAT$(DataRBI(ib, it), "###")
MID$(a$, 34, 4) = FFORMAT$(BAF!, ".###")
' QPRINTs r+1, cb, a$, revattr
' CALL ChangeAttribute (r+1, cb, 5, attr)
QPRINTs r+1, cb, ".DAT ", attr
QPRINTs r+1, cb+5, MID$(a$, 6), revattr
IF CmdStat$ > "!" THEN
MID$(a$, 1, 5) = " Sim "
MID$(a$, 6, 3) = LFORMAT$(SimGames(ref, it) + 1, "###")
MID$(a$, 10, 3) = LFORMAT$(SimAtBats, "###")
MID$(a$, 14, 3) = LFORMAT$(SimTotHits, "###")
MID$(a$, 18, 3) = LFORMAT$(m, "###")
MID$(a$, 22, 3) = LFORMAT$(j, "###")
MID$(a$, 26, 3) = LFORMAT$(SimTotHRs, "###")
MID$(a$, 30, 3) = LFORMAT$(SimRBI(ref, it) + mrbi(ref, it), "###")
IF BASF! = 0 THEN
MID$(a$, 34, 4) = ".000"
ELSE
MID$(a$, 34, 4) = FFORMAT$(BASF!, ".###")
END IF
' QPRINTs r+2, cb, a$, revattr
' CALL ChangeAttribute (r+2, cb, 5, attr)
QPRINTs r+2, cb, " Sim ", attr
QPRINTs r+2, cb+5, MID$(a$, 6), revattr
END IF
END IF
END IF
RETURN
GoBullPenIfNoWarm:
'Is anybody already throwing or warm?
N = 0
FOR i = 10 TO LastPiAd(it)
'Promote "Throwing" to "Warm"
IF WarmUpStatus(i, it) > 8 THEN WarmUpStatus(i, it) = 8
'Check to see if warm
IF WarmUpStatus(i, it) > 0 THEN
N = -1
EXIT FOR
END IF
NEXT
IF N = 0 THEN 'Nobody's warm
j = 0
DO
N = 0
CALL PopMsg(8+rowO, 22+colO, "Start someone throwing in your bullpen...", errattr, 2, kc)
CALL ClearInpBuffer
CALL Bullpen(0, it, 0, -1)
FOR i = 10 TO LastPiAd(it)
IF WarmUpStatus(i, it) > 0 THEN
N = -1
EXIT FOR
END IF
NEXT
INCR j
LOOP UNTIL N OR j > 2 'j is a fail-safe to avoid being caught in infinite loop
IF Gfx THEN
CALL UnfreezeAndRefresh
END IF
END IF
RETURN
BatterOnScreen:
IF DelFac THEN
IF DataHand(ib, it) = "S" OR DataHand(ib, it) = "B" THEN
IF UCASE$(DataHand(ip, id)) = "R" THEN
xS$ = "L"
ELSE
xS$ = "R"
END IF
ELSEIF DataHand(ib, it) = "L" THEN
xS$ = "L"
ELSE
xS$ = "R"
END IF
CALL BatterName(BLN$, xS$, FALSE)
ELSE
CALL BatterName(BLN$, "", TRUE)
END IF
RETURN
RebuildFieldScreen:
COLOR fldfor, fldbac
CLS
IF Gfx THEN CALL ShowGfx
CALL ScoreBrd(TRUE, TRUE) 'Draws frame and blank announcer's box
IF DelFac > 0 THEN CALL AddToAnnouncer(it, BLN$ + " steps back in...")
CALL PostAnnouncer(FALSE, FALSE) 'Displays "Quick Play" if DelFac = 0
ANx = 0
CALL Prompt(0)
GOSUB PrintEra
GOSUB PrintButtons
GOSUB PrintStats
CALL Defens(0)
CALL Batord
CALL Baspat
GOSUB BatterOnScreen 'Does nothing if DelFac = 0
IF Gfx THEN
CALL UnfreezeAndRefresh
END IF
RETURN
GetPhotoSpecs:
'Look for .DAT PH name (or default CmdPic$) in STADIUM.TXT
rec$ = ReturnLineInTextFile$ ("STADIUM.TXT", BackgroundPic$, 1, 20)
L = LEN(rec$)
IF L > 25 THEN 'picked one with angles defined
'Load rest of parameters off the selected record
ObsD = VAL(MID$(rec$, 21, 6))
ObsY = VAL(MID$(rec$, 27, 6))
ObsH = VAL(MID$(rec$, 33, 6))
ObsTz = VAL(MID$(rec$, 39, 6))
ObsTy = VAL(MID$(rec$, 45, 6))
PhotoCredit$ = RTRIM$(MID$(rec$, 53, 26)) + " - " + RTRIM$(MID$(rec$, 80, 19)) + ": " + RTRIM$(MID$(rec$, 100))
Gfx = TRUE
ELSEIF L > 0 THEN 'picked one without angles defined
ObsD =-100
ObsY = 0
ObsH = 70
ObsTz = -10
ObsTy = 0
PhotoCredit$ = ""
Gfx = TRUE
ELSE 'did not find .DAT filename in STADIUM.TXT
ObsD =-100
ObsY = 0
ObsH = 70
ObsTz = -10
ObsTy = 0
PhotoCredit$ = ""
Gfx = TRUE
END IF
IF ConsRows = 25 AND ConsCols = 80 THEN Gfx = FALSE
IF CmdRetroMode$ = "Y" THEN Gfx = FALSE
RETURN
DefineBitmap:
'Does photo exist?
m = LEN(DIR$(BackgroundPic$))
IF m = 0 THEN 'Oops. No picture on file
IF Gfx THEN
BitmapNRF = TRUE 'Turn on failure switch if Gfx was on
FOR nn = 1 TO 32
CALL EliminateHole(nn)
NEXT
CALL HideGfx
END IF
Gfx = FALSE 'Turn Gfx off temporarily
ELSE
BitmapNRF = FALSE
END IF
'Define Graphics background screen
IF Gfx THEN
FOR nn = 1 TO 32
CALL EliminateHole(nn)
NEXT
ConsoleGfx 1, 6, ConsCols, ConsRows-1
'Start a thread to periodically refresh the graphics window.
'THREAD CREATE RefreshWindow(0) SUSPEND TO ThreadNo
'Hide the windows for now
CALL HideGfx
sFileName$ = BackgroundPic$
IF UCASE$(RIGHT$(sFileName$, 3)) = "BMP" THEN
lResult = BitmapParam(sFileName$, %IMAGE_WIDTH_HEIGHT)
lWidth = LOWRD(lResult)
lHeight= HIWRD(lResult)
lResult = StretchBitmap(sFileName$, 1024, 512)
ELSE
lResult = ImageParam(sFileName$, %IMAGE_WIDTH_HEIGHT)
lWidth = LOWRD(lResult)
lHeight= HIWRD(lResult)
lResult = StretchImage(sFileName$, 1024, 512)
END IF
'The graphic window is from row 6 to (ConsRows - 1),
'so there are (ConsRows - 1) - 6 + 1 rows inside the window.
' (ConsRows - 6)
'The first row is 1
'The last row is (ConsRows - 6)
r = DrawToRow (ConsRows-6, ConsRows-6)
c = DrawToCol (2, ConsCols)
GfxFontName "Arial"
GfxFontSize 13
DrawFrom c, r-1 'r+2
x$ = "Photo credit: " + PhotoCredit$
DrawTextRow x$, 0
ELSE
ObsD = -130: ObsY = 0: ObsH = 350: ObsTz = -50: ObsTy = 0
END IF
RETURN
DefineBigBitmap:
m = LEN(DIR$(CmdPic$))
IF m THEN
ConsoleGfx 1, 1, ConsCols, ConsRows
sFileName$ = CmdPic$
IF UCASE$(RIGHT$(sFileName$, 3)) = "BMP" THEN
lResult = BitmapParam(sFileName$, %IMAGE_WIDTH_HEIGHT)
lWidth = LOWRD(lResult)
lHeight= HIWRD(lResult)
lResult = StretchBitmap(sFileName$, 1024, 512)
ELSE
lResult = ImageParam(sFileName$, %IMAGE_WIDTH_HEIGHT)
lWidth = LOWRD(lResult)
lHeight= HIWRD(lResult)
lResult = StretchImage(sFileName$, 1024, 512)
END IF
IF PhotoCredit$ > "!" THEN
r = DrawToRow (ConsRows-1, ConsRows)
c = DrawToCol (2, ConsCols)
GfxFontName "Arial"
GfxFontSize 14
DrawFrom c, r+4
x$ = "Photo credit: " + PhotoCredit$
DrawTextRow x$, 0
END IF
END IF
RETURN
ChangePhotoManually:
CmdChangePhoto$ = "N"
SaveBackgroundPic$ = BackgroundPic$
'Gfx = FALSE
IF ConsRows <> 25 AND ConsCols <> 80 THEN
IF LEN(DIR$("STADIUM.TXT")) THEN
FileLimit = 200
REDIM List1(1 TO FileLimit) AS List1Type
CALL LoadStadiumToList(List1(), choices)
IF Gfx THEN CALL GraphHole(30, 2+rowO, 3+colO, 21+rowO, 78+colO)
CALL SelectPhotoIO(List1(), choices, BackgroundPic$)
IF Gfx THEN CALL EliminateHole(30)
IF BackgroundPic$ = "" THEN 'Make no changes
BackgroundPic$ = SaveBackgroundPic$
IF Gfx THEN CALL UnfreezeAndRefresh
RETURN
END IF
IF BackgroundPic$ <> "--NONE--" AND BackgroundPic$ > "!" THEN 'Real picture selected
r = 17 + rowO
c = 20 + colO
QPRINTs r, c, " One moment please, stretching photograph... ", defattr
GOSUB GetPhotoSpecs
ELSE 'Apparently selected NONE
PhotoCredit$ = ""
Gfx = FALSE 'test
END IF
GOSUB DefineBitmap
GOSUB RebuildFieldScreen
END IF
END IF
RETURN
SetParkEffects:
'Credit Shane Holmes for this routine
'Requires HBF(), TeamsInLeague(), CurrParkBF!, CurrParkPF!
'internally uses it, n
IF HBF!(1) > 0 AND HBF!(2) > 0 THEN
FOR it = 1 TO 2
n = TeamsInLeague(it)
IF n > 1 THEN
NT! = 2 / (HBF!(it) + (n - HBF!(it))/(n - 1) )
ParkBatAdj(it) = CurrParkBF! * NT! - 1
END IF
NEXT
END IF
IF HPF!(1) > 0 AND HPF!(2) > 0 THEN
FOR it = 1 TO 2
n = TeamsInLeague(it)
IF n > 1 THEN
NT! = 2 / (HPF!(it) + (n - HPF!(it))/(n - 1) )
ParkPitAdj(it) = CurrParkPF! * NT! - 1
END IF
NEXT
END IF
RETURN
DeclareConsole:
IF CmdRetroMode$ = "Y" THEN
ConsRows = 25
ConsCols = 80
END IF
CONSOLE SCREEN ConsRows, ConsCols
ConsoleTitle "Strategic Baseball Simulator 4.9.3"
IF winver < 2 THEN ConsoleIcon %IDI_Console
DeleteWindowMenuItem %MENUITEM_TOOLBAR
DeleteWindowMenuItem %MENUITEM_CLOSE
ConsoleToolbar %OFF, %NO_CHANGE
ConsoleWindow %SHOW
' TEST
'ConsoleWindow %MINIMIZE
'ConsoleWindow %RESTORE
IF CmdRetroMode$ = "Y" THEN ConsoleWindow %FULLSCREEN ELSE ConsoleWindow %MAXIMIZE
RETURN
PBM_ErrorTrap:
LOCATE 10, 30
PRINT " PBM_Error"; ERRCLEAR
LOCATE 11, 30
PRINT " LL="; LL, ref, id, ps
x$ = WAITKEY$
END FUNCTION
'*********************** END OF MAIN MODULE ************************
'*************************** FUNCTIONS *****************************
FUNCTION BattersFacedByPit! (Innings, Hits, BB, SO)
'BattersFacedByPit! = (((Innings * 3) - SO) * .966) + Hits + BB + SO
BattersFacedByPit! = (((Innings * 3) - SO) * .990) + Hits + BB + SO '.990 .975??
END FUNCTION
FUNCTION BUBuildLine$ (j, tm, CalledFromOffense)
IF iused(j, tm) OR j = ipa(tm) THEN
flag$ = "x"
ELSEIF SimDaysOff(j, tm) > 0 AND DaysOffRule = TRUE THEN 'Override: SimDaysOff is negative, so this is skipped
flag$ = LTRIM$(STR$(SimDaysOff(j, tm)))
ELSEIF WarmUpRule = TRUE THEN
IF WarmUpStatus(j, tm) > 10 THEN
flag$ = "T"
ELSEIF CalledFromOffense = TRUE AND WarmUpStatus(j, tm) > 8 THEN
flag$ = "T"
ELSEIF WarmUpStatus(j, tm) > 0 THEN
flag$ = "W"
END IF
ELSE
flag$ = " "
END IF
a$ = SPACE$(66)
MID$(a$, 1, 1) = flag$
MID$(a$, 3, 18) = DataName(j, tm)
MID$(a$, 22, 1) = DataHand(j, tm)
MID$(a$, 26, 2) = LFORMAT$(DataDef(j, tm), "##")
MID$(a$, 29, 2) = LFORMAT$(DataSB(j, tm), "##")
MID$(a$, 32, 2) = LFORMAT$(DataCS(j, tm), "##")
MID$(a$, 35, 2) = LFORMAT$(DataGames(j, tm), "##")
MID$(a$, 39, 2) = LFORMAT$(DataGbyP(j, tm, 1), "##")
MID$(a$, 43, 4) = LFORMAT$(DataAB(j, tm), "####")
MID$(a$, 49, 4) = LFORMAT$(DataHits(j, tm), "####")
MID$(a$, 55, 3) = LFORMAT$(DataBB(j, tm), "###")
MID$(a$, 59, 3) = LFORMAT$(DataSO(j, tm), "###")
MID$(a$, 63, 4) = FFORMAT$(DataRBI(j, tm)/100, "#.##")
BUBuildLine$ = a$
END FUNCTION
FUNCTION CalcAttr (forg, bacg) AS LONG
CalcAttr = (bacg * 16) + forg
END FUNCTION
FUNCTION CalcOPS! (p, tm) STATIC
IF DataAB(p, tm) > 0 THEN
TB = DataHits(p,tm) + Data2B(p,tm) + 2 * Data3B(p,tm) + 3 * DataHR(p,tm)
Slug! = TB / DataAB(p, tm)
OnBase! = (DataBB(p,tm) + DataHits(p,tm)) / (DataBB(p,tm) + DataAB(p,tm))
CalcOPS! = Slug! + OnBase!
ELSE
CalcOPS! = 0.0
END IF
END FUNCTION
FUNCTION CANADA (xS$)
cS$ = UCASE$(xS$)
CANADA = 0
IF INSTR(cS$, "JAYS") > 0 OR INSTR(cS$, "EXPOS") > 0 THEN
CANADA = -1
END IF
IF INSTR(cS$, "TORON") > 0 OR INSTR(cS$, "MONT") > 0 THEN
CANADA = -1
END IF
IF MID$(cS$, 5, 4) = "ATOR" OR MID$(cS$, 5, 4) = "NMON" THEN
CANADA = -1
END IF
END FUNCTION
FUNCTION CircularFcn! (x!)
'INPUT IS ASSUMED IN RADIANS
'ELIMINATES MULTIPLES OF 2*PI AND RETURNS VALUE AS POSITIVE
IF x! > 6.2831853071 OR x! < -6.2831853071 THEN
z! = x! / 6.2831853071
Fract! = FRAC(z!)
x! = Fract! * 6.2831853071
IF x! < 0 THEN x! = 6.2831853071 + x!
CircularFcn! = x!
ELSE
CircularFcn! = x!
END IF
END FUNCTION
FUNCTION CODESUM (xS$)
CSum = 0
FOR i = 1 TO LEN(xS$)
CSum = CSum + ASC(MID$(xS$, i, 1))
NEXT
CODESUM = CSum
END FUNCTION
FUNCTION CountGamesInSCH (FavLeague$, FavTeam$, DateL$, DateH$, SubLen, VisiOff, HomeOff, OptOff)
'Counts total number of games in a schedule file
OPEN CmdPath$ + CmdSCH$ FOR BINARY AS #2
RecLen = 0
L& = LOF(2)
IF L& MOD 210 = 0 THEN RecLen = 210 : SchGamesPerRecord = 7
IF L& MOD 430 = 0 THEN RecLen = 430 : SchGamesPerRecord = 15
IF RecLen > 0 THEN SchRecords = L& / RecLen ELSE CountGamesInSCH = 0: EXIT FUNCTION
Buffer$ = SPACE$(RecLen)
GET #2 ,, Buffer$ 'Skip 1st record
GET #2 ,, Buffer$
rec = 2
EndOfFile = 0
Total = 0
DO WHILE NOT EndOfFile
DeleteFlag$ = MID$(Buffer$, 1, 1)
IF DeleteFlag$ <> "D" THEN
SCHDate$ = MID$(Buffer$, 3, 8)
FOR n = 1 TO SchGamesPerRecord 'formerly 7
SubRecOff = 10 + (n - 1) * SubLen
a$ = MID$(Buffer$, SubRecOff + VisiOff, 8)
bS$ = MID$(Buffer$, SubRecOff + HomeOff, 8)
a$ = UCASE$(a$)
bS$ = UCASE$(bS$)
TeamOK = -1
IF LEN(FavLeague$) THEN
'xS$ = MID$(a$, 3, 1)
'yS$ = MID$(bS$, 3, 1)
IF NUMERIC(MID$(a$, 1, 4), FALSE, FALSE) THEN
xS$ = MID$(a$, 5, 1)
ELSE
xS$ = MID$(a$, 3, 1)
END IF
IF NUMERIC(MID$(bS$, 1, 4), FALSE, FALSE) THEN
yS$ = MID$(bS$, 5, 1)
ELSE
yS$ = MID$(bS$, 3, 1)
END IF
IF FavLeague$ <> xS$ AND FavLeague$ <> yS$ THEN
TeamOK = 0
END IF
END IF
IF LEN(FavTeam$) THEN
IF FavTeam$ <> RTRIM$(a$) AND FavTeam$ <> RTRIM$(bS$) THEN
TeamOK = 0
END IF
END IF
IF LEN(DateL$) THEN
IF SCHDate$ < DateL$ OR SCHDate$ > DateH$ THEN
TeamOK = 0
END IF
END IF
IF a$ <> SPACE$(8) AND bS$ <> SPACE$(8) AND TeamOK = -1 THEN
INCR Total
xS$ = MID$(Buffer$, SubRecOff + OptOff, 12)
IF xS$ <> SPACE$(12) THEN
'Parse the Options
xS$ = UCASE$(xS$)
i = INSTR(xS$, "/N:")
IF i THEN
Total = Total + VAL(MID$(xS$, i+3, 3)) - 1
END IF
END IF
END IF
NEXT
END IF
INCR rec
IF rec > SchRecords THEN
EndOfFile = -1
ELSE
GET #2 ,, Buffer$
END IF
LOOP
CLOSE #2
CountGamesInSCH = Total
END FUNCTION
FUNCTION CountGamesInSER
OPEN CmdPath$ + CmdSER$ FOR INPUT AS #2 LEN = 128
Total = 0
DO
LINE INPUT #2, x$
L = LEN(x$)
IF x$ <> SPACE$(L) THEN
x$ = UCASE$(x$)
i = INSTR(x$, "/N:")
IF i THEN
Total = Total + VAL(MID$(x$, i+3, L-i-2))
ELSE
INCR Total
END IF
END IF
LOOP UNTIL EOF(2)
CLOSE #2
CountGamesInSER = Total
END FUNCTION
FUNCTION ConsoleShell (BYVAL CmdLine$, BYVAL ShowWindState&) AS LONG
' How to use:
' target app will start in it's own console
' ShowWindState& = %SW_SHOW '1 = normal?
' ConsoleShell "E:\PB35\PTS&SVCE.V72\LOGON.exe 1 /Q/B", ShowWindState&
LOCAL Si AS STARTUPINFO
LOCAL Pi AS PROCESS_INFORMATION
LOCAL Result AS LONG
Si.cb = SIZEOF(Si)
Si.dwFlags = %STARTF_USESHOWWINDOW
Si.wShowWindow = ShowWindState&
Result = CreateProcess("", BYVAL STRPTR(CmdLine$), BYVAL %NULL, BYVAL %NULL, _
0, %NORMAL_PRIORITY_CLASS OR %CREATE_NEW_CONSOLE, BYVAL %NULL, BYVAL %NULL, Si, Pi)
'PRINT cmdline$
IF Result THEN
CALL CloseHandle(pi.hProcess)
CALL CloseHandle(pi.hThread)
FUNCTION = Result
END IF
'PRINT "result = "; result
END FUNCTION
FUNCTION DECRYPT$ (x$)
'Dim z$, c$, i, n
z$ = ""
FOR i = 1 TO LEN(x$)
c$ = MID$(x$, i, 1)
n = ASC(c$) XOR 171
z$ = z$ + CHR$(n)
NEXT
DECRYPT$ = z$
END FUNCTION
FUNCTION DEFPCT!(n) STATIC
IF DataPos(n, id) = 1 THEN
defperF! = NormDEF(1)
GOTO ExitDEFPCT
ELSEIF ERRSw(id) THEN
DatErrors = DataDef(n, id)
' Adj! = (1.0 - pkbaseF(id)) / .753 'League K's vs 2003 NL Standard
Adj! = (1.0 - pkbaseF(id)) / .7496 'League K's vs 1998 NL Standard
'Results < 1 result in more errors
'Results > 1 result in less errors
'Exaggerate the result a little for low-strike-out leagues
'(We seem to get too many errors in the AL if we don't)
IF dh THEN
Adj! = Adj! + .06
END IF
'We do not do separate standards for the AL and NL.
'Otherwise we would need separate DefChancesPerGame Tables .
'The table we use is assumed to be for a non-DH league (NL).
'We know that with the DH, there are fewer strike-outs in the AL and
'therefore more fielding chances.
ch! = 0
i = 1
DO UNTIL i > 4
IF DataGbyP(n, id, i) = 0 THEN EXIT DO
ch! = ch! + DataGbyP(n, id, i) * Adj! * DefChancesPerGameF(DataPosi(n, id, i))
INCR i
LOOP
IF ch! > 0 THEN
CDEF! = 1.0 - (DatErrors / ch!)
IF i = 2 THEN 'just 1 G-By-P entry
defperF! = CDEF!
ELSE
defperF! = DEFSplit!(n, CDEF!, Adj!) 'more than 1 G-By-P entry
END IF
ELSE
DatGames = DataGames(n, id) 'no G-By-P data at all
IF DatGames = 0 THEN DatGames = DataAB(n, id) / 3.5
IF DatGames = 0 THEN DatGames = 1
defperF! = 1.0 - ( DatErrors / ( DatGames * Adj! * DefChancesPerGameF(DataPos(n, id)) ) )
END IF
ELSE
'Raw DEF% given instead of ERR
Adj! = 1.0
CDEF! = DataDef(n, id) / 1000
defperF! = DEFSplit!(n, CDEF!, Adj!)
p = DataPos(n, id)
IF p = 2 THEN defperF! = defperF! * 0.9550
IF p = 3 THEN defperF! = defperF! * 0.9870
IF p = 4 THEN defperF! = defperF! * 1.0060
IF p = 5 THEN defperF! = defperF! * 1.0080
IF p = 6 THEN defperF! = defperF! * 1.0060
END IF
IF defperF! > .999 THEN defperF! = .999
IF defperF! < .800 THEN defperF! = .800
'Check to see if penalty appies for out-of-position player
ValidPos = FALSE
CurrPos = DataPos(n, id)
IF DataPosi(n, id, 1) > 0 AND DataGbyP(n, id, 1) > 0 THEN 'strict
IF FoundPosition(CurrPos, n, id) THEN ValidPos = TRUE
ELSE 'loose
ListedPos = OrgPos(DataRef(n, id), id)
SELECT CASE CurrPos
CASE 2
IF ListedPos = 2 THEN ValidPos = TRUE
CASE 3
IF ListedPos = 3 OR ListedPos = 5 THEN ValidPos = TRUE
CASE 4
IF ListedPos = 4 OR ListedPos = 6 THEN ValidPos = TRUE
CASE 5
IF ListedPos = 5 OR ListedPos = 6 THEN ValidPos = TRUE
CASE 6
IF ListedPos = 6 THEN ValidPos = TRUE
CASE 7, 8, 9
IF ListedPos = 7 OR ListedPos = 8 OR ListedPos = 9 THEN ValidPos = TRUE
END SELECT
END IF
IF ValidPos = TRUE GOTO ExitDEFPCT
'Penalty:
defperF! = defperF! * .75
ExitDEFPCT:
DEFPCT! = defperF!
END FUNCTION
FUNCTION DefaultDHResponse$
IF MenuOpt$ = "S" OR MenuOpt$ = "E" THEN
DefaultDHResponse$ = "H"
ELSE
IF League(2) = "A" THEN
IF Century(2) = "19" AND MID$(Names(2), 1, 2) > "73" THEN
DefaultDHResponse$ = "Y"
ELSEIF Century(2) = "20" THEN
DefaultDHResponse$ = "Y"
ELSE
DefaultDHResponse$ = "N"
END IF
ELSE
DefaultDHResponse$ = "N"
END IF
END IF
END FUNCTION
FUNCTION DEFSplit!(n, ActDEF!, Adj!) STATIC
numer! = 0
denom! = 0
i = 1
DO UNTIL i > 4
IF DataGbyP(n, id, i) = 0 THEN EXIT DO
p = DataPosi(n, id, i)
numer! = numer! + DataGbyP(n, id, i) * DefChancesPerGameF(p) * Adj! * NormDEF(p)
denom! = denom! + DataGbyP(n, id, i) * DefChancesPerGameF(p) * Adj!
INCR i
LOOP
IF i = 2 THEN
DEFSplit! = ActDEF!
ELSEIF denom! > 0 THEN
ExpDEF! = numer! / denom!
p = DataPos(n, id)
xa! = NormDEF(p) * (ActDEF! / ExpDEF!)
xb! = xa! / (xa! + ( (1-NormDEF(p))*(1-ActDEF!)/(1-ExpDEF!) ) )
DEFSplit! = xb!
ELSE
DEFSplit! = ActDEF!
END IF
END FUNCTION
FUNCTION DHinDAT (team)
DHinDAT = 0
i = 1
DO
IF DataPos(i, team) = 10 THEN
DHinDAT = -1
EXIT DO
END IF
INCR i
LOOP WHILE i < 10
END FUNCTION
FUNCTION DrawToRow (row, winrows)
x! = 512 / winrows
DrawToRow = INT( x! * (row - 1) )
END FUNCTION
FUNCTION DrawToCol (col, wincols)
x! = 1024 / wincols
DrawToCol = INT( x! * (col - 1) )
END FUNCTION
FUNCTION ExpectedPitchCount (pit, tm)
'Computes Avg PitchCount / Game for a given pitcher
'Takes into account starter innings and relief innings
Starts = DataGbyP(pit, tm, 1)
TotalInnings = DataAB(pit, tm)
Games = DataGames(pit, tm)
HB = DataBB(pit, tm) * 0.08
' PitchCount = 4.81 * SOs& + 5.14 * BBs& + 3.27 * (Hits& + HB&) + 3.16 * (TotOuts& - SOs&)
TotalPitches& = 5.0 * DataSO(pit,tm) + 5.3 * DataBB(pit,tm) + _
3.4 * (DataHits(pit,tm) + HB) + _
3.3 * (DataAB(pit,tm) * 3 - DataSO(pit,tm))
IF (Games > Starts) AND Starts > 0 THEN 'Has both starts and relief appearances
MostlyStarter = 0
MostlyReliever = 0
x! = Starts / Games
IF x! > .66 THEN MostlyStarter = TRUE
IF x! < .33 THEN MostlyReliever = TRUE
IF np(tm) = 1 THEN 'starter
IF MostlyReliever THEN
PitchesExpected = 105
ELSE
ReliefInnings = (Games - Starts) * 1.7
StartInnings = TotalInnings - ReliefInnings
StartPitches& = TotalPitches& * (StartInnings / TotalInnings)
PitchesExpected = StartPitches& / Starts
IF PitchesExpected < 64 THEN PitchesExpected = 64 '4 innings
IF PitchesExpected > 145 THEN PitchesExpected = 145 '9+ innings
END IF
ELSE 'reliever
IF MostlyStarter THEN
PitchesExpected = 50
ELSE
StartInnings = Starts * 5.7
ReliefInnings = TotalInnings - StartInnings
ReliefPitches& = TotalPitches& * (ReliefInnings / TotalInnings)
PitchesExpected = ReliefPitches& / (Games - Starts)
IF PitchesExpected < 15 THEN PitchesExpected = 15 '1 inning
IF PitchesExpected > 116 THEN PitchesExpected = 116 '7 innings
END IF
END IF
ELSE 'Almost all appearances are starts
IF Games > 0 THEN 'Or all appearances are relief
PitchesExpected = TotalPitches& / Games
IF PitchesExpected < 15 THEN PitchesExpected = 15 '1 inning
ELSE
PitchesExpected = 116
END IF
END IF
IF PitchersPerGame(tm) < 2.5 AND CmdDeadBallAdj$ = "Y" THEN
y! = 1.375 - (0.15 * PitchersPerGame(tm)) '15% boost for 1.5-PPG teams (c1912)
ELSE
y! = 1.0
END IF
ExpectedPitchCount = PitchesExpected * y!
END FUNCTION
FUNCTION FFormat$ (InValue!, mask$)
L = LEN(mask$)
i = INSTR(mask$, ".")
IF i THEN
dp = L - i
f! = MyROUND!(InValue!, dp)
IF i > 1 THEN 'look at 1st "place holder" left of dp
fph$ = MID$(mask$, i - 1, 1)
ELSE
fph$ = ""
END IF
ELSE
dp = 0
f! = InValue!
END IF
x$ = LTRIM$(STR$(f!))
IF x$ = "0" THEN
IF fph$ = "#" THEN
x$ = ""
END IF
END IF
IF LEFT$(x$, 1) = "." THEN
IF fph$ = "0" THEN
x$ = "0" + x$
END IF
END IF
'Pad (or truncate) necessary places to right of decimal point
IF dp THEN
dppos = INSTR(x$, ".")
IF dppos = 0 THEN x$ = x$ + "."
LL = LEN(x$)
IF dppos = 0 THEN dppos = LL
IF dppos < LL THEN
fp$ = MID$(x$, dppos + 1) 'fractional part
ELSE
fp$ = ""
END IF
IF LEN(fp$) > dp THEN 'truncate fractional part
fp$ = LEFT$(fp$, dp)
ELSE 'pad-right fractional part
WHILE (LEN(fp$) < dp)
fp$ = fp$ + "0"
WEND
END IF
wp$ = LEFT$(x$, dppos) + fp$
ELSE
wp$ = x$
END IF
FFormat$ = PADLEFT$(wp$, L)
END FUNCTION
FUNCTION FindPP!
psoF! = DataSO(ip, id) / (DataAB(ip, id) * 3) 'Pitcher's SO of total outs
IF pkbaseF(id) > 0 THEN 'L.Avg. SO of total outs
xF! = psoF! / pkbaseF(id)
ELSE
xF! = psoF! / .239 '.239 is a norm value
END IF
ppF! = 0.90 - (0.32 * xF!) '90 - 32 = 58 default pp
IF ppF! > .78 THEN ppF! = .78 '+/- .20
IF ppF! < .38 THEN ppF! = .38
IF DataHand(ib, it) = "L" THEN
ppF! = 1 - ppF!
ELSEIF (DataHand(ib, it) = "S" OR DataHand(ib, it) = "B") AND UCASE$(DataHand(ip, id)) = "R" THEN
ppF! = 1 - ppF!
END IF
FindPP! = ppF!
END FUNCTION
FUNCTION FindRA$ (RecNum, fp, Reclen, start, leng)
SEEK fp, (RecNum - 1) * Reclen + start
GET$ fp, leng, x$
FindRA$ = x$
END FUNCTION
FUNCTION FIRSTNAME$ (xS$)
STATIC a$
i = INSTR(xS$, ",")
IF i > 1 THEN
a$ = MID$(xS$, i + 1)
FIRSTNAME$ = LTRIM$(RTRIM$(a$))
ELSE
FIRSTNAME$ = nulls$
END IF
END FUNCTION
FUNCTION FLASTNAMER$ (player, team)
' "player" must be reference index
IF DLN(player, team) = 0 THEN
RS$ = LASTNAME$(NameRef(player, team))
ELSE
FS$ = FIRSTNAME$(NameRef(player, team))
zi$ = MID$(FS$, 1, 1)
RS$ = zi$ + "." + LASTNAME$(NameRef(player, team))
END IF
FLASTNAMER$ = RS$
END FUNCTION
FUNCTION FLASTNAME$ (player, team)
' "player" is NOT reference number (although DLN must be looked up by ref)
IF DLN(DataRef(player, team), team) = 0 THEN
RS$ = LASTNAME$(DataName(player, team))
ELSE
FS$ = FIRSTNAME$(DataName(player, team))
zi$ = MID$(FS$, 1, 1)
RS$ = zi$ + "." + LASTNAME$(DataName(player, team))
END IF
FLASTNAME$ = RS$
END FUNCTION
FUNCTION FLOAT2STR$ (xF!) STATIC
n = xF! * 1000
xS$ = LTRIM$(STR$(n))
FLOAT2STR$ = PADZEROS$(xS$, 4)
END FUNCTION
FUNCTION FoundInMMList (xS$)
REGISTER i AS INTEGER
a$ = xS$
i = INSTR(a$, ".")
IF i THEN a$ = LEFT$(a$, i - 1)
a$ = RTRIM$(a$)
Found = FALSE
i = 0
DO
INCR i
IF i > MMx THEN EXIT DO
IF RTRIM$(MMList(i).MMFile) = a$ THEN Found = TRUE
LOOP UNTIL Found
IF Found THEN FoundInMMList = TRUE ELSE FoundInMMList = FALSE
END FUNCTION
FUNCTION FoundPosition (posi, plyr, team)
FoundPosition = 0
z = 1
DO
IF DataPosi(plyr, team, z) = posi THEN
FoundPosition = -1
EXIT FUNCTION
END IF
INCR z
LOOP UNTIL z > 4
END FUNCTION
FUNCTION FRND (i) STATIC
FRND = INT(i * RND) + 1
END FUNCTION
FUNCTION FULLNAME$ (xS$)
i = INSTR(xS$, ",")
IF i > 1 THEN
FULLNAME$ = FIRSTNAME$(xS$) + " " + LASTNAME$(xS$)
ELSE
FULLNAME$ = RTRIM$(xS$)
END IF
END FUNCTION
FUNCTION GetDaysOff (pl, tm)
IF UBOUND(PSum) = -1 THEN 'Array has not been dimensioned
GetDaysOff = 0
EXIT FUNCTION
END IF
FoundAt = 0
Find$ = League(tm)
Find$ = Find$ + PADRIGHT$(Names(tm), 12) + PADRIGHT$(DataName(pl, tm), 16)
TotalRecs = PSum(0).PGameCtr
CALL BinarySearchP (PSum(), 1, 29, 1, TotalRecs, Find$, FoundAt, mini)
IF FoundAt = 0 THEN
DaysOff = 0
ELSE
DaysOff = PSum(FoundAt).PDaysOff
IF CmdSch$ > "!" THEN
Now = JDATE(SchDate$)
Last = PSum(FoundAt).PJDate
DaysOff = DaysOff - (Now - Last) + 1
IF DaysOff < 0 THEN DaysOff = 0
IF DaysOff > 4 THEN DaysOff = 4
END IF
END IF
GetDaysOff = DaysOff
END FUNCTION
FUNCTION GROUNDBALLWHOAT (ppF!) STATIC
'First Randomization: add +/- .2
yF! = ppF! + (21 - FRND(41)) / 100! ' +/- .20
'Second Randomization: add +/- .4
xF! = yF! + (41 - FRND(81)) / 100! ' +/- .40
'This defines the infielder's "range":
IF xF! > .78 THEN
i = 5 '22
ELSEIF xF! > .51 THEN
i = 6 '27
ELSEIF xF! > .26 THEN
i = 4 '25
ELSEIF xF! > .18 THEN
i = 1 ' 8
ELSEIF xF! > .16 THEN
i = 2 ' 2
ELSE
i = 3 '16
END IF
GROUNDBALLWHOAT = i
END FUNCTION
FUNCTION HiSaves (tm)
REGISTER i AS INTEGER, j AS INTEGER
'Returns the saves of the leader in this category
'Takes into account starter innings and relief innings
Sav = 0
j = LastPiAd(tm)
FOR i = 10 TO j
IF DataCS(i, tm) > Sav THEN Sav = DataCS(i, tm)
NEXT
HiSaves = Sav
END FUNCTION
FUNCTION HITRATING! (bo, tm) STATIC
IF DataAB(bo, tm) = 0 THEN
HITRATING! = 0
EXIT FUNCTION
END IF
temp! = (DataHits(bo, tm) / DataAB(bo, tm)) 'BA Component
temp! = temp! + (DataHR(bo, tm) / DataAB(bo, tm)) * 1.5 'Add Power Component (2008 1.5 power factor)
'Adjust For Over-use if using a stat file
IF CmdStat$ > "!" THEN
IF CmdFocus$ = "Y" THEN
r = DataRef(bo, tm)
StatABs = SimAB(r, tm)
ELSE
FoundAt = 0
xS$ = DataName(bo, tm)
Find$ = League(tm)
Find$ = Find$ + PADRIGHT$(Names(tm), 12)
Find$ = Find$ + PADRIGHT$(xS$, 16)
TotalRecs = BSum(0).BGameCtr
CALL BinarySearchB (BSum(), 1, 29, 1, TotalRecs, Find$, FoundAt, mini)
IF FoundAt = 0 THEN
StatABs = 0
ELSE
StatABs = BSum(FoundAt).BABs
END IF
END IF
IF (StatABs * 1.2) > DataAB(bo, tm) THEN
xF! = DataAB(bo, tm) / (StatABs * 1.2)
HITRATING! = temp! * xF!
ELSE
HITRATING! = temp!
END IF
ELSE
HITRATING! = temp!
END IF
END FUNCTION
FUNCTION IFORMAT$ (InValue%, mask$)
IFormat$ = PADLEFT$(LTRIM$(STR$(InValue%)), LEN(mask$))
END FUNCTION
FUNCTION InBox(r1,c1,r2,c2, r, c, OnBorderOK) AS LONG
InBox = FALSE
IF OnBorderOK THEN
IF r >= r1 AND r <= r2 THEN
IF c >= c1 AND c <= c2 THEN
InBox = TRUE
END IF
END IF
ELSE
IF r > r1 AND r < r2 THEN
IF c > c1 AND c < c2 THEN
InBox = TRUE
END IF
END IF
END IF
END FUNCTION
FUNCTION JDATE(x$) STATIC
'Assume non-leap year
IF UBOUND(MD) = -1 THEN 'If array is un-dimensioned:
DIM MD(12)
DATA 31,28,31,30,31,30,31,31,30,31,30
MD(1) = 0
FOR i = 2 TO 12
MD(i) = MD(i-1) + VAL(READ$(i-1))
NEXT
END IF
FOR i = 2 TO 12
MD(i) = MD(i-1) + VAL(READ$(i-1))
NEXT
mm = VAL(MID$(x$, 1, 2))
dd = VAL(MID$(x$, 4, 2))
JDATE = MD(mm) + dd
END FUNCTION
FUNCTION LASTNAME$ (xS$)
i = INSTR(xS$, ",")
IF i > 1 THEN
LASTNAME$ = MID$(xS$, 1, i - 1)
ELSE
LASTNAME$ = RTRIM$(xS$)
END IF
END FUNCTION
FUNCTION LFORMAT$ (InValue&, mask$)
LFormat$ = PADLEFT$(LTRIM$(STR$(InValue&)), LEN(mask$))
END FUNCTION
FUNCTION LINESCORE$ (t)
REGISTER i AS INTEGER, j AS INTEGER, s AS INTEGER
'Return line score for team specified
x$ = PADRIGHT$(Names(t), 12) + " "
IF inn > RegInns THEN j = inn ELSE j = RegInns
FOR i = 1 TO j
IF inn < 31 THEN
c$ = " "
s = iScore(t, i)
IF i <= inn THEN
IF i = inn THEN
IF it = 1 THEN 'visitor batting
IF t = 1 THEN
IF s = 0 THEN
c$ = "*" '219
ELSE
c$ = LTRIM$(STR$(s))
END IF
END IF
ELSE 'home batting
IF t = 1 THEN
c$ = LTRIM$(STR$(s))
ELSE
IF iwin = 2 AND s = 0 THEN
'home team has won and didn't score, so apparently
'didn't bat
c$ = "-"
ELSEIF iwin = 0 AND s = 0 THEN
'home team still batting and hasn't scored
c$ = "*"
ELSE
'runs have been scored or home team has lost
c$ = LTRIM$(STR$(s))
END IF
END IF
END IF
ELSE 'i < inn
c$ = LTRIM$(STR$(s))
END IF
END IF
IF LEN(c$) > 1 THEN c$ = "#"
x$ = x$ + c$
IF i MOD 3 = 0 THEN x$ = x$ + " "
END IF
NEXT
x$ = x$ + PADLEFT$(STR$(itruns(t)), 3)
x$ = x$ + PADLEFT$(STR$(ithits(t)), 3)
x$ = x$ + PADLEFT$(STR$(iterrs(t)), 3)
LINESCORE$ = x$
END FUNCTION
FUNCTION LW! (Hits, Doubles, Triples, HR, BB)
Singles = Hits - Doubles - Triples - HR
LW! = Singles + Doubles * 1.6 + Triples * 2.2 + HR * 3 + BB * 0.7
END FUNCTION
FUNCTION MenuRoutine2$
REDIM List1(1 TO 21) AS List1Type
c1 = (ConsCols - 54) \ 2
c2 = ConsCols - c1
r1 = (ConsRows - 21) \ 2 - 1
r2 = ConsRows - r1
IF Gfx THEN
CALL GraphHole(32, r1, c1, r2, c2)
END IF
CALL Drawfrm(r1, c1, r2, c2, defattr, "SBS Main Menu", "Make Selection or [Q]uit", 0, 0, 1)
List1(01).ListItem = "% "
List1(02).ListItem = "Manual [Single Game] Mode"
List1(03).ListItem = "% Challenge a friend or the computer manager"
List1(04).ListItem = "% "
List1(05).ListItem = "Two Team Multi-Game Mode"
List1(06).ListItem = "% Quick-Play computer-managed simulation"
List1(07).ListItem = "% "
List1(08).ListItem = "Schedule Mode"
List1(09).ListItem = "% Replay a season"
List1(10).ListItem = "% "
List1(11).ListItem = "Series Mode"
List1(12).ListItem = "% Run a predetermined sequence of games"
List1(13).ListItem = "% "
List1(14).ListItem = "Statistics Report"
List1(15).ListItem = "% Create report for sims-in-progress"
List1(16).ListItem = "% "
List1(17).ListItem = "File Viewer"
List1(18).ListItem = "% View documentation and report files"
List1(19).ListItem = "% "
List1(20).ListItem = "Edit BASEBALL.CFG"
List1(21).ListItem = "% Edit game preferences"
IF Gfx THEN
GfxRefresh 0
END IF
DO
saveskipattr = skipattr
skipattr = dimattr
CALL PickFromList(List1(), 21, 21, 1, c2-c1-3, r1, c1, r2, c2, defattr, revattr, Pick, RetKey, nulls$, mous, ms$)
skipattr = saveskipattr
IF Pick > 0 THEN
SELECT CASE Pick
CASE 2
z$ = "M"
CASE 5
z$ = "T"
CASE 8
z$ = "S"
CASE 11
z$ = "E"
CASE 14
z$ = "A"
CASE 17
z$ = "F"
CASE 20
z$ = "P"
CASE ELSE
END SELECT
IF ms$ = CloseButton THEN z$ = "Q" 'Special Case on this menu
ELSE
IF mous THEN
IF ms$ = "Q" THEN
z$ = "Q"
ELSE
z$ = "$"
END IF
ELSE
z$ = "Q"
END IF
END IF
LOOP UNTIL INSTR("MTSEAFPQ", z$)
ERASE List1
MenuRoutine2$ = z$
END FUNCTION
FUNCTION MyROUND! (InValue!, DecPts&)
Tens = 1
FOR i = 1 TO DecPts&
Tens = Tens * 10
NEXT
MyROUND! = INT(((InValue! * Tens) + .5)) / Tens
END FUNCTION
FUNCTION MYINPUT$ (AutoSw, KeyEscape, CustomEscKey, KeyAccept, kc, fore, back, row, col, leng, edit$, lowlim, uplim, default$, msx, msy)
COLOR fore, back
LOCATE row, col
PRINT SPACE$(leng);
IF default$ <> nulls$ THEN
LOCATE row, col
PRINT default$;
END IF
CsrSize = 100
CURSOR ON, CsrSize
LOCATE row, col
InsToggle = FALSE
DoneSw = FALSE
DO
msx = 0
msy = 0
KyS$ = WAITKEY$
'Ignore Button Release in case we're detecting "UP"
IF ASC(KyS$, 3) = 8 THEN ITERATE DO
s% = INSHIFT
IF LEN(KyS$) = 1 THEN
kc = ASC(KyS$)
ELSEIF LEN(KyS$) = 2 THEN
kc = -ASC(RIGHT$(KyS$, 1))
ELSEIF LEN(KyS$) = 4 THEN
IF ASC(KyS$, 3) = 2 THEN
DoubleClick = TRUE
ELSE
DoubleClick = FALSE
END IF
msx = MOUSEX
msy = MOUSEY
IF AutoSw THEN kc = -99 ELSE kc = 27
END IF
IF kc = 9 AND s% = 48 THEN kc = -15 'Support Shift-Tab
KyS$ = UCASE$(KyS$)
MYINPCheckKey:
' AutoSw is TRUE from ScreenIO
' Allow ESC with or without reading field for AutoSw = FALSE
IF AutoSw = FALSE AND kc = 27 THEN
cS$ = MID$(edit$, 2, 1)
IF cS$ = "E" THEN '1. Dont read field, then exit
MYINPUT$ = CHR$(27)
DoneSw = TRUE
ELSEIF cS$ = "?" THEN
GOSUB MYINPGetField '2. Read the field, then exit
END IF ' If field is required you have to
' check that when you return
' AutoSw AND [tab Shift-tab Up/Dn arrows] usually Esc = KeyAccept
ELSEIF AutoSw = TRUE AND _
(kc = KeyAccept OR kc = 9 OR kc = -15 OR kc = -80 OR kc = -72 OR _
kc = -99 OR kc = CustomEscKey) THEN
GOSUB MYINPGetField 'Sets DoneSw to TRUE if OK
ELSEIF AutoSw = TRUE AND kc = KeyEscape THEN
'usually F3. you must handle this
'manually before screenio gets
'called again or else you'll display
'the little arrow that's in FCONTENTS
MYINPUT$ = CHR$(27)
DoneSw = TRUE
' C/R
ELSEIF kc = 13 THEN
GOSUB MYINPGetField 'Sets DoneSw to TRUE if OK
' Left/Right Arrows or normal printing moved cursor out of field
ELSEIF (CURSORX >= col + leng) OR (CURSORX < col) THEN
IF AutoSw THEN
GOSUB MYINPGetField
END IF
IF CURSORX >= col + leng THEN LOCATE row, CURSORX - 1
IF CURSORX < col THEN LOCATE row, col
' Delete
ELSEIF kc = -83 THEN
CALL ReadFromScreen(row, col, leng, field$, edit$, Valid$)
screencol = CURSORX
fieldcol = CURSORX - col + 1
IF fieldcol > 0 AND fieldcol <= leng THEN
field$ = MID$(field$, 1, fieldcol - 1) + MID$(field$, fieldcol + 1) + " "
CURSOR OFF
LOCATE row, col
PRINT field$;
CURSOR ON
LOCATE row, screencol
END IF
' Insert
ELSEIF kc = -82 THEN
InsToggle = NOT (InsToggle)
IF InsToggle THEN
CURSOR ON, CsrSize \ 2
ELSE
CURSOR ON, CsrSize
END IF
' Left-arrow
ELSEIF kc = -75 AND CURSORX > 1 THEN
LOCATE , CURSORX - 1
IF CURSORX < col THEN GOTO MYINPCheckKey
' Right-arrow
ELSEIF kc = -77 AND CURSORX < 80 THEN
LOCATE , CURSORX + 1
IF CURSORX >= col + leng THEN GOTO MYINPCheckKey
' Backspace
ELSEIF kc = 8 THEN
PRINT " ";
LOCATE , CURSORX - 2
IF CURSORX < col THEN GOTO MYINPCheckKey
' Unsupported Extended Key
ELSEIF kc > 127 OR kc < 32 THEN
CALL MyBeep
' Put on Screen
ELSE
IF InsToggle THEN
CALL ReadFromScreen(row, col, leng, field$, edit$, Valid$)
screencol = CURSORX
fieldcol = CURSORX - col + 1
field$ = MID$(field$, 1, fieldcol - 1) + KyS$ + MID$(field$, fieldcol)
CURSOR OFF
LOCATE row, col
PRINT LEFT$(field$, leng);
CURSOR ON
LOCATE , screencol + 1
ELSE
PRINT KyS$;
END IF
IF CURSORX >= col + leng THEN GOTO MYINPCheckKey
END IF
LOOP UNTIL DoneSw
CURSOR OFF 'Turn Cursor Off
EXIT FUNCTION
MYINPGetField:
CALL ReadFromScreen(row, col, leng, field$, edit$, Valid$)
IF Valid$ = "N" THEN
CALL MyBeep
ELSEIF field$ <> SPACE$(leng) AND MID$(edit$, 1, 1) = "N" AND (VAL(field$) < lowlim OR VAL(field$) > uplim) THEN
'Numeric input out-of-range
CALL MyBeep
ELSE
MYINPUT$ = field$
DoneSw = TRUE
END IF
RETURN
END FUNCTION
FUNCTION NUMBERON STATIC
i = 0
IF ir1 THEN i = 1
IF ir2 THEN INCR i
IF ir3 THEN INCR i
NUMBERON = i
END FUNCTION
FUNCTION NUMERIC (field$, sp, decpt)
'STATIC validlist$, chS$
validlist$ = "0123456789"
IF sp THEN validlist$ = validlist$ + " "
IF decpt THEN validlist$ = validlist$ + "."
NUMERIC = -1
FOR i = 1 TO LEN(field$)
chS$ = MID$(field$, i, 1)
IF INSTR(validlist$, chS$) = 0 THEN
NUMERIC = 0
EXIT FOR
END IF
NEXT
END FUNCTION
FUNCTION OUTFIELDWHOAT (ppF!) STATIC
'Returns 7, 8 or 9
xF! = ppF! + (36 - FRND(71)) / 100! ' +/- .35
IF xF! > .66 THEN
i = 7 '34
ELSEIF xF! > .32 THEN
i = 8 '34
ELSE
i = 9 '32
END IF
OUTFIELDWHOAT = i
END FUNCTION
FUNCTION OUTfrIN (Posi, Middle) STATIC
'Returns 7, 8 or 9
IF Middle THEN OUTfrIN = 8: EXIT FUNCTION
OUTfrIN = Posi
IF Posi = 5 OR Posi = 6 THEN OUTfrIN = 7
IF Posi = 1 OR Posi = 2 THEN OUTfrIN = 8
IF Posi = 3 OR Posi = 4 THEN OUTfrIN = 9
END FUNCTION
FUNCTION PADLEFT$ (xS$, leng) STATIC
Temp$ = SPACE$(leng)
RSET Temp$ = xS$
PADLEFT$ = Temp$
END FUNCTION
FUNCTION PADRIGHT$ (xS$, leng) STATIC
Temp$ = SPACE$(leng)
LSET Temp$ = xS$
PADRIGHT$ = Temp$
END FUNCTION
FUNCTION PADZEROS$ (xS$, leng) STATIC 'to the left
L = LEN(xS$)
IF L >= leng THEN
PADZEROS$ = RIGHT$(xS$, leng)
ELSE
PADZEROS$ = STRING$(leng - L, "0") + xS$
END IF
END FUNCTION
FUNCTION PitcherCloneUnused (SearchName$, tm) STATIC
'Search the starting lineup
'A return of FALSE means you can't use "SearchName$"; he's either in the
'starting lineup or on the bench and "used"
PitcherCloneUnused = TRUE
c1 = SearchDAT(1, 9, tm, SearchName$, 0)
IF c1 > 0 THEN
PitcherCloneUnused = FALSE
EXIT FUNCTION
END IF
'Name isn't in starting lineup
'Search the bench
c2 = SearchDAT(LastPiAd(tm) + 1, MAXPLAYERS, tm, SearchName$, 0)
IF c2 > 0 THEN
'Name is on bench - is he used?
IF iused(c2, tm) THEN PitcherCloneUnused = FALSE
END IF
END FUNCTION
FUNCTION PlayWav(WavFile$) AS LONG
IF LEN(DIR$(WavFile$)) = 0 THEN
EXIT FUNCTION
ELSE
IF CmdDeBug$ = "Y" THEN QPRINTs 6, 42, WavFile$, defattr
END IF
SndPlaySound BYVAL STRPTR(WavFile$), %SND_ASYNC
PlayWav = 0
END FUNCTION
FUNCTION RefreshWindow(BYVAL lPlaceHolder AS LONG) AS LONG
'Refresh the graphics window every 20 seconds.
DO
SLEEP 20000
CALL UnfreezeAndRefresh
LOOP
END FUNCTION
FUNCTION ReturnLineInTextFile$ (fil$, keyy$, keybeg, keylen)
Found = FALSE
IF LEN(DIR$(fil$)) THEN
OPEN fil$ FOR INPUT AS #1
DO WHILE NOT EOF(1)
LINE INPUT #1, rec$
rec$ = RTRIM$(UCASE$(rec$))
IF RTRIM$(MID$(rec$, keybeg, keylen)) = UCASE$(keyy$) THEN
Found = TRUE
EXIT DO
END IF
LOOP
CLOSE #1
END IF
IF Found THEN
ReturnLineInTextFile$ = rec$
ELSE
ReturnLineInTextFile$ = ""
END IF
END FUNCTION
FUNCTION ROTATIONLIST (Fil$)
REGISTER i AS INTEGER
Found = FALSE
i = 1
DO UNTIL i > RTx
IF RTRIM$(RotRec(i).RotTeam) = RTRIM$(Fil$) THEN Found = TRUE: EXIT DO
INCR i
LOOP
IF NOT Found THEN i = 0
ROTATIONLIST = i
END FUNCTION
FUNCTION RunsAllowed! (TB, Hits, BB, Innings, SO)
'Estimate Batters Faced by Pitcher
BattersFaced! = BattersFacedByPit! (Innings, Hits, BB, SO)
RunsAllowed! = (Hits + BB) * TB / BattersFaced!
END FUNCTION
FUNCTION RunsCreated! (TB, Hits, BB, AB)
RunsCreated! = (Hits + BB) * TB / (AB + BB)
END FUNCTION
FUNCTION RunsCreated27! (AB, Hits, H2, H3, HR, BB, HBP, SH, SF, SB, CS, GIDP)
IF (AB + BB + HBP + SH + SF) = 0 THEN
RunsCreated27! = 0
EXIT FUNCTION
END IF
TB = Hits + H2 + 2*H3 + 3*HR
RC! = ( (Hits + BB + HBP - CS - GIDP) * _
(TB + .26*(BB + HBP) + .52*(SH + SF + SB)) ) / _
(AB + BB + HBP + SH + SF)
den = AB - Hits + CS + SH + SF + GIDP
IF den > 0 THEN
RC27! = (RC! / den) * 27
ELSE
RC27! = 0
END IF
IF RC27! > 99.99 THEN RC27! = 99.99
RunsCreated27! = RC27!
END FUNCTION
FUNCTION SearchDAT (s1, s2, tm, SearchName$, posit) STATIC
n = s1
DO
IF DataName(n, tm) < "!" THEN
n = 99
EXIT DO
END IF
IF SearchName$ = DataName(n, tm) THEN
IF posit = 0 THEN
EXIT DO
ELSE
IF posit = DataPos(n, tm) THEN
EXIT DO
END IF
END IF
END IF
INCR n
LOOP UNTIL n > s2
IF n > s2 THEN SearchDAT = 0 ELSE SearchDAT = n
END FUNCTION
FUNCTION SubDoubleQuote$ (xS$)
yS$ = xS$
FOR i = 1 TO LEN(yS$)
IF MID$(yS$, i, 1) = "'" THEN MID$(yS$, i, 1) = CHR$(34)
NEXT
SubDoubleQuote$ = yS$
END FUNCTION
FUNCTION TotalBases (Hits, Doubles, Triples, HR)
TotalBases = Hits + Doubles + 2*Triples + 3*HR
END FUNCTION
FUNCTION TRUNCFILENAME$ (flnm$) STATIC
'Do NOT feed this function a file extension!
'This function limits the main part of the file name to the DOS
'limit of 8 characters
L = LEN(flnm$)
i = L + 1
DO
i = i - 1
IF i <= 0 THEN EXIT DO
xS$ = MID$(flnm$, i, 1)
LOOP WHILE xS$ <> "\" AND xS$ <> ":" AND i > 0
' Length of file-name part is (L - i)
IF L > 8 THEN
TRUNCFILENAME$ = LEFT$(flnm$, 8 + i)
ELSE
TRUNCFILENAME$ = flnm$
END IF
END FUNCTION
FUNCTION ValidMMDDYY (MMDDYY$)
MM$ = MID$(MMDDYY$, 1, 2)
DD$ = MID$(MMDDYY$, 4, 2)
YY$ = MID$(MMDDYY$, 7, 2)
ValidMMDDYY = FALSE
IF NOT NUMERIC (MM$, FALSE, FALSE) THEN EXIT FUNCTION
IF NOT NUMERIC (DD$, FALSE, FALSE) THEN EXIT FUNCTION
IF NOT NUMERIC (YY$, FALSE, FALSE) THEN EXIT FUNCTION
IF MM$ < "01" OR MM$ > "12" OR DD$ < "01" OR DD$ > "31" THEN EXIT FUNCTION
ValidMMDDYY = TRUE
END FUNCTION
FUNCTION WHOATGUY (WhoAtPos) STATIC
'Determine who is playing the position "WhoAtPos"
IF WhoAtPos = 1 THEN
i = ip
ELSE
i = 1
DO UNTIL WhoAtPos = DataPos(i, id) OR i > 8
INCR i
LOOP
END IF
WHOATGUY = i
END FUNCTION
FUNCTION YESorNO$ (revfor, revbac, regfor, regbac, default$)
OrgY = CURSORY
OrgX = CURSORX
COLOR revfor, revbac
PRINT default$;
CURSOR ON
LOCATE OrgY, OrgX
zS$ = WAITKEY$
IF LEN(zS$) = 4 THEN
msx = MOUSEX
msy = MOUSEY
CALL FlashField (msy, msx, 1, 2, 80, 0)
zS$ = UCASE$(CHR$(SCREEN(msy, msx)))
LOCATE OrgY, OrgX
ELSE
zS$ = UCASE$(zS$)
END IF
IF zS$ <> "Y" AND zS$ <> "N" THEN zS$ = default$
COLOR revfor, revbac
PRINT zS$;
YESorNO$ = zS$
COLOR regfor, regbac
LOCATE 1, 1
CURSOR OFF
END FUNCTION
'**************************** SUBROUTINES ******************************
SUB AddToAnnouncer (tm, xS$)
'tm indicates which team the announcement concerns - so gender changes
'can be applied to that team
IF ANx < 12 THEN
INCR ANx
IF tm THEN
IF Gender(tm) THEN 'should be indexed by team 1 or 2
REPLACE "He " WITH "She " IN xS$
REPLACE "He'" WITH "She'" IN xS$
REPLACE " he " WITH " she " IN xS$
REPLACE " he's " WITH " she's " IN xS$
REPLACE " him" WITH " her" IN xS$
REPLACE " HIM" WITH " HER" IN xS$
REPLACE " guy" WITH " gal" IN xS$
REPLACE " his " WITH " her " IN xS$
REPLACE " fellow" WITH " gal" IN xS$
REPLACE " himself" WITH " herself" IN xS$
END IF
END IF
Announcer(ANx).mgs = xS$
END IF
END SUB
SUB AddToMMList (xS$)
a$ = xS$
i = INSTR(a$, ".")
IF i THEN a$ = LEFT$(a$, i - 1)
IF MMx < 100 THEN
INCR MMx
MMList(MMx).MMFile = a$
END IF
END SUB
SUB AddToScoreCrd (team, RefNum, Code$, Result$) STATIC
IF SCx < 300 THEN
INCR SCx
SCRec(SCx).SCTeam = team
SCRec(SCx).SCRef = RefNum
SCRec(SCx).SCInn = inn
SCRec(SCx).SCCode = Code$
SCRec(SCx).SCResult = LEFT$(Result$, 30)
IF ir1 THEN SCRec(SCx).SCBase1 = " X" ELSE SCRec(SCx).SCBase1 = " ."
IF ir2 THEN SCRec(SCx).SCBase2 = " X" ELSE SCRec(SCx).SCBase2 = " ."
IF ir3 THEN SCRec(SCx).SCBase3 = " X" ELSE SCRec(SCx).SCBase3 = " ."
RunsAfterPlay = itruns(it) - RunsBeforePlay
IF RunsAfterPlay THEN
SCRec(SCx).SCBase4 = STR$(RunsAfterPlay)
ELSE
SCRec(SCx).SCBase4 = " "
END IF
END IF
END SUB
SUB AddToRefByBO (bo, tm, ref)
IF bo <= 9 THEN
RefByBO(bo, tm) = RefByBO(bo, tm) + PADZEROS$(LTRIM$(STR$(ref)), 2)
END IF
END SUB
SUB AdjustBattingOrder (tm)
ON ERROR GOTO ErrorTrap
REDIM Protect(9)
ProtectCtr = 0
IF dh = 0 THEN
s = 9
FOR i = 1 TO 9
IF DataPos(i, tm) = 1 THEN
s = i
EXIT FOR
END IF
NEXT
IF s <> 9 THEN CALL Switch(9, s, tm)
INCR ProtectCtr
Protect(ProtectCtr) = 9
END IF
'EXPERIMENTAL 2009 "F"
'Go through lineup. If a player's current slot is same as .DAT, do not mess with his slot
IF AdjustBO(tm) = "F" THEN
IF dh = 0 THEN L = 8 ELSE L = 9
FOR i = 1 TO L
s = 0
FOR j = 1 TO L
IF DataName$(i, tm) = NameRef$(j, tm) THEN
s = j
EXIT FOR
END IF
NEXT
IF s > 0 THEN
IF i <> s THEN CALL Switch(i, s, tm)
INCR ProtectCtr
Protect(ProtectCtr) = i
END IF
NEXT
END IF
'Who has best OPS?
i = 3
GOSUB SearchProtectList
IF NOT InList THEN
MostF! = -1
FOR i = 1 TO 9
GOSUB SearchProtectList
IF NOT InList THEN
GOSUB ComputeOPS_Slug
IF OPS! > MostF! THEN
MostF! = OPS!
s = i
END IF
END IF
NEXT
IF s <> 3 THEN CALL Switch(3, s, tm)
INCR ProtectCtr
Protect(ProtectCtr) = 3
END IF
'Who left has most RBI/P.A. ?
i = 4
GOSUB SearchProtectList
IF NOT InList THEN
MostF! = -1
FOR i = 1 TO 9
GOSUB SearchProtectList
IF NOT InList THEN
'Normalize RBI per P.A.
x1! = DataRBI(i, tm) / (DataAB(i, tm) + DataBB(i, tm))
IF x1! > MostF! THEN
MostF! = x1!
s = i
END IF
END IF
NEXT
IF s <> 4 THEN CALL Switch(4, s, tm)
INCR ProtectCtr
Protect(ProtectCtr) = 4
END IF
'Who left has most SB/P.A.?
i = 1
GOSUB SearchProtectList
IF NOT InList THEN
MostF! = -1
FOR i = 1 TO 9
GOSUB SearchProtectList
IF NOT InList THEN
nsb! = (DataSB(i,tm) * 600) / (DataAB(i,tm) + DataBB(i,tm))
IF nsb! > MostF! THEN
MostF! = nsb!
s = i
END IF
END IF
NEXT
nsb1! = MostF!
IF s <> 1 THEN CALL Switch(1, s, tm)
INCR ProtectCtr
Protect(ProtectCtr) = 1
END IF
'Who left has most SB/P.A.?
i = 2
GOSUB SearchProtectList
IF NOT InList THEN
MostF! = -1
FOR i = 1 TO 9
GOSUB SearchProtectList
IF NOT InList THEN
nsb! = (DataSB(i,tm) * 600) / (DataAB(i,tm) + DataBB(i,tm))
IF nsb! > MostF! THEN
MostF! = nsb!
s = i
END IF
END IF
NEXT
nsb2! = MostF!
IF s <> 2 THEN CALL Switch(2, s, tm)
INCR ProtectCtr
Protect(ProtectCtr) = 2
END IF
'Of #1 and #2, who has the best OBP?
'Swap if #2 has a better OBP
i = 1
GOSUB SearchProtectList
IF NOT InList THEN
i = 2
GOSUB SearchProtectList
IF NOT InList THEN
IF DataAB(1, tm) THEN
x1! = (DataHits(1, tm) + DataBB(1, tm)) / (DataAB(1,tm) + DataBB(1,tm))
ELSE
x1! = 0.
END IF
IF DataAB(2, tm) THEN
x2! = (DataHits(2, tm) + DataBB(2, tm)) / (DataAB(2,tm) + DataBB(2,tm))
ELSE
x2! = 0.
END IF
'We know that #1 has more SB/P.A.
'But if the difference is small...
IF nsb1! - nsb2! < 11 THEN
'And if #2's OBP is significantly better...
IF x2! > (x1! + .050) THEN
CALL Switch(1, 2, tm)
END IF
END IF
END IF
END IF
'Who left has highest Slug%?
i = 5
GOSUB SearchProtectList
IF NOT InList THEN
MostF! = 0
FOR i = 1 TO 9
GOSUB SearchProtectList
IF NOT InList THEN
GOSUB ComputeOPS_Slug
IF Slug! > MostF! THEN
MostF! = Slug!
s = i
END IF
END IF
NEXT
IF s <> 5 THEN CALL Switch(5, s, tm)
INCR ProtectCtr
Protect(ProtectCtr) = 5
END IF
'Who left has highest Slug%?
i = 6
GOSUB SearchProtectList
IF NOT InList THEN
MostF! = 0
FOR i = 1 TO 9
GOSUB SearchProtectList
IF NOT InList THEN
GOSUB ComputeOPS_Slug
IF Slug! > MostF! THEN
MostF! = Slug!
s = i
END IF
END IF
NEXT
IF s <> 6 THEN CALL Switch(6, s, tm)
INCR ProtectCtr
Protect(ProtectCtr) = 6
END IF
'Who left has highest Slug%?
i = 7
GOSUB SearchProtectList
IF NOT InList THEN
MostF! = 0
FOR i = 1 TO 9
GOSUB SearchProtectList
IF NOT InList THEN
GOSUB ComputeOPS_Slug
IF Slug! > MostF! THEN
MostF! = Slug!
s = i
END IF
END IF
NEXT
IF s <> 7 THEN CALL Switch(7, s, tm)
INCR ProtectCtr
Protect(ProtectCtr) = 7
END IF
'Who left has highest Slug%?
i = 8
GOSUB SearchProtectList
IF NOT InList THEN
MostF! = 0
FOR i = 1 TO 9
GOSUB SearchProtectList
IF NOT InList THEN
GOSUB ComputeOPS_Slug
IF Slug! > MostF! THEN
MostF! = Slug!
s = i
END IF
END IF
NEXT
IF s <> 8 THEN CALL Switch(8, s, tm)
INCR ProtectCtr
Protect(ProtectCtr) = 8
END IF
IF dh THEN
'Who has not been picked? Should just be one left.
s = 9
FOR i = 1 TO 9
GOSUB SearchProtectList
IF NOT InList THEN
s = i
EXIT FOR
END IF
NEXT
IF s <> 9 THEN CALL Switch(9, s, tm)
' INCR ProtectCtr
' Protect(ProtectCtr) = 9
END IF
EXIT SUB
ErrorTrap:
LOCATE 10, 30
PRINT "BO_Error"; ERRCLEAR
x$ = WAITKEY$
EXIT SUB
SearchProtectList:
InList = 0
FOR n = 1 TO 9
IF Protect(n) = i THEN
InList = -1
EXIT FOR
END IF
NEXT
RETURN
ComputeOPS_Slug:
TB = DataHits(i,tm) + Data2B(i,tm) + 2 * Data3B(i,tm) + 3 * DataHR(i,tm)
IF DataAB(i,tm) > 0 THEN
Slug! = TB / DataAB(i,tm)
OBP! = (DataHits(i, tm) + DataBB(i, tm)) / (DataAB(i, tm) + DataBB(i,tm))
OPS! = OBP! + Slug!
ELSE
Slug! = 0.
OBP! = 0.
OPS! = 0.
END IF
RETURN
END SUB
SUB Advanc (I1, I2, I3) STATIC
ON ERROR GOTO ERRORTRAP
' On a score:
' Increment team's total runs, the scoreboard, hitter's box rbi,
' hitter's box runs, opposing pitcher responsible for runner,
' runs this half-inning.
IF I3 = 0 OR ir3 = 0 THEN GOTO A10
IF iout < 3 THEN
runner = ir3
GOSUB AdvanceCredit
ELSE
'3rd out just made - add to LOB before we erase the runner
'innLOB should always be zero at this point
IF ir3 THEN innLOB = 1
END IF
ir3 = 0
A10:
IF I2 = 0 OR ir2 = 0 THEN GOTO A20
IF I2 = 1 THEN ir3 = ir2
IF I2 = 2 THEN
runner = ir2
GOSUB AdvanceCredit
END IF
ir2 = 0
A20:
IF I1 = 0 OR ir1 = 0 THEN GOTO A30
IF I1 = 1 THEN ir2 = ir1
IF I1 = 2 THEN ir3 = ir1
IF I1 = 3 THEN
runner = ir1
GOSUB AdvanceCredit
END IF
ir1 = 0
A30:
GOTO AdvanceEXIT
AdvanceCredit: '"runner" previously set...credit one run at a time
IF NOT IGone THEN
IF inn >= RegInns AND it = 2 THEN
IF itruns(2) > itruns(1) THEN GOTO AdvanceExit
END IF
END IF
INCR itruns(it)
INCR iScoreBd(it, innct)
IF inn < 31 THEN INCR iScore(it, inn)
IF Errorx = FALSE AND DPsw = FALSE THEN
INCR mrbi(ref, it)
END IF
INCR mruns(DataRef(runner, it), it)
INCR mpr(ABS(mpp(runner)), id)
IF mpp(runner) > 0 AND inne - innadverr + iout < 3 AND Errorx = FALSE THEN
INCR mper(mpp(runner), id)
END IF
IF itruns(it) = itruns(id) THEN 'Score now tied? Erase "pitcher-of-record"
WPteam = 0: WPpit = 0: LPteam = 0: LPpit = 0: SPteam = 0: SPpit = 0
'Check for Blown Save
IF QualSave1IP OR QualSave2IP THEN
QualSave1IP = 0
QualSave1ID = 0
QualSave2IP = 0
QualSave2ID = 0
IF inn > (RegInns - 3) THEN INCR mpBS(ip, id)
END IF
ELSEIF itruns(it) - itruns(id) = 1 THEN
WPteam = it: WPpit = ipa(it)
LPteam = id: LPpit = ABS(mpp(runner))
END IF
INCR innr
IF NOT IGone AND NOT RunAnnounced THEN
IF DelFac THEN CALL Msg ("15", "0", "0", "07", runner, it, man2, team2) '* scores
END IF
RETURN
ErrorTrap:
LOCATE 10, 30
PRINT "ERROR: Advance "; ERRCLEAR
LOCATE 11, 30
'PRINT "inn:";inn;"innct:";innct;"id:";id;"it:";it;"runner";runner; _
' "ref:";ref;"mpp(runner):";mpp(runner); _
' "Dataref(runner, it):";Dataref(runner, it);
x$ = WAITKEY$
AdvanceEXIT:
END SUB
SUB AnnScoring (runner)
IF runner THEN
CALL Msg ("15", "0", "0", "07", runner, it, man2, team2)
RunAnnounced = TRUE
END IF
END SUB
SUB AssignFatigue (team)
'On each pitching change a new assignment is made to the new current pitcher
'on the team specified. The larger FatRnd is, the more durable the pitcher.
'If you want to lower complete games (and use the bullpen more)
'make FatRnd smaller.
'Starters:
IF np(team) = 1 THEN 'Assign Fatigue-factor to starter
'let's try a bell curve (see fitcurve.bas)
'we need to maintain the avg around 1.15, but would like to
'cut down on complete games, so we need fewer instances of
'high numbers, but the few we get need to be really high
'so we can maintain the 1.15 number
x! = RND
IF PitchersPerGame(id) < 2.5 THEN y! = .190 ELSE y! = .205
FatRnd(team) = (2.71 ^ (-1 * ABS(x! - .5) ^.3)) / (y! * SQR(2 * 3.14159))
ELSE
'Bullpen Assign Fatigue-factor to reliever
IF inn < 6 THEN '1 thru 5
'Assign random fatigue factor (1.0 - 2.0) avg 1.50
FatRnd(team) = (FRND(11) + 9) / 10
ELSEIF inn < 8 THEN '6 thru 7
'Assign random fatigue factor (0.9 - 1.6) avg 1.25
FatRnd(team) = (FRND(8) + 8) / 10
ELSE '8 +
'Assign random fatigue factor (0.8 - 1.4) avg 1.10
FatRnd(team) = (FRND(7) + 7) / 10
END IF
END IF
END SUB
SUB AutoLineup (tm, c) 'Select Players by their playing-time history
'List of players (max of 12) who play a given position
'Reset for each position
'Check
DIM Positions (10)
FOR i = 1 TO 9
Positions(DataPos(i,tm)) = 1
NEXT
FOR i = 2 TO 9
IF Positions(i) = 0 THEN
x$ ="AUTOLINEUP detected error:|Def. position " + STR$(i) + " unfilled"
CALL ErrorBox (x$)
END IF
NEXT
'End Check
c = 0
PPoolLim = 12
REDIM PosPool(PPoolLim) AS PosPoolType
DIM SlotFilled(9)
DIM Rando(9)
FOR i = 1 TO 9
Rando(i) = i
SlotFilled(i) = 0
NEXT
'Shuffle the "Deck"
FOR i = 1 TO 20
m = FRND(9)
n = FRND(9)
j = Rando(m)
Rando(m) = Rando(n)
Rando(n) = j
NEXT
StartingPitName$ = DataName(ipa(tm), tm)
'Go through each Batting Order Slot "n" in starting nine
'"n" is random so we won't introduce a bias in player selection
FOR r = 1 TO 9
n = Rando(r)
'The default position for this guy:
p = DataPos(n, tm)
IF p < 2 THEN 'Skip pitchers & blanks
GOTO AuLiNextN
END IF
'Reset and Load PosPool
'Build list of all who play this position
'If already in lineup, make sure there's someone on the bench that
'can replace that selection
PPool = 0
TotABthisPos! = 0
nn = 1
DO
GamesAllPos = 0
FOR i = 1 TO 4 '4 possible games by position
IF DataPosi(nn, tm, i) > 1 THEN
GamesAllPos = GamesAllPos + DataGbyP(nn, tm, i)
END IF
NEXT
'GamesAllPos will be 0 for old-style but we'll handle that later
FOR i = 1 TO 4
IF i = 1 AND DataPosi(nn, tm, 1) = 0 THEN
'old style
posi = DataPos(nn, tm)
ELSE
'new style
posi = DataPosi(nn, tm, i)
END IF
IF posi = p THEN
BenchSlot = 0
OKay = TRUE
IF nn <> n AND nn < 10 THEN
IF SlotFilled(nn) = FALSE THEN
pp = DataPos(nn, tm)
m = LastPiAd(tm) + 1
DO 'Go thru entire bench
FOR ii = 1 TO 4 '4 possible games by position
IF ii = 1 AND DataPosi(m, tm, 1) = 0 THEN
posi2 = DataPos(m, tm)
ELSE
posi2 = DataPosi(m, tm, ii)
END IF
IF pp = posi2 AND posi2 <> 1 THEN
BenchSlot = m
EXIT DO
END IF
NEXT
INCR m
IF m > MAXPLAYERS THEN EXIT DO
LOOP UNTIL DataPos(m, tm) = 0
ELSE
OKay = FALSE
END IF
IF BenchSlot = 0 THEN OKay = FALSE
END IF
IF OKay THEN 'OK to add "nn" to PosPool
IF PPool < PPoolLim THEN
INCR PPool
PosPool(PPool).PSlot = nn
IF GamesAllPos = 0 THEN
'Old Style
xF! = DataAB(nn, tm)
ELSE
xF! = (DataGByP(nn, tm, i) / GamesAllPos) * DataAB(nn, tm)
END IF
'Block players marked "X" in DataPlat from starting against same-handed pitcher
IF UCASE$(DataPlat(nn, tm)) = "X" THEN
ij = 3 - tm
IF ipa(ij) THEN
IF DataHand(nn, tm) = UCASE$(DataHand(ipa(ij), ij)) THEN
xF! = 1.0
END IF
END IF
END IF
'Make it almost impossible to select a player that has
'the same name as the starting pitcher
IF DataName(nn, tm) = StartingPitName$ THEN
xF! = .0001
END IF
PosPool(PPool).PABbyPos = xF!
PosPool(PPool).PPct = 0!
PosPool(PPool).PRepl = BenchSlot
TotABthisPos! = TotABthisPos! + PosPool(PPool).PABbyPos
END IF
END IF
END IF
NEXT
IF nn = 9 THEN nn = LastPiAd(tm)
INCR nn
IF nn > MAXPLAYERS THEN EXIT DO
LOOP UNTIL DataPos(nn, tm) = 0 AND nn > 9
IF PPool < 1 THEN GOTO AuLiNextN
'Calculate percent of games by each player in pool
FOR i = 1 TO PPool
IF TotABthisPos! > 0 THEN
PosPool(i).PPct = PosPool(i).PABbyPos / TotABthisPos!
END IF
NEXT
'Get a random number to select the player
xF! = RND
'Select the "Pick"
Pick = 0
BaseP! = 0
FOR i = 1 TO PPool
IF xF! < BaseP! + PosPool(i).PPct THEN
Pick = i
EXIT FOR
END IF
BaseP! = BaseP! + PosPool(i).PPct
NEXT
IF Pick = 0 THEN Pick = PPool
PickSlot = PosPool(Pick).PSlot
'If we picked a different player:
IF n <> PickSlot THEN
c = -1
'If the player we picked is already in the starting lineup:
IF PickSlot < 10 THEN
'We picked someone already in lineup (B) to replace A:
pp = DataPos(PickSlot, tm) 'Old field pos B's now playing
CALL Switch(n, PickSlot, tm) 'Switch B to A's slot
DataPos(n, tm) = p 'Make sure B's playing A's org. field pos "p"
IF PosPool(Pick).PRepl > MAXPLAYERS THEN
PRINT "***";
PRINT PosPool(Pick).PRepl;
PRINT "***";
PauseIt
END IF
'Player A is now sitting in the "PickSlot" position
'Swap someone in from bench (C) to take A's place
nn1 = PosPool(Pick).PRepl
CALL Switch(PickSlot, nn1, tm)
'Make sure he's playing B's org. field pos
DataPos(PickSlot, tm) = pp
ELSE
'We picked someone from the bench:
IF PickSlot > MAXPLAYERS THEN
PRINT "***2";
PRINT PickSlot;
PRINT "***2";
PauseIt
END IF
CALL Switch(n, PickSlot, tm)
DataPos(n, tm) = p
END IF
END IF
AuLiNextN:
SlotFilled(n) = TRUE
NEXT 'r
END SUB
SUB AutoPitcher (tm, Method$, Repl$, N)
' RotRec must be DIMed
' In: Fil$, Method$ (Opt: Repl$)
' Out: N
N = 10
Fil$ = DataFil(tm)
i = ROTATIONLIST (Fil$)
IF i = 0 THEN 'Should never occur on two-team situation,
IF RTx > 1499 THEN 'already added
CALL MyBeep
x$ = " SUB AutoPitcher ERROR: Rotation List Full. " + Fil$
CALL ErrorBox (x$)
EXIT SUB
END IF
INCR RTx
i = RTx
RotRec(i).RotTeam = Fil$
RotRec(i).RotMeth = Method$
IF (tm = 1 AND CmdVSpot$ = "Y") OR _
(tm = 2 AND CmdHSpot$ = "Y") OR _
CmdSpot$ = "Y" THEN
RotRec(i).RotSpot = "Y"
ELSE
RotRec(i).RotSpot = " "
END IF
RotRec(i).RotIndex = 0
RotRec(i).RotList(1) = 10
RotRec(i).RotList(2) = 11
RotRec(i).RotList(3) = 12
RotRec(i).RotList(4) = 13
RotRec(i).RotList(5) = 14
END IF
IF Repl$ = "Y" THEN
RotRec(i).RotMeth = Method$
END IF
IF RotRec(i).RotMeth < "!" THEN
CALL MyBeep
x$ = "AutoPitcher ERROR: No Rotation Method: " + RotRec(i).RotMeth
CALL ErrorBox (x$)
EXIT SUB
END IF
m1$ = MID$(RotRec(i).RotMeth, 1, 1)
m2$ = MID$(RotRec(i).RotMeth, 2, 1)
TotPitchers = LastPiAd(tm) - 9
IF m1$ = "S" THEN 'sequential/two-team
IF VAL(m2$) < 1 OR VAL(m2$) > 5 THEN m2$ = "5"
'What if we have very few pitchers?
k = VAL(m2$)
IF k > TotPitchers THEN k = TotPitchers
'Clear out un-used spots in the rotation list
kk = k
DO WHILE kk < 5
INCR kk
RotRec(i).RotList(kk) = 0
LOOP
'Point index to next slot in rotation
IF RotRec(i).RotIndex < k THEN
INCR RotRec(i).RotIndex
ELSE
RotRec(i).RotIndex = 1
END IF
j = RotRec(i).RotIndex
ELSEIF m1$ = "R" THEN 'random
IF VAL(m2$) < 1 OR VAL(m2$) > 5 THEN m2$ = "5"
k = VAL(m2$)
IF k > TotPitchers THEN k = TotPitchers
j = FRND(k)
ELSEIF m1$ > "0" AND m1$ <= "9" THEN 'direct
IF m2$ >= "0" AND m2$ <= "9" THEN
j = VAL(m1$ + m2$)
ELSE
j = VAL(m1$)
END IF
ELSEIF m1$ > "@" AND m1$ < "K" THEN 'sch file direct
j = ASC(m1$) - 55
ELSE
CALL MyBeep
x$ = "SUB AutoPitcher ERROR: Invalid Method: " + m1$
CALL ErrorBox (x$)
EXIT SUB
END IF
IF j > 0 AND j < 6 THEN
N = RotRec(i).RotList(j)
ELSEIF j > 5 AND j < (LastPiAd(tm) - 8) THEN 'Direct
N = j + 9 'fixed 10/7/00
ELSE
BEEP
N = 10
END IF
END SUB
SUB BasPat
zS$ = SPACE$(15)
'Batting order box borders (we don't want to collide with them)
b1r1 = ConsRows - 12
b1c1 = 2
b1r2 = b1r1 + 10
b1c2 = 18
b2r1 = ConsRows - 12
b2c1 = ConsCols - 17
b2r2 = b2r1 + 10
b2c2 = ConsCols - 1
IF Gfx THEN
CALL EliminateHole(14)
CALL EliminateHole(15)
CALL EliminateHole(16)
ELSE
IF BasPatRow(1) > 0 AND BasPatRow(1) < ConsRows THEN QPRINTs BasPatRow(1), BasPatCol(1), zS$, fldattr
IF BasPatRow(2) > 0 AND BasPatRow(2) < ConsRows THEN QPRINTs BasPatRow(2), BasPatCol(2), zS$, fldattr
IF BasPatRow(3) > 0 AND BasPatRow(3) < ConsRows THEN QPRINTs BasPatRow(3), BasPatCol(3), zS$, fldattr
END IF
IF ir1 THEN
tr = BasPatRow(1)
tc = BasPatCol(1)
runner = ir1
GOSUB BPGetName
GOSUB AttachSR
CALL ClipIfNecessary (xS$, tr, tc, b1r1, b1c1, b1r2, b1c2, b2r1, b2c1, b2r2, b2c2, ca, cf)
IF ca THEN
IF Gfx THEN CALL GraphHole(14, tr, ca, tr, cf)
IF TeamAttr(it) <> 0 THEN kk = TeamAttr(it) ELSE kk = drtattr
QPRINTs tr, ca, xS$, kk
END IF
END IF
IF ir2 THEN
tr = BasPatRow(2)
tc = BasPatCol(2)
runner = ir2
GOSUB BPGetName
GOSUB AttachSR
CALL ClipIfNecessary (xS$, tr, tc, b1r1, b1c1, b1r2, b1c2, b2r1, b2c1, b2r2, b2c2, ca, cf)
IF ca THEN
IF Gfx THEN CALL GraphHole(15, tr, ca, tr, cf)
IF TeamAttr(it) <> 0 THEN kk = TeamAttr(it) ELSE kk = drtattr
QPRINTs tr, ca, xS$, kk
END IF
END IF
IF ir3 THEN
tr = BasPatRow(3)
tc = BasPatCol(3)
runner = ir3
GOSUB BPGetName
GOSUB AttachSR
CALL ClipIfNecessary (xS$, tr, tc, b1r1, b1c1, b1r2, b1c2, b2r1, b2c1, b2r2, b2c2, ca, cf)
IF ca THEN
IF Gfx THEN CALL GraphHole(16, tr, ca, tr, cf)
IF TeamAttr(it) <> 0 THEN kk = TeamAttr(it) ELSE kk = drtattr
QPRINTs tr, ca, xS$, kk
END IF
END IF
EXIT SUB
BPGetName:
xS$ = FLASTNAME$(runner, it)
RETURN
AttachSR:
IF LEN(xS$) > 9 THEN xS$ = LEFT$(xS$, 9)
xS$ = xS$ + "/" + LTRIM$(STR$(DataSpeed(runner, it)))
RETURN
END SUB
SUB BatOrd
REGISTER j AS INTEGER
'Check if frame is already on screen
tr = ConsRows - 12
tc = ConsCols - 16
IF linattr <> SCREENATTR(tr, 2) OR (inn = 1 AND it = 1) THEN 'check color attr inside lineup card area
'TEST TEAM LOGO
IF Gfx THEN
IF TeamLogo(1) > "!" THEN
r = DrawToRow (ConsRows-24, ConsRows-6)
c = DrawToCol (4, ConsCols)
DrawFrom c, r
lResult = StretchImage(TeamLogo(1), 96, 64)
END IF
IF TeamLogo(2) > "!" THEN
r = DrawToRow (ConsRows-24, ConsRows-6)
c = DrawToCol (tc+1, ConsCols)
DrawFrom c, r
lResult = StretchImage(TeamLogo(2), 96, 64)
END IF
END IF
'Team Label names
x$ = RTRIM$(Names(1))
y$ = RTRIM$(Names(2))
'Erase old labels because length is variable
IF Gfx THEN
CALL EliminateHole(10)
CALL EliminateHole(11)
'Create Holes for Team Label
CALL GraphHole(10, tr-2, 4, tr-2, 3+LEN(x$))
CALL GraphHole(11, tr-2, tc+1, tr-2, tc+LEN(y$))
ELSE
xS$ = SPACE$(14)
QPRINTs tr-2, 4, xS$, fldattr
QPRINTs tr-2, tc+1, xS$, fldattr
END IF
'Print Labels
QPRINTs tr-2, 4, x$, linattr
QPRINTs tr-2, tc+1, y$, linattr
'Holes for Batting Order
IF Gfx THEN
CALL GraphHole(12, tr, 2, tr+10, 18)
CALL GraphHole(13, tr, tc-1, tr+10, ConsCols-1)
END IF
'Draw Batting order frames
CALL Drawfrm(tr, 2, tr+10, 18, linattr, nulls$, "VISI", 0, 0, 0)
CALL Drawfrm(tr, tc-1, tr+10, ConsCols-1, linattr, nulls$, "HOME", 0, 0, 0)
END IF
FOR t = 1 TO 2
IF t = 1 THEN c = 3 ELSE c = tc
FOR i = 1 TO 9
r = tr + i '13 + i
xS$ = FLASTNAME$(i, t)
xS$ = PADRIGHT$(xS$, 12)
MID$(xS$, 12, 1) = UCASE$(DataHand(i, t))
xS$ = Pos(DataPos(i, t)) + " " + xS$
QPRINTs r, c, xS$, linattr
NEXT
NEXT
'Set batter pointer
IF DelFac > 0 THEN
leng = 15
IF it = 1 THEN
IF ibp(1) THEN CALL ChangeAttribute (ibp(1) + tr, 3, leng, scdattr)
IF ibp(2) THEN CALL ChangeAttribute (ibp(2) + tr, tc, leng, drkattr)
ELSE
IF ibp(1) THEN CALL ChangeAttribute (ibp(1) + tr, 3, leng, drkattr)
IF ibp(2) THEN CALL ChangeAttribute (ibp(2) + tr, tc, leng, scdattr)
END IF
END IF
END SUB
SUB BatterName(BLastName$, LorR$, EraseOnly)
'Where's the catcher?
CALL DefCoordinates (2, r, c, ObsD, ObsY, ObsH, ObsTz, ObsTy)
CatcherRow = r
CatcherCol = c
IF CatcherRow < 1 OR CatcherCol < 1 THEN EXIT SUB
BatterRow = CatcherRow - 1
'Eliminate old holes
IF Gfx THEN
CALL EliminateHole(19)
CALL EliminateHole(20)
ELSE
'Or blank out non-graphic screens
zS$ = SPACE$(14)
IF CatcherCol - 13 > 0 THEN
QPRINTs BatterRow, CatcherCol -13, zS$, fldattr
END IF
IF CatcherCol + 6 + 14 <= ConsCols THEN
QPRINTs BatterRow, CatcherCol + 6, zS$, fldattr
END IF
END IF
IF EraseOnly THEN EXIT SUB
'Trim the name if it's too long
x$ = BLastName$
IF LEN(x$) > 12 THEN x$ = LEFT$(x$, 12)
'Tack on Speed-Rating
x$ = x$ + "/" + LTRIM$(STR$(DataSpeed(ib, it)))
LX = LEN(x$)
'Decide where to put the batter
IF LorR$ = "R" THEN
BatterCol = CatcherCol - LEN(x$) + 1
'Possibly Trim RH Batter
IF BatterCol < 1 THEN BatterCol = 1
Hole = 19
END IF
IF LorR$ = "L" THEN
BatterCol = CatcherCol + 6
'Possibly trim LH Batter
L = BatterCol + LX
IF L > ConsCols THEN
LD = L - ConsCols
x$ = LEFT$(x$, LX - LD + 1)
LX = LEN(x$)
END IF
Hole = 20
END IF
'Batting order box borders
b1r1 = ConsRows - 12
b1c1 = 2
b1r2 = b1r1 + 10
b1c2 = 18
b2r1 = ConsRows - 12
b2c1 = ConsCols - 17
b2r2 = b2r1 + 10
b2c2 = ConsCols - 1
CALL ClipIfNecessary (x$, BatterRow, BatterCol, b1r1, b1c1, b1r2, b1c2, b2r1, b2c1, b2r2, b2c2, ca, cf)
IF ca THEN
IF Gfx THEN CALL GraphHole(Hole, BatterRow, ca, BatterRow, cf)
IF TeamAttr(it) <> 0 THEN kk = TeamAttr(it) ELSE kk = drtattr
QPRINTs BatterRow, ca, x$, kk
END IF
END SUB
SUB BinarySearchB (ARRAYx() AS BatSummaryOVL, beg, leng, rangelo, rangehi, Find$, FoundAt, mini) STATIC
FoundAt = 0 'no matching element yet
mini = rangelo
maxi = rangehi
DO
Try = (mini + maxi) \ 2 'start testing in middle
xS$ = ARRAYx(Try).BatSummaryRec
xS$ = MID$(xS$, beg, leng)
IF xS$ = Find$ THEN 'found it!
FoundAt = Try 'return matching element
EXIT DO 'all done
END IF
IF xS$ > Find$ THEN 'too high, cut in half
maxi = Try - 1
ELSE
mini = Try + 1 'too low, cut other way
END IF
LOOP WHILE maxi >= mini
END SUB
SUB BinarySearchP (ARRAYx() AS PitSummaryOVL, beg, leng, rangelo, rangehi, Find$, FoundAt, mini) STATIC
FoundAt = 0 'no matching element yet
mini = rangelo
maxi = rangehi
DO
Try = (mini + maxi) \ 2 'start testing in middle
xS$ = ARRAYx(Try).PitSummaryRec
xS$ = MID$(xS$, beg, leng)
IF xS$ = Find$ THEN 'found it!
FoundAt = Try 'return matching element
EXIT DO 'all done
END IF
IF xS$ > Find$ THEN 'too high, cut in half
maxi = Try - 1
ELSE
mini = Try + 1 'too low, cut other way
END IF
LOOP WHILE maxi >= mini
END SUB
SUB BinarySearchF (ARRAYx() AS FldSummaryOVL, beg, leng, rangelo, rangehi, Find$, FoundAt, mini) STATIC
FoundAt = 0 'no matching element yet
mini = rangelo
maxi = rangehi
DO
Try = (mini + maxi) \ 2 'start testing in middle
xS$ = ARRAYx(Try).FldSummaryRec
xS$ = MID$(xS$, beg, leng)
IF xS$ = Find$ THEN 'found it!
FoundAt = Try 'return matching element
EXIT DO 'all done
END IF
IF xS$ > Find$ THEN 'too high, cut in half
maxi = Try - 1
ELSE
mini = Try + 1 'too low, cut other way
END IF
LOOP WHILE maxi >= mini
END SUB
SUB Box
ON ERROR GOTO ErrorTrap
REGISTER i AS INTEGER, j AS INTEGER
i = 2
j = 30
REDIM TxtTbl (i, j) AS ScrType
REDIM BoxPosit (i, j) AS PosiType
DIM BoxRefbyLine(2, 30) AS LONG
'Special Stats
Savlin = 0
FOR t = 1 TO 2
lin = 0
FOR i = 1 TO MAXPLAYERS
IF merr(i, t) > 0 THEN
IF lin = 0 THEN INCR lin: TxtTbl(t, lin).ScrLine = "Errors:"
INCR lin
IF lin < 30 THEN
player = i
team = t
GOSUB BSGetName
xS$ = LEFT$(RS$, 11)
IF merr(i, t) > 1 THEN
TxtTbl(t, lin).ScrLine = " " + xS$ + STR$(merr(i, t))
ELSE
TxtTbl(t, lin).ScrLine = " " + xS$
END IF
IF CmdStat$ > "!" THEN
GOSUB LookUpBatStats
IF FoundAt THEN
TxtTbl(t, lin).ScrLine = _
RTRIM$(TxtTbl(t, lin).ScrLine) + _
" (" + LTRIM$(STR$( BSum(FoundAt).BErrs )) + ")"
END IF
END IF
END IF
END IF
NEXT i
Lastlin = lin
FOR i = 1 TO MAXPLAYERS
IF m2b(i, t) > 0 THEN
IF lin = Lastlin THEN INCR lin: TxtTbl(t, lin).ScrLine = "Doubles:"
INCR lin
IF lin < 30 THEN
player = i
team = t
GOSUB BSGetName
xS$ = LEFT$(RS$, 11)
IF m2b(i, t) > 1 THEN
TxtTbl(t, lin).ScrLine = " " + xS$ + STR$(m2b(i, t))
ELSE
TxtTbl(t, lin).ScrLine = " " + xS$
END IF
IF CmdStat$ > "!" THEN
GOSUB LookUpBatStats
IF FoundAt THEN
TxtTbl(t, lin).ScrLine = _
RTRIM$(TxtTbl(t, lin).ScrLine) + _
" (" + LTRIM$(STR$( BSum(FoundAt).B2Bs )) + ")"
END IF
END IF
END IF
END IF
NEXT i
Lastlin = lin
FOR i = 1 TO MAXPLAYERS
IF m3b(i, t) > 0 THEN
IF lin = Lastlin THEN INCR lin: TxtTbl(t, lin).ScrLine = "Triples:"
INCR lin
IF lin < 30 THEN
player = i
team = t
GOSUB BSGetName
xS$ = LEFT$(RS$, 11)
IF m3b(i, t) > 1 THEN
TxtTbl(t, lin).ScrLine = " " + xS$ + STR$(m3b(i, t))
ELSE
TxtTbl(t, lin).ScrLine = " " + xS$
END IF
IF CmdStat$ > "!" THEN
GOSUB LookUpBatStats
IF FoundAt THEN
TxtTbl(t, lin).ScrLine = _
RTRIM$(TxtTbl(t, lin).ScrLine) + _
" (" + LTRIM$(STR$( BSum(FoundAt).B3Bs )) + ")"
END IF
END IF
END IF
END IF
NEXT i
Lastlin = lin
FOR i = 1 TO MAXPLAYERS
IF mhr(i, t) > 0 THEN
IF lin = Lastlin THEN INCR lin: TxtTbl(t, lin).ScrLine = "Home Runs:"
INCR lin
IF lin < 30 THEN
player = i
team = t
GOSUB BSGetName
xS$ = LEFT$(RS$, 11)
IF mhr(i, t) > 1 THEN
TxtTbl(t, lin).ScrLine = " " + xS$ + STR$(mhr(i, t))
ELSE
TxtTbl(t, lin).ScrLine = " " + xS$
END IF
IF CmdStat$ > "!" THEN
GOSUB LookUpBatStats
IF FoundAt THEN
TxtTbl(t, lin).ScrLine = _
RTRIM$(TxtTbl(t, lin).ScrLine) + _
" (" + LTRIM$(STR$( BSum(FoundAt).BHRs )) + ")"
END IF
END IF
END IF
END IF
NEXT i
Lastlin = lin
FOR i = 1 TO MAXPLAYERS
IF msb(i, t) > 0 THEN
IF lin = Lastlin THEN INCR lin: TxtTbl(t, lin).ScrLine = "Stolen Bases:"
INCR lin
IF lin < 30 THEN
player = i
team = t
GOSUB BSGetName
xS$ = LEFT$(RS$, 11)
IF msb(i, t) > 1 THEN
TxtTbl(t, lin).ScrLine = " " + xS$ + STR$(msb(i, t))
ELSE
TxtTbl(t, lin).ScrLine = " " + xS$
END IF
IF CmdStat$ > "!" THEN
GOSUB LookUpBatStats
IF FoundAt THEN
TxtTbl(t, lin).ScrLine = _
RTRIM$(TxtTbl(t, lin).ScrLine) + _
" (" + LTRIM$(STR$( BSum(FoundAt).BSBs )) + ")"
END IF
END IF
END IF
END IF
NEXT i
Lastlin = lin
FOR i = 1 TO MAXPLAYERS
IF mcs(i, t) > 0 THEN
IF lin = Lastlin THEN INCR lin: TxtTbl(t, lin).ScrLine = "Caught Stealing:"
INCR lin
IF lin < 30 THEN
player = i
team = t
GOSUB BSGetName
xS$ = LEFT$(RS$, 11)
IF mcs(i, t) > 1 THEN
TxtTbl(t, lin).ScrLine = " " + xS$ + STR$(mcs(i, t))
ELSE
TxtTbl(t, lin).ScrLine = " " + xS$
END IF
IF CmdStat$ > "!" THEN
GOSUB LookUpBatStats
IF FoundAt THEN
TxtTbl(t, lin).ScrLine = _
RTRIM$(TxtTbl(t, lin).ScrLine) + _
" (" + LTRIM$(STR$( BSum(FoundAt).BCSs )) + ")"
END IF
END IF
END IF
END IF
NEXT i
IF dp(t) > 0 THEN
INCR lin
IF lin < 30 THEN
TxtTbl(t, lin).ScrLine = "Double Play:" + STR$(dp(t))
END IF
END IF
IF GameLOB(t) > 0 THEN
INCR lin
IF lin < 30 THEN
TxtTbl(t, lin).ScrLine = "LOB:" + STR$(GameLOB(t))
END IF
END IF
IF lin > Savlin THEN Savlin = lin
NEXT t
Txtlines = Savlin
'Regular Batting Box Score:
Savlin = 0
FOR t = 1 TO 2
lin = 0
FOR s = 1 TO 9
p = RefOrg(s, t).RefPos 'p: org. defensive position of each starter
L = LEN(RefByBO(s, t)) 'list of each person (ref #) to appear in this spot in the batting order
FOR i = 1 TO L - 1 STEP 2
rf = VAL(MID$(RefByBO(s, t), i, 2))
'skip relief pitchers who haven't batted
IF p = 1 AND i > 1 AND rf <= LastPiAd(t) AND rf > 9 _
AND mab(rf, t) = 0 AND mruns(rf, t) = 0 AND mhits(rf, t) = 0 _
AND mrbi(rf, t) = 0 THEN
ELSE
IF lin < 30 THEN
INCR lin
IF i = 1 THEN
IF p = 10 THEN p = 0
pS$ = LTRIM$(STR$(p))
ELSE
pS$ = " "
END IF
BoxPosit(t, lin).ScrLine = pS$
BoxRefbyLine(t, lin) = rf
END IF
END IF
NEXT i
NEXT s
IF lin > Savlin THEN Savlin = lin
NEXT t
IF Savlin > Txtlines THEN TotLines = Savlin ELSE TotLines = Txtlines
OUTHdl = 68
Outdevice$ = CmdWritePath$ + "~BOX.PRN"
OPEN Outdevice$ FOR OUTPUT AS #OUTHdl
'f1$ = "\\\ \ # # # # \ \ \\\ \ # # # # \ \"
'f2$ = "\\\ \ # # # # \ \ \ \"
'f3$ = " \ \ \\\ \ # # # # \ \"
'f4$ = " \ \ \ \"
PRINT #OUTHdl, "~"; LEFT$(Names(1), 11) + " AB R H B W K"; TAB(47);LEFT$(Names(2), 11) + " AB R H B W K"
lin = 1
DO UNTIL lin > TotLines
Txt1$ = TxtTbl(1,lin).ScrLine
Txt2$ = TxtTbl(2,lin).ScrLine
Pos1$ = BoxPosit(1,lin).ScrLine
Pos2$ = BoxPosit(2,lin).ScrLine
IF Txt1$ < " " THEN Txt1$ = " "
IF Txt2$ < " " THEN Txt2$ = " "
IF BoxRefByLine(1, lin) > 0 THEN
rf1 = BoxRefByLine(1, lin)
player = rf1
team = 1
GOSUB BSGetName
x1S$ = LEFT$(RS$, 11)
END IF
IF BoxRefByLine(2, lin) > 0 THEN
rf2 = BoxRefByLine(2, lin)
player = rf2
team = 2
GOSUB BSGetName
x2S$ = LEFT$(RS$, 11)
END IF
a$ = SPACE$(90)
IF BoxRefByLine(1, lin) > 0 AND BoxRefByLine(2, lin) > 0 THEN
MID$(a$, 1, 2) = Pos1$
MID$(a$, 3, 11) = x1S$
MID$(a$, 15, 1) = LTRIM$(STR$(mab(rf1, 1)))
MID$(a$, 17, 1) = LTRIM$(STR$(mruns(rf1, 1)))
MID$(a$, 19, 1) = LTRIM$(STR$(mhits(rf1, 1)))
MID$(a$, 21, 1) = LTRIM$(STR$(mrbi(rf1, 1)))
MID$(a$, 23, 1) = LTRIM$(STR$(mbb(rf1, 1)))
MID$(a$, 25, 1) = LTRIM$(STR$(mso(rf1, 1)))
MID$(a$, 27, 18) = Txt1$
MID$(a$, 46, 2) = Pos2$
MID$(a$, 48, 11) = x2S$
MID$(a$, 60, 1) = LTRIM$(STR$(mab(rf2, 2)))
MID$(a$, 62, 1) = LTRIM$(STR$(mruns(rf2, 2)))
MID$(a$, 64, 1) = LTRIM$(STR$(mhits(rf2, 2)))
MID$(a$, 66, 1) = LTRIM$(STR$(mrbi(rf2, 2)))
MID$(a$, 68, 1) = LTRIM$(STR$(mbb(rf2, 2)))
MID$(a$, 70, 1) = LTRIM$(STR$(mso(rf2, 2)))
MID$(a$, 72, 18) = Txt2$
PRINT #OUTHdl, a$
ELSEIF BoxRefByLine(1, lin) > 0 THEN
MID$(a$, 1, 2) = Pos1$
MID$(a$, 3, 11) = x1S$
MID$(a$, 15, 1) = LTRIM$(STR$(mab(rf1, 1)))
MID$(a$, 17, 1) = LTRIM$(STR$(mruns(rf1, 1)))
MID$(a$, 19, 1) = LTRIM$(STR$(mhits(rf1, 1)))
MID$(a$, 21, 1) = LTRIM$(STR$(mrbi(rf1, 1)))
MID$(a$, 23, 1) = LTRIM$(STR$(mbb(rf1, 1)))
MID$(a$, 25, 1) = LTRIM$(STR$(mso(rf1, 1)))
MID$(a$, 27, 18) = Txt1$
MID$(a$, 72, 18) = Txt2$
PRINT #OUTHdl, a$
ELSEIF BoxRefByLine(2, lin) > 0 THEN
MID$(a$, 27, 18) = Txt1$
MID$(a$, 46, 2) = Pos2$
MID$(a$, 48, 11) = x2S$
MID$(a$, 60, 1) = LTRIM$(STR$(mab(rf2, 2)))
MID$(a$, 62, 1) = LTRIM$(STR$(mruns(rf2, 2)))
MID$(a$, 64, 1) = LTRIM$(STR$(mhits(rf2, 2)))
MID$(a$, 66, 1) = LTRIM$(STR$(mrbi(rf2, 2)))
MID$(a$, 68, 1) = LTRIM$(STR$(mbb(rf2, 2)))
MID$(a$, 70, 1) = LTRIM$(STR$(mso(rf2, 2)))
MID$(a$, 72, 18) = Txt2$
PRINT #OUTHdl, a$
ELSE
MID$(a$, 27, 18) = Txt1$
MID$(a$, 72, 18) = Txt2$
PRINT #OUTHdl, a$
END IF
INCR lin
LOOP
'Pitcher stats
i = 2
j = 15
REDIM PitTbl(i, j) AS PitTblType
PRINT #OUTHdl,
PRINT #OUTHdl, "~Pitcher IP H R ER BB SO"; TAB(47); "Pitcher IP H R ER BB SO"
'f$ = "\ \## \ \ ## ## ## ## ##"
Savlin = 0
FOR t = 1 TO 2
lin = 0
FOR n = 1 TO np(t)
p = iyp(n, t)
'See if we've already done this pitcher.
'It's possible that a pitcher can enter a game more than once...
i = 1
Found = FALSE
DO WHILE i < n
IF p = iyp(i, t) THEN
Found = TRUE
EXIT DO
END IF
INCR i
LOOP
IF Found THEN ITERATE FOR
IF WPteam = t AND WPpit = p THEN
flag$ = " W"
ELSEIF LPteam = t AND LPpit = p THEN
flag$ = " L"
ELSEIF SPteam = t AND SPpit = p THEN
flag$ = " S"
ELSE
flag$ = " "
END IF
y$ = " "
IF flag$ > " " THEN
IF CmdStat$ > "!" THEN
Find$ = League(t) + PADRIGHT$(Names(t), 12) + PADRIGHT$(NameRef(p, t), 16)
TotalRecs = PSum(0).PGameCtr
CALL BinarySearchP (PSum(), 1, 29, 1, TotalRecs, Find$, FoundAt, mini)
IF FoundAt THEN
IF flag$ = " W" THEN
w = PSum(FoundAt).PWin
l = PSum(FoundAt).PLoss
y$ = "(" + LTRIM$(STR$(w)) + "-" + LTRIM$(STR$(l)) + ")"
END IF
IF flag$ = " L" THEN
w = PSum(FoundAt).PWin
l = PSum(FoundAt).PLoss
y$ = "(" + LTRIM$(STR$(w)) + "-" + LTRIM$(STR$(l)) + ")"
END IF
IF flag$ = " S" THEN
s = PSum(FoundAt).PSave
y$ = "(" + LTRIM$(STR$(s)) + ")"
END IF
END IF
END IF
END IF
player = p
team = t
GOSUB BSGetName
xS$ = RTRIM$(RS$ + flag$)
L = LEN(y$)
IF L > 1 THEN
d = L + LEN(xS$)
IF d > 18 THEN xS$ = LEFT$(xS$, LEN(xS$) - (d-18))
xS$ = xS$ + y$
END IF
i = mpo(p, t) MOD 3
SELECT CASE i
CASE 0
zS$ = " "
CASE 1
zS$ = "1/3"
CASE 2
zS$ = "2/3"
END SELECT
INCR lin
' f$ = "\ \## \ \ ## ## ## ## ##"
a$ = SPACE$(39)
MID$(a$, 1, 18) = xS$
MID$(a$, 19, 2) = FFORMAT$(INT(mpo(p,t) / 3) , "##")
MID$(a$, 22, 3) = zS$
MID$(a$, 26, 2) = LFORMAT$(mph(p,t), "##")
MID$(a$, 29, 2) = LFORMAT$(mpr(p,t), "##")
MID$(a$, 32, 2) = LFORMAT$(mper(p,t), "##")
MID$(a$, 35, 2) = LFORMAT$(mpw(p,t), "##")
MID$(a$, 38, 2) = LFORMAT$(mpk(p,t), "##")
PitTbl(t, lin).ScrLine = a$
NEXT n
IF lin > Savlin THEN Savlin = lin
NEXT t
FOR i = 1 TO Savlin
Txt1$ = PitTbl(1, i).ScrLine
Txt2$ = PitTbl(2, i).ScrLine
IF Txt1$ < " " THEN Txt1$ = " "
IF Txt2$ < " " THEN Txt2$ = " "
PRINT #OUTHdl, Txt1$; TAB(46); Txt2$
NEXT
i = 2
j = 15
REDIM PitTbl (i, j) AS PitTblType
Savlin = 0
FOR t = 1 TO 2
lin = 0
FOR i = 10 TO TopPitLim
L = mpBS(i, t)
IF L THEN
INCR lin
IF lin = 1 THEN PitTbl(t, lin).ScrLine = "Blown Save:"
player = i
team = t
GOSUB BSGetName
xS$ = LEFT$(RS$, 11)
IF L > 1 THEN xS$ = xS$ + "(" + LTRIM$(STR$(L)) + ")"
INCR lin
PitTbl(t, lin).ScrLine = " " + xS$
END IF
NEXT
L = LEN(WildPit(t))
IF L THEN
INCR lin
PitTbl(t, lin).ScrLine = "WP:"
n = 1
DO WHILE n < L
r = VAL(MID$(WildPit(t), n, 2))
player = r
team = t
GOSUB BSGetName
xS$ = LEFT$(RS$, 11)
INCR lin
PitTbl(t, lin).ScrLine = " " + xS$
n = n + 2
LOOP
END IF
L = LEN(PassedB(t))
IF L THEN
INCR lin
PitTbl(t, lin).ScrLine = "Passed Ball:"
n = 1
DO WHILE n < L
r = VAL(MID$(PassedB(t), n, 2))
player = r
team = t
GOSUB BSGetName
xS$ = LEFT$(RS$, 11)
INCR lin
PitTbl(t, lin).ScrLine = " " + xS$
n = n + 2
LOOP
END IF
L = LEN(HitByPit(t))
IF L THEN
INCR lin
PitTbl(t, lin).ScrLine = "HBP:"
n = 1
DO WHILE n < L
r = VAL(MID$(HitByPit(t), n, 2))
player = r
team = t
GOSUB BSGetName
xS$ = LEFT$(RS$, 11)
r = VAL(MID$(HitByPit(t), n + 2, 2))
player = r
team = 3 - t
GOSUB BSGetName
yS$ = LEFT$(RS$, 11)
INCR lin
PitTbl(t, lin).ScrLine = " " + xS$ + "(" + yS$ + ")"
n = n + 4
LOOP
END IF
IF lin > Savlin THEN Savlin = lin
NEXT
IF Savlin THEN PRINT #OUTHdl,
FOR i = 1 TO Savlin
Txt1$ = PitTbl(1, i).ScrLine
Txt2$ = PitTbl(2, i).ScrLine
IF Txt1$ < " " THEN Txt1$ = " "
IF Txt2$ < " " THEN Txt2$ = " "
PRINT #OUTHdl, Txt1$; TAB(46); Txt2$
NEXT
'Print line score
PRINT #OUTHdl,
xS$ = LINESCORE$(1)
i = LEN(xS$) - 6
PRINT #OUTHdl, TAB(i); "R H E"
PRINT #OUTHdl, xS$
xS$ = LINESCORE$(2)
PRINT #OUTHdl, xS$
PRINT #OUTHdl,
CLOSE #OUTHdl
'Return
ERASE TxtTbl
ERASE BoxPosit
ERASE PitTbl
EXIT SUB
BSGetName:
RS$ = FLASTNAMER$(player, team)
RETURN
LookUpBatStats:
Find$ = League(t) + PADRIGHT$(Names(t), 12) + PADRIGHT$(NameRef(i, t), 16)
TotalRecs = BSum(0).BGameCtr
FoundAt = 0
CALL BinarySearchB (BSum(), 1, 29, 1, TotalRecs, Find$, FoundAt, mini)
RETURN
ErrorTrap:
LOCATE 10, 30
PRINT "ERROR: BoxScore"; ERRCLEAR
x$ = WAITKEY$
END SUB
SUB BubbleSortFlt (ArrayFlt!(), ArrayStr() AS SortStrType, O$) 'STATIC
DO
OutOfOrder = 0
FOR x = 1 TO UBOUND(ArrayFlt!) - 1
IF O$ = "A" THEN
IF ArrayFlt!(x) > ArrayFlt!(x + 1) THEN
SWAP ArrayFlt!(x), ArrayFlt!(x + 1)
SWAP ArrayStr(x).SSItem, ArrayStr(x + 1).SSItem
OutOfOrder = -1
END IF
ELSE
IF ArrayFlt!(x) < ArrayFlt!(x + 1) THEN
SWAP ArrayFlt!(x), ArrayFlt!(x + 1)
SWAP ArrayStr(x).SSItem, ArrayStr(x + 1).SSItem
OutOfOrder = -1
END IF
END IF
NEXT
LOOP WHILE OutOfOrder
END SUB
SUB BubbleSortInt (ArrayInt(), ArrayStr() AS SortStrType) 'STATIC
DO
OutOfOrder = 0
FOR x = 1 TO UBOUND(ArrayInt) - 1
IF ArrayInt(x) < ArrayInt(x + 1) THEN
' < is descending
' > is ascending
SWAP ArrayInt(x), ArrayInt(x + 1)
SWAP ArrayStr(x).SSItem, ArrayStr(x + 1).SSItem
OutOfOrder = -1
END IF
NEXT
LOOP WHILE OutOfOrder
END SUB
SUB BuildBullpenPlyList (tm, PlyList() AS PlyListType, Av, CalledFromOffense)
Av = 0
IF NewStyle(tm) AND LastPiAd(tm) > 10 THEN 'New Style has "Games" and "Starts"
'Put Relievers in first, then starters if appropriate
'relief1 is "normal" address of 1st reliever in .DAT
'If less than 6 pitchers, relief1 is the last pitcher
relief1 = MIN&(15, LastPiAd(tm))
j = relief1
DO
Pass = 0
IF j < relief1 THEN
IF DataGames(j, tm) > DataGbyP(j, tm, 1) THEN '+2
Pass = -1
END IF
ELSE
Pass = -1
END IF
IF Pass THEN
IF Av < 25 THEN
a$ = BUBuildLine$ (j, tm, CalledFromOffense)
INCR Av
PlyList(Av).Item = a$
PlyList(Av).Ref = j
END IF
END IF
INCR j
IF j > LastPiAd(tm) THEN j = 10
IF j = relief1 THEN EXIT DO
LOOP
ELSE
'Old Style - we know nothing about Games and Starts
IF LastPiAd(tm) > 17 THEN 'More than 8 pitchers [take #14+ ]
n1 = 14
ELSE
n1 = 10 '8 or less pitchers [take all]
END IF
FOR j = n1 TO LastPiAd(tm)
IF Av < 25 THEN
a$ = BUBuildLine$ (j, tm, CalledFromOffense)
INCR Av
PlyList(Av).Item = a$
PlyList(Av).Ref = j
END IF
NEXT
END IF
END SUB
SUB BuildTeamWin (tm, beg, endd, hdg, pend)
REGISTER j AS INTEGER, k AS INTEGER, m AS INTEGER
wlim = MAXPLAYERS + 4
REDIM VirtualWin(wlim) AS GLOBAL VirtualWinType
Bhdg = FALSE
Phdg = FALSE
pend = endd
FOR j = beg TO endd
jj = j
IF DataName(j, tm) < "!" THEN pend = j - 1: EXIT FOR
IF DataPos(j, tm) = 1 AND j > 9 AND j <= LastPiAd(tm) THEN 'Pitchers
IF hdg THEN
IF Phdg = FALSE THEN
IF m < wlim THEN
INCR m
VirtualWin(m).item = "~ Name L/R W L S G St Inn Hits HR BB SO ERA"
END IF
Phdg = TRUE
Bhdg = FALSE
END IF
END IF
IF iused(j, tm) THEN flag$ = "x" ELSE flag$ = " "
a$ = SPACE$(70)
MID$(a$, 1, 2) = LFORMAT$(jj, "##")
MID$(a$, 4, 1) = flag$
MID$(a$, 5, 17) = DataName(j, tm)
MID$(a$, 24, 1) = DataHand(j, tm)
MID$(a$, 28, 2) = LFORMAT$(DataDef(j, tm), "##")
MID$(a$, 31, 2) = LFORMAT$(DataSB(j, tm), "##")
MID$(a$, 34, 2) = LFORMAT$(DataCS(j, tm), "##")
MID$(a$, 37, 2) = LFORMAT$(DataGames(j, tm), "##")
MID$(a$, 41, 2) = LFORMAT$(DataGbyP(j, tm, 1), "##")
MID$(a$, 45, 4) = LFORMAT$(DataAB(j, tm), "####")
MID$(a$, 51, 4) = LFORMAT$(DataHits(j, tm), "####")
MID$(a$, 56, 2) = LFORMAT$(DataHR(j, tm), "##")
MID$(a$, 59, 3) = LFORMAT$(DataBB(j, tm), "###")
MID$(a$, 63, 3) = LFORMAT$(DataSO(j, tm), "###")
MID$(a$, 67, 4) = FFORMAT$(DataRBI(j, tm)/100, "#.##")
ELSE
IF hdg THEN 'Position Players
IF Bhdg = FALSE THEN
IF m < wlim THEN
INCR m
VirtualWin(m).item = "~ Name Pos AB Hit 2B 3B HR RBI BB SO B S SB CS Def Avg Games@Pos"
IF ERRSw(tm) THEN MID$(VirtualWin(m).item, 65, 3) = "ERR"
END IF
Bhdg = TRUE
Phdg = FALSE
END IF
END IF
IF DataAB(j, tm) = 0 THEN
BAF! = 0
ELSE
BAF! = DataHits(j, tm) / DataAB(j, tm)
END IF
IF iused(j, tm) THEN flag$ = "x" ELSE flag$ = " "
a$ = SPACE$(114)
MID$(a$, 1, 2) = LFORMAT$(jj, "##")
MID$(a$, 4, 1) = flag$
MID$(a$, 5, 15) = DataName(j, tm)
MID$(a$, 21, 2) = Pos(DataPos(j, tm))
MID$(a$, 24, 3) = LFORMAT$(DataAB(j, tm), "###")
MID$(a$, 28, 3) = LFORMAT$(DataHits(j, tm), "###")
MID$(a$, 32, 3) = LFORMAT$(Data2B(j, tm), "###")
MID$(a$, 36, 2) = LFORMAT$(Data3B(j, tm), "##")
MID$(a$, 39, 2) = LFORMAT$(DataHR(j, tm), "##")
MID$(a$, 42, 3) = LFORMAT$(DataRBI(j, tm), "###")
MID$(a$, 46, 3) = LFORMAT$(DataBB(j, tm), "###")
MID$(a$, 50, 3) = LFORMAT$(DataSO(j, tm), "###")
MID$(a$, 54, 1) = DataHand(j, tm)
MID$(a$, 56, 1) = LFORMAT$(DataSpeed(j, tm), "#")
MID$(a$, 58, 3) = LFORMAT$(DataSB(j, tm), "###")
MID$(a$, 62, 2) = LFORMAT$(DataCS(j, tm), "##")
MID$(a$, 65, 3) = LFORMAT$(DataDef(j, tm), "###")
MID$(a$, 69, 4) = FFORMAT$(BAF!, ".###")
b$ = ""
FOR k = 1 TO 4
IF DataGByP(j,tm,k) > 0 THEN
b$ = b$ + LFORMAT$(DataGbyP(j,tm,k), "####") + " at"
IF DataPosi(j,tm,k) = 10 THEN
b$ = b$ + " DH"
ELSE
b$ = b$ + LFORMAT$(DataPosi(j,tm,k), "###")
END IF
END IF
NEXT
bl = LEN(b$)
IF bl THEN
MID$(a$, 73, bl) = b$
END IF
END IF
IF m < wlim THEN
INCR m
VirtualWin(m).item = a$
END IF
NEXT
END SUB
SUB Bullpen (n, tm, ForceN, CalledFromOffense) STATIC
'Be aware that we pass back "n" and "tm", so don't use them as variables in this routine
REGISTER i AS INTEGER
'Check if we already have selected pitcher
IF ForceN THEN
n = ForceN
GOTO BU150
END IF
IF CalledFromOffense = FALSE AND amgr(tm) THEN GOTO BU1000
REDIM PlyList(1 TO 25) AS PlyListType 'was 14
'Build list of relief pitchers
CALL BuildBullpenPlyList (tm, PlyList(), Av, CalledFromOffense) 'Returns PlyList() and Av
'Save the screen
QPush
r = MIN&(Av+7+rowO, ConsRows-1)
IF Gfx THEN CALL GraphHole(30, 5+rowO, 5+colO, r+1, 77+colO)
BU10:
'Display the pitchers selected
CALL Drawfrm(5+rowO, 5+colO, r, 75+colO, defattr, "'" + RTRIM$(Names(tm)) + " Bullpen", "Dbl-click (or Enter) selection or ESC", 1, 0, 2)
QPRINTs 6+rowO, 7+colO, " Name L/R W L S G St Inn Hits BB SO ERA", defattr
'Row and Col are coordinates of the upper-left corner of the FRAME
CALL PickFromPlyList (PlyList(), Av, r-7-rowO, 1, 66, 6+rowO, 5+colO, r, 75+colO, dimattr, revattr, Pick, RetKey, nulls$, 0)
IF Pick > 0 THEN
n = PlyList(Pick).Ref
ELSE
n = 0
ERASE PlyList
GOTO BU999
END IF
r2 = MIN&(Av+9+rowO, ConsRows-1)
IF iused(n, tm) THEN
CALL PopMsg(r2, 20+colO, " Sorry, that pitcher has already been used. ", errattr, 2, kc)
GOTO BU10
END IF
IF SimDaysOff(n, tm) > 0 AND DaysOffRule = TRUE THEN
x$ = " This pitcher needs the day off. | Hit 'Y' to select anyway (with performance penalty). "
CALL PopMsg(r2, 10+colO, x$, errattr, 0, kc)
IF UCASE$(CHR$(kc)) <> "Y" THEN GOTO BU10
SimDaysOff(n, tm) = 0 - SimDaysOff(n, tm)
END IF
IF PitcherCloneUnused(DataName(n, tm), tm) = 0 THEN
CALL PopMsg(r2, 23+colO, " Sorry, that pitcher is/has been in the lineup! ", errattr, 2, kc)
GOTO BU10
END IF
'Reject if current pitcher is picked
IF n = ipa(tm) THEN
CALL PopMsg(r2, 24+colO, " Oops, that player is pitching now! ", errattr, 2, kc)
GOTO BU10
END IF
IF WarmUpRule = TRUE THEN
'Pitcher selected is "cold"
IF WarmUpStatus(n, tm) < 1 THEN
NowThrowing = 0
FOR i = 10 TO TopPitLim
IF CalledFromOffense = FALSE THEN
IF WarmUpStatus(i, tm) > 10 THEN INCR NowThrowing
ELSE
IF WarmUpStatus(i, tm) > 8 THEN INCR NowThrowing
END IF
NEXT
'Get up and start throwing if there's room (only 2 can throw at same time)
IF NowThrowing > 1 THEN
CALL PopMsg(r2, 23+colO, " You already have two people throwing! ", errattr, 2, kc)
GOTO BU10
END IF
IF CalledFromOffense = FALSE THEN
WarmUpStatus(n, tm) = 12
ELSE
WarmUpStatus(n, tm) = 10
END IF
IF Gender(tm) THEN
xS$ = " She'll get up and start throwing! "
ELSE
xS$ = " He'll get up and start throwing! "
END IF
CALL PopMsg(r2, 25+colO, xS$, errattr, 2, kc)
CALL BuildBullpenPlyList (tm, PlyList(), Av, CalledFromOffense) 'Returns PlyList() and Av
GOTO BU10
'Pitcher selected has just started throwing, not warm yet
ELSEIF WarmUpStatus(n, tm) > 10 THEN
IF Gender(tm) THEN
xS$ = " She's not quite warm yet! "
ELSE
xS$ = " He's not quite warm yet! "
END IF
CALL PopMsg(r2, 28+colO, xS$, errattr, 2, kc)
GOTO BU10
END IF
END IF
ERASE PlyList
'Just in case WarmUpRule = FALSE and somehow we get here from offense
IF CalledFromOffense = TRUE THEN
GOTO BU999
END IF
'We now have a new pitcher
iused(ip, tm) = TRUE 'mark old ip as used
BU150:
ip = n 'set new IP
ipa(tm) = ip 'store the pitchers address
INCR np(tm) 'add to count of pitchers
iyp(np(tm), tm) = ip 'store pitchers number by order of appearance
nPitch(tm) = 0 'reset pitch-count (by team only)
CALL AssignFatigue (tm)
'Reset WarmUpStatus of new pitcher
IF WarmUpRule = TRUE THEN WarmUpStatus(ip, tm) = 0
'Check to see if pitcher has a save situation brewing
DefLead = itruns(tm) - itruns(it)
IF DefLead > 0 THEN
'Faces tying run on-deck
IF DefLead < (NUMBERON + 3) THEN
QualSave1IP = ip
QualSave1ID = tm
END IF
'Has a three-run (or less) lead with nobody on
IF DefLead < 4 AND (NUMBERON = 0) THEN
QualSave2IP = ip
QualSave2ID = tm
END IF
END IF
IF NOT dh THEN 'we have to put pitcher in batting order
ps = 0 'find slot where the last pitcher was hitting (=ps)
DO
INCR ps
IF ps > 9 THEN
x$ = "ERROR(BULL1): No Pitcher Found in Lineup:" + DataFil(tm)
CALL ErrorBox (x$)
END IF
LOOP UNTIL DataPos(ps, tm) = 1
'If the current guy in the pitcher's slot is a pinch-hitter,
'the pitcher he pinch-hit for is on the bench! Do a swap which
'puts the pinch-hitter back on the bench (he's not staying in the
'game) and the old pitcher temporarily back in the lineup.
'Then we'll copy the new pitcher into the lineup.
'Check the pitcher list to see if the guy in the pitcher's slot is here
LastRealPitcher$ = DataName(iyp(np(tm)-1, tm), tm)
IF DataName(ps, tm) <> LastRealPitcher$ THEN
'Must be a pinch hitter/runner
'Find LastRealPitcher$ on bench - with position of pitcher
ps2 = SearchDAT(LastPiAd(tm)+1, MAXPLAYERS, tm, LastRealPitcher$, 1)
IF ps2 THEN
CALL Switch(ps, ps2, tm)
'Mark PH as used and restore his .DAT position
iused(ps2, tm) = TRUE
DataPos(ps2, tm) = OrgPos(DataRef(ps2, tm), tm)
ELSE
x$ = "ERROR(BULL1): Failed to locate previous pitcher on bench"
x$ = x$ + "|" + DataFil(tm)
CALL ErrorBox (x$)
END IF
END IF
'Copy pitcher's name and reference to slot ps
'Insert hitting stats
'Does new pitcher's name exist on bench?
SearchName$ = DataName(ip, tm)
n2 = SearchDAT (LastPiAd(tm)+1, MAXPLAYERS, tm, SearchName$, 0)
IF n2 THEN
CALL CopyStats(n2, ps, tm)
ELSE
DataAB(ps, tm) = 100
xS$ = UCASE$(DataCode(ip, tm))
code = ASC(xS$) - 64
IF code < 1 OR code > 5 THEN
IF RND < .5 THEN
DataHits(ps, tm) = 16
ELSE
DataHits(ps, tm) = 17
END IF
ELSE
DataHits(ps, tm) = 30 - (5 * code)
END IF
'1 A = 24 25
'2 B = 19 20
'3 C = 14 15
'4 D = 09 10
'5 E = 04 05
DataHR(ps, tm) = DataHits(ps, tm) * .025
DataSO(ps, tm) = 49.1 - DataHits(ps, tm) * 0.9
DataBB(ps, tm) = 5
IF DataPBatAB(ip, tm) > 0 THEN
DataAB(ps, tm) = DataPBatAB(ip, tm)
DataHits(ps, tm) = DataPBatHi(ip, tm)
DataHR(ps, tm) = DataPBatHR(ip, tm)
DataBB(ps, tm) = DataPBatBB(ip, tm)
DataSO(ps, tm) = DataPBatSO(ip, tm)
END IF
Data2B(ps, tm) = DataHits(ps, tm) * .14
Data3B(ps, tm) = DataHits(ps, tm) * .02
DataRBI(ps, tm) = DataHits(ps, tm) / 2.4
IF DataHand(ip, tm) = "r" THEN
DataHand(ps, tm) = "L"
ELSEIF DataHand(ip, tm) = "l" THEN
DataHand(ps, tm) = "R"
ELSE
DataHand(ps, tm) = DataHand(ip, tm)
END IF
DataDef(ps, tm) = 0
DataSpeed(ps, tm) = 3
DataSB(ps, tm) = 1 'was 3
DataCS(ps, tm) = 1 'was 2
END IF
DataName(ps, tm) = DataName(ip, tm)
DataRef(ps, tm) = ip
'Mark New pitcher as NOT used in case he's coming in because
'the last pitcher was PH'ed for
iused(ps, tm) = FALSE
CALL AddToRefByBO (ps, tm, ip) 'bat position, team, ref
END IF
GOTO BU999
BU1000:
'Automatic manager side trip
'Mark old IP as used - guarantees we won't select the current pitcher
' "SUB Manage" guarantees there IS at least one more to select
REDIM DupNameFlag (10:TopPitLim) AS LONG
nn = LastPiAd(tm)
IF DupNameTeam(tm) THEN
FOR i = 10 TO nn
SearchName$ = DataName(i, tm)
IF PitcherCloneUnused(SearchName$, tm) = 0 THEN DupNameFlag(i) = TRUE
NEXT
END IF
iused(ip, tm) = TRUE
DefLead = itruns(tm) - itruns(it)
CloserSituation = FALSE
IF DefLead > -1 AND DefLead < 4 THEN
IF StrictCloserRule THEN
IF inn > 8 THEN
IF DefLead > 0 THEN
CloserSituation = TRUE
END IF
END IF
ELSE
IF inn > 8 THEN
CloserSituation = TRUE
ELSEIF inn = 8 AND (iout > 0 OR NUMBERON) THEN
CloserSituation = TRUE
END IF
END IF
END IF
IF CloserSituation THEN
GOSUB BUGetAvClosers
IF AvCls > 0 THEN
Closers = TRUE
GOSUB BUSelectReliever
CloserIn(tm) = TRUE
ELSE
GOSUB BUGetAvGeneral
IF AvGen > 0 THEN
Closers = FALSE
GOSUB BUSelectReliever
ELSE
GOSUB BUFindAnyOne
IF n = 0 THEN
GOSUB DumpScoreCard
x$ = "Bullpen Error-Closer: Out of Pitchers"
x$ = x$ + "|" + DataFil(tm)
CALL ErrorBox (x$)
GOTO BU999
END IF
END IF
END IF
ELSE 'Setup Pitcher Situation
GOSUB BUGetAvGeneral
IF AvGen > 0 THEN
Closers = FALSE
GOSUB BUSelectReliever
ELSE
GOSUB BUFindAnyOne
IF n = 0 THEN
GOSUB DumpScoreCard
x$ = "Bullpen Error-General: Out of Pitchers"
x$ = x$ + "|" + DataFil(tm)
CALL ErrorBox (x$)
GOTO BU999
END IF
END IF
END IF
GOTO BU150 'Back to Primary Routine
BUGetAvClosers:
'Games = DataGames(i, tm)
'Starts = DataGbyP(i, tm, 1)
'Saves = DataCS(i, tm)
REDIM PitList(1 TO 25) AS TotPctType
AvCls = 0
IF NewStyleWithSaves(tm) THEN
TotSaves = 0
TopCloser = 0
TopCloserSaves = 0
IF LastPiAd(tm) < 15 THEN '5 or less pitchers [take all]
nb = 10
ELSEIF LastPiAd(tm) < 18 THEN '6 - 8 pitchers
nb = 14
ELSE '9 or more pitchers
nb = 15
END IF
FOR i = nb TO LastPiAd(tm)
IF DataCS(i, tm) > 0 AND iused(i, tm) = 0 THEN
IF SimDaysOff(i, tm) = 0 OR DaysOffRule = FALSE THEN
IF NOT DupNameFlag(i) THEN
IF DataCS(i, tm) > TopCloserSaves THEN
TopCloserSaves = DataCS(i, tm)
TopCloser = i
END IF
TotSaves = TotSaves + DataCS(i, tm)
END IF
END IF
END IF
NEXT
FOR i = nb TO LastPiAd(tm)
IF DataCS(i, tm) > 0 AND iused(i, tm) = 0 THEN
IF SimDaysOff(i, tm) = 0 OR DaysOffRule = FALSE THEN
IF NOT DupNameFlag(i) THEN
IF TotSaves > 0 THEN
IF i = TopCloser THEN 'the "Go-To Guy"
xF! = (DataCS(i, tm) * 1.2) / TotSaves
ELSE
xF! = DataCS(i, tm) / TotSaves
END IF
IF xF! > 0 AND AvCls < 25 THEN
INCR AvCls
PitList(AvCls).PctOfTot = xF!
PitList(AvCls).Slot = i
END IF
END IF
END IF
END IF
END IF
NEXT
ELSE
'Old Style
j = MIN&(15, LastPiAd(tm)) 'usually 15 unless not that many pitchers
IF iused(j, tm) = 0 THEN
IF SimDaysOff(j, tm) = 0 OR DaysOffRule = FALSE THEN
IF NOT DupNameFlag(j) THEN
AvCls = 1
PitList(1).Slot = j
END IF
END IF
END IF
END IF
RETURN
BUGetAvGeneral:
'Games = DataGames(i, tm)
'Starts = DataGbyP(i, tm, 1)
'Saves = DataCS(i, tm)
REDIM PitList(1 TO 25) AS TotPctType
TotInn = 0
IF NewStyleWithSaves(tm) THEN 'Have Games, Starts and Saves
FOR i = 10 TO LastPiAd(tm)
'If no spot starters, skip pitchers in starting rotation
GOSUB CheckIfInRotation
IF SkipHim = FALSE AND iused(i, tm) = 0 THEN
IF SimDaysOff(i, tm) = 0 OR DaysOffRule = FALSE THEN
RA = DataGames(i, tm) - DataGbyP(i, tm, 1)
IF RA > 0 THEN
IF (DataCS(i, tm) / RA) < .2 THEN 'We skip high-save guys
IF NOT DupNameFlag(i) THEN
'Primarily Starter or Reliever?
IF DataGbyP(i, tm, 1) < (DataGames(i, tm) \ 2) THEN
'Primarily a reliever
ReliefInn = DataAB(i, tm) - (DataGbyP(i, tm, 1) * 6)
ELSE
'Primarily a starter (w/2 innings per relief appearance)
ReliefInn = RA * 2
END IF
IF ReliefInn < 0 THEN ReliefInn = 0
TotInn = TotInn + ReliefInn
END IF
END IF
END IF
END IF
END IF
NEXT
AvGen = 0
TopDogInn = 0
TopDog = 0
FOR i = 10 TO LastPiAd(tm)
'If no spot starters, skip pitchers in starting rotation
GOSUB CheckIfInRotation
IF SkipHim = FALSE AND iused(i, tm) = 0 THEN
IF SimDaysOff(i, tm) = 0 OR DaysOffRule = FALSE THEN
RA = DataGames(i, tm) - DataGbyP(i, tm, 1)
IF RA > 0 THEN
IF (DataCS(i, tm) / RA) < .2 THEN 'We skip high-save guys
IF NOT DupNameFlag(i) THEN
IF TotInn > 0 THEN
'Primarily Starter or Reliever?
IF DataGbyP(i, tm, 1) < (DataGames(i, tm) \ 2) THEN
'Primarily a reliever
ReliefInn = DataAB(i, tm) - (DataGbyP(i, tm, 1) * 6)
ELSE
'Primarily a starter (w/2 innings per relief appearance)
ReliefInn = RA * 2
END IF
IF ReliefInn > TopDogInn THEN
TopDogInn = ReliefInn
TopDog = i
END IF
IF ReliefInn > 0 AND AvGen < 25 THEN
INCR AvGen
xF! = ReliefInn / TotInn
PitList(AvGen).PctOfTot = xF!
PitList(AvGen).Slot = i
END IF
END IF
END IF
END IF
END IF
END IF
END IF
NEXT
ELSE
'Old Style .DAT (we know nothing about Games, Starts & Saves)
IF LastPiAd(tm) < 15 THEN '5 or less pitchers [take last]
nb = LastPiAd(tm)
ELSEIF LastPiAd(tm) = 15 THEN '6
nb = 14
ELSE '7 or more
nb = 16 'we assume slot 15 is closer
END IF
TotInn = 0
FOR i = nb TO LastPiAd(tm)
IF i <> 15 THEN
IF iused(i, tm) = 0 THEN
IF SimDaysOff(i, tm) = 0 OR DaysOffRule = FALSE THEN
IF NOT DupNameFlag(i) THEN
TotInn = TotInn + DataAB(i, tm)
END IF
END IF
END IF
END IF
NEXT
AvGen = 0
FOR i = nb TO LastPiAd(tm)
IF i <> 15 THEN
IF iused(i, tm) = 0 THEN
IF SimDaysOff(i, tm) = 0 OR DaysOffRule = FALSE THEN
IF NOT DupNameFlag(i) THEN
IF TotInn > 0 THEN
IF AvGen < 25 THEN
INCR AvGen
xF! = DataAB(i, tm) / TotInn
PitList(AvGen).PctOfTot = xF!
PitList(AvGen).Slot = i
END IF
END IF
END IF
END IF
END IF
END IF
NEXT
END IF
RETURN
CheckIfInRotation:
'Input: i
SkipHim = FALSE
'Does rotation record exist?
Fil$ = DataFil(tm)
j = ROTATIONLIST (Fil$) 'RotationList does not exist in Single Game mode, so SBS can pick anyone
IF j > 0 THEN
IF RotRec(j).RotSpot = " " OR AllowStartersInRelief = FALSE THEN
'We will not allow relivers to be pulled from the starting rotation
' 1. If Spot Starters are not used, OR
' 2. STARTERS-MAY-RELIEVE was specified in baseball.cfg
'Check if pitcher "i" is in starting rotation
jj = 1
DO UNTIL jj > 5 OR SkipHim = TRUE
IF i = RotRec(j).RotList(jj) THEN SkipHim = TRUE
INCR jj
LOOP
END IF
END IF
RETURN
BUFindANYONE:
n = 0
'Try #15 first:
IF LastPiAd(tm) > 14 THEN
IF iused(15, tm) = 0 AND DupNameFlag(i) = 0 THEN
n = 15
END IF
END IF
IF n THEN RETURN
'Last desperate search
'i = 10
'DO UNTIL i > LastPiAd(tm)
' IF iused(i, tm) = 0 AND DupNameFlag(i) = 0 THEN
' n = i
' EXIT DO
' END IF
' INCR i
'LOOP
i = LastPiAd(tm)
DO UNTIL i < 10
IF iused(i, tm) = 0 AND DupNameFlag(i) = 0 THEN
n = i
EXIT DO
END IF
DECR i
LOOP
RETURN
BUSelectReliever:
IF Closers = TRUE THEN
NList = AvCls
TopDog = 99
ELSE
NList = AvGen
END IF
IF NList = 1 THEN
n = PitList(1).Slot
ELSEIF NList > 1 THEN
DO
'Get a random number to select the pitcher
xF! = RND
Pick = 0
BaseP! = 0
FOR i = 1 TO NList
IF xF! < BaseP! + PitList(i).PctOfTot THEN
Pick = i
EXIT FOR
END IF
BaseP! = BaseP! + PitList(i).PctOfTot
NEXT
IF Pick = 0 THEN Pick = NList
n = PitList(Pick).Slot
LOOP WHILE n = TopDog AND inn > 6 AND RND < .25
'Reject the biggest-inning guy after the 6th some of the time
END IF
RETURN
DumpScoreCard:
'Append ScoreCard to CmdScrF$ file
IF CmdScrF$ > "!" THEN
REDIM List1(1 TO 300) AS List1Type
CALL LoadScoreCardToList1 (List1(), j) ' j returns items in list
IF LEFT$(CmdScrF$, 3) = "LPT" THEN
xS$ = CmdScrF$
ELSE
xS$ = CmdWritePath$ + CmdScrF$
END IF
CALL DumpList(List1(), j, xS$, TRUE)
ERASE List1
END IF
RETURN
BU999:
IF NOT amgr(tm) THEN
IF Gfx THEN CALL EliminateHole(30)
QPop
END IF
END SUB
SUB BUNTRoutine
ON ERROR GOTO ERRORTRAP
'We take back some of these results if batter doesn't make contact
WhoAtPos = fr4
IF WhoAtPos = 4 THEN WhoAtPos = 5
wag = WHOATGUY(WhoAtPos)
Result$ = LTRIM$(STR$(WhoAtPos))
'What if a Pitch-Out occurred?
IF POut THEN
IF ir3 <> 0 AND iout < 2 THEN
GOTO CheckSqueeze
ELSE
IF DelFac THEN
AddToAnnouncer id, "They Pitchout..."
AddToAnnouncer it, "The batter pulls the bat back..."
AddToAnnouncer it, "And the runner holds..."
END IF
CALL ResetBatter
Result$ = ""
WhoAtPos = 0 'to keep defense from flashing
EXIT SUB
END IF
END IF
'Sac Bunt Attempts that accidentally turn into a hit
IF DataSpeed(ib, it) < 4 THEN
x! = .13: y! = .11
ELSEIF DataSpeed(ib, it) < 7 THEN
x! = .18: y! = .13
ELSEIF DataSpeed(ib, it) < 9 THEN
x! = .23: y! = .15
ELSE
x! = .28: y! = .17
END IF
IF (ir1 = 0 AND ir2 = 0 AND ir3 = 0) THEN y! = 0
IF Tight THEN
z! = x! - y! + .05
ELSE
z! = 0
END IF
IF RND < (x! - y! - z!) THEN
' IF (DataSpeed(ib, it) / 2) + FRND(10) > 13 THEN 'Its a hit! 9/19
'7 - 10%
'8 - 10%
'9 - 20%
IF DelFac THEN
IF SoundOn THEN CALL WavBunt
CALL Msg ("24", "0", "0", "01", ib, it, man2, team2) 'sq's around
CALL Msg ("24", "0", "0", "02", ib, it, man2, team2) 'down
CALL Msg ("02", "4", "2", "00", wag, id, man2, team2) 'fields & throws
CALL Msg ("23", "0", "0", "01", 0, it, man2, team2) 'safe
END IF
CALL Advanc(1, 1, 1)
ir1 = ib
mpp(ib) = ip
'Credit the hit. Bump "Batters Faced".
CALL CreditHit
INCR mpbf(ip, id)
Result$ = "1B"
EXIT SUB
END IF
'Nobody on base! OR two-out: Just an out.
IF (ir1 = 0 AND ir2 = 0 AND ir3 = 0) OR iout = 2 THEN
IF DelFac THEN
IF SoundOn THEN CALL WavBunt
CALL Msg ("24", "0", "0", "01", ib, it, man2, team2) 'sq's around
CALL Msg ("24", "0", "0", "02", ib, it, man2, team2) 'down
CALL Msg ("02", "4", "2", "00", wag, id, man2, team2) 'fields & throws
CALL Msg ("02", "4", "3", "00", ib, it, man2, team2) 'out
END IF
INCR iout
INCR mpo(ip, id)
IF WhoAtPos <> 3 THEN
Result$ = Result$ + "-3"
INCR Assists(DataRef(wag, id), id, WhoAtPos)
ELSE
Result$ = Result$ + "UN"
END IF
INCR PutOuts(DataRef(WHOATGUY(3), id), id, 3)
INCR mpbf(ip, id)
EXIT SUB
END IF
CheckSqueeze:
'Calculate bunting ability (successrate!)
singles = DataHits(ib,it) - Data2B(ib,it) - Data3B(ib,it) - DataHR(ib,it)
x! = (singles + DataSB(ib,it) - DataCS(ib,it)) / (DataAB(ib,it) + DataBB(ib,it))
x1! = x! / p1baseF(it)
'around 1.0 would be a bit less than average
'get pitchers rate
IF DataPos(ib, it) = 1 AND DataRef(ib, it) <= LastPiAd(it) THEN
SuccessRate! = x1! - .1
' zzzSumR = zzzSumR + SuccessRate!
' zzzSumN = zzzSumN + 1
ELSE
SuccessRate! = x1! - .2
END IF
IF SuccessRate! < .35 THEN SuccessRate! = .35
IF SuccessRate! > .85 THEN SuccessRate! = .85
IF ir3 THEN 'RUNNER ON THIRD
SqueezeAttempt = FALSE
IF ir1 <> 0 AND ir2 = 0 THEN '1st and 3rd situation
IF amgr(it) = 0 THEN
'Player is calling the shots
x$ = " Attempt squeeze? [y/N]"
CALL PopMsg(10+rowO, 30+colO, x$, errattr, 0, kc)
IF UCASE$(CHR$(kc)) = "Y" THEN SqueezeAttempt = TRUE
ELSE
'Computer is in control
IF RND < DataSpeed(ir3, it) / 9 THEN SqueezeAttempt = TRUE '8
'Also, make SqueezeAttempt true is pitcher is next
IF ib < 9 THEN ibp1 = ib + 1 ELSE ibp1 = 1
IF DataPos(ibp1, it) = 1 THEN SqueezeAttempt = TRUE
'No Squeeze if infield is in
IF Tight THEN SqueezeAttempt = FALSE
END IF
ELSE
SqueezeAttempt = TRUE
END IF
IF SqueezeAttempt THEN
IF DelFac THEN CALL Msg ("24", "0", "0", "04", 0, it, man2, team2) 'sq is on!
Success = FALSE
IF NOT Tight THEN
IF RND < SuccessRate! THEN Success = TRUE
ELSE
'IF FRND(10) + DataSpeed(ir3) > 15 THEN Success = TRUE
IF RND < SuccessRate! * 0.66 THEN Success = TRUE
END IF
IF POut THEN Success = FALSE
IF Success THEN
IF DelFac THEN
IF SoundOn THEN CALL WavBunt
CALL Msg ("24", "0", "0", "10", ir3, it, man2, team2) 'here comes
CALL Msg ("15", "0", "0", "05", ir3, it, man2, team2) 'SAFE
END IF
CALL Advanc(1, 1, 1)
IF DelFac THEN CALL Msg ("02", "4", "3", "00", ib, it, man2, team2) 'batter out
INCR iout
INCR mpo(ip, id)
'credit a squeeze as a sacrifice
INCR mSacB(ref, it)
mab(ref, it) = mab(ref, it) - 1
IF UCASE$(DataHand(ip, id)) = "L" THEN
mabLHP(ref, it) = mabLHP(ref, it) - 1
ELSE
mabRHP(ref, it) = mabRHP(ref, it) - 1
END IF
IF WhoAtPos <> 3 THEN
Result$ = Result$ + "-3 SQZ"
n = 3
INCR Assists(DataRef(wag, id), id, WhoAtPos)
ELSE
Result$ = Result$ + "-4 SQZ"
n = 4
END IF
INCR PutOuts(DataRef(WHOATGUY(n), id), id, n)
INCR mpbf(ip, id)
ELSE
IF DelFac THEN 'Squeeze Unsuccessful
IF POut THEN AddToAnnouncer id, "They Pitchout!"
CALL Msg ("24", "0", "0", "03", ib, it, man2, team2) 'no contact
CALL Msg ("24", "0", "0", "10", ir3, it, man2, team2) 'here comes
AddToAnnouncer it, "He is...OUT at the plate!"
CALL Msg ("29", "0", "0", "11", 0, id, man2, team2) 'boo
END IF
INCR iout
INCR mpo(ip, id)
i = ir3
ir3 = ir2
ir2 = ir1
ir1 = 0
Result$ = ""
CALL AddToScoreCrd(it, DataRef(i, it), "4", "1-2 Bad SQZ")
INCR PutOuts(DataRef(WHOATGUY(2), id), id, 2)
'Runner on 3rd should get tagged with a caught stealing
INCR mcs(DataRef(i, it), it)
'No assist unless the pitcher gets one (this was a pitchout)
CALL ResetBatter
WhoAtPos = 0 'to keep defense from flashing
END IF
EXIT SUB
END IF
END IF
' Either NO Runner on Third
' [1st only, 2nd only or 1st and 2nd]
' OR
' 1st and 3rd and NO Squeeze Attempt
'Basic Sacrifice attempt
IF DelFac THEN
IF SoundOn THEN CALL WavBunt
CALL Msg ("24", "0", "0", "01", ib, it, man2, team2) 'sq's around
END IF
Success = FALSE
IF NOT Tight THEN
IF RND < SuccessRate! THEN Success = TRUE
ELSE
IF RND < .55 THEN Success = TRUE
END IF
IF Success THEN
zzsacok = zzsacok + 1
IF DelFac THEN
CALL Msg ("24", "0", "0", "02", ib, it, man2, team2) 'bunt is down
CALL Msg ("24", "0", "0", "11", wag, id, man2, team2) '* up with it
END IF
INCR iout 'Success - runners advance (except 3rd)
INCR mpo(ip, id)
INCR mSacB(ref, it)
mab(ref, it) = mab(ref, it) - 1
IF UCASE$(DataHand(ip, id)) = "L" THEN
mabLHP(ref, it) = mabLHP(ref, it) - 1
ELSE
mabRHP(ref, it) = mabRHP(ref, it) - 1
END IF
CALL Advanc(1, 1, 0)
IF DelFac THEN
CALL Msg ("02", "4", "3", "00", ib, it, man2, team2) 'batter out
CALL Msg ("24", "0", "0", "07", ib, it, man2, team2) 'nice bunt
END IF
IF WhoAtPos <> 3 THEN
Result$ = Result$ + "-3 SAC"
n = 3
INCR Assists(DataRef(wag, id), id, WhoAtPos)
ELSE
Result$ = Result$ + "-1 SAC"
n = 1
END IF
INCR PutOuts(DataRef(WHOATGUY(n), id), id, n)
ELSE 'Unsuccessful!
zzsacfa = zzsacfa + 1
INCR iout
INCR mpo(ip, id)
IF Tight THEN x! = .9 ELSE x! = .5
IF RND < x! THEN 'Lead runner out - batter reaches first
i = 4
Rezult$ = " FO"
IF ir3 = 0 THEN
IF ir2 THEN 'Get lead runner at third
ir2 = ir1
'Proposed fix:
IF ir1 = 0 THEN Rezult$ = " FC"
'---
IF WhoAtPos <> 5 THEN
i = 5
ELSE
i = 6
'Proposed change - no more 5-6 force outs
'change to 1-5
WhoAtPos = 1
wag = WHOATGUY(WhoAtPos)
Result$ = "1"
i = 5
'---
END IF
END IF
END IF
ir1 = ib
mpp(ib) = ip
Result$ = Result$ + "-" + LTRIM$(STR$(i)) + Rezult$
INCR Assists(DataRef(wag, id), id, WhoAtPos)
INCR PutOuts(DataRef(WHOATGUY(i), id), id, i)
IF DelFac THEN
CALL Msg ("24", "0", "0", "02", ib, it, man2, team2) 'bunt is down
CALL Msg ("24", "0", "0", "11", wag, id, man2, team2) '* up with it
CALL Msg ("24", "0", "0", "06", 0, id, man2, team2) 'get lead
CALL Msg ("24", "0", "0", "08", ib, it, man2, team2) 'batter on
END IF
ELSE 'Batter pops it up
INCR PutOuts(DataRef(wag, id), id, WhoAtPos)
IF DelFac THEN
CALL Msg ("05", "0", "3", "00", 0, it, man2, team2) 'popped it up
CALL Msg ("24", "0", "0", "09", wag, id, man2, team2) '* grabes it
END IF
END IF
END IF
INCR mpbf(ip, id)
EXIT SUB
ErrorTrap:
LOCATE 10, 30
PRINT "BUNT_Error"; ERRCLEAR
LOCATE 11, 30
PRINT "wag="; wag; "WhoAtPos="; WhoAtPos; "n="; n;
x$ = WAITKEY$
END SUB
SUB Button (row, col, attr, xS$, shadow)
QPRINTs row, col, xS$, attr
IF shadow THEN
L = LEN(xS$)
a = SCREENATTR(row + 1, col + i) 'return color attr at shadow point
bac = (a AND &H70) \ 16 'background color at shadow point
attr2 = bac * 16 'black on background color
FOR i = 1 TO L
QPRINTs row + 1, col + i, CHR$(223), attr2
NEXT
QPRINTs row, col + L, CHR$(220), attr2
END IF
END SUB
SUB ChangeAttribute (row, col, leng, attr) STATIC
'Pure PB/CC method
LOCATE row, col
forg = attr MOD 16
bacg = attr \ 16
IF (col + leng) < (ConsCols + 2) THEN COLOR forg, bacg, leng
END SUB
SUB CheckForValidFile (File$, RecLen, Valid)
'Is File$ the old format or the new?
'Check for existence of File$ before going here
OPEN File$ FOR BINARY AS #4
L& = LOF(4)
IF (L& MOD RecLen <> 0) THEN 'Wrong Record Length
Valid = 0
ELSE
Valid = -1
END IF
CLOSE #4
END SUB
SUB ClearActiveSTATRec
OPEN CmdPath$ + CmdSCH$ FOR BINARY AS #2
Buffer$ = SPACE$(90)
GET #2 ,, Buffer$ 'Read 1st 90 bytes (active stat files)
MID$(Buffer$, 11, 80) = SPACE$(80)
PUT #2, 1, Buffer$ 'Rewrite 1st 90 bytes
CLOSE #2
STx = 0
REDIM ActiveSTAT(10) AS GLOBAL STRING
END SUB
SUB ClipIfNecessary (xS$, tr, tc, b1r1, b1c1, b1r2, b1c2, b2r1, b2c1, b2r2, b2c2, ca, cf)
'Input:
' xS$
' Object origin and length: tr, tc
' Box to protect: b1r1, b1c1, b1r2, b1c2
'Output:
' xS$
' first column: ca
' last column: cf
ce = tc + LEN(xS$) - 1
cf = ce
ca = 0
cb = 0
'Does any part of the name overlap the batting orders?
FOR i = tc TO ce
IF Inbox(b1r1, b1c1, b1r2, b1c2, tr, i, -1) THEN
IF cb = 0 THEN cb = i
ELSE
IF ca = 0 THEN ca = i
END IF
NEXT
IF cb = 0 THEN 'we didn't clip anything -- try other box
ca = 0
FOR i = tc TO ce
IF Inbox(b2r1, b2c1, b2r2, b2c2, tr, i, -1) THEN
IF cb = 0 THEN cb = i
ELSE
IF ca = 0 THEN ca = i
END IF
NEXT
END IF
IF cb = 0 THEN 'we still didn't clip anything
ca = tc
cf = ce
EXIT SUB
END IF
IF ca > 0 THEN
IF cb > ca THEN 'clipped on right
xS$ = MID$(xS$, 1, cb-ca)
cf = cb - 1
ELSE 'clipped on left
xS$ = MID$(xS$, ca-tc+1)
cf = ce
END IF
END IF
END SUB
SUB ClearInpBuffer
DO
x$ = INKEY$
LOOP WHILE LEN(x$)
END SUB
SUB CopyStats(fr, tw, tm)
DataAB(tw, tm) = DataAB(fr, tm)
DataHits(tw, tm) = DataHits(fr, tm)
DataHR(tw, tm) = DataHR(fr, tm)
DataSO(tw, tm) = DataSO(fr, tm)
DataBB(tw, tm) = DataBB(fr, tm)
Data2B(tw, tm) = Data2B(fr, tm)
Data3B(tw, tm) = Data3B(fr, tm)
DataRBI(tw, tm) = DataRBI(fr, tm)
DataHand(tw, tm) = DataHand(fr, tm)
DataDef(tw, tm) = DataDef(fr, tm)
DataSB(tw, tm) = DataSB(fr, tm)
DataCS(tw, tm) = DataCS(fr, tm)
DataSpeed(tw,tm) = DataSpeed(fr,tm)
FOR i = 1 TO 4
DataPosi(tw, tm, i) = DataPosi(fr, tm, i)
DataGByP(tw, tm, i) = DataGByP(fr, tm, i)
NEXT
END SUB
SUB CountActiveSTATFiles
OPEN CmdPath$ + CmdSCH$ FOR BINARY AS #2
Buffer$ = SPACE$(90)
GET #2 ,, Buffer$
STx = 0
REDIM ActiveSTAT(10) AS GLOBAL STRING
a$ = MID$(Buffer$, 11, 8)
n = 11
DO WHILE a$ <> SPACE$(8) AND STx < 10
INCR STx
ActiveSTAT(STx) = RTRIM$(a$)
a$ = MID$(Buffer$, n + 8, 8)
n = n + 8
LOOP
CLOSE #2
END SUB
SUB CountAvPitchers (t, Av, LastGuy) STATIC
Av = 0
LastGuy = 0
FOR i = 10 TO LastPiAd(t)
IF iused(i, t) = 0 AND i <> ipa(t) THEN
IF SimDaysOff(i, t) = 0 OR DaysOffRule = FALSE THEN
IF DupNameTeam(t) THEN
IF PitcherCloneUnused(DataName(i, t), t) THEN
OK = TRUE
ELSE
OK = FALSE
END IF
ELSE
OK = TRUE
END IF
IF OK THEN
IF NewStyle(t) THEN 'Games > Starts
IF DataGames(i, t) > DataGbyP(i, t, 1) THEN
INCR Av
LastGuy = i
END IF
ELSE
INCR Av
LastGuy = i
END IF
END IF
END IF
END IF
NEXT
END SUB
SUB CreditHit
'pitcher:
INCR mph(ip, id)
'hitter:
INCR mhits(ref, it)
IF UCASE$(DataHand(ip, id)) = "L" THEN
INCR mhitsLHP(ref, it)
ELSE
INCR mhitsRHP(ref, it)
END IF
INCR ithits(it)
INCR innh
END SUB
SUB DefCheck (OutOfPositionMsg)
FOR i = 1 TO 9
OK = FALSE
CurrPos = DataPos(i, id)
IF CurrPos = 1 OR CurrPos = 10 THEN
OK = TRUE
ELSE
IF DataPosi(i, id, 1) > 0 AND DataGbyP(i, id, 1) > 0 THEN 'Strict
IF FoundPosition(CurrPos, i, id) THEN
OK = TRUE
END IF
ELSE
ListedPos = OrgPos(DataRef(i, id), id) 'Loose
SELECT CASE CurrPos
CASE 2
IF ListedPos = 2 THEN OK = TRUE
CASE 3
IF ListedPos = 3 OR ListedPos = 5 THEN OK = TRUE
CASE 4
IF ListedPos = 4 OR ListedPos = 6 THEN OK = TRUE
CASE 5
IF ListedPos = 5 OR ListedPos = 6 THEN OK = TRUE
CASE 6
IF ListedPos = 6 THEN OK = TRUE
CASE 7, 8, 9
IF ListedPos = 7 OR ListedPos = 8 OR ListedPos = 9 THEN OK = TRUE
END SELECT
END IF
END IF
IF OK = FALSE AND OutOfPositionMsg = TRUE THEN
zS$ = LASTNAME$(DataName(i, id))
xS$ = "Note: " + zS$ + " is playing out-of-position. "
CALL PopMsg(9+rowO, 20+colO, xS$, errattr, 2, kc)
END IF
NEXT
'Are all positions occupied?
IF dh THEN p1 = 2: p2 = 10 ELSE p1 = 1: p2 = 9
FOR p = p1 TO p2
OK = FALSE
FOR i = 1 TO 9
IF p = DataPos(i, id) THEN
OK = TRUE
EXIT FOR
END IF
NEXT
IF NOT OK THEN
xS$ = STR$(p)
CALL PopMsg(10+rowO, 20+colO, "Lineup error: No Position" + xS$, errattr, 2, kc)
END IF
NEXT
END SUB
SUB DefCoordinates (p, r, c, ObsD, ObsY, ObsH, ObsTz, ObsTy)
ON ERROR GOTO ERRORTRAP
IF ConsRows < 28 OR ConsCols < 85 THEN
SELECT CASE p
CASE 1
r = MidRow + 4: c = MidCol - 6
CASE 2
r = MidRow + 9: c = MidCol - 4
CASE 3
r = MidRow + 2: c = MidCol + 11
CASE 4
r = MidRow : c = MidCol + 4
CASE 5
r = MidRow + 2: c = MidCol - 16
CASE 6
r = MidRow : c = MidCol - 12
CASE 7
r = MidRow - 3: c = MidCol - 26
CASE 8
r = MidRow - 5: c = MidCol - 4
CASE 9
r = MidRow - 3: c = MidCol + 16
CASE 10
r = 0: c = 0
END SELECT
EXIT SUB
END IF
DIM ax(10)
DIM ay(10)
DIM az(10)
ax(1) = 58: ay(1) = -10: az(1) = 0 'pitcher
ax(2) = -3: ay(2) = -3: az(2) = 0 'catcher
ax(3) = 73: ay(3) = 53: az(3) = 0 '1st
ax(4) = 128: ay(4) = 32: az(4) = 0 '2nd
ax(5) = 73: ay(5) = -63: az(5) = 0 '3rd
ax(6) = 128: ay(6) = -38: az(6) = 0 'short
ax(7) = 250: ay(7) = -150: az(7) = 0 'lf
ax(8) = 350: ay(8) = -15: az(8) = 0 'cf
ax(9) = 250: ay(9) = 150: az(9) = 0 'rf
ox = ObsD
oy = ObsY
oz = ObsH
xw! = .8
sfv! = ConsRows
sfh! = ConsCols * .85
TiltZ! = ObsTz * .01745 'convert to radians
TiltY! = ObsTy * .01745 'convert to radians
TiltZ! = CircularFcn(TiltZ!)
TiltY! = CircularFcn(TiltY!)
'Verticle (row)
IF ox = ax(p) AND oy = ay(p) THEN
ThetaZ! = 0
ELSE
ThetaZ! = ATN( (oz - az(p)) / SQR( (ox - ax(p))^2 + (oy - ay(p))^2 ) )
ThetaZ! = CircularFcn(ThetaZ!)
END IF
ThetaZ! = CircularFcn(ThetaZ! + TiltZ!)
IF ThetaZ! > 3.14159 THEN SignFac! = 1.0 ELSE SignFac! = -1.0
cv! = SignFac! * TAN(ThetaZ!) * xw! * sfv!
'Horizontal (column)
IF ox = ax(p) AND oy = ay(p) THEN
ThetaY! = 0
ELSE
ThetaY! = ATN( (oy - ay(p)) / SQR( (ox - ax(p))^2 + (oy - ay(p))^2 ) )
ThetaY! = CircularFcn(ThetaY!)
END IF
ThetaY! = CircularFcn(ThetaY! + TiltY!)
IF ThetaY! > 3.14159 THEN SignFac! = 1.0 ELSE SignFac! = -1.0
ch! = SignFac! * TAN(ThetaY!) * xw! * sfh!
c = ch! + MidCol
TotGraphRows = ConsRows - 6
'Calculate mid-row for graphics window, then add 5 because window starts at 6
mr! = (TotGraphRows \ 2) + 5
r = mr! - cv!
IF c < 1 THEN c = 1
IF c > ConsCols THEN c = ConsCols
IF r < 6 THEN r = 6
IF r > ConsRows - 1 THEN r = ConsRows - 1
GOTO DefCoordEXIT
ErrorTrap:
LOCATE 10, 30
PRINT "ERROR: DefCoordinates "; ERRCLEAR
LOCATE 11, 30
x$ = WAITKEY$
DefCoordEXIT:
END SUB
SUB DefSwitch (row, tm)
DIM Llitrow(3), Llitcol(3), Llit$(3), Lrow(3), Lcol(3), Llen(3), Led$(3), LContents$(3)
IF Gfx THEN CALL GraphHole(30, row+rowO, 1+colO, row+18+rowO, 80+colO)
CALL Drawfrm(row+rowO, 1+colO, row+17+rowO, 78+colO, defattr, "'" + RTRIM$(Names(tm))+ " Lineup", "ESC (or close window) to Continue", 1, 0, 1)
QPRINTs row+2+rowO, 18+colO, "Change DEFENSIVE POSITIONING in Current Lineup", defattr
DATA 16,35,"",16,37,01,"X "
DATA 16,39,"",16,43,01,"X "
Flds = 2
c = 1
FOR i = 1 TO Flds
Llitrow(i) = VAL(READ$(c)) + row + rowO
Llitcol(i) = VAL(READ$(c+1)) + colO
Llit$(i) = READ$(c+2)
Lrow(i) = VAL(READ$(c+3)) + row + rowO
Lcol(i) = VAL(READ$(c+4)) + colO
Llen(i) = VAL(READ$(c+5))
Led$(i) = READ$(c+6)
c = c + 7
NEXT
DoneSw = FALSE
DO
x$ = " Name Pos Gam Avg AB Hit HR Def Games@Pos"
IF ERRSw(tm) THEN MID$(x$, 40, 3) = "ERR"
QPRINTs row+4+rowO, 3+colO, x$, defattr
FOR j = 1 TO 9
IF DataAB(j, tm) = 0 THEN
BAF! = 0
ELSE
BAF! = DataHits(j, tm) / DataAB(j, tm)
END IF
a$ = SPACE$(75)
MID$(a$, 1, 1) = LFORMAT$(j, "#")
MID$(a$, 3, 13) = DataName(j, tm)
MID$(a$, 17, 2) = Pos(DataPos(j, tm))
MID$(a$, 20, 3) = LFORMAT$(DataGames(j, tm), "###")
MID$(a$, 24, 4) = FFORMAT$(BAF!, ".###")
MID$(a$, 29, 3) = LFORMAT$(DataAB(j, tm), "###")
MID$(a$, 33, 3) = LFORMAT$(DataHits(j, tm), "###")
MID$(a$, 37, 2) = LFORMAT$(DataHR(j, tm), "##")
MID$(a$, 40, 3) = LFORMAT$(DataDef(j, tm), "###")
b$ = ""
FOR k = 1 TO 4
IF DataGByP(j,tm,k) > 0 THEN
b$ = b$ + LFORMAT$(DataGbyP(j,tm,k), "####") + " @"
IF DataPosi(j,tm,k) > 9 THEN
b$ = b$ + "DH"
ELSE
b$ = b$ + LFORMAT$(DataPosi(j,tm,k), "##")
END IF
END IF
NEXT
bl = LEN(b$)
IF bl THEN
MID$(a$, 44, bl) = b$
END IF
QPRINTs row+4+j+rowO, 3+colO, a$, dimattr
NEXT
FOR i = row+5+rowO TO row+13+rowO
CALL ChangeAttribute(i, 19+colO, 2, revattr)
NEXT
QPRINTs row+15+rowO, 9+colO, "Enter the player numbers whose POSITION you want to switch.", defattr
x$ = LPtr$ + "-" + RPtr$
QPRINTs row+16+rowO, 39+colO, x$, defattr
LContents$(1) = " "
LContents$(2) = " "
CursorPtr = 1
DO
TakeFromAnywhere = 1 'Grabs any mouse-clicked character
CALL ScreenIO(Keyed, KeyEsc, 0, KeyEsc, Flds, CursorPtr, Llen(), Lrow(), Lcol(), Led$(), Llit$(), Llitrow(), Llitcol(), LContents$())
TakeFromAnywhere = 0
IF LContents$(1) = " " AND LContents$(2) = " " THEN DoneSw = TRUE: EXIT DO
p1 = VAL(LContents$(1))
p2 = VAL(LContents$(2))
IF p1 > 0 AND p1 <= 9 AND p2 > 0 AND p2 <= 9 THEN
IF p1 = p2 THEN EXIT DO
n1 = 0
n2 = 0
IF DataPos(p1, tm) = 1 THEN
'Can p2 pitch?
SearchName$ = DataName(p2, tm)
n2 = SearchDAT (10, LastPiAd(tm), tm, SearchName$, 0)
IF n2 = 0 THEN
CALL PopMsg(13+rowO, 28+colO, LASTNAME$(SearchName$) + " can't pitch. ", errattr, 2, kc)
EXIT DO
END IF
END IF
IF DataPos(p2, tm) = 1 THEN
'Can p1 pitch?
SearchName$ = DataName(p1, tm)
n1 = SearchDAT (10, LastPiAd(tm), tm, SearchName$, 0)
IF n1 = 0 THEN
CALL PopMsg(13+rowO, 28+colO, LASTNAME$(SearchName$) + " can't pitch. ", errattr, 2, kc)
EXIT DO
END IF
END IF
SWAP DataPos(p1, tm), DataPos(p2, tm)
'Score Card
IF inn > 0 THEN
x$ = "[DEF]" + FLASTNAME$(p1, tm) _
+ " to " + Pos(DataPos(p1, tm))
CALL AddToScoreCrd (0, 0, "X", x$)
x$ = "[DEF]" + FLASTNAME$(p2, tm) _
+ " to " + Pos(DataPos(p2, tm))
CALL AddToScoreCrd (0, 0, "X", x$)
END IF
'Is a pitcher involved?
n = 0
IF DataPos(p1, tm) = 1 THEN
n = n1
p = p1
otherguy = p2
END IF
IF DataPos(p2, tm) = 1 THEN
n = n2
p = p2
otherguy = p1
END IF
IF n THEN
ip = n 'set new IP
ipa(tm) = ip 'store the pitchers address
INCR np(tm) 'add to count of pitchers
iyp(np(tm), tm) = ip 'store pitchers number by order of appearance
nPitch(tm) = 0 'clear pitch count
CALL AssignFatigue (tm)
'Check to see if pitcher has a save situation brewing
DefLead = itruns(tm) - itruns(it)
IF DefLead > 0 THEN
'Faces tying run on-deck
IF DefLead < (NUMBERON + 3) THEN
QualSave1IP = ip
QualSave1ID = tm
END IF
'Has a three-run (or less) lead with nobody on
IF DefLead < 4 AND (NUMBERON = 0) THEN
QualSave2IP = ip
QualSave2ID = tm
END IF
END IF
'For Box Score ??
' CALL AddToRefByBO (p, tm, ip) 'bat position, team, ref
'Score Card
'CALL AddToScoreCrd (it, n, "A", "[Relief]")
x$ = "[Relief]" + FLASTNAME$(ip, tm)
CALL AddToScoreCrd (it, 0, "X", x$)
'Games-Played-By-Position (use normal pitcher ref no)
IF GpPos(n, tm, 1) = 0 THEN GpPos(n, tm, 1) = 1
'Fix: 02/23/05
'Find ex-pitcher's clone and mark as used
SearchName$ = DataName(otherguy, tm)
nc = SearchDAT (LastPiAd(tm)+1, MAXPLAYERS, tm, SearchName$, 0)
IF nc THEN iused(nc, tm) = TRUE
END IF
EXIT DO
END IF
LOOP
LOOP UNTIL DoneSw
IF Gfx THEN CALL EliminateHole(30)
LOCATE 1, 1
END SUB
SUB DefSwitchSetup (kc, Flds, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
rowx = rowO
colx = colO
IF ConsRows > 28 THEN rowx = rowx + 2
CALL GetScreen(Scr1$, 20+rowx, 17+colx, 24+rowx, 66+colx)
CALL DrawFrm(20+rowx, 17+colx, 24+rowx, 66+colx, defattr, nulls$, "ESC:Continue F3:Cancel", 0, 0, 2)
FContents$(1) = "N"
Flds = 1
DATA 22,19,"Want to change defensive positioning? [y/N] ",22,63,01,"X "
c = 1
FOR i = 1 TO Flds
Flitrow(i) = VAL(READ$(c)) + rowx
Flitcol(i) = VAL(READ$(c+1)) + colx
Flit$(i) = READ$(c+2)
Frow(i) = VAL(READ$(c+3)) + rowx
Fcol(i) = VAL(READ$(c+4)) + colx
Flen(i) = VAL(READ$(c+5))
Fed$(i) = READ$(c+6)
c = c + 7
NEXT
CursorPtr = 1
DO
s = defattr
defattr = dimattr
CALL ScreenIO(Keyed, KeyF3, 0, KeyEsc, Flds, CursorPtr, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
defattr = s
ErrorSw$ = "N"
'Cancel
IF Keyed = KeyF3 THEN EXIT DO
IF FContents$(1) <> "Y" AND FContents$(1) <> "N" THEN ErrorSw$ = "Y"
LOOP WHILE ErrorSw$ = "Y"
kc = Keyed
CALL PutScreen(Scr1$, 20+rowx, 17+colx, 24+rowx, 66+colx)
END SUB
SUB DelFrMMList (xS$)
a$ = xS$
i = INSTR(a$, ".")
IF i THEN a$ = LEFT$(a$, i - 1)
a$ = RTRIM$(a$)
Found = FALSE
i = 0
DO
INCR i
IF i > MMx THEN EXIT DO
IF RTRIM$(MMList(i).MMFile) = a$ THEN
FOR j = i + 1 TO MMx
MMList(j - 1) = MMList(j)
NEXT
MMList(MMx).MMFile = nulls$
DECR MMx
EXIT DO
END IF
LOOP
END SUB
SUB Defens (StepThrough)
STATIC xS$, zS$
IF Gfx = FALSE AND (ConsRows = 25 AND ConsCols = 80) THEN
'Bases
xS$ = CHR$(4) 'little diamond
r = MidRow + 8: c = MidCol - 1: GOSUB PRINTIT
r = MidRow : c = MidCol - 1: GOSUB PRINTIT
r = MidRow + 4: c = MidCol + 11: GOSUB PRINTIT
r = MidRow + 4: c = MidCol - 13: GOSUB PRINTIT
'Lower Diamond
xS$ = CHR$(249) ' little dot was 250
r = MidRow + 2: c = MidCol - 19: GOSUB PRINTIT
r = MidRow + 2: c = MidCol + 17: GOSUB PRINTIT
r = MidRow + 1: c = MidCol + 20: GOSUB PRINTIT
'Upper diamond
r = MidRow + 2: c = MidCol - 7: GOSUB PRINTIT
r = MidRow + 2: c = MidCol + 5: GOSUB PRINTIT
'Inf-outf border
r = MidRow + 1: c = MidCol - 15: GOSUB PRINTIT
r = MidRow - 1: c = MidCol - 11: GOSUB PRINTIT
r = MidRow - 2: c = MidCol - 5: GOSUB PRINTIT
r = MidRow - 2: c = MidCol + 3: GOSUB PRINTIT
r = MidRow - 1: c = MidCol + 9: GOSUB PRINTIT
r = MidRow + 1: c = MidCol + 13: GOSUB PRINTIT
'Foul lines
r = MidRow - 3: c = MidCol + 32: GOSUB PRINTIT
r = MidRow - 3: c = MidCol - 34: GOSUB PRINTIT
END IF
'Get rid of old holes/or erase positions
IF Gfx THEN
FOR p = 1 TO 9
CALL EliminateHole(20+p)
NEXT
ELSE
zS$ = SPACE$(11)
FOR p = 2 TO 9
CALL DefCoordinates (p, r, c, ObsD, ObsY, ObsH, ObsTz, ObsTy)
IF r > 0 AND c > 0 THEN
QPRINTs r, c, zS$, fldattr
END IF
NEXT
END IF
'Refresh screen after eliminating the defense
IF DelFac > 0 AND StepThrough > 0 THEN
IF Gfx THEN GfxRefresh 0
CALL Delay(StepThrough/1000.0##)
END IF
IF DelFac = 0 THEN
IF Gfx THEN GfxWindow %GFX_FREEZE
END IF
'Batting order box borders
'Left
b1r1 = ConsRows - 12
b1c1 = 2
b1r2 = b1r1 + 10
b1c2 = 18
'Right
b2r1 = ConsRows - 12
b2c1 = ConsCols - 17
b2r2 = b2r1 + 10
b2c2 = ConsCols - 1
'Left team label:
l1r1 = ConsRows - 14
l1c1 = 4
l1r2 = l1r1
l1c2 = l1c1 + LEN(RTRIM$(Names(1))) - 1
'Right team label:
l2r1 = ConsRows - 14
l2c1 = ConsCols - 15
l2r2 = l2r1
l2c2 = l2c1 + LEN(RTRIM$(Names(2))) - 1
'Stick in the player names
FOR p = 1 TO 9
CALL DefCoordinates (p, r, c, ObsD, ObsY, ObsH, ObsTz, ObsTy)
IF r > 0 AND c > 0 THEN
k = WHOATGUY(p)
xS$ = LASTNAME$(DataName(k, id))
xS$ = LEFT$(xS$, 11)
IF p = 1 THEN GOSUB PitchLabel: b=14 ELSE b=11
w = LEN(xS$)
ce = c + w - 1
cf = ce
ca = 0
cb = 0
'Does any part of the name overlap the batting orders?
'Try left batting order
FOR i = c TO ce
IF Inbox(b1r1, b1c1, b1r2, b1c2, r, i, -1) THEN
IF cb = 0 THEN cb = i
ELSE
IF ca = 0 THEN ca = i
END IF
NEXT
IF cb = 0 THEN
'We didn't clip anything
'Try right batting order
ca = 0
FOR i = c TO ce
IF Inbox(b2r1, b2c1, b2r2, b2c2, r, i, -1) THEN
IF cb = 0 THEN cb = i
ELSE
IF ca = 0 THEN ca = i
END IF
NEXT
END IF
IF cb = 0 THEN
'We still didn't clip anything
'try left team label
ca = 0
FOR i = c TO ce
IF Inbox(l1r1, l1c1, l1r2, l1c2, r, i, -1) THEN
IF cb = 0 THEN cb = i
ELSE
IF ca = 0 THEN ca = i
END IF
NEXT
END IF
IF cb = 0 THEN
'We still didn't clip anything
'try right team label
ca = 0
FOR i = c TO ce
IF Inbox(l2r1, l2c1, l2r2, l2c2, r, i, -1) THEN
IF cb = 0 THEN cb = i
ELSE
IF ca = 0 THEN ca = i
END IF
NEXT
END IF
IF cb = 0 THEN 'we never did clip anything
ca = c
cf = ce
ELSE
IF ca > 0 THEN
IF cb > ca THEN 'clipped on right
xS$ = MID$(xS$, 1, cb-ca)
cf = cb - 1
ELSE 'clipped on left
xS$ = MID$(xS$, ca-c+1)
cf = ce
END IF
END IF
END IF
'Erase
IF Gfx THEN
IF ca THEN CALL GraphHole(20+p, r, ca, r, cf)
ELSE
QPRINTs r, c, SPACE$(b), fldattr
END IF
'Replace by:
IF ca THEN
IF TeamAttr(id) <> 0 THEN kk = TeamAttr(id) ELSE kk = fldattr
QPRINTs r, ca, xS$, kk
END IF
'Map where to put the baserunners on the screen
IF p = 3 THEN BasPatRow(1) = r + 1: BasPatCol(1) = c - 3
IF p = 6 THEN BasPatRow(2) = r + 1: BasPatCol(2) = c + 3
IF p = 5 THEN
IF Gfx = FALSE AND (ConsRows = 25 AND ConsCols = 80) THEN
BasPatRow(3) = r + 1
ELSE
BasPatRow(3) = r + 2
END IF
BasPatCol(3) = c - 2
END IF
IF p = 1 THEN BasPatRow(5) = r + 2: BasPatCol(5) = c
IF DelFac > 0 AND StepThrough > 0 THEN
IF Gfx THEN GfxRefresh 0
CALL Delay(StepThrough/1000.0##)
END IF
END IF
NEXT
IF DelFac = 0 THEN
IF Gfx THEN GfxWindow NOT %GFX_FREEZE
END IF
'Re-do what defense may have overwritten
IF Gfx = FALSE AND (ConsRows = 25 AND ConsCols = 80) THEN
QPRINTs 14+rowO, 33+colO, CHR$(249), fldattr
END IF
GOTO DefensEXIT
PRINTIT:
QPRINTs r, c, xS$, fldattr
RETURN
PitchLabel:
IF UCASE$(DataHand(ip, id)) = "R" THEN
xS$ = "[R]" + xS$
ELSE
xS$ = xS$ + "[L]"
END IF
RETURN
ErrorTrap:
LOCATE 10, 30
PRINT "ERROR: Defens "; ERRCLEAR
LOCATE 11, 30
x$ = WAITKEY$
DefensEXIT:
END SUB
SUB DEFFix(r, c)
IF SCREEN(r, c) = 32 THEN
QPRINTs r, c, CHR$(249), fldattr
END IF
END SUB
SUB DisplayKeysAndEdit (ParentFrame AS BoxType, ChildFrame AS BoxType, myfile$, RecLen, Flds, Fpos(), Flen(), Flitrow(), Flitcol(), Flit$(), Frow(), Fcol(), Fed$())
' Displays list of "keys" in random access file and waits for your pick to edit
'
' row1, etc = screen location of parent "key" window
' recrow1, etc = screen location of child "record" window
'
DIM FirstRecNum(100) '100 pages max
DIM PageRecNum(120) '120 keys on a page max
KeyEsc = 27
KeyRet = 13
KeyRtab = 9
KeyLtab = -15
KeyUp = -72
KeyDown = -80
KeyLeft = -75
KeyRight = -77
KeyBack = 8
KeyIns = -82
KeyDel = -83
KeyPgUp = -73
KeyPgDn = -81
COLOR dimfor, dimbac
pageno = 1
PageKeyPtr = 1
FirstRecNum(1) = 1
IF LEN(DIR$(myfile$)) = 0 THEN
BEEP
FileNum = FREEFILE
OPEN myfile$ FOR BINARY AS FileNum
RecBuff$ = SPACE$(RecLen)
MID$(RecBuff$, 1, 1) = "D"
MID$(RecBuff$, 3, 8) = STRING$(8, 0)
SEEK #FileNum, 1
PUT$ #FileNum, RecBuff$
CLOSE FileNum
END IF
FileNum = FREEFILE
OPEN myfile$ FOR BINARY AS FileNum
'Set KeyPos and KeyLen to first input field
KeyFldNdx = 0
GOSUB FindNextDataField
KeyPos = Fpos(KeyFldNdx)
KeyLen = Flen(KeyFldNdx)
Reentry:
LOCATE 1, 1
CURSOR OFF
NumberOfRecords = LOF(FileNum) \ RecLen
Columns = (ParentFrame.col2 - ParentFrame.col1 - 1) \ (KeyLen + 2)
IF Columns = 0 THEN Columns = 1
KeysInColumn = ParentFrame.row2 - ParentFrame.row1 - 1
PageMaxKeys = KeysInColumn * Columns
RecNumber = FirstRecNum(pageno)
PageKeyCtr = 1
PageFull = False
EofReached = False
DO UNTIL PageFull
'don't read past EoF
IF RecNumber > NumberOfRecords THEN
EofReached = True
PageFull = True
EXIT DO
END IF
SEEK #FileNum, (RecNumber - 1) * RecLen + 1
GET$ #FileNum, RecLen, RecBuff$
'logic to skip records marked delete
DO WHILE MID$(RecBuff$, 1, 1) = "D" AND RecNumber < NumberOfRecords
INCR RecNumber
SEEK #FileNum, (RecNumber - 1) * RecLen + 1
GET$ #FileNum, RecLen, RecBuff$
LOOP
IF RecNumber >= NumberOfRecords AND MID$(RecBuff$, 1, 1) = "D" THEN
EofReached = True
PageFull = True
EXIT DO
END IF
'given a PageKeyCtr, store the relative record number
PageRecNum(PageKeyCtr) = RecNumber - FirstRecNum(pageno) + 1
'figure where to locate
stak = (PageKeyCtr - 1) \ KeysInColumn + 1
c = ParentFrame.col1 + (stak - 1) * (KeyLen + 2) + 2
r = ParentFrame.row1 + PageKeyCtr - (stak - 1) * KeysInColumn
IF PageKeyCtr = PageKeyPtr THEN
attr = revattr
HighLiteR = r: HighLiteC = c
END IF
QPRINTs r, c, MID$(RecBuff$, KeyPos, KeyLen), attr
IF PageKeyCtr = PageKeyPtr THEN attr = dimattr
INCR PageKeyCtr
INCR RecNumber
IF PageKeyCtr > PageMaxKeys THEN PageFull = True
LOOP
'Wait for arrow keys / insert / esc / PageUp / PageDown / Enter
DO
mous = 0
msx = 0
msy = 0
KyS$ = WAITKEY$
s% = INSHIFT
IF LEN(KyS$) = 1 THEN
kc = ASC(KyS$)
KyS$ = UCASE$(KyS$)
ELSEIF LEN(KyS$) = 2 THEN
kc = -ASC(RIGHT$(KyS$, 1))
ELSEIF LEN(KyS$) = 4 THEN
IF ASC(KyS$, 3) = 2 THEN
DoubleClick = TRUE
ELSE
DoubleClick = FALSE
END IF
mous = TRUE
msx = MOUSEX
msy = MOUSEY
ms$ = CHR$(SCREEN(msy, msx))
IF ms$ = CHR$(249) THEN
kc = 27
ELSEIF ms$ = CloseButton$ THEN
kc = 13
ELSEIF msx > ParentFrame.col1 AND msx < ParentFrame.col2 AND msy > ParentFrame.row1 AND msy < ParentFrame.row2 THEN
'INSIDE frame
IF NumberOfRecords > 0 THEN
'Determine PageItemPtr
PageKeyPtr = msy - ParentFrame.row1 + INT((msx - ParentFrame.col1 - 2) / (KeyLen + 2)) * KeysInColumn
IF PageKeyPtr < 1 THEN PageKeyPtr = 1
IF PageKeyPtr > PageKeyCtr - 1 THEN PageKeyPtr = PageKeyCtr - 1
GOSUB MoveHighLight
IF DoubleClick THEN
kc = 13
ELSE
GOTO ContinueLoop
END IF
ELSE
GOTO ContinueLoop
END IF
ELSEIF msx < ParentFrame.col1 OR msx > ParentFrame.col2 OR msy < ParentFrame.row1 OR msy > ParentFrame.row2 THEN
'OUTSIDE the frame - ESC
kc = 27
ELSE
'ON the frame
SELECT CASE ms$
CASE DnPtr$
kc = -81
CASE UpPtr$
kc = -73
CASE ELSE
kc = 27
END SELECT
END IF
END IF
IF kc = KeyUp THEN
IF PageKeyPtr > 1 THEN
DECR PageKeyPtr
GOSUB MoveHighlight
GOTO ContinueLoop
END IF
END IF
IF kc = KeyDown THEN
IF PageKeyPtr < PageKeyCtr - 1 THEN
INCR PageKeyPtr
GOSUB MoveHighlight
GOTO ContinueLoop
END IF
END IF
IF kc = KeyLeft THEN
IF PageKeyPtr > KeysInColumn THEN
PageKeyPtr = PageKeyPtr - KeysInColumn
GOSUB MoveHighlight
GOTO ContinueLoop
END IF
END IF
IF kc = KeyRight THEN
IF PageKeyPtr + KeysInColumn < PageKeyCtr THEN
PageKeyPtr = PageKeyPtr + KeysInColumn
GOSUB MoveHighlight
GOTO ContinueLoop
END IF
END IF
IF kc = KeyPgUp THEN
IF pageno > 1 THEN DECR pageno
PageKeyPtr = 1
GOTO Reentry
END IF
IF kc = KeyPgDn AND EofReached = False THEN
INCR pageno
FirstRecNum(pageno) = RecNumber
PageKeyPtr = 1
GOSUB BlankScreen
GOTO Reentry
END IF
IF kc = KeyRet OR kc = KeyIns THEN
CALL GetScreen (ScrBuf$, ChildFrame.row1, ChildFrame.col1,ChildFrame.row2 + 1, ChildFrame.col2 + 2)
CALL Drawfrm(ChildFrame.row1, ChildFrame.col1, ChildFrame.row2, ChildFrame.col2, defattr, "", "Hit ESC When Done", 1, 0, 1)
IF kc = KeyIns THEN
RecNum = 0
ELSE
RecNum = FirstRecNum(pageno) + PageRecNum(PageKeyPtr) - 1
END IF
CLOSE FileNum
CALL EditRandomRec(myfile$, RecNum, RecLen, Flds, Fpos(), Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol())
COLOR dimfor, dimbac
CALL PutScreen (ScrBuf$, ChildFrame.row1, ChildFrame.col1, ChildFrame.row2 + 1, ChildFrame.col2 + 2)
OPEN myfile$ FOR BINARY AS FileNum
GOTO Reentry
END IF
IF kc = KeyF2 THEN
CLOSE FileNum
beg = 3 'KeyPos
leng = 8 'KeyLen
CALL QSortRand(myfile$, FileNum, RecLen, beg, leng, "A")
OPEN myfile$ FOR BINARY AS FileNum
GOTO Reentry
END IF
IF kc = KeyDel THEN
QPRINTs ParentFrame.row2, 5, "[ Are you sure? Y/N ]", defattr
x$ = WAITKEY$
QPRINTs ParentFrame.row2, 5, STRING$( 21, CHR$(196)), defattr
IF UCASE$(x$) <> "Y" THEN
GOTO ContinueLoop
ELSE
RecNum = FirstRecNum(pageno) + PageRecNum(PageKeyPtr) - 1
SEEK #FileNum, (RecNum - 1) * RecLen + 1
GET$ #FileNum, RecLen, RecBuff$
MID$(RecBuff$, 1, 1) = "D"
SEEK #FileNum, (RecNum - 1) * RecLen + 1
PUT$ #FileNum, RecBuff$
GOSUB BlankScreen
GOTO Reentry
END IF
END IF
ContinueLoop:
LOOP WHILE kc <> KeyEsc
GOTO DisplayKeysExit
FindNextDataField:
i = KeyFldNdx + 1
IF i > Flds THEN i = 1
DO WHILE Frow(i) = 0 OR Fcol(i) = 0
INCR i
IF i > Flds THEN i = 1
LOOP
KeyFldNdx = i
RETURN
MoveHighlight:
CALL ChangeAttribute(HighLiteR, HighLiteC, KeyLen, dimattr)
stak = (PageKeyPtr - 1) \ KeysInColumn + 1
c = ParentFrame.col1 + (stak - 1) * (KeyLen + 2) + 2
r = ParentFrame.row1 + PageKeyPtr - (stak - 1) * KeysInColumn
CALL ChangeAttribute(r, c, KeyLen, revattr)
HighLiteR = r: HighLiteC = c
RETURN
BlankScreen:
BlankLine$ = STRING$(ParentFrame.col2 - ParentFrame.col1 - 1, " ")
c = ParentFrame.col1 + 1
FOR r = ParentFrame.row1 + 1 TO ParentFrame.row2 - 1
QPRINTs r, c, BlankLine$, dimattr
NEXT
RETURN
DisplayKeysExit:
CLOSE FileNum
END SUB
SUB Drawfrm (row1, col1, row2, col2, attr, TopLiteral$, BotLiteral$, Shadow, Style, ESCPoint)
IF ConsRows = 25 THEN BeginBuffer
CBl$ = " "
IF style = 0 THEN 'single lines
Cul$ = CHR$(218)
Cho$ = CHR$(196)
Cur$ = CHR$(191)
Cmr$ = CHR$(180)
Cml$ = CHR$(195)
Cv0$ = CHR$(179)
Cll$ = CHR$(192)
Clr$ = CHR$(217)
Clo$ = CHR$(180) + CloseButton$ + CHR$(195)
CloCan$ = CHR$(180) + CloseButton$ + CHR$(179) + CHR$(249) + CHR$(195)
ELSE
Cul$ = CHR$(201)
Cho$ = CHR$(205)
Cur$ = CHR$(187)
Cmr$ = CHR$(181)
Cml$ = CHR$(198)
Cv0$ = CHR$(186)
Cll$ = CHR$(200)
Clr$ = CHR$(188)
Clo$ = CHR$(181) + CloseButton$ + CHR$(198)
CloCan$ = CHR$(181) + CloseButton$ + CHR$(179) + CHR$(249) + CHR$(198)
END IF
IF ESCPoint = 1 THEN
xS$ = Cul$ + Clo$ + STRING$(col2 - col1 - 4, Cho$) + Cur$
ELSEIF ESCPoint = 2 THEN
xS$ = Cul$ + CloCan$ + STRING$(col2 - col1 - 6, Cho$) + Cur$
ELSE
xS$ = Cul$ + STRING$(col2 - col1 - 1, Cho$) + Cur$
END IF
QPRINTs row1, col1, xS$, attr
c = (col1 + col2) \ 2 - LEN(TopLiteral$) \ 2 - 1
IF LEN(TopLiteral$) THEN
x$ = Cmr$ + TopLiteral$ + Cml$
QPRINTs row1, c, x$, attr
END IF
xS$ = Cv0$ + STRING$(col2 - col1 - 1, CBl$) + Cv0$
FOR r = row1 + 1 TO row2 - 1
QPRINTs r, col1, xS$, attr
NEXT
xS$ = Cll$ + STRING$(col2 - col1 - 1, Cho$) + Clr$
QPRINTs row2, col1, xS$, attr
c = (col1 + col2) \ 2 - LEN(BotLiteral$) \ 2 - 1
IF LEN(BotLiteral$) THEN
x$ = Cmr$ + BotLiteral$ + Cml$
QPRINTs row2, c, x$, attr
END IF
IF Shadow THEN
attr2 = 8
'Verticle shadow on right side of frame
c = col2 + 1
FOR r = row1 + 1 TO row2
QPRINTs r, c, CHR$(SCREEN(r, c)), 8
QPRINTs r, c+1, CHR$(SCREEN(r, c+1)), 8
NEXT
IF ConsRows = 25 THEN EndBuffer 'Have to end buffer before a "color" statement
'Horizontal shadow underneath frame
leng = col2 - col1 + 1
LOCATE row2 + 1, col1 + 2
COLOR 8, 0, leng
'Another Horizontal method
' CALL ChangeAttribute (row2+1, col1+2, col2-col1+1, attr2)
ELSE
IF ConsRows = 25 THEN EndBuffer 'Have to end buffer before a "color" statement
END IF
END SUB
SUB DoubleRoutine
IF NOT Errorx THEN
ppF! = FindPP!
WhoAtPos = OUTFIELDWHOAT (ppF!)
wag = WHOATGUY (WhoAtPos)
IF DelFac THEN
x! = RND
IF WhoAtPos = 8 THEN
i = RND(1, 3)
ELSEIF WhoAtPos = 7 THEN
IF x! < .33 THEN
i = 1
ELSEIF x! < .67 THEN
i = 3
ELSE
i = 4
END IF
ELSE '9
IF x! < .33 THEN
i = 1
ELSEIF x! < .67 THEN
i = 2
ELSE
i = 4
END IF
END IF
t$ = LTRIM$(STR$(i))
t$ = PADZEROS$(t$, 2)
CALL Msg ("11", "0", "1", t$, 0, it, man2, team2) 'long drive
IF t$ <> "04" THEN m = wag: n = id ELSE m = ib: n = it
CALL Msg ("11", "0", "2", t$, m, n, man2, team2) '* going back
IF t$ = "01" THEN m = wag: n = id ELSE m = ib: n = it
CALL Msg ("11", "0", "3", t$, m, n, man2, team2) '* around 1st
END IF
END IF
IF DelFac THEN
IF SoundOn THEN CALL WavRegularHit
END IF
'Advance runners (Default)
ii = 2 'bases to advance runner on 1st
jj = 2 'bases to advance runner on 2nd
ThrowOutChance1 = 0
Gamble = 0
IF HitAndRun THEN ii = 3: GOTO DoubleTOCheck
IF ir1 THEN
'Safe% 1st-Home
'
'Sp 0/1out 2out
'
' 1 54 68
' 2 58 72
' 3 62 76
' 4 66 80
' 5 70 84
' 6 74 88
' 7 78 92
' 8 82 96
' 9 86 98
IF iout = 2 THEN i = 14 ELSE i = 0
n = 4 * DataSpeed(ir1, it) + 52 + i '4.6
IF WhoAtPos = 7 THEN i = -4
IF WhoAtPos = 8 THEN i = 0
IF WhoAtPos = 9 THEN i = -4
n = n + i
n = n + (9 - FRND(15)) '+/- 8
IF n > 98 THEN n = 98
IF amgr(it) = 0 AND AutoCoach = 0 THEN
CALL PostAnnouncer (TRUE, FALSE)
ANx = 0
SLEEP 2000
x$ = " Score runner from 1st? [y/N] (" + LFORMAT$(n, "##") + "%)"
CALL PopMsg(10+rowO, 22+colO, x$, errattr, 0, kc)
IF UCASE$(CHR$(kc)) = "Y" THEN
ii = 3
ThrowOutChance1 = 100 - n
END IF
ELSE
'AutoCoach
IF iout = 0 THEN SucLim = 85 '92
IF iout = 1 THEN SucLim = 72 '76
IF iout = 2 THEN SucLim = 60 '70
IF iout = 2 THEN
RunsBehind = itruns(id) - itruns(it)
IF ir3 <> 0 AND ir2 <> 0 THEN
a = 3
ELSEIF ir3 <> 0 OR ir2 <> 0 THEN
a = 2
ELSE
a = 1
END IF
IF RunsBehind = a OR RunsBehind = (a - 1) THEN
SucLim = 50
END IF
END IF
IF n >= SucLim THEN
ii = 3
ThrowOutChance1 = 100 - n
IF SucLim = 50 AND n < 80 THEN
Gamble = TRUE
END IF
END IF
END IF
END IF
DoubleTOCheck:
IF DelFac THEN
IF ir3 > 0 THEN CALL AnnScoring(ir3)
IF ir2 > 0 THEN CALL AnnScoring(ir2)
IF Gamble THEN
xS$ = "They'll try to score " + LASTNAME$(DataName(ir1, it)) + "..."
CALL AddToAnnouncer (it, xS$)
END IF
END IF
IF ir1 THEN CALL ThrowOutCheck (ii, jj, ThrowOutChance1, 0, 0, 0)
CALL Advanc(ii, jj, 1)
IF DelFac THEN
IF NOT Errorx THEN CALL Msg ("11", "0", "4", t$, ib, it, man2, team2) 'double for *
END IF
IF ref2 THEN INCR iout 'Anybody get thrown out?
ir2 = ib
mpp(ib) = ip
IF Errorx THEN
mpp(ib) = -mpp(ib)
EXIT SUB
END IF
CALL CreditHit
INCR m2b(ref, it)
IF UCASE$(DataHand(ip, id)) = "L" THEN
INCR m2bLHP(ref, it)
ELSE
INCR m2bRHP(ref, it)
END IF
INCR mp2b(ip, id)
Result$ = "2B"
IF ref2 THEN EXIT SUB
'Outfielder Error?
CALL Outfield (WhoAtPos)
'Gamble to stretch double into a triple?
IF OutFErr = FALSE THEN
IF iout < 2 AND amgr(it) = 0 AND AutoCoach = 0 THEN
IF ir2 = ib AND ir3 = 0 THEN
'criteria to gamble
RunsBehind = itruns(id) - itruns(it)
IF inn > (RegInns - 4) AND (RunsBehind = 1 OR RunsBehind = 0) THEN
CALL PostAnnouncer (TRUE, FALSE)
ANx = 0
SLEEP 1500
r = 10+rowO
c = 23+colO
n = 5 * DataSpeed(ir2, it) + 30
x$ = " Stretch hit to a triple? [y/N] (" + LFORMAT$(n, "##") + "%)"
CALL PopMsg(r, c, x$, errattr, 0, kc)
IF UCASE$(CHR$(kc)) = "Y" THEN
IF DelFac THEN CALL Msg ("31", "0", "0", "10", ir2, it, man2, team2)
'He's going to try for third!"
IF DelFac THEN CALL Msg ("31", "0", "0", "06", ir2, it, man2, team2)
' He slides...
IF RND < (n / 100) THEN
'Made it!
'Take back his "2b" credits
DECR m2b(ref, it)
IF UCASE$(DataHand(ip, id)) = "L" THEN
DECR m2bLHP(ref, it)
ELSE
DECR m2bRHP(ref, it)
END IF
DECR mp2b(ip, id)
'Credit for triple instead
INCR m3b(ref, it)
IF UCASE$(DataHand(ip, id)) = "L" THEN
INCR m3bLHP(ref, it)
ELSE
INCR m3bRHP(ref, it)
END IF
INCR mp3b(ip, id)
Result$ = "3B"
ir3 = ib
ir2 = 0
IF DelFac THEN CALL Msg ("15", "0", "0", "09", ir3, it, man2, team2)
'Safe
IF DelFac THEN CALL Msg ("31", "0", "0", "11", ir3, it, man2, team2)
'Gamble pays off!
ELSE
'Didn't make it
INCR mpo(ip, id)
IF DelFac THEN CALL Msg ("14", "0", "0", "03", ir1, it, man2, team2)
'OUT! The gamble failed.
ref2 = DataRef(ir2, it)
'Result2$ = "X-@3rd"
INCR Assists(DataRef(WHOATGUY(WhoAtPos), id), id, WhoAtPos)
m = 5 'who took throw?
INCR PutOuts(DataRef(WHOATGUY(m), id), id, m)
Result2$ = LTRIM$(STR$(WhoAtPos)) + "-" + LTRIM$(STR$(m))
Code2$ = "3"
ir2 = 0
INCR iout
END IF
END IF
END IF
END IF
END IF
END IF
END SUB
SUB DoubleSwitch (DidIt, inplayer, outplayer) STATIC
'I am the defense's manager
'I have just brought in a relief pitcher
'Do I want to double-switch?
DidIt = FALSE
IF dh THEN EXIT SUB
'Find my pitcher's batting slot on offense
ps = 0
DO
INCR ps
IF ps > 9 THEN
x$ = "ERROR(DoubleSwitch): No Pitcher Found in Lineup"
x$ = x$ + "|" + DataFil(id)
CALL ErrorBox (x$)
END IF
LOOP UNTIL DataPos(ps, id) = 1
psOrg = ps
'Who is due up when we bat?
DueUp = ibp(id) + 1
IF DueUp = 10 THEN DueUp = 1
'Is my reliever scheduled to bat among the first three batters next inning?
PitcherBatsNextInning = FALSE
p = DueUp
FOR i = 0 TO 2
IF p = psOrg THEN PitcherBatsNextInning = TRUE: EXIT FOR
INCR p
IF p > 9 THEN p = 1
NEXT
IF NOT PitcherBatsNextInning THEN EXIT SUB
'Find previous three batting slots PRIOR to the guy due up
REDIM Player(3)
p = DueUp - 1
FOR i = 1 TO 3
IF p < 1 THEN p = 9
Player(i) = p
DECR p
NEXT
'For each of these three players, compute OPS and compare to bench
'players who can play his position
SmallestDiff! = 999.
L1 = 0
FOR pp = 1 TO 3
p = Player(pp)
PlayerOPS! = CalcOPS!(p, id)
PlayerPos = DataPos(p, id)
'Get list of n unused players on bench who can play "PlayerPos" on defense
'Build DefList(n)
GOSUB BuildList
FOR i = 1 TO n
b = DefList(i)
SubOPS! = CalcOPS!(b, id)
'Randomize this so we don't pick the same guy every time
x! = (6 - FRND(11)) / 50 ' -.1 to +.1
SubOPS! = SubOPS! + x!
Diff! = PlayerOPS! - SubOPS!
IF Diff! < SmallestDiff! THEN
SmallestDiff! = Diff!
L1 = p 'Guy in lineup now
L2 = b 'Guy on bench
OPOS = PlayerPos
END IF
NEXT
NEXT
'If for some reason we didn't find anyone - get out
IF L1 = 0 THEN EXIT SUB
'Swap Bench player into slot L1
x$ = "[SUB]" + FLASTNAME$(L2, id) + "(" + RTRIM$(Pos(OPOS)) _
+ ") for " + FLASTNAME$(L1, id)
CALL AddToScoreCrd (0, 0, "X", x$)
CALL Switch(L1, L2, id)
'Mark bench spot L2 as used
iused(L2, id) = TRUE
'Put new guy in right defensive position
DataPos(L1, id) = OPOS
'Swap Pitcher into slot L1 - player into slot psOrg
CALL Switch(L1, psOrg, id)
'Remove new pitcher from the slot he was in before we swapped
'in the RefByBO list. I.E. Remove DataRef(L1, id) from slot psOrg
LL = LEN(RefByBO(psOrg, id))
IF LL > 2 THEN
RefByBO(psOrg, id) = LEFT$(RefByBO(psOrg, id), LL-2)
ELSE
RefByBO(psOrg, id) = nulls$
END IF
CALL AddToRefByBO (psOrg, id, DataRef(psOrg, id)) 'Player in slot psOrg
CALL AddToRefByBO (L1, id, DataRef(L1, id)) 'Pitcher in slot L1
x$ = "[DBL-SW]" + FLASTNAME$(psOrg, id) + " bats #" + LTRIM$(STR$(psOrg))
CALL AddToScoreCrd (0, 0, "X", x$)
x$ = " " + FLASTNAME$(L1, id) + " bats #" + LTRIM$(STR$(L1))
CALL AddToScoreCrd (0, 0, "X", x$)
DidIt = TRUE
inplayer = psOrg
outplayer = L2
EXIT SUB
BuildList:
REDIM DefList(20)
n = 0
k = PlayerPos
FOR j = LastPiAd(id) + 1 TO MAXPLAYERS
IF iused(j, id) = 0 AND DataName(j, id) > "!" THEN
'Can the sub guy (j) play position (k)?
OK = FALSE
'Are we playing "strict" or "loose"?
IF DataPosi(j, id, 1) > 0 THEN 'Strict
IF FoundPosition (k, j, id) THEN
OK = TRUE
END IF
ELSE
subdefPos = DataPos(j, id)
SELECT CASE k
CASE 2
IF subdefPos = 2 THEN OK = TRUE
CASE 3
IF subdefPos = 3 OR subdefPos = 5 THEN OK = TRUE
CASE 4
IF subdefPos = 4 OR subdefPos = 6 THEN OK = TRUE
CASE 5
IF subdefPos = 5 OR subdefPos = 6 THEN OK = TRUE
CASE 6
IF subdefPos = 6 THEN OK = TRUE
CASE 7, 8, 9
IF subdefPos = 7 OR subdefPos = 8 OR subdefPos = 9 THEN OK = TRUE
END SELECT
END IF
'Is the candidate's name identical to current or used pitcher?
FOR i = 1 TO np(id)
IF DataName(j, id) = DataName(iyp(i,id), id) THEN OK = FALSE
NEXT
IF OK THEN
IF n < 20 THEN
INCR n
DefList(n) = j
END IF
END IF
END IF
NEXT
RETURN
END SUB
SUB DumpList (List1() AS List1Type, ItemsInList, OutDevice$, ExtendIt)
'Dump a typed string array to Printer or File
IF OutDevice$ < "!" THEN EXIT SUB
IF LEFT$(OutDevice$, 3) = "LPT" THEN
OPEN "~LIST.TMP" FOR OUTPUT AS #20
ELSE
IF ExtendIt THEN
OPEN OutDevice$ FOR APPEND AS #20
ELSE
OPEN OutDevice$ FOR OUTPUT AS #20
END IF
END IF
PRINT #20, " "
PRINT #20, DATE$; " "; TIME$;
PRINT #20, " #"; SimGameCtr + 1;
PRINT #20, STRING$(41, "-");
IF LEN(SCHDate$) THEN
PRINT #20, " "; SCHDate$
ELSE
PRINT #20, STRING$(10, "-"); " "
END IF
FOR i = 1 TO ItemsInList
xS$ = RTRIM$(List1(i).ListItem)
IF LEFT$(xS$, 1) = "~" THEN
PRINT #20, MID$(xS$, 2)
ELSE
PRINT #20, xS$
END IF
NEXT
CLOSE #20
IF LEFT$(OutDevice$, 3) <> "LPT" THEN EXIT SUB
'Print Selected
CALL PopMsg(13+rowO, 30+colO, "Launching WORDPAD.", errattr, 1, kc2)
'Launch WordPad
SHELL WordPadSpec$ + " ~LIST.TMP"
END SUB
SUB EditRA(myfile$)
'TYPE BoxType
' row1 as long
' col1 as long
' row2 as long
' col2 as long
'END TYPE
DIM ParentFrame AS BoxType
DIM ChildFrame AS BoxType
DIM Flit$(63)
DIM Flitrow(63) AS LONG
DIM Flitcol(63) AS LONG
DIM Frow(63) AS LONG
DIM Fcol(63) AS LONG
DIM Fed$(63)
DIM Flen(63) AS LONG
DIM FPos(63) AS LONG
myfile$ = RTRIM$(myfile$)
FileNum = FREEFILE
OPEN myfile$ FOR BINARY AS FileNum
L& = LOF(FileNum)
CLOSE FileNum
IF L& = 0 THEN KILL file$
IF (L& MOD 430 = 0) OR (L& = 0) THEN
RecLen = 430
Flds = 62
'Parent Frame:
ParentFrame.row1 = 5
ParentFrame.col1 = 4
ParentFrame.row2 = 21
ParentFrame.col2 = 76
'Child Frame:
ChildFrame.row1 = 4
ChildFrame.col1 = 20
ChildFrame.row2 = 22
ChildFrame.col2 = 57
ELSE
RecLen = 210
Flds = 30
'Parent Frame:
ParentFrame.row1 = 5
ParentFrame.col1 = 2
ParentFrame.row2 = 21
ParentFrame.col2 = 76
'Child Frame:
ChildFrame.row1 = 4
ChildFrame.col1 = 20
ChildFrame.row2 = 18
ChildFrame.col2 = 57
END IF
c = 1
FOR i = 1 TO Flds
Flit$(i) = READ$(c)
Flitrow(i) = VAL(READ$(c+1))
Flitcol(i) = VAL(READ$(c+2))
Frow(i) = VAL(READ$(c+3))
Fcol(i) = VAL(READ$(c+4))
Fed$(i) = READ$(c+5)
Flen(i) = VAL(READ$(c+6))
FPos(i) = VAL(READ$(c+7))
c = c + 8
NEXT
DATA "Date:", 05, 22, 05, 28, " X", 08, 03
DATA "Options:", 06, 43, 00, 00, " ", 00, 00
DATA "", 00, 00, 07, 22, " X", 08, 11
DATA "AT", 07, 31, 00, 00, " ", 00, 00
DATA "", 00, 00, 07, 34, " X", 08, 19
DATA "", 00, 00, 07, 43, " X", 12, 27
DATA "", 00, 00, 08, 22, " X", 08, 39
DATA "AT", 08, 31, 00, 00, " ", 00, 00
DATA "", 00, 00, 08, 34, " X", 08, 47
DATA "", 00, 00, 08, 43, " X", 12, 55
DATA "", 00, 00, 09, 22, " X", 08, 67
DATA "AT", 09, 31, 00, 00, " ", 00, 00
DATA "", 00, 00, 09, 34, " X", 08, 75
DATA "", 00, 00, 09, 43, " X", 12, 83
DATA "", 00, 00, 10, 22, " X", 08, 95
DATA "AT", 10, 31, 00, 00, " ", 00, 00
DATA "", 00, 00, 10, 34, " X", 08, 103
DATA "", 00, 00, 10, 43, " X", 12, 111
DATA "", 00, 00, 11, 22, " X", 08, 123
DATA "AT", 11, 31, 00, 00, " ", 00, 00
DATA "", 00, 00, 11, 34, " X", 08, 131
DATA "", 00, 00, 11, 43, " X", 12, 139
DATA "", 00, 00, 12, 22, " X", 08, 151
DATA "AT", 12, 31, 00, 00, " ", 00, 00
DATA "", 00, 00, 12, 34, " X", 08, 159
DATA "", 00, 00, 12, 43, " X", 12, 167
DATA "", 00, 00, 13, 22, " X", 08, 179
DATA "AT", 13, 31, 00, 00, " ", 00, 00
DATA "", 00, 00, 13, 34, " X", 08, 187
DATA "", 00, 00, 13, 43, " X", 12, 195
DATA "", 00, 00, 14, 22, " X", 08, 207
DATA "AT", 14, 31, 00, 00, " ", 00, 00
DATA "", 00, 00, 14, 34, " X", 08, 215
DATA "", 00, 00, 14, 43, " X", 12, 223
DATA "", 00, 00, 15, 22, " X", 08, 235
DATA "AT", 15, 31, 00, 00, " ", 00, 00
DATA "", 00, 00, 15, 34, " X", 08, 243
DATA "", 00, 00, 15, 43, " X", 12, 251
DATA "", 00, 00, 16, 22, " X", 08, 263
DATA "AT", 16, 31, 00, 00, " ", 00, 00
DATA "", 00, 00, 16, 34, " X", 08, 271
DATA "", 00, 00, 16, 43, " X", 12, 279
DATA "", 00, 00, 17, 22, " X", 08, 291
DATA "AT", 17, 31, 00, 00, " ", 00, 00
DATA "", 00, 00, 17, 34, " X", 08, 299
DATA "", 00, 00, 17, 43, " X", 12, 307
DATA "", 00, 00, 18, 22, " X", 08, 319
DATA "AT", 18, 31, 00, 00, " ", 00, 00
DATA "", 00, 00, 18, 34, " X", 08, 327
DATA "", 00, 00, 18, 43, " X", 12, 335
DATA "", 00, 00, 19, 22, " X", 08, 347
DATA "AT", 19, 31, 00, 00, " ", 00, 00
DATA "", 00, 00, 19, 34, " X", 08, 355
DATA "", 00, 00, 19, 43, " X", 12, 363
DATA "", 00, 00, 20, 22, " X", 08, 375
DATA "AT", 20, 31, 00, 00, " ", 00, 00
DATA "", 00, 00, 20, 34, " X", 08, 383
DATA "", 00, 00, 20, 43, " X", 12, 391
DATA "", 00, 00, 21, 22, " X", 08, 403
DATA "AT", 21, 31, 00, 00, " ", 00, 00
DATA "", 00, 00, 21, 34, " X", 08, 411
DATA "", 00, 00, 21, 43, " X", 12, 419
TopLiteral$ = "Highlight Record F2=Sort By Date"
BotLiteral$ = "Hit <" + CHR$(196) + CHR$(217) + ", Ins, or ESC"
FrameStyle = 0
CALL Drawfrm(ParentFrame.row1, ParentFrame.col1, ParentFrame.row2, ParentFrame.col2, defattr, TopLiteral$, BotLiteral$, 1, FrameStyle, 2)
IF FrameStyle = 0 THEN x1$ = CHR$(193): x2$ = CHR$(194) ELSE x1$ = CHR$(207): x2$ = CHR$(209)
r = 11
QPRINTs r, ParentFrame.col2, x1$, defattr
QPRINTs r + 1, ParentFrame.col2, UpPtr$, defattr
QPRINTs r + 2, ParentFrame.col2, DnPtr$, defattr
QPRINTs r + 3, ParentFrame.col2, x2$, defattr
CALL DisplayKeysAndEdit(ParentFrame, ChildFrame, myfile$, RecLen, Flds, Fpos(), Flen(), Flitrow(), Flitcol(), Flit$(), Frow(), Fcol(), Fed$())
END SUB
SUB EditRandomRec (myfile$, RecNum, RecLen, Flds, Fpos(), Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol())
KeyEsc = 27
KeyRet = 13
KeyRtab = 9
KeyLtab = -15
KeyUp = -72
KeyDown = -80
KeyLeft = -75
KeyRight = -77
KeyBack = 8
KeyIns = -82
KeyDel = -83
KeyPgUp = -73
KeyPgDn = -81
COLOR dimfor, dimbac
FileNum = FREEFILE
OPEN myfile$ FOR BINARY AS FileNum
NumberOfRecords = LOF(FileNum) \ RecLen
IF RecNum <> 0 THEN
' LOCATE 24, 2: PRINT "Records: "; NumberOfRecords;
' Don't read past EoF!
IF RecNum > NumberOfRecords THEN
BEEP
GOTO EditRandRecExit
END IF
SEEK #FileNum, (RecNum - 1) * RecLen + 1
GET$ #FileNum, RecLen, RecBuff$
' Print field literals and field values
FOR i = 1 TO Flds
IF Flitrow(i) > 0 AND Flitrow(i) < 26 AND Flitcol(i) > 0 AND Flitcol(i) < 80 THEN
QPRINTs Flitrow(i), Flitcol(i), Flit$(i), dimattr
END IF
IF Frow(i) > 0 AND Frow(i) < 26 AND Fcol(i) > 0 AND Fcol(i) < 80 THEN
QPRINTs Frow(i), Fcol(i), MID$(RecBuff$, Fpos(i), Flen(i)), revattr
END IF
NEXT
ELSE ' add a new record
' Add blank record at EoF
RecBuff$ = STRING$(RecLen, " ")
NumberOfRecords = NumberOfRecords + 1
RecNum = NumberOfRecords
SEEK #FileNum, (RecNum - 1) * RecLen + 1
PUT$ #FileNum, RecBuff$
' Print field literals and blanks
FOR i = 1 TO Flds
IF Flitrow(i) > 0 AND Flitrow(i) < 26 AND Flitcol(i) > 0 AND Flitcol(i) < 80 THEN
QPRINTs Flitrow(i), Flitcol(i), Flit$(i), dimattr
END IF
IF Frow(i) > 0 AND Frow(i) < 26 AND Fcol(i) > 0 AND Fcol(i) < 80 THEN
QPRINTs Frow(i), Fcol(i), STRING$(Flen(i), " "), revattr
END IF
NEXT
END IF
FldPtr = 0
GOSUB AdvanceField
LOCATE Frow(FldPtr), Fcol(FldPtr)
CsrSize = 100
CURSOR ON, CsrSize
InsToggle = FALSE
' problem: you can never escape if you put your cursor in
' a field that edits to an error unless you fix it.
' only way to fix: remove esc from making changes to record
' so now you must hit return in order to take the update
COLOR revfor, revbac
DO
ScanInput:
msx = 0
msy = 0
KyS$ = WAITKEY$
s% = INSHIFT
IF LEN(KyS$) = 1 THEN
kc = ASC(KyS$)
ELSEIF LEN(KyS$) = 2 THEN
kc = -ASC(RIGHT$(KyS$, 1))
ELSEIF LEN(KyS$) = 4 THEN
IF ASC(KyS$, 3) = 2 THEN
DoubleClick = TRUE
ELSE
DoubleClick = FALSE
END IF
msx = MOUSEX
msy = MOUSEY
IF CHR$(SCREEN(msy, msx)) = CloseButton$ THEN 'ESC button (but accept input)
kc = KeyEsc
END IF
IF CHR$(SCREEN(msy, msx)) = CHR$(249) THEN 'Abort button
kc = KeyEsc
EXIT DO
END IF
'Did we click in an input field?
FOR i = 1 TO Flds
IF Frow(i) > 0 AND Fcol(i) > 0 AND Flen(i) > 0 THEN
IF msx >= Fcol(i) AND msx < Fcol(i) + Flen(i) AND msy = Frow(i) THEN
'Process field at old location
CALL ReadFromScreen (Frow(FldPtr), Fcol(FldPtr), Flen(FldPtr), field$, Fed$(FldPtr), valid$)
IF valid$ = "Y" THEN
MID$(RecBuff$, Fpos(FldPtr), Flen(FldPtr)) = field$
FldPtr = i
LOCATE msy, msx 'FRow(FldPtr), Fcol(FldPtr)
ELSE
LOCATE msy, msx 'FRow(FldPtr), Fcol(FldPtr)
BEEP
END IF
GOTO ScanInput
END IF
END IF
NEXT
END IF
IF kc = 9 AND s% = 48 THEN kc = KeyLtab 'Support Shift-Tab
KyS$ = UCASE$(KyS$)
Recycle:
IF kc = KeyEsc OR kc = KeyRet OR kc = KeyRtab OR kc = KeyDown OR (CURSORX = Fcol(FldPtr) + Flen(FldPtr)) THEN
' Escape or C/R or right tab or cursor reached end-of-field
CALL ReadFromScreen (Frow(FldPtr), Fcol(FldPtr), Flen(FldPtr), field$, Fed$(FldPtr), valid$)
IF valid$ = "Y" THEN
MID$(RecBuff$, Fpos(FldPtr), Flen(FldPtr)) = field$
GOSUB AdvanceField
LOCATE Frow(FldPtr), Fcol(FldPtr)
ELSE
LOCATE Frow(FldPtr), Fcol(FldPtr)
BEEP
END IF
ELSEIF kc = KeyLtab OR kc = KeyUp OR CURSORX < Fcol(FldPtr) THEN
' Left tab or cursor up or cursor left beyond limit
CALL ReadFromScreen (Frow(FldPtr), Fcol(FldPtr), Flen(FldPtr), field$, Fed$(FltPtr), valid$)
IF valid$ = "Y" THEN
MID$(RecBuff$, Fpos(FldPtr), Flen(FldPtr)) = field$
GOSUB RetreatField
LOCATE Frow(FldPtr), Fcol(FldPtr)
ELSE
LOCATE Frow(FldPtr), Fcol(FldPtr)
BEEP
END IF
ELSEIF kc = KeyDel THEN
CALL ReadFromScreen (Frow(FldPtr), Fcol(FldPtr), Flen(FldPtr), field$, Fed$(FltPtr), valid$)
screencol = CURSORX
fieldcol = CURSORX - Fcol(FldPtr) + 1
IF fieldcol > 0 AND fieldcol <= Flen(FldPtr) THEN
field$ = MID$(field$, 1, fieldcol - 1) + MID$(field$, fieldcol + 1) + " "
LOCATE Frow(FldPtr), Fcol(FldPtr)
PRINT field$;
LOCATE Frow(FldPtr), screencol
END IF
' Insert (Toggle)
ELSEIF kc = KeyIns THEN
InsToggle = NOT (InsToggle)
IF InsToggle THEN
CURSOR ON, CsrSize \ 2
ELSE
CURSOR ON, CsrSize
END IF
ELSEIF kc = KeyLeft AND CURSORX > 1 THEN
LOCATE Frow(FldPtr), CURSORX - 1
screencol = CURSORX
IF screencol < Fcol(FldPtr) THEN GOTO Recycle
ELSEIF kc = KeyRight AND CURSORX < 80 THEN
LOCATE Frow(FldPtr), CURSORX + 1
screencol = CURSORX
IF screencol = Fcol(FldPtr) + Flen(FldPtr) THEN GOTO Recycle
ELSEIF kc = KeyBack THEN
PRINT " ";
LOCATE Frow(FldPtr), CURSORX - 2
screencol = CURSORX
IF screencol < Fcol(FldPtr) THEN GOTO Recycle
ELSEIF kc < 32 OR kc > 127 THEN
BEEP
ELSE
IF InsToggle THEN
' Insert within field
CALL ReadFromScreen (Frow(FldPtr), Fcol(FldPtr), Flen(FldPtr), field$, Fed$(FltPtr), Valid$)
screencol = CURSORX
fieldcol = CURSORX - Fcol(FldPtr) + 1
field$ = MID$(field$, 1, fieldcol - 1) + KyS$ + MID$(field$, fieldcol)
CURSOR OFF
LOCATE Frow(FldPtr), Fcol(FldPtr)
PRINT LEFT$(field$, Flen(FldPtr));
CURSOR ON
LOCATE , screencol + 1
ELSE
PRINT KyS$;
END IF
screencol = CURSORX
IF screencol = Fcol(FldPtr) + Flen(FldPtr) THEN GOTO Recycle
END IF
LOOP UNTIL kc = KeyEsc AND valid$ = "Y"
SEEK #FileNum, (RecNum - 1) * RecLen + 1
PUT$ #FileNum, RecBuff$
EditRandRecExit:
COLOR deffor, defbac
CLOSE FileNum
GOTO EditRandomRecExit
AdvanceField: ' C/R will drop down to new line
IsDone = FALSE
LastPtr = FldPtr
DO UNTIL IsDone
INCR FldPtr
IF FldPtr > Flds THEN FldPtr = 1
IF Frow(FldPtr) <> 0 AND Fcol(FldPtr) <> 0 THEN
IF kc = KeyRet THEN
IF Frow(FldPtr) <> Frow(LastPtr) THEN IsDone = TRUE
ELSE
IsDone = TRUE
END IF
END IF
LOOP
RETURN
RetreatField:
IsDone = FALSE
DO UNTIL IsDone
DECR FldPtr
IF FldPtr < 1 THEN FldPtr = Flds
IF Frow(FldPtr) <> 0 AND Fcol(FldPtr) <> 0 THEN IsDone = TRUE
LOOP
RETURN
EditRandomRecExit:
CURSOR OFF
END SUB
SUB Engine STATIC
'Set hitter adjustment factor - lefties/righties/switch-hitters:
'Assumes 3/4 of pitchers are right-handed
'Assumes 2/3 of batters are right-handed
adjF! = 1.0
IF DataPlat(ib, it) > "!" AND DataHand(ib, it) <> UCASE$(DataHand(ip, id)) THEN
adjF! = adjF! + 0
ELSEIF DataHand(ib, it) = "R" THEN
IF UCASE$(DataHand(ip, id)) = "R" THEN
adjF! = adjF! - .015
ELSE
adjF! = adjF! + .045
END IF
ELSEIF DataHand(ib, it) = "L" THEN
IF UCASE$(DataHand(ip, id)) = "R" THEN
adjF! = adjF! + .030
ELSE
adjF! = adjF! - .090
END IF
END IF
'Park Effects
IF CmdParkEffects$ = "Y" THEN
adjF! = adjF! + ParkBatAdj(it)
adjF! = adjF! + ParkPitAdj(id)
END IF
'Additional Home Field Advantage
IF CmdHomeFieldAdv$ <> "N" THEN
IF it = 2 THEN 'Home is up
adjF! = adjF! + .030
ELSE
'Visitors bat more often so magnitude should be 94.4% of Home's 9/8.5
' .03 * .9444 = .0283
adjF! = adjF! - .0285
END IF
END IF
'Infield-In or Back
IF Tight THEN
adjF! = adjF! + .3000 'Adds ~80 points
ELSE '1/50 measured tight/non-tight : .3 / 50 = .006 : 1 - .006 = .994
adjF! = adjF! - .0065 'Take ~1.6 points off avg
END IF
'Pitcher Fatigue
IF NewStyle(id) AND DataGames(ip, id) AND DataAB(ip, id) THEN
'New Style has "Games" and "Starts"
FatFac! = nPitch(id) / ExpectedPitchCount(ip, id)
adjF! = adjF! + (0.175 * FatFac! - 0.0965)
ELSE
'Old style
IF np(id) = 1 THEN
adjF! = adjF! + (.005 * mpo(ip, id) - .05) 'Starters
ELSE
adjF! = adjF! + (.010 * mpo(ip, id) - .05) 'Relievers
END IF
END IF
'Extra Pitcher Fatigue if rest days are being overridden by human manager
IF SimDaysOff(ip, id) < 0 THEN
adjF! = adjF! + (SimDaysOff(ip, id) / -3)
END IF
'Focusing
HPowerAdjF! = 1!
IF CmdFocus$ = "Y" AND CmdStat$ > "!" THEN
HFadjF! = 0
OVadjF! = 0
PFadjF! = 0
xF! = RND
IF xF! < .75 THEN Foc = 1 ELSE Foc = 0
'Hitter "focusing"
IF Foc = 1 AND SimAtBats > 0 THEN
IF SimAtBats > (DataAB(ib, it) \ 2) THEN
IF SimTotHits > 0 AND DataHits(ib, it) > 0 THEN
x1! = DataHits(ib, it) / DataAB(ib, it) 'DAT avg
x2! = SimTotHits / SimAtBats 'SIM avg
HFadjF! = (x1! - x2!) / x1!
END IF
IF SimTotHRs > 0 AND DataHR(ib, it) > 0 THEN
x1! = DataHR(ib, it) / DataAB(ib, it) 'DAT avg
x2! = SimTotHRs / SimAtBats 'SIM avg
HPowerAdjF! = HPowerAdjF! + (x1! - x2!) / x1!
END IF
END IF
END IF
'Hitter overuse performance penalty
'Season .DAT AB is under 350 and over-used by 50% or more
IF BatterOveruse THEN
IF SimAtBats THEN
IF DataAB(ib, it) < 350 THEN
IF SimAtBats > DataAB(ib, it) * 1.5! THEN
OVadjF! = DataAB(ib, it) / SimAtBats
OVadjF! = OVadjF! - 1! 'This will always be negative (hurts hitter)
OVadjF! = OVadjF! * 0.5 'Magnif. factor
IF OVadjF! > .25 THEN OVadjF! = .25
IF OVadjF! < -.25 THEN OVadjF! = -.25
END IF
END IF
END IF
END IF
'Pitcher "focusing"
IF Foc = 0 AND SimInn(ip, id) > (DataAB(ip, id) / 2) THEN
IF SimHitsAlw(ip, id) THEN
x1! = DataHits(ip, id) / DataAB(ip, id) 'DAT Hits/inn
x2! = SimHitsAlw(ip, id) / SimInn(ip, id) 'SIM Hits/inn
PFadjF! = (x1! - x2!) / x1!
END IF
END IF
adjF! = adjF! + HFadjF! + OVadjF! + PFadjF! 'Add in the focusing adj
END IF
'Normal adjF! is near 1.0
IF adjF! > 2 THEN adjF! = 2.0
IF adjF! < 0 THEN adjF! = 0
'Estimate Batters Faced by Pitcher
bfF! = BattersFacedByPit!(DataAB(ip,id), DataHits(ip,id), DataBB(ip,id), DataSO(ip,id))
'Estimate Plate Appearances by Batter
'See if there's special Hit-by-Pitch code
'Set HitByPitch "Percentage"
hbF! = (DataBB(ip, id) / bfF!) * 0.08
xS$ = DataHP(ib, it)
IF xS$ >= "A" THEN
code = 74 - ASC(UCASE$(xS$)) 'A=9 B=8 C=7 D=6 E=5 F=4 G=3 H=2 I=1
IF code < 1 THEN code = 1
code = code - 4 'A=5 B=4 C=3 D=2 E=1 F=0 G=-1 H=-2 I=-3
IF code < 1 THEN xF! = 1 / (ABS(code) + 2) ELSE xF! = code 'A=5 B=4 C=3 D=2 E=1 F=1/2 G=1/3 H=1/4
hbF! = hbF! * xF!
END IF
'Set Sacrifice Fly percentage
'(ignore Sac-bunts: they aren't handled by "engine")
'Old-timer seasons (especially) with lots of speed play small-ball and sacrifice a lot
'So we need to crank up the plate appearances by increasing "sacF!"
IF TeamSpeed(it) > 3.5 THEN
sacF! = .015 * TeamSpeed(it) - .049
ELSE
sacF! = .0035
END IF
'Batter's plate appearances: AB + BB + HPB + SACF
paF! = DataAB(ib, it) + DataBB(ib, it) + (hbF! + sacF!) * DataAB(ib, it)
IF paF! = 0 THEN paF! = 1
IF bfF! = 0 THEN bfF! = 1
phitsF! = DataHits(ip, id) / bfF!
'Home Runs
h4bF! = (DataHR(ib, it) / paF!) * HPowerAdjF!
'Allow anyone remote possibility of hitting HR
IF h4bF! < .001 THEN h4bF! = .001
IF pHRind(id) THEN
p4bF! = DataHR(ip, id) / bfF!
ELSE
p4bF! = phitsF! * phit4bF(id)
END IF
'Don't allow a pitcher to be invincible on HR's either!
IF p4bF! < .0015 THEN p4bF! = .0015
'Triples
h3bF! = Data3B(ib, it) / paF!
'Allow anyone remote possibility of hitting 3B
IF h3bF! < .001 THEN h3bF! = .001
p3bF! = phitsF! * phit3bF(id)
'Doubles
h2bF! = Data2B(ib, it) / paF!
p2bF! = phitsF! * phit2bF(id)
'Singles
hsinglF! = DataHits(ib, it) - (Data2B(ib, it) + Data3B(ib, it) + DataHR(ib, it))
h1bF! = hsinglF! / paF!
p1bF! = phitsF! - (p2bF! + p3bF! + p4bF!)
'Walks
hwalkF! = DataBB(ib, it) / paF!
pwalkF! = DataBB(ip, id) / bfF!
'League-Rating factor
IF LeagueRating(it) <> LeagueRating(id) THEN
f! = LeagueRating(it) / LeagueRating(id)
f! = 1 + (f! - 1) / 2 'Reduce the effect by 1/2
h1bF! = f! * h1bF!
h2bF! = f! * h2bF!
h3bF! = f! * h3bF!
h4bF! = f! * h4bF!
hwalkF! = f! * hwalkF!
p1bF! = f! * p1bF!
p2bF! = f! * p2bF!
p3bF! = f! * p3bF!
p4bF! = f! * p4bF!
pwalkF! = f! * pwalkF!
END IF
'Batter Normalization:
'Alter batting stats of the out-of-era team to that of the
'current era league
IF (CmdEra$ = "H" AND it = 1) OR _
(CmdEra$ = "V" AND it = 2) OR _
(CmdEra$ = "B") OR _
p4baseNorm! > 0 THEN 'indicates a norm year/league forced
'-------------------------------------------------------------
' Linear-Weights method
'-------------------------------------------------------------
NtvPlus! = LW!(LgTotHits(it), LgTot2B(it), LgTot3B(it), LgTotHR(it), LgTotBB(it))
NtvMinus! = LgTotInns(it) * 3 'Outs
LWRN! = NtvPlus! / NtvMinus!
IF p4baseNorm! > 0 THEN t = 3 ELSE t = id
TgtPlus! = LW!(LgTotHits(t), LgTot2B(t), LgTot3B(t), LgTotHR(t), LgTotBB(t))
TgtMinus! = LgTotInns(t) * 3 'Outs
LWRT! = TgtPlus! / TgtMinus!
a! = LWRT! / LWRN!
PA_org! = DataAB(ib,it) + DataBB(ib,it)
PA_new! = a! * (DataHits(ib,it) + DataBB(ib,it)) + (DataAB(ib,it) - DataHits(ib,it))
f! = a! * (PA_org! / PA_new!)
h1bF! = f! * h1bF!
h2bF! = f! * h2bF!
h3bF! = f! * h3bF!
h4bF! = f! * h4bF!
hwalkF! = f! * hwalkF!
END IF
'Pitcher Normalization
'Alter pitching stats of out-of-era team to that of the
'current-era league
IF (CmdEra$ = "H" AND it = 2) OR _
(CmdEra$ = "V" AND it = 1) OR _
(CmdEra$ = "B") OR _
p4baseNorm! > 0 THEN 'indicates a norm year/league forced
'-------------------------------------------------------------
' Linear-Weights method
'-------------------------------------------------------------
NtvPlus! = LW!(LgTotHits(id), LgTot2B(id), LgTot3B(id), LgTotHR(id), LgTotBB(id))
NtvMinus! = LgTotInns(id) * 3 'Outs
LWRN! = NtvPlus! / NtvMinus!
IF p4baseNorm! > 0 THEN t = 3 ELSE t = it
TgtPlus! = LW!(LgTotHits(t), LgTot2B(t), LgTot3B(t), LgTotHR(t), LgTotBB(t))
TgtMinus! = LgTotInns(t) * 3 'Outs
LWRT! = TgtPlus! / TgtMinus!
a! = LWRT! / LWRN!
BF_org! = BattersFacedByPit!(DataAB(ip,id), DataHits(ip,id), DataBB(ip,id), DataSO(ip,id))
BF_new! = BattersFacedByPit!(DataAB(ip,id), DataHits(ip,id)*a!, DataBB(ip,id)*a!, DataSO(ip,id))
f! = a! * (BF_org! / BF_new!)
p1bF! = f! * p1bF!
p2bF! = f! * p2bF!
p3bF! = f! * p3bF!
p4bF! = f! * p4bF!
pwalkF! = f! * pwalkF!
END IF
LastHR = FALSE
IF SCx THEN
IF LEFT$(SCRec(SCx).SCResult, 2) = "HR" THEN LastHR = TRUE
END IF
x1! = hwalkF! * pwalkF! / pwbaseF(id)
walkF! = x1! / ( x1! + ( (1! - hwalkF!)*(1! - pwalkF!)/(1! - pwbaseF(id)) ) )
'Walk adjustments
IF PAround OR LastHR THEN
IF ABS(1 - hbF! - walkF!) < .001 THEN walkF! = .3
IF PAround THEN
nF! = 3.0
HF! = DataHits(ib, it) / paF!
IF HF! < 0.1 THEN HF! = 0.1
mF! = (walkF! + HF! - (nF! * walkF!)) / HF!
'factor to decrease hits by
'this formula takes all additional walks from out of hits, so
'batting averages suffer
ELSEIF LastHR THEN
nF! = 1.2
mF! = (1 - hbF! - nF! * walkF!) / (1 - hbF! - walkF!)
END IF
IF mF! < 0.1 THEN mF! = 0.1
walkF! = walkF! * nF! 'adjust walks up
h1bF! = h1bF! * mF! 'hits down -- hitter's or pitcher's -- makes no diff
h2bF! = h2bF! * mF!
h3bF! = h3bF! * mF!
h4bF! = h4bF! * mF!
IF LastHR THEN
IF ABS(1 - walkF! - hbF!) < .001 THEN
mF! = 1
ELSE
mF! = (1 - walkF! - .03) / (1 - walkF! - hbF!)
END IF
hbF! = .03 'new assignment for hbF! Enter this value above.
h1bF! = h1bF! * mF! 'hits down
h2bF! = h2bF! * mF!
h3bF! = h3bF! * mF!
h4bF! = h4bF! * mF!
END IF
INCR zzzWalkAdj
ELSE
'Nothing special going on, so reduce chance of walk to balance out the times we raise the chance.
'We also need to reduce because of intentional walks
walkF! = walkF! * 0.985
INCR zzzNoWalkAdj
END IF
'Adjust basic event probabilities by the "log5" method
x1! = h1bF! * p1bF! / p1baseF(id)
y1! = x1! / (x1! + ( (1 - h1bF!) * (1 - p1bF!) / (1 - p1baseF(id)) ) )
x2! = h2bF! * p2bF! / p2baseF(id)
y2! = x2! / (x2! + ( (1 - h2bF!) * (1 - p2bF!) / (1 - p2baseF(id)) ) )
x3! = h3bF! * p3bF! / p3baseF(id)
y3! = x3! / (x3! + ( (1 - h3bF!) * (1 - p3bF!) / (1 - p3baseF(id)) ) )
x4! = h4bF! * p4bF! / p4baseF(id)
y4! = x4! / (x4! + ( (1 - h4bF!) * (1 - p4bF!) / (1 - p4baseF(id)) ) )
bp1F! = walkF!
bp2F! = bp1F! + hbF!
'Now apply the adjustments and build the "break points"
'phit1bF(*) = % of hits that are singles in this league
'phit2bF(*) = % of hits that are doubles in this league
'phit3bF(*) = % of hits that are triples in this league
'phit4bF(*) = % of hits that are home runs in this league
cadjF! = 1! - adjF!
bp3F! = bp2F! + y1! * (1! - phit1bF(id) * cadjF!)
bp4F! = bp3F! + y2! * (1! - phit2bF(id) * cadjF!)
bp5F! = bp4F! + y3! * (1! - phit3bF(id) * cadjF!)
bp6F! = bp5F! + y4! * (1! - phit4bF(id) * cadjF!)
HitType = 0
xF! = RND 'Throw the dice!
n = FRND(10) 'Pitch count distrubition
IF fr7=401 THEN 'force a single
HitType = 1
CALL SingleRoutine
nPitch(id) = nPitch(id) + P33(n)
fr7 = 0
EXIT SUB
END IF
IF HitAndRun THEN
IF xF! < bp6F! THEN 'A base hit or walk
CALL Msg ("25", "0", "0", "02", 0, it, 0, 0) 'Hit-and-run
END IF
END IF
IF xF! > bp6F! THEN
CALL OutOrError ' Out or Error
IF Result$ = "K" THEN
nPitch(id) = nPitch(id) + P48(n)
ELSE
nPitch(id) = nPitch(id) + P32(n)
END IF
ELSEIF xF! > bp5F! THEN
IF RND < (.01 * DataSpeed(ib, it) - .05) THEN InsideThePark = TRUE
IF inn >= RegInns AND it = 2 THEN
RunnersOn = NUMBERON
IF itruns(2) + RunnersOn > itruns(1) THEN InsideThePark = FALSE
END IF
HitType = 4
CALL HomeRunRoutine ' Home Run
InsideThePark = FALSE
nPitch(id) = nPitch(id) + P33(n)
ELSEIF xF! > bp4F! THEN
HitType = 3
CALL TripleRoutine ' Triple
nPitch(id) = nPitch(id) + P33(n)
ELSEIF xF! > bp3F! THEN
HitType = 2
CALL DoubleRoutine ' Double
nPitch(id) = nPitch(id) + P33(n)
ELSEIF xF! > bp2F! THEN
HitType = 1
CALL SingleRoutine ' Single
nPitch(id) = nPitch(id) + P33(n)
ELSEIF xF! > bp1F! THEN
CALL HBRoutine ' HB
nPitch(id) = nPitch(id) + P33(n)
ELSE
CALL WalkRoutine ' Walk
nPitch(id) = nPitch(id) + P52(n)
END IF
END SUB
SUB ErrorBox (ErrorMsg$)
'Use "|" as delimiter
n = PARSECOUNT(ErrorMsg$, "|")
TopRow = 9
TotL = LEN(ErrorMsg$)
Lines = TotL / 60 + 1
IF n > 1 THEN Lines = MAX(Lines, n)
BotRow = TopRow + Lines + 3
CALL GetScreen(Scr1$, TopRow+RowO, 8+ColO, BotRow+RowO, 71+ColO)
IF Gfx THEN CALL GraphHole (32, TopRow+RowO, 8+ColO, BotRow+RowO, 71+ColO)
CALL DrawFrm(TopRow+RowO, 8+ColO, BotRow+RowO, 71+ColO, defattr, nulls$, nulls$, 0, 0, 0)
r = TopRow + 2 + RowO
FOR i = 1 TO n
x$ = PARSE$(ErrorMsg$, "|", i)
QPRINTs r, 10+ColO, x$, defattr
INCR r
NEXT
PauseIt
CALL PutScreen(Scr1$, TopRow+RowO, 8+ColO, BotRow+RowO, 71+ColO)
IF Gfx THEN
CALL EliminateHole(32)
GfxRefresh 0
END IF
END SUB
SUB ExitPickForDAT (List1() AS List1Type, Pick, RetKey)
'We don't allow no negative Retkey's in here!
IF RetKey > 0 THEN yS$ = UCASE$(CHR$(RetKey)) ELSE yS$ = " "
'V view
'E edit
'N new
'A auxilliary
IF yS$ = "V" OR yS$ = "E" OR yS$ = "N" OR yS$ = "A" THEN
QPush
IF yS$ = "V" THEN
CALL ListFile(CurrentDir$ + RTRIM$(List1(Pick).ListItem))
ELSE
IF yS$ = "N" THEN
CALL Drawfrm(10+rowO, 10+colO, 14+rowO, 71+colO, defattr, nulls$, nulls$, 0, 0, 0)
LOCATE 12+rowO, 12+colO: PRINT "Enter filename of NEW File: ";
default$ = CmdPath$ + " "
zS$ = MYINPUT$(FALSE, KeyEscape, CustomEscKey, KeyAccept, kc, revfor, revbac, 12+rowO, 40+colO, 20, "XR", 0, 0, default$, msx, msy)
'No mouse support here
i = INSTR(zS$, ".")
IF i THEN zS$ = LEFT$(zS$, i - 1) ELSE zS$ = RTRIM$(zS$)
IF MenuOpt$ = "E" THEN
zS$ = zS$ + ".SER"
ELSE
zS$ = zS$ + ".DAT"
END IF
zS$ = EditorSpec$ + zS$
ELSE
IF yS$ = "E" THEN
zS$ = EditorSpec$ + CurrentDir$ + RTRIM$(List1(Pick).ListItem)
END IF
IF yS$ = "A" THEN
zS$ = AuxSpec$ + CurrentDir$ + RTRIM$(List1(Pick).ListItem)
END IF
END IF
LOCATE 10+rowO, 10+colO
ShowWindState& = 1
ConsoleShell zS$, ShowWindState& 'this will launch in separate window
END IF
COLOR deffor, defbac
QPop
RetKey = -99
END IF
END SUB
SUB ExitPickForSCH (List1() AS List1Type, Pick, RetKey)
'We don't allow no negative RetKey's here
IF RetKey > 0 THEN yS$ = UCASE$(CHR$(RetKey)) ELSE yS$ = " "
IF yS$ = "E" OR yS$ = "N" THEN
QPush
IF yS$ = "N" THEN
CALL Drawfrm(10+rowO, 10+colO, 14+rowO, 71+colO, defattr, nulls$, nulls$, 0, 0, 0)
LOCATE 12+rowO, 12+colO: PRINT "Enter filename of NEW Schedule File: ";
default$ = CmdPath$ + " "
zS$ = MYINPUT$(FALSE, KeyEscape, CustomEscKey, KeyAccept, kc, revfor, revbac, 12+rowO, 49+colO, 20, "XR", 0, 0, default$, msx, msy)
'no mouse support
i = INSTR(zS$, ".")
IF i THEN zS$ = LEFT$(zS$, i - 1) ELSE zS$ = RTRIM$(zS$)
zS$ = zS$ + ".SCH"
ELSE
LOCATE 12+rowO, 40+colO
zS$ = CurrentDir$ + RTRIM$(List1(Pick).ListItem)
END IF
CALL EditRA(zS$)
COLOR deffor, defbac
QPop
IF yS$ <> "N" THEN RetKey = -99 'force another loop
END IF
END SUB
SUB ExitPickForSTS (List1() AS List1Type, Pick, RetKey)
IF RetKey = -83 THEN
CALL Drawfrm(6+rowO, 25+colO, 8+rowO, 43+colO, defattr, nulls$, nulls$, 0, 0, 0)
QPRINTs 7+rowO, 26+colO, " Are you sure? ", defattr
LOCATE 7+rowO, 41+colO
IF YESorNO$(7, 0, deffor, defbac, "N") = "N" THEN EXIT SUB
zS$ = List1(Pick).ListItem
i = INSTR(zS$, ".")
zS$ = LEFT$(zS$, i - 1)
xS$ = zS$ + ".STS"
CALL KillIt (xS$)
xS$ = zS$ + ".STB"
CALL KillIt (xS$)
xS$ = zS$ + ".STF"
CALL KillIt (xS$)
xS$ = zS$ + ".STP"
CALL KillIt (xS$)
xS$ = zS$ + ".STH"
CALL KillIt (xS$)
xS$ = zS$ + ".RES"
CALL KillIt (xS$)
xS$ = zS$ + ".ROT"
CALL KillIt (xS$)
xS$ = zS$ + ".STD"
CALL KillIt (xS$)
END IF
END SUB
SUB Fireworks (Bursts)
kount = 1
wattr = CalcAttr(7, 0)
DO UNTIL kount > Bursts
DOWNx = RND * (ConsRows - 7) + 4
across = RND * (ConsCols - 15) + 8
QPRINTs DOWNx, across, "*", wattr
'1=blue 2=green 3=skyb 4=red 5=purple 6=brown 7=white 8=grey
'9=b.blu 10=b.grn 11=b.skyb 12=b.red 13=b.purple
r = 2 '2
circles = RND * 5 + 5 '5 - 8
IF mon$ = "C" THEN k = RND * 6 + 10 ELSE k = 7
FOR c = 1 TO circles
i = 0
IF c = 1 THEN
xS$ = CHR$(250)
cl = k
ELSEIF c < 4 THEN
xS$ = CHR$(249)
cl = k
ELSEIF c < circles THEN
xS$ = CHR$(42)
cl = k - 1
ELSE
xS$ = CHR$(15)
cl = k - 2
END IF
attr = CALCATTR(cl, 0)
FOR y = -.707 * r TO .707 * r STEP 1
x1 = SQR(r * r - y * y)
x2 = -x1
lc1 = x1 + across
lc2 = x2 + across
lr = y * .4 + DOWNx
INCR i
IF lc1 > 0 AND lc1 < ConsCols AND lr > 0 AND lr < ConsRows THEN
QPRINTs lr, lc1, xS$, attr
END IF
IF lc2 > 0 AND lc2 < ConsCols AND lr > 0 AND lr < ConsRows THEN
QPRINTs lr, lc2, xS$, attr
END IF
NEXT
FOR x = -.707 * r TO .707 * r STEP 1
y1 = SQR(r * r - x * x) * .4
y2 = -y1
lr1 = y1 + DOWNx
lr2 = y2 + DOWNx
lc = x + across
INCR i
IF lr1 > 0 AND lr1 < ConsRows AND lc > 0 AND lc < ConsCols THEN
QPRINTs lr1, lc, xS$, attr
END IF
IF lr2 > 0 AND lr2 < ConsRows AND lc > 0 AND lc < ConsCols THEN
QPRINTs lr2, lc, xS$, attr
END IF
NEXT
INCR r
NEXT c
IF RND < .3 THEN SLEEP 50
INCR kount
LOOP
END SUB
SUB Flash (p, blink)
CALL DefCoordinates (p, r, c, ObsD, ObsY, ObsH, ObsTz, ObsTy)
IF r > 0 AND c > 0 THEN
k = WHOATGUY(p)
leng = LEN(LASTNAME$(DataName(k, id)))
IF p = 1 THEN leng = leng + 3
IF p = 5 THEN IF leng > 9 THEN leng = 9
'How many times to flash?
IF DelFac > 2 THEN
times = 8
ELSEIF DelFac = 2 THEN
times = 6
ELSE
times = 4
END IF
CALL FlashField (r, c, leng, times, 140, 0)
END IF
END SUB
SUB FlashField (r, c, leng, times, interval, forceattr)
'What is the current attribute at r, c?
IF forceattr = 0 THEN
currattr = SCREENATTR(r, c)
ELSE
currattr = forceattr
END IF
'Compute the background of the current attribute:
b = currattr \ 16
'Make tempattr with the foreground the same as the background of the current attribute
tempattr = CALCATTR(b, b)
attr = tempattr
FOR i = 1 TO times 'must be even number to work correctly
CALL ChangeAttribute(r, c, leng, attr)
SLEEP interval
IF attr = currattr THEN
attr = tempattr
ELSEIF attr = tempattr THEN
attr = currattr
END IF
NEXT
END SUB
SUB Fly (DPsw, Dramatic, deep, t$) STATIC
ON ERROR GOTO ERRORTRAP
'NOTE!: If no out is recorded, decrement mpo(ip, id) before returning
wag = WHOATGUY(WhoAtPos)
IF DPsw AND iout < 2 THEN 'Double play possibility - pending baserunners/outs
i = 0
xF! = RND
IF WhoAtPos = 3 OR WhoAtPos = 4 THEN
IF ir2 THEN
i = ir2
ir2 = 0 '3-6 & 4-6
j = 6
ELSEIF ir1 THEN
i = ir1
ir1 = 0 '3-3 & 4-3
j = 3
END IF
ELSEIF WhoAtPos = 5 THEN
IF ir2 THEN
i = ir2 '5-4
ir2 = 0
j = 4
ELSEIF ir1 AND (xF! < .5 OR HitandRun = TRUE) THEN
'5-3
i = ir1
ir1 = 0
j = 3
END IF
ELSEIF WhoAtPos = 6 THEN
IF ir2 THEN
i = ir2 '6-4
ir2 = 0
j = 4
ELSEIF ir1 AND (xF! < .5 OR HitandRun = TRUE) THEN
'6-3
i = ir1
ir1 = 0
j = 3
END IF
END IF
IF i THEN
IF DelFac THEN
CALL Msg ("29", "0", "0", "07", i, it, man2, team2) 'doubled-off
CALL Msg ("40", "0", "0", "00", i, it, man2, team2) 'holy cow
END IF
iout = iout + 2
INCR mpo(ip, id)
INCR dp(id)
IF WhoAtPos = 3 AND j = 3 THEN
Result$ = Result$ + "UN DP!"
ELSE
Result$ = Result$ + "-" + LTRIM$(STR$(j)) + " DP!"
END IF
INCR Assists(DataRef(wag, id), id, WhoAtPos)
INCR PutOuts(DataRef(WHOATGUY(j), id), id, j)
GOTO FLY999
END IF
END IF
'No double play - reg:s=3 dram:s=4,5
wag = WHOATGUY(WhoAtPos)
IF WhoAtPos < 7 THEN Dramatic = FALSE
IF DelFac THEN
IF Dramatic THEN
CALL Msg ("07", "0", "4", t$, wag, id, man2, team2)
CALL Msg ("07", "0", "5", t$, wag, id, man2, team2)
ELSE
CALL Msg ("06", "0", "3", "00", wag, id, man2, team2)
END IF
END IF
'Record the out
INCR iout
IF iout > 2 THEN GOTO FLY999
'Consider possible sacrifice fly
shallow = FALSE
'** RUNNER ON 3RD **
IF ir3 <> 0 THEN
IF WhoAtPos < 7 THEN GOTO FLYHold
IF DelFac THEN
IF INSTR(Announcer(1).mgs, "eep") OR INSTR(Announcer(1).mgs, "ong") THEN
GOSUB FLYScore
GOTO FLY999
END IF
IF INSTR(Announcer(1).mgs, "loop") OR INSTR(Announcer(1).mgs, "litt") OR _
INSTR(Announcer(1).mgs, "dump") OR INSTR(Announcer(1).mgs, "slap") OR _
INSTR(Announcer(1).mgs, "shot") THEN
shallow = TRUE
END IF
ELSE
IF deep THEN
GOSUB FLYScore
GOTO FLY999
END IF
END IF
IF amgr(it) = 0 AND AutoCoach = 0 THEN
CALL PostAnnouncer (TRUE, FALSE)
ANx = 0
SLEEP 2000
IF shallow THEN i = 60: j = 3 ELSE i = 18: j = 2
x! = 1 - ( (i - (DataSpeed(ir3, it) * j)) / 100)
x! = x! * 100
IF x! > 99.9 THEN x! = 99.9
x$ = " Tag-up at 3rd? [y/N] (" + FFORMAT$(x!, "##.#") + "%)"
CALL PopMsg(10+rowO, 25+colO, x$, errattr, 0, kc)
IF UCASE$(CHR$(kc)) <> "Y" THEN
GOTO FLYHold
END IF
ELSE
IF DataSpeed(ir3, it) + iout + FRND(10) < 8 THEN
' OUT:0 OUT:1 OUT:2
'sp adv% adv% adv%
' 1 40 50 60
' 2 50 60 70
' 3 60 70 80
' 4 70 80 90
' 5 80 90 100
' 6 90 100 100
' 7 100 100 100
' 8 100 100 100
' 9 100 100 100
GOTO FLYHold
END IF
END IF
'Normal Out chance: = (18 - (DataSpeed(ir3, it) * 2)) / 100
'Shallow Out chance: = (60 - (DataSpeed(ir3, it) * 3)) / 100
'sp out% shallow-out%
' 1 16 57
' 2 14 54
' 3 12 51
' 4 10 48
' 5 8 45
' 6 6 42
' 7 4 39
' 8 2 36
' 9 0 33
IF shallow THEN i = 60: j = 3 ELSE i = 18: j = 2
IF RND < (i - (DataSpeed(ir3, it) * j)) / 100 THEN
GOSUB FLYNailed
ELSE
GOSUB FLYScore
END IF
ELSEIF ir2 <> 0 AND HitAndRun = FALSE THEN 'and nobody on third
IF WhoAtPos > 7 THEN 'AND iout < 2 (no sense trying to adv w/2 out)
i = 0
IF DelFac THEN
IF INSTR(Announcer(1).mgs, "deep") OR _
INSTR(Announcer(1).mgs, "long") THEN
i = 1
ELSE
i = 2
END IF
ELSE
IF deep THEN
i = 1
END IF
END IF
IF i > 0 THEN '1 or 2
IF amgr(it) = 0 AND AutoCoach = 0 THEN
CALL PostAnnouncer (TRUE, FALSE)
ANx = 0
SLEEP 2000
x! = 1 - (.10*i + .15 - ( (DataSpeed(ir2, it) - 1) / 40))
'65%-85% for i=2 75%-95% for i=1
x! = x! * 100
IF x! > 99.9 THEN x! = 99.9
x$ = " Tag-up at 2nd? [y/N] (" + FFORMAT$(x!, "##.#") + "%)"
CALL PopMsg(10+rowO, 25+colO, x$, errattr, 0, kc)
IF UCASE$(CHR$(kc)) <> "Y" THEN
GOTO FLY999
END IF
ELSE
IF (DataSpeed(ir2, it) + FRND(10) < 10) OR iout = 2 THEN
'sp adv attempt%
' 1 20%
' 2 30
' 3 40
' 4 50
' 5 60
' 6 70
' 7 80
' 8 90
' 9 100
GOTO FLY999 'No advance attempt
END IF
END IF
'Attempt to advance
IF DelFac THEN CALL Msg ("17", "0", "0", "02", ir2, it, man2, team2) 'tags @2nd
'Safe Chance: 1 - (.10*i + .15 - ( (DataSpeed(ir2, it) - 1) / 40))
IF RND < .10*i + .15 - ( (DataSpeed(ir2, it) - 1) / 40) THEN
'Thrown OUT at third!
IF DelFac THEN CALL Msg ("14", "0", "0", "03", ir2, it, man2, team2) 'OUT @3
' Result2$ = "X@3rd DP"
INCR Assists(DataRef(wag, id), id, WhoAtPos)
INCR PutOuts(DataRef(WHOATGUY(5), id), id, 5)
ref2 = DataRef(ir2, it)
Result2$ = LTRIM$(STR$(WhoAtPos)) + "-5 DP"
Code2$ = "3"
IF DelFac THEN CALL Msg ("29", "0", "0", "14", wag, id, man2, team2) 'nice throw
ir2 = 0
INCR iout
INCR mpo(ip, id)
INCR dp(id)
ELSE
'Advance Runner to third
IF DelFac THEN AddToAnnouncer it, "He's in there safely..."
ir3 = ir2
ir2 = 0
END IF
END IF
END IF
ELSEIF HitAndRun THEN
IF DelFac THEN
i = 0
IF ir2 THEN
i = ir2
ELSEIF ir1 THEN
i = ir1
END IF
IF i THEN
CALL Msg ("31", "0", "0", "08", i, it, man2, team2) 'hurries back...
END IF
END IF
END IF
GOTO FLY999
FLYHold:
'** HOLDS AT THIRD **
IF DelFac THEN CALL Msg ("16", "0", "0", "03", ir3, it, man2, team2)
GOTO FLY999
FLYScore:
'** Scores on SACRIFICE FLY **
IF DelFac THEN
CALL Msg ("17", "0", "0", "03", ir3, it, man2, team2)
CALL Msg ("17", "0", "0", "04", ir3, it, man2, team2)
END IF
RunAnnounced = TRUE
IF ir2 > 0 AND ( WhoAtPos = 8 OR WhoAtPos = 9 ) AND RND < .4 THEN
'Advance both 2nd and 3rd
IF DelFac THEN AddToAnnouncer it, "Runner on 2nd also advances..."
CALL Advanc(0, 1, 1)
ELSE
'Only advance 3rd
CALL Advanc(0, 0, 1)
END IF
INCR mSacF(ref, it)
mab(ref, it) = mab(ref, it) - 1
IF UCASE$(DataHand(ip, id)) = "L" THEN
mabLHP(ref, it) = mabLHP(ref, it) - 1
ELSE
mabRHP(ref, it) = mabRHP(ref, it) - 1
END IF
Result$ = Result$ + " SACF"
RETURN
FLYNailed:
'** THROWN OUT AT THE PLATE **
IF DelFac THEN CALL Msg ("17", "0", "0", "03", ir3, it, man2, team2)
ref2 = DataRef(ir3, it)
'Result2$ = "X-@Home DP"
Result2$ = LTRIM$(STR$(WhoAtPos)) + "-2 DP"
Code2$ = "4"
INCR Assists(DataRef(wag, id), id, WhoAtPos)
INCR PutOuts(DataRef(WHOATGUY(2), id), id, 2)
IF DelFac THEN CALL Msg ("14", "0", "0", "04", ir3, it, man2, team2)
ir3 = 0
INCR iout
INCR mpo(ip, id)
INCR dp(id)
CALL Advanc(1, 1, 0) 'Runner on 2nd always advances
RETURN
ErrorTrap:
LOCATE 10, 30
PRINT "FLY_Error"; ERRCLEAR
x$ = WAITKEY$
FLY999:
END SUB
SUB GetNextPitchers
' CmdVP$ or CmdHP$ will replace the method that's already in the table
' for the affected team. The method will remain in effect until the end
' of the simulation or until another CmdVP$ or CmdHP$ is issued.
'
'TYPE TotPctType
' PctOfTot AS SINGLE
' Slot AS INTEGER
'END TYPE
REGISTER i AS INTEGER, j AS INTEGER, k AS INTEGER
REDIM BrkTbl(25) AS TotPctType
FOR tm = 1 TO 2
IF tm = 1 THEN
IF CmdVP$ <> nulls$ THEN
Method$ = CmdVP$
Repl$ = "Y"
ELSE
Method$ = CmdSP$
Repl$ = "N"
END IF
CmdVP$ = nulls$
END IF
IF tm = 2 THEN
IF CmdHP$ <> nulls$ THEN
Method$ = CmdHP$
Repl$ = "Y"
ELSE
Method$ = CmdSP$
Repl$ = "N"
END IF
CmdHP$ = nulls$
END IF
CALL AutoPitcher (tm, Method$, Repl$, N) 'Returns N
OriginalSelection = N
IF (tm = 1 AND CmdVSpot$ = "Y") OR _
(tm = 2 AND CmdHSpot$ = "Y") OR _
CmdSpot$ = "Y" THEN
'Possible Spot Starter
ELSE
'No Spot Starter, we are done
GOTO AssignPitcher
END IF
'Possible Spot Starter
NumInRot = VAL(MID$(Method$, 2, 1))
'Calculate Total Starts by ALL Pitchers
TotStarts = 0
FOR i = 10 TO LastPiAd(tm)
TotStarts = TotStarts + DataGbyP(i, tm, 1)
NEXT
IF TotStarts = 0 THEN GOTO AssignPitcher
xF! = RND
IF xF! > ((DataGbyP(N, tm, 1) / TotStarts) * NumInRot) OR _
(DaysOffRule = TRUE AND GetDaysOff(N, tm) > 0) THEN 'Pitcher is tired
'Pick a Spot Starter
r = ROTATIONLIST (DataFil(tm)) 'Find Rot record for this team
IF r = 0 THEN
x$ = "AutoPit: Spot Starter Error: " + DataFil(tm)
CALL ErrorBox (x$)
END IF
'Calculate starts by pitchers NOT in current rotation
SpotStarts = 0
j = 0
FOR i = 10 TO LastPiAd(tm)
'Is "i" already in rotation?
SkipIt = FALSE
FOR k = 1 TO 5
IF RotRec(r).RotList(k) = i THEN SkipIt = TRUE
NEXT
IF NOT SkipIt THEN
SpotStarts = SpotStarts + DataGbyP(i, tm, 1)
INCR j
BrkTbl(j).PctOfTot = 0
BrkTbl(j).Slot = 0
END IF
NEXT
IF SpotStarts = 0 THEN GOTO AssignPitcher
'For these pitchers not in the current rotation:
'Calculate percentage of "spot starts" they had
j = 0
FOR i = 10 TO LastPiAd(tm)
'Is "i" already in rotation?
SkipIt = FALSE
FOR k = 1 TO 5
IF RotRec(r).RotList(k) = i THEN SkipIt = TRUE
NEXT
IF NOT SkipIt THEN
INCR j
BrkTbl(j).PctOfTot = DataGbyP(i, tm, 1) / SpotStarts
BrkTbl(j).Slot = i
END IF
NEXT
try = 1
TryAgain:
xF! = RND
N = 0
BaseP! = 0
FOR i = 1 TO j
IF xF! < BaseP! + BrkTbl(i).PctOfTot THEN
N = BrkTbl(i).Slot
EXIT FOR
END IF
BaseP! = BaseP! + BrkTbl(i).PctOfTot
NEXT
IF N = 0 THEN N = BrkTbl(j).Slot
'Try to avoid tired pitchers
IF CmdStat$ > "!" AND DaysOffRule = TRUE THEN
IF GetDaysOff(N, tm) THEN
'He's tired! Try again.
INCR try
IF try < 5 THEN GOTO TryAgain
N = OriginalSelection
END IF
END IF
END IF
AssignPitcher:
ipa(tm) = N
np(tm) = 1
iyp(1, tm) = N
CALL AssignFatigue (tm)
NEXT 'tm
ERASE BrkTbl
END SUB
SUB GetScreen (ScrSave$, row1, col1, row2, col2)
ScrSave$ = SPACE$((row2 - row1 + 1) * (col2 - col1 + 1) * 2)
i = 1
FOR r = row1 TO row2
FOR c = col1 TO col2
b = SCREEN(r, c)
a = SCREENATTR(r, c)
x$ = CHR$(b) + CHR$(a)
MID$(ScrSave$, i, 2) = x$
i = i + 2
NEXT
NEXT
END SUB
SUB GetScrollKey (kc, RowOff, ColOff)
Donex = FALSE
DO
KyS$ = WAITKEY$
KyS$ = UCASE$(KyS$)
IF LEN(KyS$) = 1 THEN
kc = ASC(KyS$)
ELSEIF LEN(KyS$) = 2 THEN
kc = -ASC(RIGHT$(KyS$, 1))
ELSEIF LEN(KyS$) = 4 THEN
msx = MOUSEX
msy = MOUSEY
CALL FlashField (msy, msx, 1, 2, 100, 0)
kc = SCREEN(msy, msx)
IF kc = 118 THEN ' "v"
KyS$ = CHR$(kc)
ELSE
KyS$ = UCASE$(CHR$(kc))
kc = ASC(KyS$)
END IF
SELECT CASE KyS$
CASE UpPtr$
kc = -72
CASE DnPtr$
kc = -80
CASE LPtr$
kc = -75
CASE RPtr$
kc = -77
CASE CloseButton$ 'normal escape
kc = 27
CASE ELSE
END SELECT
END IF
' ESC
IF kc = 27 THEN
Donex = TRUE
' S (swap)/ M (more lineups) special cases
ELSEIF kc = 83 OR kc = 77 THEN
Donex = TRUE
' Left-arrow
ELSEIF kc = -75 AND ColOff > 0 THEN
ColOff = ColOff - 10
Donex = TRUE
' Right-arrow
ELSEIF kc = -77 AND ColOff < 72 THEN
ColOff = ColOff + 10
Donex = TRUE
' Up arrow
ELSEIF kc = -72 AND RowOff > 0 THEN
DECR RowOff
Donex = TRUE
' Down arrow
ELSEIF kc = -80 AND RowOff < 30 THEN 'sets maximum number "downs" (was 10)
INCR RowOff
Donex = TRUE
'Emergency escape for testing
' ELSEIF kc = 32 THEN
' Donex = TRUE
ELSE
MyBeep
END IF
LOOP UNTIL Donex
LOCATE 1, 1
'EXIT SUB
'FlashMouse:
'CALL FlashField (msy, msx, 1, 2, 100, 0)
'RETURN
END SUB
SUB Gone
IF SoundOn THEN
ANx = 0
AddToAnnouncer id, "Home Run by " + FULLNAME$(DataName(ib, it))
CALL PostAnnouncer (TRUE, FALSE)
END IF
i = 12
COLOR i, 0
IF Gfx THEN CALL GraphHole(30, 6+rowO, 16+colO, 22+rowO, 66+colO)
CALL Drawfrm(6+rowO, 16+colO, 22+rowO, 66+colO, linattr, nulls$, nulls$, 0, 0, 0)
redattr = CALCATTR(i, 0)
r = 7 + rowO
c = 17 + colO
tempattr = CALCATTR(0, 0) 'black on black
attr = redattr
FOR n = 1 TO 5 'should be odd number
QPRINTs r, c, " ", attr
QPRINTs r+01, c, " HHHH HHHH OOOOOO MMMM MMMM EEEEEEEE ", attr
QPRINTs r+02, c, " HH HH OO OO MM MMMM MM EE ", attr
QPRINTs r+03, c, " HHHHHHHH OO OO MM MM MM EEEEE ", attr
QPRINTs r+04, c, " HH HH OO OO MM MM EE ", attr
QPRINTs r+05, c, " HHHH HHHH OOOOOO MMMM MMMM EEEEEEEE ", attr
QPRINTs r+06, c, " ", attr
QPRINTs r+07, c, " RRRRRRR UUUU UUUU NNNN NNNN ", attr
QPRINTs r+08, c, " RR RR UU UU NN N NN ", attr
QPRINTs r+09, c, " RRRRRR UU UU NN N NN ", attr
QPRINTs r+10, c, " RR R UU UU NN N NN ", attr
QPRINTs r+11, c, " RRR RR UUUUUU NNNN NNNN ", attr
QPRINTs r+12, c, " ", attr
QPRINTs r+13, c, " ", attr
QPRINTs r+14, c, " ", attr
SLEEP 200
IF attr = redattr THEN
attr = tempattr
ELSEIF attr = tempattr THEN
attr = redattr
END IF
NEXT
QPRINTs 20+rowO, 35+colO, "...by " + FULLNAME$(DataName(ib, it)), redattr
IF CmdFireworks$ = "Y" THEN
SLEEP 2000
CALL Fireworks(6)
ELSE
SLEEP 3000
END IF
COLOR fldfor, fldbac
END SUB
SUB Ground STATIC
ON ERROR GOTO ERRORTRAP
'If an out is not recorded must decrement mpo(ip, id)
wag = WHOATGUY(WhoAtPos)
Dramatic = (RND < .11) 'Sets of dramatic outs
BasesLoaded = (ir1 <> 0 AND ir2 <> 0 AND ir3 <> 0)
IF WhoAtPos = 1 OR WhoAtPos = 3 OR WhoAtPos = 5 THEN
AtFactor = 0
ELSE
AtFactor = 10
END IF
'Close Game AND its getting late AND there's a guy on third
DefAhead = itruns(id) - itruns(it)
IF (DefAhead < 2 AND DefAhead > -4) AND (DefAhead + RegInns - 3 < inn) AND ir3 <> 0 THEN
'01/11/00
GameSituation = TRUE
' Def situation Game Situation
'--------------- --------------
' Up 2 or more never
' Up 1 8th inn +
' Tied 7th inn +
' Down 1 6th inn +
' Down 2 5th inn +
' Down 3 4th inn +
ELSE
GameSituation = FALSE
END IF
'The smaller the number the more likely the runner holds at 3rd.
'Tight (when set) is -1
IF ir3 THEN
HoldFactor = AtFactor + DataSpeed(ir3, it) + (Tight * 10) + (iout * 5) + FRND(5)
ELSE
HoldFactor = 0
END IF
p$ = LTRIM$(STR$(WhoAtPos))
t$ = LTRIM$(STR$(RND(1, 4)))
t$ = PADZEROS$(t$, 2)
IF ir1 THEN GOTO GROnFirst
IF (ir2 <> 0 AND ir3 <> 0) OR (ir3 <> 0) THEN GOTO GROnThird
'** NOBODY ON BASE -OR- LONE RUNNER on Second **
GOSUB DidFBCatchThrow
IF DelFac THEN
IF Dramatic THEN
IF SoundOn THEN
IF t$ = "04" THEN
CALL WavSoftGrounder
ELSE
CALL WavRegularGrounder
END IF
END IF
CALL Msg ("03", p$, "1", t$, wag, id, man2, team2)
CALL Msg ("03", p$, "2", t$, wag, id, man2, team2)
CALL Msg ("03", p$, "3", t$, wag, id, man2, team2)
IF FBDropped THEN
CALL Msg ("30", "0", "0", "05", bm1, id, man2, team2)
CALL Msg ("30", "0", "0", "09", bm1, id, man2, team2) 'error
ELSE
CALL Msg ("03", p$, "4", t$, wag, id, man2, team2)
END IF
ELSE
IF SoundOn THEN CALL WavRegularGrounder
CALL Msg ("02", p$, "1", "00", wag, id, man2, team2)
CALL Msg ("02", p$, "2", "00", wag, id, man2, team2)
IF FBDropped THEN
CALL Msg ("30", "0", "0", "05", bm1, id, man2, team2)
CALL Msg ("30", "0", "0", "09", bm1, id, man2, team2) 'error
ELSE
CALL Msg ("02", p$, "3", "00", ib, it, man2, team2)
END IF
END IF
END IF
IF FBDropped THEN GOTO GR999
INCR iout
IF ir2 <> 0 THEN
IF WhoAtPos = 3 OR WhoAtPos = 4 THEN
CALL Advanc(0, 1, 0)
END IF
END IF
UnAssistedPct! = .67
Result$ = Result$ + "-3"
INCR Assists(DataRef(wag, id), id, WhoAtPos)
INCR PutOuts(DataRef(WHOATGUY(3), id), id, 3)
GOTO GR999
GROnThird:
'** RUNNER at 3rd OR (2nd AND 3rd)
' OR (1st AND 3rd OR BASES LOADED, Tight/GameSituation from GROnFirst routine)
'Send regular 1st line
IF DelFac THEN
IF SoundOn THEN CALL WavRegularGrounder
CALL Msg ("02", p$, "1", "00", wag, id, man2, team2)
END IF
GROnThird2:
IF iout = 2 THEN
GOSUB DidFBCatchThrow
GOTO GRHoldAt3rd
END IF
'Try to guess whether guy on third will try to score (less than 2 out)
IF HoldFactor < 18 THEN 'hold the runner(s)
OLDir3 = ir3
GOSUB DidFBCatchThrow
GOTO GRHoldAt3rd
ELSEIF Tight THEN 'infield in
GOTO GRThrowHomeOut
ELSEIF GameSituation THEN 'desperate sit. for def.
IF FRND(5) + AtFactor > 12 THEN
GOTO GRThrowHomeSafe '60 safe if @4 or @6
ELSE
GOTO GRThrowHomeOut
END IF
ELSE
GOSUB DidFBCatchThrow 'defense not concerned
GOTO GRIgnoreHomeThrow1st
END IF
GROnFirst:
' ** RUNNER ON 1ST, 1ST AND 2ND, 1ST AND 3RD, OR BASES LOADED *********
' if the following situation exists don't even CONSIDER a d.p. because
' a critical run would score even if successful!
' 1st & 3rd with 0 out AND (Tight or GameSituation):
IF ir3 <> 0 AND ir2 = 0 AND iout = 0 AND (GameSituation OR Tight) THEN
GOTO GROnThird
END IF
' Is batter a slow runner?
' The SMALLER dpF!, the GREATER the chance of a double play)
' The BIGGER dpF!, the SMALLER the chance of a double play)
' So, to get more double-plays make the denominator larger
' to get fewer double-plays make the denominator smaller
dpF! = (DataSpeed(ib, it) + 5!) / 17 '4.6 +
IF dpF! < .375 THEN dpF! = .375
'Reduce chances of DP under following conditions:
IF HitAndRun THEN dpF! = 1!
'Infield tight
IF Tight THEN dpF! = .96
'Ball hit to first-baseman:
IF WhoAtPos = 3 THEN dpF! = dpF! + (1.0 - dpF!) / 2.0
'Ball hit to catcher:
IF WhoAtPos = 2 THEN dpF! = .99
'DOUBLE PLAY?
c = 0
IF RND > dpF! AND iout < 2 THEN
'Yes - DP
t$ = LTRIM$(STR$(RND(1, 3))) 'don't want to do announcer track 4 here
t$ = PADZEROS$(t$, 2)
IF DelFac THEN
IF Dramatic THEN
'Sometimes don't want other tracks also
IF RND < .9 THEN
IF p$ = "4" AND t$ = "02" THEN
IF RND < .5 THEN t$ = "01" ELSE t$ = "03"
END IF
IF p$ = "6" AND t$ = "01" THEN
IF RND < .5 THEN t$ = "02" ELSE t$ = "03"
END IF
END IF
IF SoundOn THEN
IF t$ = "04" THEN
CALL WavSoftGrounder
ELSE
CALL WavRegularGrounder
END IF
END IF
CALL Msg ("03", p$, "1", t$, wag, id, man2, team2)
CALL Msg ("03", p$, "2", t$, wag, id, man2, team2)
ELSE
IF SoundOn THEN CALL WavRegularGrounder
CALL Msg ("02", p$, "1", "00", wag, id, man2, team2)
END IF
END IF
GOTO GRDoublePlay
END IF
'NO DOUBLE PLAY
IF Dramatic THEN
x! = RND
IF x! < .25 THEN 'no "at-em" balls in announcer track
t$ = "01" 'left
ELSEIF x! < .5 THEN
t$ = "02" 'right
ELSE
t$ = "04" 'slow
END IF
IF DelFac THEN
IF SoundOn THEN
IF t$ = "04" THEN
CALL WavSoftGrounder
ELSE
CALL WavRegularGrounder
END IF
END IF
CALL Msg ("03", p$, "1", t$, wag, id, man2, team2)
CALL Msg ("03", p$, "2", t$, wag, id, man2, team2)
END IF
ELSE
IF DelFac THEN
IF SoundOn THEN CALL WavRegularGrounder
CALL Msg ("02", p$, "1", "00", wag, id, man2, team2)
END IF
END IF
'Special Case: GameSituation OR Tight
ForceFailedDP = FALSE
IF iout < 2 AND (GameSituation OR Tight) THEN
IF BasesLoaded THEN
IF iout = 0 THEN
IF Tight THEN 'Tight: Always a force out
GOTO GRForceAtHome
ELSE 'Game Sit: Play at Plate
IF FRND(5) + AtFactor > 12 THEN
GOTO GRThrowHomeSafe '60 safe if @4 or @6
ELSE
GOTO GRForceAtHome
END IF
END IF
END IF
IF iout = 1 THEN
IF Tight THEN 'Tight: Always a force out
GOTO GRForceAtHome
ELSE
r1F! = RND 'Game Sit:
IF AtFactor = 0 THEN 'At 1,3,5
IF r1F! < .95 THEN
GOTO GRForceAtHome
ELSE
ForceFailedDP = TRUE
END IF
ELSE 'At 4,6
IF r1F! < .78 THEN '.5
GOTO GRForceAtHome
ELSEIF r1F! < .82 THEN '.75
GOTO GRThrowHomeSafe
ELSE
ForceFailedDP = TRUE
END IF
END IF
END IF
END IF
ELSEIF ir3 THEN '1st & 3rd
GOTO GROnThird2
END IF
END IF 'GameSituation or Tight w/less than 2 out
'Is There a FORCE AT 2ND or 3RD -OR- Is ONLY PLAY at 1ST?
GoSecond = FALSE
GoThird = FALSE
UnAssisted = FALSE
r1F! = RND
IF NOT HitAndRun AND NOT Tight THEN
IF WhoAtPos < 4 THEN 'at 1, 2 or 3
IF iout < 2 THEN
IF r1F! < .4 OR BasesLoaded THEN '1/11/00 = .4
'if we're going to second, we don't want
'the announcer to be describing a "dramatic"
'slow ground ball. So, we'll backtrack and put
'different words in his mouth.
GOSUB ChangeAnnouncer
GoSecond = TRUE
IF WhoAtPos = 2 THEN GoSecond = FALSE
END IF
END IF
ELSE 'at 4, 5 or 6
IF iout < 2 THEN
IF r1F! < .7 OR BasesLoaded THEN '1/11/00 = .7 FORCE 70%
GOSUB ChangeAnnouncer
GoSecond = TRUE
IF WhoAtPos = 5 AND ir2 <> 0 AND RND < .2 THEN
GoSecond = FALSE
GoThird = TRUE
END IF
END IF
ELSE
IF r1F! < .3 THEN 'with 2 out, sometimes go to 2nd
GOSUB ChangeAnnouncer
GoSecond = TRUE
IF WhoAtPos = 5 AND ir2 <> 0 AND RND < .5 THEN
GoSecond = FALSE
GoThird = TRUE
END IF
END IF
END IF
END IF
END IF
IF GoSecond OR GoThird OR ForceFailedDP THEN 'Go to Second or Third for Force Out
'Decide if it's an unassisted force or not
IF GoThird THEN
UnAssisted = TRUE
ELSE
'Ball must be hit to short or second
IF WhoAtPos = 4 THEN
IF Dramatic THEN
IF t$ = "01" AND RND < .25 THEN UnAssisted = TRUE
ELSE
IF RND < .15 THEN UnAssisted = TRUE
END IF
END IF
IF WhoAtPos = 6 THEN
IF Dramatic THEN
IF t$ = "02" AND RND < .25 THEN UnAssisted = TRUE
ELSE
IF RND < .15 THEN UnAssisted = TRUE
END IF
END IF
END IF
IF DelFac THEN
IF ForceFailedDP THEN
IF GoThird THEN
AddToAnnouncer id, "He steps on third..."
ELSE
IF UnAssisted THEN
AddToAnnouncer id, "He steps on 2nd for the force..."
ELSE
CALL Msg ("08", "0", "1", "00", 0, id, man2, team2) 'over to 2nd
END IF
END IF
ELSEIF Dramatic THEN
IF GoThird THEN
AddToAnnouncer id, "He races to 3rd - steps on the bag..."
ELSE
IF UnAssisted THEN
AddToAnnouncer id, "He steps on 2nd for the force..."
ELSE
AddToAnnouncer id, "He fires to second..."
END IF
END IF
ELSE
IF iout = 2 THEN
IF GoThird THEN
AddToAnnouncer id, "He steps on third for the force..."
ELSE
IF UnAssisted THEN
AddToAnnouncer id, "He steps on 2nd for the force..."
ELSE
AddToAnnouncer id, "He flips to 2nd..."
END IF
END IF
ELSE
IF GoThird THEN
AddToAnnouncer id, "He steps on third for the force..."
ELSE
IF UnAssisted THEN
AddToAnnouncer id, "He steps on 2nd for one..."
ELSE
CALL Msg ("08", "0", "1", "00", 0, id, man2, team2)
'over to 2nd...got one there
END IF
END IF
END IF
END IF
END IF
'Possibility of Dropped Throw by middle infielder
'Middle-man pos is "n"
IF UnAssisted THEN
tt$ = LTRIM$(STR$(WhoAtPos))
ELSE
IF WhoAtPos > 4 THEN tt$ = "4" ELSE tt$ = "6"
END IF
n = VAL(tt$)
nn = WHOATGUY(n)
defperF! = DEFPCT!(nn)
IF NOT UnAssisted THEN
zF! = (1.0 - defperF!) * .8 'Decrease constant for more errors
IF RND > (defperF! + zF!) THEN 'Dropped throw at second!
INCR iterrs(id)
INCR inne
i = DataRef(nn, id)
INCR GpPos(i, id, n)
INCR merr(i, id)
INCR SumErrors(n)
IF DelFac THEN
CALL Msg ("30", "0", "0", "05", nn, id, man2, team2)
AddToAnnouncer it, "Everybody's safe!"
CALL Msg ("30", "0", "0", "09", nn, id, man2, team2) 'error
END IF
Errorx = TRUE
CALL Advanc(1, 1, 1)
Errorx = FALSE
ir1 = ib
mpp(ib) = ip
IF mpp(ir2) > 0 THEN
mpp(ir2) = -mpp(ir2) 'Flip to negative to show runner got on via error
END IF
Result$ = Result$ + "/E-" + tt$
mpo(ip, id) = mpo(ip, id) - 1 'No out recorded anywhere!
GOTO GR999
END IF
END IF
INCR iout 'Got the force out
IF ForceFailedDP THEN 'Bases-Loaded situation
IF DelFac THEN
'Back to 1st...
CALL Msg ("08", "0", "2", "00", 0, id, man2, team2)
AddToAnnouncer it, "SAFE!! Not in time! He beat it!"
END IF
ELSEIF Dramatic THEN
IF DelFac THEN AddToAnnouncer id, "OUT on a close play!"
ELSE
IF iout = 3 THEN
IF DelFac THEN AddToAnnouncer it, "Side out!"
ELSEIF RND < .5 THEN
IF DelFac THEN AddToAnnouncer it, "Force out there -- no play at 1st."
ELSE
'Back to 1st...
IF DelFac THEN CALL Msg ("08", "0", "2", "00", 0, id, man2, team2)
'Possibility of bad relay throw to first after a force out
zF! = (1.0 - defperF!) * .6 'Increase constant for fewer errors
IF RND > (defperF! + zF!) THEN WildThrow = TRUE
IF DelFac THEN
IF NOT WildThrow THEN
AddToAnnouncer it, "Not in time! He beat it."
ELSE
AddToAnnouncer id, "Wild throw! Into the dugout!"
IF NUMBERON > 1 THEN
AddToAnnouncer it, "Everybody gets an extra base!"
END IF
END IF
END IF
END IF
END IF
IF GoThird THEN
CALL Advanc(1, 0, 1) 'Force out at 3rd
ELSE
CALL Advanc(0, 1, 1) 'Force out at 2nd
END IF
ir1 = ib
mpp(ib) = ip
IF UnAssisted THEN
Result$ = Result$ + "UN F"
ELSE
Result$ = Result$ + "-" + tt$ + " F"
INCR Assists(DataRef(wag, id), id, WhoAtPos)
END IF
n = VAL(tt$)
INCR PutOuts(DataRef(WHOATGUY(n), id), id, n)
IF WildThrow THEN
INCR iterrs(id)
INCR inne
INCR innadverr
i = DataRef(WHOATGUY(n), id)
INCR GpPos(i, id, n)
INCR merr(i, id)
INCR SumErrors(n)
Errorx = TRUE
CALL Advanc(1, 1, 1) 'Everybody advances one extra base
Errorx = FALSE
Result$ = Result$ + "/E-" + tt$
WildThrow = FALSE
END IF
ELSE 'No Force Out -- Runners Advance
INCR iout
IF iout < 3 AND DelFac > 0 THEN
AddToAnnouncer id, "No play at second..."
END IF
IF DelFac THEN
IF Dramatic THEN
CALL Msg ("03", p$, "3", t$, wag, id, man2, team2) '*throw to 1st
CALL Msg ("03", p$, "4", t$, ib, it, man2, team2) 'OUT
ELSE
CALL Msg ("02", p$, "2", "00", wag, id, man2, team2) '* throw to 1st
CALL Msg ("02", p$, "3", "00", ib, it, man2, team2) 'OUT
END IF
END IF
CALL Advanc(1, 1, 1) 'advance all runners one base
ir1 = 0
UnAssistedPct! = .67
Result$ = Result$ + "-3"
INCR Assists(DataRef(wag, id), id, WhoAtPos)
INCR PutOuts(DataRef(WHOATGUY(3), id), id, 3)
END IF
GOTO GR999
GRHoldAt3rd:
'HOLDS AT THIRD - batter out (probably)
IF DelFac THEN
IF iout <> 2 THEN
'problem: FBDropped routine has already advanced ir3
CALL Msg ("16", "0", "0", "03", OLDir3, it, man2, team2) 'holds at 3rd
END IF
CALL Msg ("02", p$, "2", "00", wag, id, man2, team2) 'here's the throw
IF FBDropped THEN
CALL Msg ("30", "0", "0", "05", bm1, id, man2, team2)
CALL Msg ("30", "0", "0", "09", bm1, id, man2, team2) 'error
ELSE
CALL Msg ("02", p$, "3", "00", ib, it, man2, team2) '*'s out at 1st
END IF
END IF
IF FBDropped THEN GOTO GR999
INCR iout
IF ir1 > 0 AND ir2 = 0 THEN CALL Advanc(1, 0, 0)
UnAssistedPct! = .85
Result$ = Result$ + "-3"
INCR Assists(DataRef(wag, id), id, WhoAtPos)
INCR PutOuts(DataRef(WHOATGUY(3), id), id, 3)
GOTO GR999
GRForceAtHome:
'Less than TWO OUT & Bases Loaded - THROW HOME and FORCE RUNNER
IF DelFac THEN
CALL Msg ("29", "0","0", "01", 0, id, man2, team2) 'throw comes home
CALL Msg ("29", "0","0", "02", 0, id, man2, team2) 'force out at home
CALL Msg ("29", "0","0", "03", ib, it, man2, team2) '* is on
END IF
ir3 = 0
INCR iout
CALL Advanc(1, 1, 0)
ir1 = ib
mpp(ib) = ip
Result$ = Result$ + "-2 FO"
INCR Assists(DataRef(wag, id), id, WhoAtPos)
INCR PutOuts(DataRef(WHOATGUY(2), id), id, 2)
GOTO GR999
GRThrowHomeOut:
' THROWN OUT AT HOME - batter safe on FC
IF DelFac THEN
CALL Msg ("29", "0","0", "04", ir3, it, man2, team2) 'trying to score
CALL Msg ("29", "0","0", "05", 0, id, man2, team2) 'here comes throw
CALL Msg ("14", "0","0", "04", ir3, it, man2, team2) 'OUT at plate!
END IF
ir3 = 0
INCR iout
CALL Advanc(1, 1, 0)
ir1 = ib
mpp(ib) = ip
Result$ = Result$ + "-2 FC"
INCR Assists(DataRef(wag, id), id, WhoAtPos)
INCR PutOuts(DataRef(WHOATGUY(2), id), id, 2)
GOTO GR999
GRThrowHomeSafe:
' RUNNER SCORES - batter safe on FC
IF DelFac THEN
CALL Msg ("29", "0","0", "04", ir3, it, man2, team2) 'trying to score
CALL Msg ("29", "0","0", "05", 0, id, man2, team2) 'here comes throw
CALL Msg ("15", "0","0", "05", 0, it, man2, team2) 'safe!
CALL Msg ("29", "0","0", "03", ib, it, man2, team2) '* is on
END IF
CALL Advanc(1, 1, 1)
ir1 = ib
mpp(ib) = ip
mpo(ip, id) = mpo(ip, id) - 1 'No out recorded anywhere!
Result$ = "Safe on FC"
GOTO GR999
GRIgnoreHomeThrow1st:
' RUNNER SCORES - batter out (probably)
IF DelFac THEN
CALL Msg ("29", "0","0", "06", 0, id, man2, team2) 'goto 1st for sure one
IF FBDropped THEN
CALL Msg ("30", "0", "0", "05", bm1, id, man2, team2)
CALL Msg ("30", "0", "0", "09", bm1, id, man2, team2) 'error
ELSE
CALL Msg ("02", p$, "3", "00", ib, it, man2, team2) 'batter is out
END IF
END IF
IF FBDropped THEN GOTO GR999
INCR iout
CALL Advanc(1, 1, 1)
UnAssistedPct! = .75
Result$ = Result$ + "-3"
INCR Assists(DataRef(wag, id), id, WhoAtPos)
INCR PutOuts(DataRef(WHOATGUY(3), id), id, 3)
GOTO GR999
' DOUBLE-PLAY
GRDoublePlay:
DPsw = TRUE
iout = iout + 2
INCR mpo(ip, id)
INCR dp(id)
ref = DataRef(ib, it)
INCR mGDP(ref, it)
'Chance of a step-on-the-bag DP
StepOn2nd = FALSE
IF WhoAtPos = 4 AND t$ = "01" THEN
IF RND < .15 THEN StepOn2nd = TRUE
END IF
IF WhoAtPos = 6 AND t$ <> "01" THEN
IF RND < .20 THEN StepOn2nd = TRUE
END IF
StepOn3rd = FALSE
IF ir2 <> 0 AND WhoAtPos = 5 AND t$ = "01" THEN 'Hit down the line
IF RND < .30 THEN StepOn3rd = TRUE
END IF
IF BasesLoaded = FALSE THEN
IF StepOn3rd THEN
GOSUB DPStepOn3rd
ELSE
'Around 2nd DP
GOSUB DPAround2nd
END IF
ELSE
' BASES LOADED DOUBLE PLAY
' IS D.P. AROUND HOME OR AROUND 2ND?
IF (GameSituation = TRUE AND iout = 0) OR (WhoAtPos = 1) THEN
'D.P. Around Home:
IF DelFac THEN
AddToAnnouncer id, "They throw to the plate for one..."
CALL Msg ("08", "0","2", "00", 0, id, man2, team2) 'back to 1st
AddToAnnouncer id, "OUT! Double Play"
END IF
CALL Advanc(1, 1, 0)
ir1 = 0
Result$ = Result$ + "-2-3 DP!"
INCR Assists(DataRef(wag, id), id, WhoAtPos)
INCR PutOuts(DataRef(WHOATGUY(2), id), id, 2)
INCR Assists(DataRef(WHOATGUY(2), id), id, 2)
INCR PutOuts(DataRef(WHOATGUY(3), id), id, 3)
ELSE
GOSUB DPAround2nd
END IF
END IF
DPsw = FALSE
GOTO GR999
DPStepOn3rd:
IF DelFac THEN
AddToAnnouncer id, "He steps on the bag for one..."
CALL Msg ("08", "0","2", "00", 0, id, man2, team2) 'back to 1st
CALL Msg ("08", "0","3", "00", 0, id, man2, team2) 'Double play
END IF
CALL Advanc(1, 0, 1)
Result$ = Result$ + "UN-3 DP"
INCR PutOuts(DataRef(WHOATGUY(5), id), id, 5)
INCR Assists(DataRef(WHOATGUY(5), id), id, 5)
INCR PutOuts(DataRef(WHOATGUY(3), id), id, 3)
RETURN
DPAround2nd:
IF DelFac THEN
IF NOT StepOn2nd THEN
CALL Msg ("08", "0","1", "00", 0, id, man2, team2) 'over to 2nd
ELSE
CALL Msg ("08", "0","4", "00", 0, id, man2, team2) 'steps on the bag
END IF
CALL Msg ("08", "0","2", "00", 0, id, man2, team2) 'back to 1st
CALL Msg ("08", "0","3", "00", 0, id, man2, team2) 'Double play
END IF
CALL Advanc(0, 1, 1)
ir1 = 0
IF WhoAtPos = 5 THEN
Result$ = Result$ + "-4-3 DP"
n = 4
END IF
IF WhoAtPos = 6 THEN
IF StepOn2nd = FALSE THEN
Result$ = Result$ + "-4-3 DP"
n = 4
ELSE
Result$ = Result$ + "UN-3 DP"
n = 6
END IF
END IF
IF WhoAtPos = 4 OR WhoAtPos = 3 THEN
IF StepOn2nd = FALSE THEN
Result$ = Result$ + "-6-3 DP"
n = 6
ELSE
Result$ = Result$ + "UN-3 DP"
n = 4
END IF
END IF
IF NOT StepOn2nd THEN INCR Assists(DataRef(wag, id), id, WhoAtPos)
INCR PutOuts(DataRef(WHOATGUY(n), id), id, n)
INCR Assists(DataRef(WHOATGUY(n), id), id, n)
INCR PutOuts(DataRef(WHOATGUY(3), id), id, 3)
RETURN
ChangeAnnouncer:
IF DelFac THEN
IF Dramatic THEN
a$ = UCASE$(Announcer(1).mgs)
i = INSTR(a$, "SLOW")
i = i + INSTR(a$, "CHOP")
i = i + INSTR(a$, "DRIBBLE")
i = i + INSTR(a$, "SQUIB")
i = i + INSTR(a$, "KNUB")
i = i + INSTR(a$, "TAP")
IF i THEN
ANx = ANx - 2
t$ = LTRIM$(STR$(RND(1, 2))) '1 or 2 only
t$ = PADZEROS$(t$, 2)
CALL Msg ("03", p$, "1", t$, wag, id, man2, team2)
CALL Msg ("03", p$, "2", t$, wag, id, man2, team2)
END IF
END IF
END IF
RETURN
DidFBCatchThrow:
FBDropped = FALSE
IF MID$(Result$, 1, 1) = "3" THEN RETURN
'Error on 1st baseman?
bm1 = WHOATGUY(3)
defper1bF! = DEFPCT!(bm1)
zF! = (1.0 - defper1bF!) * .9 'was .8 'Decrease constant for more errors
IF RND > (defper1bF! + zF!) THEN '1st baseman mishandles throw
FBDropped = TRUE
Errorx = TRUE
INCR iterrs(id)
INCR inne
r1 = DataRef(bm1, id)
INCR GpPos(r1, id, 3)
INCR merr(r1, id)
INCR SumErrors(3)
CALL Advanc(1, 1, 1)
Errorx = FALSE
ir1 = ib
mpp(ir1) = ip
mpp(ir1) = -mpp(ir1) 'Flip to negative to show runner got on via error
Result$ = Result$ + "/E-3"
mpo(ip, id) = mpo(ip, id) - 1 'No out recorded anywhere!
END IF
RETURN
GR999:
IF Result$ = "3-3" THEN
Result$ = "3UN"
IF DelFac THEN
FOR i = 2 TO 4
xS$ = UCASE$(Announcer(i).mgs)
IF INSTR(xS$, "HE FLIPS") THEN Result$ = "3-1"
NEXT
ELSE
IF RND > UnAssistedPct! THEN
Result$ = "3-1"
END IF
END IF
IF Result$ = "3-1" THEN
'Take back the putout I already gave the 1st-baseman
'and give it to the pitcher instead
IF PutOuts(DataRef(WHOATGUY(3), id), id, 3) > 0 THEN
DECR PutOuts(DataRef(WHOATGUY(3), id), id, 3)
END IF
INCR PutOuts(ip, id, 1)
ELSE
'Remove the assist I gave the 1st-baseman
IF Assists(DataRef(WHOATGUY(3), id), id, 3) > 0 THEN
DECR Assists(DataRef(WHOATGUY(3), id), id, 3)
END IF
END IF
END IF
EXIT SUB
ErrorTrap:
LOCATE 10, 30
PRINT "ERROR: Ground "; ERRCLEAR
LOCATE 11, 30
PRINT "wag:";wag;"WhoAPos:";WhoAtPos;
x$ = WAITKEY$
END SUB
SUB GroundRulesIO (Flds, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
CALL Drawfrm(2+rowO, 5+colO, 15+rowO, 76+colO, defattr, "Manager Options and other Preferences", "ESC (or close window) to Continue", 1, 0, 1)
DATA 03,07,"Automatic Manager: ", 00,00,00," "
DATA 04,07," Visitor [Y/N] ", 04,32,01,"XR"
DATA 05,07," Home [Y/N] ", 05,32,01,"XR"
DATA 07,07,"Delay seconds: ", 00,00,00," "
DATA 08,07,"[This determines how quickly the play-by-play progresses]",00,00,00," "
DATA 09,07," Delay [0-7] ", 09,32,01,"NR"
DATA 11,07,"Sound Effects [y/n] ", 11,32,01,"XR"
DATA 11,39,"Background Picture ", 11,58,15,"X "
DATA 12,07,"Audio Announcer [y/n] ", 12,32,01,"XR"
DATA 13,07,"Cross-Era Normalization ", 13,32,05,"X "
DATA 13,39,"Performance Focusing [y/N]",13,66,01,"XR"
QPRINTs rowO+11, colO+74, "+", revattr
Flds = 11
c = 1
FOR i = 1 TO Flds
Flitrow(i) = VAL(READ$(c))
IF Flitrow(i) > 0 THEN Flitrow(i) = Flitrow(i) + rowO
Flitcol(i) = VAL(READ$(c+1))
IF Flitcol(i) > 0 THEN Flitcol(i) = Flitcol(i) + colO
Flit$(i) = READ$(c+2)
Frow(i) = VAL(READ$(c+3))
IF Frow(i) > 0 THEN Frow(i) = Frow(i) + rowO
Fcol(i) = VAL(READ$(c+4))
IF Fcol(i) > 0 THEN Fcol(i) = Fcol(i) + colO
Flen(i) = VAL(READ$(c+5))
Fed$(i) = READ$(c+6)
c = c + 7
NEXT
'Set Defaults
REDIM FContents$(13)
FContents$(2) = "N"
FContents$(3) = "N"
FContents$(6) = LTRIM$(STR$(DelFac)) 'Delay
FContents$(7) = CmdSound$ 'Sound
IF LEN(DIR$("STADIUM.TXT")) THEN
FContents$(8) = BackgroundPic$ 'Default Graphics
'Load Contents of Stadium.txt to an array
FileLimit = 200
REDIM List1(1 TO FileLimit) AS List1Type
CALL LoadStadiumToList (List1(), choices)
ELSE
FContents$(8) = ""
choices = 0
END IF
FContents$(9) = "Y" 'Audio Announcer
IF Year(1) <> Year(2) THEN 'Normalization
FContents$(10) = "H"
ELSE
FContents$(10) = ""
END IF
FContents$(11) = "N" 'Focusing
IF CmdStat$ < "!" THEN FLen(11) = -1
CursorPtr = 2
DO
GroundRuleLoop:
CustomEscKey = -62 'F4
CALL ScreenIO(Keyed, KeyEsc, CustomEscKey, KeyEsc, Flds, CursorPtr, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
IF Keyed = CustomEscKey THEN 'F4 - Browse/Select Graphics File
IF LEN(DIR$("STADIUM.TXT")) THEN
CALL SelectPhotoIO(List1(), choices, Selection$)
IF Selection$ = "" THEN 'Make no changes
Selection$ = FContents$(8)
END IF
FContents$(8) = Selection$
GOTO GroundRuleLoop
END IF
END IF
'Edit Field Contents
Error1$ = "N"
IF FContents$(2) <> "Y" AND FContents$(2) <> "N" THEN
Error1$ = "Y": CursorPtr = 2: CALL MyBeep: GOTO GroundRuleLoop
END IF
IF FContents$(3) <> "Y" AND FContents$(3) <> "N" THEN
Error1$ = "Y": CursorPtr = 3: CALL MyBeep: GOTO GroundRuleLoop
END IF
IF FContents$(6) < "0" OR FContents$(6) > "9" THEN
Error1$ = "Y": CursorPtr = 6: CALL MyBeep: GOTO GroundRuleLoop
END IF
IF FContents$(7) <> "Y" AND FContents$(7) <> "N" THEN
Error1$ = "Y": CursorPtr = 7: CALL MyBeep: GOTO GroundRuleLoop
END IF
x$ = RTRIM$(FContents$(10))
y$ = "Response must be [H, V, B] or [####L] where ####=Year L=League"
LL = LEN(x$)
IF LL = 1 THEN
IF x$ <> "H" AND x$ <> "V" AND x$ <> "B" THEN
CALL PopMsg (14+rowO, 7+colO, y$, errattr, 5, kc)
Error1$ = "Y": CursorPtr = 10: GOTO GroundRuleLoop
END IF
END IF
IF LL = 5 THEN
x1$ = MID$(x$, 1, 4)
x2$ = MID$(x$, 5, 1)
IF NUMERIC(x1$, 0, 0) AND (x2$ >= "A" AND x2$ <= "Z") THEN
ELSE
CALL PopMsg (14+rowO, 7+colO, y$, errattr, 5, kc)
Error1$ = "Y": CursorPtr = 10: GOTO GroundRuleLoop
END IF
END IF
IF LL > 1 AND LL < 5 THEN
CALL PopMsg (14+rowO, 7+colO, y$, errattr, 5, kc)
Error1$ = "Y": CursorPtr = 10: GOTO GroundRuleLoop
END IF
IF FContents$(9) <> "Y" AND FContents$(9) <> "N" THEN
Error1$ = "Y": CursorPtr = 9: CALL MyBeep: GOTO GroundRuleLoop
END IF
IF FContents$(11) <> "Y" AND FContents$(11) <> "N" THEN
Error1$ = "Y": CursorPtr = 11: CALL MyBeep: GOTO GroundRuleLoop
END IF
IF FContents$(2) = "N" OR FContents$(3) = "N" THEN
IF FContents$(6) = "0" THEN
Error1$ = "Y"
CursorPtr = 6
CALL MyBeep
QPRINTs 12+rowO, 7+colO,"Do not choose Delay = 0 UNLESS the computer is managing BOTH sides!", defattr
SLEEP 3000
QPRINTs 12+rowO, 7+colO, SPACE$(68), defattr
GOTO GroundRuleLoop
END IF
END IF
LOOP WHILE Error1$ = "Y"
CURSOR OFF 'turn off cursor
ERASE List1
amgr(1) = (FContents$(2) = "Y")
amgr(2) = (FContents$(3) = "Y")
DelFac = VAL(FContents$(6))
SoundOn = (FContents$(7) = "Y")
BackgroundPic$ = RTRIM$(FContents$(8))
AnnouncerOn = (FContents$(9) = "Y")
CmdEra$ = RTRIM$(FContents$(10))
CmdFocus$ = FContents$(11)
IF DelFac = 0 THEN SoundOn = FALSE
END SUB
SUB HBRoutine
IF DelFac THEN
IF SoundOn THEN CALL WavPopMitt
CALL Msg ("29", "0", "0", "16", ib, it, man2, team2)
CALL Msg ("29", "0", "0", "17", ib, it, man2, team2)
END IF
IF ir3 <> 0 AND ir2 <> 0 AND ir1 <> 0 THEN 'Bases Loaded
CALL Advanc(1, 1, 1)
ELSEIF ir1 THEN 'Runner on First
IF ir2 THEN 'Also on Second
CALL Advanc(1, 1, 0)
ELSE 'Nobody on Second
CALL Advanc(1, 0, 0)
END IF
END IF
' ** PUT BATTER ON 1ST **
ir1 = ib
mpp(ib) = ip
DECR mab(ref, it)
IF UCASE$(DataHand(ip, id)) = "L" THEN
DECR mabLHP(ref, it)
ELSE
DECR mabRHP(ref, it)
END IF
INCR mhb(ref, it)
INCR mphb(ip, id)
Result$ = "HBP"
xS$ = PADZEROS$(LTRIM$(STR$(ip)), 2) + PADZEROS$(LTRIM$(STR$(ref)), 2)
HitByPit(id) = HitByPit(id) + xS$
END SUB
SUB HomeOptions (Pick)
REDIM List1(1 TO 10) AS List1Type
IF it = 2 THEN
CALL Drawfrm(10+rowO, 42+colO, 20+rowO, 72+colO, defattr, RTRIM$(Names(2)), "", 0, 0, 2)
List1(1).ListItem = " Pinch Hit "
List1(2).ListItem = " Pinch Run "
List1(3).ListItem = " View Lineup "
List1(4).ListItem = " View Opponent "
List1(5).ListItem = " Call Bullpen "
IF WarmUpRule = FALSE THEN List1(5).ListItem = "%" + List1(5).ListItem
List1(6).ListItem = STRING$(27,CHR$(196))
List1(7).ListItem = " Steal "
List1(8).ListItem = " Bunt/Squeeze "
List1(9).ListItem = " Hit and Run "
CALL PickFromList(List1(), 9, 9, 1, 27, 10+rowO, 42+colO, 20+rowO, 72+colO, dimattr, revattr, Pick, RetKey, nulls$, mous, ms$)
SELECT CASE Pick
CASE 1
PH = TRUE
CASE 2
PRun = TRUE
CASE 3
ViewHome = TRUE
CASE 4
ViewVisi = TRUE
CASE 5
BullO = TRUE
CASE 7
Steal = TRUE
CASE 8
Bunt = TRUE
CASE 9
HitAndRun = TRUE
CASE ELSE
END SELECT
ELSE
CALL Drawfrm(10+rowO, 42+colO, 21+rowO, 72+colO, defattr, RTRIM$(Names(2)), "", 0, 0, 2)
List1(1).ListItem = " Visit Mound "
List1(2).ListItem = " Player Substitution "
List1(3).ListItem = " Swap Positions "
List1(4).ListItem = " View Line-up "
List1(5).ListItem = " View Opponent "
List1(6).ListItem = STRING$(27,CHR$(196))
List1(7).ListItem = " Intentional Walk "
List1(8).ListItem = " Infield Tight "
List1(9).ListItem = " Pitch-Out "
List1(10).ListItem =" Pitch-Around "
CALL PickFromList(List1(), 10, 10, 1, 27, 10+rowO, 42+colO, 21+rowO, 72+colO, dimattr, revattr, Pick, RetKey, nulls$, mous, ms$)
SELECT CASE Pick
CASE 1
BullD = TRUE
CASE 2
SubX = TRUE
CASE 3
SwPos = TRUE
CASE 4
ViewHome = TRUE
CASE 5
ViewVisi = TRUE
CASE 7
IWalk = TRUE
CASE 8
Tight = TRUE
CASE 9
POut = TRUE
CASE 10
PAround = TRUE
CASE ELSE
END SELECT
END IF
ERASE List1
END SUB
SUB HomeRunRoutine
ppF! = FindPP!
WhoAtPos = OUTFIELDWHOAT(ppF!)
wag = WHOATGUY(WhoAtPos)
IGone = TRUE
IF DelFac THEN
IF SoundOn THEN CALL WavBigFly
IF InsideThePark THEN
CALL TripleDialog (wag)
CALL Msg ("10", "0", "4", "00", ib, it, man2, team2) 'he's not stopping
CALL Msg ("31", "0", "0", "01", ib, it, man2, team2) 'rounds third...
CALL Msg ("31", "0", "0", "06", ib, it, man2, team2) 'he slides...
CALL Msg ("15", "0", "0", "04", ib, it, man2, team2) 'SAFE...
ELSE
IF RND < .1 THEN t$ = "02" ELSE t$ = "01"
CALL Msg ("09", "0", "1", "01", 0, it, man2, team2) 'long drive
CALL Msg ("09", "0", "2", t$, wag, id, man2, team2) '* going back
CALL Msg ("09", "0", "3", t$, 0, id, man2, team2) 'gone
END IF
END IF
CALL Advanc(3, 2, 1)
INCR itruns(it)
INCR innr
INCR iScoreBd(it, innct)
IF inn < 31 THEN INCR iScore(it, inn)
INCR mpr(ip, id)
INCR mphr(ip, id)
IF inne - innadverr + iout < 3 THEN INCR mper(ip, id)
CALL CreditHit
INCR mruns(ref, it)
INCR mhr(ref, it)
IF UCASE$(DataHand(ip, id)) = "L" THEN
INCR mhrLHP(ref, it)
ELSE
INCR mhrRHP(ref, it)
END IF
INCR mrbi(ref, it)
IF itruns(it) = itruns(id) THEN 'Score now tied? Erase "pitcher-of-record"
WPteam = 0: WPpit = 0: LPteam = 0: LPpit = 0: SPteam = 0: SPpit = 0
'Check for Blown Save
IF QualSave1IP OR QualSave2IP THEN
QualSave1IP = 0
QualSave1ID = 0
QualSave2IP = 0
QualSave2ID = 0
IF inn > (RegInns - 3) THEN INCR mpBS(ip, id)
END IF
ELSEIF itruns(it) - itruns(id) = 1 THEN
WPteam = it: WPpit = ipa(it)
LPteam = id: LPpit = ip
END IF
Result$ = "HR"
END SUB
SUB Innsum (r, c)
QPRINTs r, c,"Inning.......", defattr
QPRINTs r, c+13, STR$(inn), defattr
QPRINTs r+2, c,"Runs.........", dimattr
QPRINTs r+2, c+13, STR$(innr), dimattr
QPRINTs r+3, c,"Hits.........", dimattr
QPRINTs r+3, c+13, STR$(innh), dimattr
QPRINTs r+4, c,"Errors.......", dimattr
QPRINTs r+4, c+13, STR$(inne), dimattr
QPRINTs r+5, c,"LOB..........", dimattr
QPRINTs r+5, c+13, STR$(innLOB), dimattr
QPRINTs r+7, c,"'" + LEFT$(Names(1), 12) + LFORMAT$(itruns(1), "##"), defattr
QPRINTs r+8, c,"'" + LEFT$(Names(2), 12) + LFORMAT$(itruns(2), "##"), defattr
END SUB
SUB KillIt (xS$)
yS$ = CmdWritePath$ + xS$
IF LEN(DIR$(yS$)) THEN KILL yS$
END SUB
SUB Lineup (ii, rv)
DIM Llitrow(3), Llitcol(3), Llit$(3), Lrow(3), Lcol(3), Llen(3), Led$(3), LContents$(3)
DATA 23,36,"",23,37,02,"X "
DATA 23,42,"",23,43,02,"X "
Flds = 2
c = 1
FOR i = 1 TO Flds
Llitrow(i) = VAL(READ$(c)) + rowO
IF ConsRows > 25 THEN INCR Llitrow(i)
Llitcol(i) = VAL(READ$(c+1)) + colO
Llit$(i) = READ$(c+2)
Lrow(i) = VAL(READ$(c+3)) + rowO
IF ConsRows > 25 THEN INCR Lrow(i)
Lcol(i) = VAL(READ$(c+4)) + colO
Llen(i) = VAL(READ$(c+5))
Led$(i) = READ$(c+6)
c = c + 7
NEXT
LastDS = 0
r1 = (ConsRows - 23) \ 2
r2 = r1 + 24
c1 = (ConsCols - 78) \ 2
c2 = c1 + 79
IF ConsRows > 25 AND ConsCols > 81 THEN
sr2 = 1
sc2 = 2
shad = 1
ELSE
sr2 = 0
sc2 = 0
shad = 0
END IF
IF Gfx THEN CALL GraphHole(30, r1, c1, r2+sr2, c2+sc2)
CALL Drawfrm(r1, c1, r2, c2, defattr, "Lineup for '" + RTRIM$(Names(ii)), ARROWS$ + ":SCROLL [S]wap [M]ore Lineups ESC:Continue", shad, 0, 1)
QPRINTs r2-4, c1+1, STRING$(c2-c1-1, CHR$(196)), defattr
QPRINTs r2-4, c1+36, CHR$(180) + " " + LPtr$ + " " + RPtr$ + " " + CHR$(195), defattr
QPRINTs MidRow+3, c2, CHR$(193), defattr
QPRINTs MidRow+4, c2, UpPtr$, defattr
QPRINTs MidRow+5, c2, DnPtr$, defattr
QPRINTs MidRow+6, c2, CHR$(194), defattr
LU5:
RowOff = 0: ColOff = 0
CALL BuildTeamWin (ii, 1, MAXPLAYERS, TRUE, pend)
DO
'1st Vir elem, # of elem, roff, coff, scrn-line, scrn-col, lockrows, lockcol, collimit
'(p1, maxLines, RowOff, ColOff, startline, startcol, rowlock, collock, collimit)
CALL ShowVirtWin (1, 10, RowOff, ColOff, r1+2, c1+2, 10, 20, c2-c1-3)
x$ = STRING$(35,CHR$(196)) + " Bench " + STRING$(36, CHR$(196))
QPRINTs r1+12, c1+1, x$, defattr
CALL ShowVirtWin (LastPiAd(ii) + 4, r2-r1-17, RowOff, ColOff, r1+13, c1+2, 0, 20, c2-c1-3)
GOSUB ShowOpposingPitcher
GOSUB Check4PitInBO 'Is pitcher also playing in the field?
CALL GetScrollKey (kc, RowOff, ColOff)
IF kc = 27 THEN
rv = 0
GOTO LU999
END IF
LOOP UNTIL kc = 83 OR kc = 77 ' "S"wap or "M"ore
'AutoLineup [M]
IF kc = 77 THEN
IF inn = 0 THEN
CALL AutoLineup(ii, c)
CALL AdjustBattingOrder(ii)
ELSE
xS$ = " Sorry. Can't use this feature after the game has started. "
CALL PopMsg(r2-4, 10+colO, xS$, errattr, 2, kc)
END IF
GOTO LU5
END IF
LU100:
IF ConsRows > 25 THEN
rr1 = 23+rowO
cc1 = 23+colO
rr2 = 25+rowO
cc2 = 61+colO
ELSE
rr1 = 22+rowO
cc1 = 23+colO
rr2 = 24+rowO
cc2 = 61+colO
END IF
CALL GetScreen(Scr1$, rr1, cc1, rr2, cc2)
IF Gfx THEN CALL GraphHole(32, rr1, cc1, rr2, cc2)
CALL Drawfrm(rr1, cc1, rr2, cc2, defattr, "Player Numbers to Swap", "ESC:Continue F3:Cancel", 0, 0, 2)
QPRINTs rr1+1, 40+colO, xLPtr$ + xRPtr$, defattr
LContents$(1) = " "
LContents$(2) = " "
CursorPtr = 1
DO
CALL ScreenIO(Keyed, KeyF3, 0, KeyEsc, Flds, CursorPtr, Llen(), Lrow(), Lcol(), Led$(), Llit$(), Llitrow(), Llitcol(), LContents$())
'Cancel
IF Keyed = KeyF3 THEN
BEEP
CALL PutScreen(Scr1$, rr1, cc1, rr2, cc2)
IF Gfx THEN
CALL EliminateHole(32)
CALL UnfreezeAndRefresh
END IF
GOTO LU5
END IF
'Edit Field Contents
Error1$ = "N"
IF LContents$(1) = SPACE$(2) AND LContents$(2) = SPACE$(2) THEN
rv = 0
CALL PutScreen(Scr1$, rr1, cc1, rr2, cc2)
IF Gfx THEN CALL EliminateHole(32)
GOTO LU999
END IF
M10 = VAL(LContents$(1))
M20 = VAL(LContents$(2))
CursorPtr = 1
IF M10 < 1 OR (M10 > 9 AND M10 <= LastPiAd(ii)) OR M10 > pend THEN
xS$ = " Out of range! "
CALL PopMsg(rr1-1, 33+colO, xS$, errattr, 2, kc)
Error1$ = "Y"
GOTO L100Cont
END IF
IF M20 < 1 OR (M20 > 9 AND M20 <= LastPiAd(ii)) OR M20 > pend THEN
xS$ = " Out of range! "
CALL PopMsg(rr1-1, 33+colO, xS$, errattr, 2, kc)
Error1$ = "Y"
CursorPtr = 2
GOTO L100Cont
END IF
IF inn > 0 AND M10 < 10 AND M20 < 10 THEN
xS$ = " Can't change the batting order after the game starts! "
CALL PopMsg(rr1-1, 11+colO, xS$, errattr, 2, kc)
Error1$ = "Y"
GOTO L100Cont
END IF
IF iused(M10, ii) OR iused(M20, ii) THEN
xS$ = " You already sent that player to the showers. Try again. "
CALL PopMsg(rr1-1, 15+colO, xS$, errattr, 2, kc)
Error1$ = "Y"
GOTO L100Cont
END IF
IF (DataPos(M10, ii) = 1 AND M20 > 9) OR (DataPos(M20, ii) = 1 AND M10 > 9) THEN
xS$ = " Select [Bullpen] option to change pitchers! "
CALL PopMsg(rr1-1, 15+colO, xS$, errattr, 2, kc)
Error1$ = "Y"
GOTO L100Cont
END IF
'Find bench guy you're about to swap in:
bn = 0
lu = 0
IF M10 > LastPiAd(ii) AND M20 > LastPiAd(ii) THEN
bn = 0
lu = 0
ELSEIF M10 > LastPiAd(ii) THEN
bn = M10
lu = M20
ELSEIF M20 > LastPiAd(ii) THEN
bn = M20
lu = M10
END IF
IF bn THEN
'Does this guy have identical name to a current or used pitcher?
FOR nn = 1 TO np(ii)
IF DataName(bn, ii) = DataName(iyp(nn, ii), ii) THEN
Error1$ = "Y"
xS$ = " The bench player seems to be a used pitcher. Try again. "
CALL PopMsg(rr1-1, 15+colO, xS$, errattr, 2, kc)
GOTO L100Cont
END IF
NEXT
END IF
'Former position of check4pitinBO
L100Cont:
LOOP WHILE Error1$ = "Y"
CURSOR OFF 'turn off cursor
IF M10 < 10 THEN IOPOS = DataPos(M10, ii)
IF M20 < 10 THEN IOPOS = DataPos(M20, ii)
LUSwitchEm:
IF inn > 0 THEN
'Prevent adding to scorecard after a double-switch
IF (M10 > 9 OR M20 > 9) AND bn > 0 THEN
x$ = "[SUB]" + FLASTNAME$(bn, ii) + "(" + RTRIM$(Pos(IOPOS)) _
+ ") for " + FLASTNAME$(lu, ii)
CALL AddToScoreCrd (0, 0, "X", x$)
END IF
END IF
'Switch attributes of player M10 and M20 on team ii
CALL Switch(M10, M20, ii)
rv = -1
CALL PutScreen(Scr1$, rr1, cc1, rr2, cc2)
IF Gfx THEN
CALL EliminateHole(32)
CALL UnfreezeAndRefresh
END IF
IF M10 < 10 AND M20 < 10 THEN GOTO LU5 'Double-switch exit
IF M10 < 10 THEN DataPos(M10, ii) = IOPOS
IF M20 < 10 THEN DataPos(M20, ii) = IOPOS
IF inn > 0 THEN
IF M10 < 10 AND M20 > 10 THEN iused(M20, ii) = TRUE
IF M20 < 10 AND M10 > 10 THEN iused(M10, ii) = TRUE
IF M10 < 10 THEN LastDS = M10
IF M20 < 10 THEN LastDS = M20
'Add new player to lineup batting slot
CALL AddToRefByBO (LastDS, ii, DataRef(LastDS, ii)) 'bat-pos, team, ref
END IF
'Double-Switch Option
IF LastDS > 0 AND NOT dh AND HotBull THEN
CALL Drawfrm(12+rowO, 13+colO, 14+rowO, 67+colO, defattr, nulls$, nulls$, 1, 0, 0)
QPRINTs 13+rowO, 15+colO, "Want to Double-Switch with the new pitcher? [y/N]", defattr
LOCATE 13+rowO, 65+colO
IF YESorNO$(revfor, revbac, deffor, defbac, "N") = "Y" THEN
M10 = LastDS
ps = 0
DO
INCR ps
IF ps > 9 THEN
x$ = "ERROR(LineUp): No Pitcher Found in Lineup"
x$ = x$ + "|" + DataFil(ii)
CALL ErrorBox (x$)
END IF
LOOP UNTIL DataPos(ps, id) = 1
M20 = ps
HotBull = FALSE 'so will not prompt again
'Remove new player from M10 slot in RefByBO
L = LEN(RefByBO(M10, ii))
IF L > 2 THEN
RefByBO(M10, ii) = LEFT$(RefByBO(M10, ii), L-2)
ELSE
RefByBO(M10, ii) = nulls$
END IF
'Remove new pitcher from M20 slot
L = LEN(RefByBO(M20, ii))
IF L > 2 THEN
RefByBO(M20, ii) = LEFT$(RefByBO(M20, ii), L-2)
ELSE
RefByBO(M20, ii) = nulls$
END IF
'Add new player to M20 slot (they haven't been switched yet)
CALL AddToRefByBO (M20, ii, DataRef(M10, ii)) 'bat-pos, team, ref
'Add new pitcher to M10 slot (they haven't been switched yet)
CALL AddToRefByBO (M10, ii, DataRef(M20, ii)) 'bat-pos, team, ref
x$ = "[DBL-SW]" + FLASTNAME$(M10, ii) + " bats #" + LTRIM$(STR$(M20))
CALL AddToScoreCrd (0, 0, "X", x$)
x$ = " " + FLASTNAME$(M20, ii) + " bats #" + LTRIM$(STR$(M10))
CALL AddToScoreCrd (0, 0, "X", x$)
GOTO LUSwitchEm
END IF
END IF
GOTO LU5
ShowOpposingPitcher:
ij = 3 - ii
IF ipa(ij) THEN
x$ = "Opposing Pitcher W L ERA SIM: W L ERA"
ELSE
x$ = "Opposing Pitcher not determined"
END IF
CALL Drawfrm(r2-3, c1+1, r2-1, c2-1, defattr, x$, nulls$, 0, 0, 0)
IF ipa(ij) THEN
p = ipa(ij)
a$ = SPACE$(69)
MID$(a$, 1, 12) = RTRIM$(Names(ij))
xS$ = DataName(p, ij)
MID$(a$, 14, 20) = FULLNAME$(xS$)
MID$(a$, 35, 1) = DataHand(p, ij)
MID$(a$, 37, 2) = LFORMAT$(DataDef(p, ij), "##")
MID$(a$, 40, 2) = LFORMAT$(DataSB(p, ij), "##")
xF! = DataRBI(p, ij) / 100
MID$(a$, 43, 5) = FFORMAT$(xF!, "#0.##")
IF CmdStat$ > "!" AND DaysOffRule = TRUE THEN
m = GetDaysOff (p, ij)
IF m THEN
MID$(a$, 53, 1) = LFORMAT$(m, "#")
END IF
END IF
CALL PitchersWLS (ij, p, w, l, s, era!)
MID$(a$, 56, 3) = LFORMAT$(w, "###")
MID$(a$, 60, 3) = LFORMAT$(l, "###")
MID$(a$, 64, 5) = FFORMAT$(era!, "#0.##")
QPRINTs r2-2, c1+5, a$, dimattr
END IF
RETURN
Check4PitInBO:
'Is there a pitcher in the batting order?
ps = 0
i = 1
DO
IF DataPos(i, ii) = 1 THEN ps = i : EXIT DO
INCR i
LOOP UNTIL i > 9
IF ps THEN
'There is - Is the pitcher's name anywhere else in the batting order?
FOR i = 1 TO 9
IF i <> ps THEN
IF DataName(i, ii) = DataName(ps, ii) THEN
Error1$ = "Y"
xS$ = " WARNING: The current pitcher is also in the lineup! Please correct. "
CALL PopMsg(20+rowO, 6+colO, xS$, errattr, 4, kc)
EXIT FOR
END IF
END IF
NEXT
END IF
RETURN
LU999:
ERASE VirtualWin
IF Gfx THEN
CALL EliminateHole(30)
END IF
END SUB
SUB ListFile (FileN$)
' TYPE BufType
' BufferItem AS STRING * 210
' END TYPE
MaxPasses = 1000
REDIM PassPosD(MaxPasses) AS LONG
'Check if File Exists
IF LEN(DIR$(FileN$)) = 0 THEN
PRINT FileN$; " not found in the current directory."
EXIT SUB
END IF
MaxLinesInPass = 815
REDIM Buffer(1 TO MaxLinesInPass) AS BufType
' Read through entire file, figure out positions in file when we
' need a "pass break". Go ahead and put first pass into memory.
D& = 1
LastPass = 0
ErrorSw = 0
File = 70
OPEN FileN$ FOR INPUT AS #File
DO UNTIL EOF(File)
IF D& MOD MaxLinesInPass THEN
CurrPass = INT(D& / MaxLinesInPass) + 1
ELSE
CurrPass = INT(D& / MaxLinesInPass)
END IF
IF CurrPass > MaxPasses THEN
CurrPass = CurrPass - 1
ErrorSw = -1
EXIT DO
END IF
IF CurrPass <> LastPass THEN
PassPosD(CurrPass) = SEEK(File)
LastPass = CurrPass
END IF
IF CurrPass = 1 THEN
LINE INPUT #File, xS$
Buffer(D&).BufferItem = xS$
ELSE
xS$ = ""
LINE INPUT #File, xS$
END IF
INCR D&
LOOP
LastLineInFileD& = D& - 1
TotalPasses = CurrPass
'find the last \
l = LEN(FileN$)
i = l
DO
IF MID$(FileN$, i, 1) = "\" THEN EXIT DO
i = i - 1
LOOP WHILE i > 0
IF i = 0 THEN short$ = FileN$ ELSE short$ = MID$(FileN$, i + 1)
COLOR dimfor, dimbac
attr = CalcAttr(0, 7)
CURSOR OFF
a$ = "[X]:Close [" + CHR$(30) + " " + CHR$(31) + "]:PageUp/Dn [< >] [u d] [T]op [B]ot [P]rint [S]aveAs " + CHR$(195) + short$
MID$(a$, 2, 1) = CloseButton$
MID$(a$,12, 1) = UpPtr$
MID$(a$,14, 1) = DnPtr$
MID$(a$,29, 1) = LPtr$
MID$(a$,31, 1) = RPtr$
MID$(a$,35, 1) = xUpPtr$
MID$(a$,37, 1) = xDnPtr$
a$ = PADRIGHT$(a$, ConsCols)
QPRINTs ConsRows, 1, a$, attr
LastPass = 1
begD& = 1
startcol = 1
MouseDown = FALSE
MOUSE 3, DOUBLE, DOWN, UP
Cnt = 0
DO
IF ConsRows = 25 THEN BeginBuffer
DO 'Experiment - Loop while MouseDown
INCR Cnt
FOR linenoD& = begD& TO begD& + (ConsRows-2)
'Find the current pass in the file for line you are about to display
IF linenoD& MOD MaxLinesInPass THEN
CurrPass = INT(linenoD& / MaxLinesInPass) + 1
ELSE
CurrPass = INT(linenoD& / MaxLinesInPass)
END IF
'Always keep the right pass of the file in the buffer memory
IF CurrPass <> LastPass AND CurrPass <= TotalPasses THEN
REDIM Buffer(1 TO MaxLinesInPass) AS BufType '64K or 32 screens
SEEK #File, PassPosD(CurrPass)
LastPass = CurrPass
FOR n = 1 TO MaxLinesInPass
LINE INPUT #File, Buffer(n).BufferItem
IF EOF(File) THEN EXIT FOR
NEXT
END IF
'Find the memory slot in Buffer for linenoD&
i = linenoD& - (CurrPass - 1) * MaxLinesInPass
IF linenoD& > LastLineInFileD& THEN
IF ErrorSw THEN
QPRINTs linenoD& - begD& + 1, 1, "<File Size Limit Exceeded>", defattr
ELSE
QPRINTs linenoD& - begD& + 1, 1, "<End of File>" + SPACE$(ConsCols-13), defattr
n = linenoD& - begD& + 2
DO WHILE n < ConsRows
QPRINTs n, 1, SPACE$(ConsCols), dimattr
INCR n
LOOP
END IF
EXIT FOR
ELSEIF MID$(Buffer(i).BufferItem, 1, 1) = CHR$(12) THEN
QPRINTs linenoD& - begD& + 1, 1, "<New Page>", defattr
ELSEIF MID$(Buffer(i).BufferItem, 1, 1) = "~" THEN
QPRINTs linenoD& - begD& + 1, 1, MID$(Buffer(i).BufferItem, startcol + 1, ConsCols), revattr
ELSE
QPRINTs linenoD& - begD& + 1, 1, MID$(Buffer(i).BufferItem, startcol, ConsCols), dimattr
END IF
NEXT
IF MouseDown AND Cnt = 1 THEN
SLEEP 200 'slow down so hopefully inkey will detect the "up"
END IF
x$ = INKEY$ 'Exp
IF LEN(x$) THEN
' LOCATE 10, 30: PRINT "INPUT DETECTED";: SLEEP 200
MouseDown = FALSE
ELSEIF MouseDown THEN
' LOCATE 10, 30: PRINT "MD/NO INPUT ";
SLEEP 180
IF kc = -81 THEN ' Pg down
IF begD& + (ConsRows-1) <= LastLineInFileD& THEN begD& = begD& + (ConsRows-1)
END IF
IF kc = -73 THEN ' PgUp
IF begD& > ConsRows-1 THEN begD& = begD& - (ConsRows-1) ELSE begD& = 1
END IF
IF kc = -72 THEN ' Up Arrow
IF begD& > 1 THEN begD& = begD& - 1
END IF
IF kc = -80 THEN ' Down Arrow
IF begD& + 1 <= LastLineInFileD& THEN begD& = begD& + 1
END IF
END IF
LOOP WHILE MouseDown
IF ConsRows = 25 THEN EndBuffer
ListerWait:
KyS$ = WAITKEY$
OrgKyS$ = KyS$
Cnt = 0
mous = 0
msx = 0
msy = 0
MouseDown = FALSE
IF LEN(KyS$) = 1 THEN
kc = ASC(KyS$)
KyS$ = UCASE$(KyS$)
ELSEIF LEN(KyS$) = 2 THEN
kc = -ASC(RIGHT$(KyS$, 1))
ELSEIF LEN(KyS$) = 4 THEN
mous = TRUE
msx = MOUSEX
msy = MOUSEY
'read a character from the screen
kc = SCREEN(msy, msx)
KyS$ = CHR$(kc)
IF KyS$ = CloseButton$ THEN kc = 27
IF KyS$ = DnPtr$ THEN kc = -81
IF KyS$ = UpPtr$ THEN kc = -73
IF KyS$ = xDnPtr$ THEN kc = -80
IF KyS$ = xUpPtr$ THEN kc = -72
IF KyS$ = LPtr$ THEN kc = -75
IF KyS$ = RPtr$ THEN kc = -77
IF ASC(OrgKyS$, 3) = 2 THEN MouseDown = TRUE
IF ASC(OrgKyS$, 3) = 4 THEN MouseDown = TRUE
IF msy = ConsRows THEN GOSUB FlashMouse
END IF
IF ASC(OrgKyS$, 3) = 8 THEN GOTO ListerWait 'Button Release
IF kc = -81 THEN ' PgDn
IF begD& + (ConsRows-1) <= LastLineInFileD& THEN begD& = begD& + (ConsRows-1) ELSE CALL MyBeep: GOTO ListerWait
END IF
IF kc = -73 THEN ' PgUp
IF begD& = 1 THEN CALL MyBeep: GOTO ListerWait
IF begD& > ConsRows-1 THEN begD& = begD& - (ConsRows-1) ELSE begD& = 1
END IF
IF kc = -80 THEN ' Down
IF begD& + 1 <= LastLineInFileD& THEN begD& = begD& + 1 ELSE CALL MyBeep: GOTO ListerWait
END IF
IF kc = -72 THEN ' Up
IF begD& > 1 THEN begD& = begD& - 1 ELSE CALL MyBeep: GOTO ListerWait
END IF
IF kc = -75 THEN ' Left
IF startcol - 10 > 0 THEN startcol = startcol - 10
END IF
IF kc = -77 THEN ' Right
'l=121:42
'l=155:75
'l=175:95
'l=175-ConsCols
IF startcol + 10 < (210 - ConsCols) THEN startcol = startcol + 10
END IF
IF KyS$ = "T" OR KyS$ = "t" THEN
begD& = 1
END IF
IF KyS$ = "B" OR KyS$ = "b" THEN
IF LastLineInFileD& - (ConsRows-2) > 0 THEN begD& = LastLineInFileD& - (ConsRows-2) ELSE begD& = 1
END IF
IF KyS$ = "P" OR KyS$ = "p" THEN
CALL PopMsg(13+rowO, 30+colO, "Launching WORDPAD.", errattr, 1, kc2)
'Launch WordPad
CLOSE #File
SLEEP 500
SHELL WordPadSpec$ + " " + FileN$
SLEEP 500
OPEN FileN$ FOR INPUT AS #File
MouseDown = FALSE
END IF
IF KyS$ = "S" OR KyS$ = "s" THEN 'Save As
CALL Drawfrm(12+rowO, 22+colO, 14+rowO, 58+colO, defattr, "Save As...", "ENTER:Save ESC:Cancel", 1, 0, 0)
OldFile$ = RTRIM$(FileN$)
NewFile$ = RTRIM$(MYINPUT$(FALSE, EscKey, CustomEscKey, 13, kc2, revfor, revbac, 13+rowO, 24+colO, 32, " E", 0, 0, OldFile$, msx, msy))
MouseDown = FALSE
'No mouse support
IF kc2 = KeyEsc THEN GOTO ListerTestLoop
IF UCASE$(RTRIM$(NewFile$)) = UCASE$(RTRIM$(FileN$)) THEN GOTO ListerTestLoop
IF NewFile$ < "!" THEN GOTO ListerTestLoop
CLOSE #File
SLEEP 500
FILECOPY RTRIM$(FileN$), NewFile$
SLEEP 500
OPEN FileN$ FOR INPUT AS #File
END IF
ListerTestLoop:
LOOP UNTIL kc = 27 'Escape
MOUSE 3, DOUBLE, DOWN
CLOSE #File
ERASE Buffer
ERASE PassPosD
EXIT SUB
FlashMouse:
CALL FlashField (msy, msx, 1, 2, 100, revattr)
RETURN
END SUB
SUB LoadFilesToList1 (FileMask$, List1() AS List1Type, Limit, n)
f$ = UCASE$(DIR$(FileMask$))
DO
IF f$ > "!" THEN
Reject = FALSE 'Win 2K/XP patch
IF FileMask$ = "*. " THEN
L = LEN(f$)
IF MID$(f$, L-3, 1) = "." THEN Reject = TRUE
END IF
IF NOT Reject THEN
INCR n
IF n <= Limit THEN
List1(n).ListItem = f$
ELSE
x$ = "Exceeded program limits on number of files"
CALL ErrorBox (x$)
EXIT SUB
END IF
END IF
END IF
f$ = UCASE$(DIR$)
LOOP WHILE f$ > "!"
END SUB
SUB LoadPbyP
ON ERROR GOTO LPP_ErrorTrap
DIM CurrClass$(10)
DIM CurrPos$(10)
DIM CurrSeq$(10)
DIM CurrTrk$(20)
ndx = 0
OPEN "baseball.msg" FOR INPUT AS #1
DO UNTIL EOF(1)
LINE INPUT #1, rec$
c1$ = MID$(rec$, 1, 1)
IF c1$ = ";" THEN
IF EOF(1) THEN
EXIT DO
ELSE
ITERATE DO
END IF
END IF
IF c1$ = "C" THEN
cc = 0
cp = 0
cs = 0
ct = 0
GOSUB ParseRec
FOR i = 1 TO n
CurrClass$(i) = PARSE$(x$, i)
NEXT
cc = n
ELSEIF c1$ = "P" THEN
cp = 0
cs = 0
ct = 0
GOSUB ParseRec
FOR i = 1 TO n
CurrPos$(i) = PARSE$(x$, i)
NEXT
cp = n
ELSEIF c1$ = "S" THEN
cs = 0
ct = 0
GOSUB ParseRec
FOR i = 1 TO n
CurrSeq$(i) = PARSE$(x$, i)
NEXT
cs = n
ELSEIF c1$ = "D" THEN
ct = 0
GOSUB ParseRec
FOR i = 1 TO n
CurrTrk$(i) = PARSE$(x$, i)
NEXT
ct = n
ELSEIF c1$ = " " THEN
ccc = 1
DO
cpc = 1
DO
csc = 1
DO
ctc = 1
DO
INCR ndx
IF ndx > 1500 THEN
PRINT "Too many Play-by-Play lines!"
SLEEP 1000
EXIT SUB
END IF
IF cc > 0 THEN
PbyP(ndx).class = PADZEROS$(CurrClass$(ccc), 2)
ELSE
PbyP(ndx).class = "00"
END IF
IF cp > 0 THEN
PbyP(ndx).pos = CurrPos$(cpc)
ELSE
PbyP(ndx).pos = "0"
END IF
IF cs > 0 THEN
PbyP(ndx).seq = CurrSeq$(csc)
ELSE
PbyP(ndx).seq = "0"
END IF
IF ct > 0 THEN
PbyP(ndx).trk = PADZEROS$(CurrTrk$(ctc), 2)
ELSE
PbyP(ndx).trk = "00"
END IF
PbyP(ndx).pndx = " "
PbyP(ndx).text = MID$(rec$, 7)
INCR ctc
LOOP UNTIL ctc > ct
INCR csc
LOOP UNTIL csc > cs
INCR cpc
LOOP UNTIL cpc > cp
INCR ccc
LOOP UNTIL ccc > cc
END IF
LOOP
CLOSE #1
REDIM PRESERVE PbyP(ndx) AS GLOBAL PbyPType
PbyP_Cnt = ndx
ARRAY SORT PbyP(1) FOR PbyP_Cnt, FROM 1 TO 6, ASCEND
'PRINT "PbyP_Cnt: "; PbyP_Cnt
'Stick in the "tie-breaker index"
i = 1
key$ = PbyP(1).class + PbyP(1).pos + PbyP(1).seq + PbyP(1).trk
DO UNTIL i > PbyP_Cnt
savekey$ = key$
IDX = 0
DO UNTIL key$ <> savekey$ OR i > PbyP_Cnt
INCR IDX
x$ = LTRIM$(STR$(IDX))
x$ = PADZEROS$(x$, 3)
PbyP(i).pndx = x$
INCR i
IF i <= PbyP_Cnt THEN
key$ = PbyP(i).class + PbyP(i).pos + PbyP(i).seq + PbyP(i).trk
END IF
LOOP
LOOP
EXIT SUB
ParseRec:
s = INSTR(rec$, " ")
IF s THEN
x$ = MID$(rec$, 3, s - 3)
ELSE
x$ = MID$(rec$, 3)
END IF
n = PARSECOUNT(x$)
RETURN
LPP_ErrorTrap:
LOCATE 10, 30
PRINT "LPP_Error"; ERRCLEAR
x$ = WAITKEY$
END SUB
SUB LoadScoreCardToList1 (List1() AS List1Type, j) 'j will return actual # of entries
i = 1
j = 0
LastTeam = 2
DO WHILE i <= SCx
IF SCRec(i).SCTeam <> LastTeam _
AND SCRec(i).SCCode <> "X" _
AND SCRec(i).SCCode <> "0" THEN
LastTeam = SCRec(i).SCTeam
IF j < 300 THEN
INCR j
zS$ = ": " + Names(LastTeam)
List1(j).ListItem = "~ Inn." + STR$(SCRec(i).SCInn) + zS$
END IF
END IF
IF SCRec(i).SCRef > 0 THEN
player = SCRec(i).SCRef
team = SCRec(i).SCTeam
GOSUB SCGetName 'in yS$
ELSE
yS$ = ""
END IF
IF SCRec(i).SCCode = " " THEN 'normal'
xS$ = PADRIGHT$(yS$, 18)
ELSEIF SCRec(i).SCCode = "X" THEN 'free format
xS$ = SCRec(i).SCResult
GOTO SCINC
ELSEIF SCRec(i).SCCode = "9" THEN 'PH/PR replacement
xS$ = "*EX:" + yS$ + " " + _
LEFT$(SCRec(i).SCResult, 10)
GOTO SCINC
ELSEIF SCRec(i).SCCode = "8" THEN 'PH
xS$ = "*PH:" + PADRIGHT$(yS$, 14)
ELSEIF SCRec(i).SCCode = "7" THEN
xS$ = "*PR:" + yS$ 'PR
GOTO SCINC
ELSEIF SCRec(i).SCCode = "6" THEN 'SB
xS$ = "*SB:" + PADRIGHT$(yS$, 14)
ELSEIF SCRec(i).SCCode = "5" THEN
xS$ = PADRIGHT$(yS$, 18) 'WP/PB
ELSEIF SCRec(i).SCCode = "4" THEN
xS$ = "X@4:" + PADRIGHT$(yS$, 14) 'X4
ELSEIF SCRec(i).SCCode = "3" THEN
xS$ = "X@3:" + PADRIGHT$(yS$, 14) 'X3
ELSEIF SCRec(i).SCCode = "2" THEN
xS$ = "X@2:" + PADRIGHT$(yS$, 14) 'X2
ELSEIF SCRec(i).SCCode = "1" THEN
xS$ = "X@1:" + PADRIGHT$(yS$, 14) 'X1 PK-OFF
ELSEIF SCRec(i).SCCode = "0" THEN
xS$ = PADRIGHT$(yS$, 17) + " " 'Starting Lineup
xS$ = xS$ + LEFT$(SCRec(i).SCResult, 10)
GOTO SCINC
ELSEIF SCRec(i).SCCode = "A" THEN
'Flip teams for special case.
'Completely special case for listing pitchers on other side
'and defensive people swaped in in a double-switch.
player = SCRec(i).SCRef
team = 3 - SCRec(i).SCTeam
GOSUB SCGetName
xS$ = RTRIM$(SCRec(i).SCResult) + " " + yS$
GOTO SCINC
ELSE
xS$ = "- " + PADRIGHT$(yS$, 16)
END IF
xS$ = xS$ + LEFT$(SCRec(i).SCResult, 10) + _
SCRec(i).SCBase3 + _
SCRec(i).SCBase2 + _
SCRec(i).SCBase1 + _
SCRec(i).SCBase4
SCINC:
IF j < 300 THEN
INCR j
List1(j).ListItem = xS$
END IF
INCR i
LOOP
EXIT SUB
SCGetName: 'input: team, ref
yS$ = FLASTNAMER$(player, team)
RETURN
END SUB
SUB LoadSIMData (tm)
i = 1
DO WHILE i <= MAXPLAYERS
xS$ = DataName(i, tm)
ref = DataRef(i, tm)
IF i > LastPiAd(tm) THEN
IF xS$ < "!" THEN EXIT DO
END IF
IF ref < 1 OR ref > MAXPLAYERS THEN
x$ = "Reference ptr out of bounds in LoadSIMData.|Ref:"
x$ = x$ + STR$(ref) + " Max:" + STR$(MAXPLAYERS)
x$ = x$ + "|" + xS$ + " " + RTRIM$(Names(tm))
MyBEEP
CALL ErrorBox (x$)
END IF
'Look up everybody's hitting record, including pitchers
FoundAt = 0
Find$ = League(tm)
Find$ = Find$ + PADRIGHT$(Names(tm), 12)
Find$ = Find$ + PADRIGHT$(xS$, 16)
TotalRecs = BSum(0).BGameCtr
CALL BinarySearchB (BSum(), 1, 29, 1, TotalRecs, Find$, FoundAt, mini)
IF FoundAt = 0 THEN
BSum(FoundAt).BGames = 0
BSum(FoundAt).BABs = 0
BSum(FoundAt).BHits = 0
BSum(FoundAt).BBBs = 0
BSum(FoundAt).BKs = 0
BSum(FoundAt).BHRs = 0
BSum(FoundAt).BRBIs = 0
BSum(FoundAt).BStreak = 0
END IF
SimGames(ref, tm) = BSum(FoundAt).BGames
SimAB(ref, tm) = BSum(FoundAt).BABs
SimHits(ref, tm) = BSum(FoundAt).BHits
SimBB(ref, tm) = BSum(FoundAt).BBBs
SimSO(ref, tm) = BSum(FoundAt).BKs
SimHR(ref, tm) = BSum(FoundAt).BHRs
SimRBI(ref, tm) = BSum(FoundAt).BRBIs
SimBStreak(ref, tm) = BSum(FoundAt).BStreak
IF ref > 9 AND ref <= LastPiAd(tm) THEN
IF ref < 10 OR ref > TopPitLim THEN
x$ = "Reference ptr not in pitcher range.|Ref:" + STR$(ref)
BEEP
CALL ErrorBox (x$)
END IF
'A Pitcher's Reference Number, so look up pitching history
FoundAt = 0
Find$ = League(tm)
Find$ = Find$ + PADRIGHT$(Names(tm), 12) + PADRIGHT$(xS$, 16)
TotalRecs = PSum(0).PGameCtr
CALL BinarySearchP (PSum(), 1, 29, 1, TotalRecs, Find$, FoundAt, mini)
IF FoundAt = 0 THEN
PSum(FoundAt).PInns = 0
PSum(FoundAt).P3rds = 0
PSum(FoundAt).PWin = 0
PSum(FoundAt).PLoss = 0
PSum(FoundAt).PERuns = 0
PSum(FoundAt).PHits = 0
PSum(FoundAt).PBBs = 0
PSum(FoundAt).PSOs = 0
PSum(FoundAt).PSave = 0
PSum(FoundAt).PDaysOff = 0
END IF
SimInn(ref, tm) = PSum(FoundAt).PInns + PSum(FoundAt).P3rds / 3
SimWins(ref, tm) = PSum(FoundAt).PWin
SimLosses(ref, tm) = PSum(FoundAt).PLoss
SimHitsAlw(ref, tm) = PSum(FoundAt).PHits
SimERuns(ref, tm) = PSum(FoundAt).PERuns
SimBBAlw(ref, tm) = PSum(FoundAt).PBBs
SimSO_P(ref, tm) = PSum(FoundAt).PSOs
SimSaves(ref, tm) = PSum(FoundAt).PSave
DaysOff = PSum(FoundAt).PDaysOff
IF CmdSch$ > "!" THEN
Now = JDATE(SchDate$)
Last = PSum(FoundAt).PJDate
DaysOff = DaysOff - (Now - Last) + 1
IF DaysOff < 0 THEN DaysOff = 0
IF DaysOff > 4 THEN DaysOff = 4
END IF
SimDaysOff(ref, tm) = DaysOff
END IF
INCR i
LOOP
END SUB
SUB LoadStadiumToList (List1() AS List1Type, choices)
'FileLimit = 200
'REDIM List1(1 TO FileLimit) AS List1Type
OPEN "STADIUM.TXT" FOR INPUT AS #1 LEN = 128
n = 1
List1(n).ListItem = "--NONE--"
DO WHILE NOT EOF(1)
LINE INPUT #1, rec$
rec$ = UCASE$(rec$)
IF MID$(rec$, 1, 1) <> "*" THEN
INCR n
fn$ = MID$(rec$, 1, 20)
st$ = RTRIM$(MID$(rec$, 53, 26))
cy$ = RTRIM$(MID$(rec$, 80, 20))
cr$ = RTRIM$(MID$(rec$, 100, 16))
x$ = fn$ + PADRIGHT$(st$ + ", " + cy$, 35) + cr$
List1(n).ListItem = x$
END IF
LOOP
CLOSE #1
choices = n
END SUB
SUB Logo (zS$)
c1 = (ConsCols - 57) \ 2 '75 65
c2 = ConsCols - c1
r1 = (ConsRows - 21) \ 2
r2 = ConsRows - r1
IF Gfx THEN
CALL GraphHole(32, r1, c1, r2, c2)
END IF
attr = dimattr
CALL Drawfrm(r1, c1, r2, c2, defattr, "Copyright 1988-2012 ----------------", "", 0, 0, 0)
xS$ = "David B. Schmidt"
IF CODESUM(xS$) <> 1380 THEN
QPRINTs r1+13, c1+19, "TAMPERING DETECTED!!!", defattr
SLEEP 4000
zS$ = "Q"
END IF
QPRINTs r1, c1+31, xS$, defattr
c = c1 + 2
r = r1 + 2
IF ConsRows = 25 THEN BeginBuffer
QPRINTs r+ 5, c, " * *", attr
QPRINTs r+ 6, c, " * *", attr
QPRINTs r+ 7, c, " * *", attr
QPRINTs r+ 8, c, " ", attr
QPRINTs r+ 9, c, " * *", attr
QPRINTs r+10, c, " * *", attr
QPRINTs r+11, c, " * * *", attr
QPRINTs r+12, c, " * * * *", attr
QPRINTs r+13, c, " * * * *", attr
QPRINTs r+14, c, " * SBS *", attr
QPRINTs r+15, c, " * *", attr
QPRINTs r+16, c, " * *", attr
QPRINTs r+17, c, " *", attr
'QPRINTs r+18, c+9, " ", attr
QPRINTs r+19, c+14, "Version 4.9.3 2012.06.04", attr
'STRATEGIC
cS$ = ""
i = 1
DO
xS$ = READ$(i)
IF xS$ <> "Z" THEN
cS$ = cS$ + CHR$(VAL(xS$))
INCR i
ELSE
EXIT DO
END IF
LOOP
DATA 32,201,205,205,32,205,203,205,32,201,205,205,187,32,201,205,205,187,32
DATA 205,203,205,32,201,205,205,32,201,205,205,187,32,32,203,32,32,201,205,187
DATA Z
QPRINTs r, c+7, cS$, attr
cS$ = ""
INCR i
DO
xS$ = READ$(i)
IF xS$ <> "Z" THEN
cS$ = cS$ + CHR$(VAL(xS$))
INCR i
ELSE
EXIT DO
END IF
LOOP
DATA 32,200,205,187,32,32,186,32,32,204,205,203,188,32,204,205,205,185,32,32
DATA 186,32,32,204,205,205,32,186,32,205,187,32,32,186,32,32,186
DATA Z
QPRINTs r+1, c+7, cS$, attr
cS$ = ""
INCR i
DO
xS$ = READ$(i)
IF xS$ <> "Z" THEN
cS$ = cS$ + CHR$(VAL(xS$))
INCR i
ELSE
EXIT DO
END IF
LOOP
DATA 32,205,205,188,32,32,202,32,32,202,32,202,32,32,202,32,32,202,32,32
DATA 202,32,32,200,205,205,32,200,205,205,188,32,32,202,32,32,200,205,188
DATA Z
QPRINTs r+2, c+7, cS$, attr
'BASEBALL
cS$ = ""
INCR i
DO
xS$ = READ$(i)
IF xS$ <> "Z" THEN
cS$ = cS$ + CHR$(VAL(xS$))
INCR i
ELSE
EXIT DO
END IF
LOOP
DATA 32,219,223,223,223,220,32,32
DATA 219,223,223,223,219,32,32
DATA 219,223,223,219,32,32
DATA 219,223,223,223,219,32,32
DATA 219,223,223,223,220,32,32
DATA 219,223,223,223,219,32,32
DATA 219,32,32,32,32,32
DATA 219
DATA Z
QPRINTs r+4, c+1, cS$, attr
cS$ = ""
INCR i
DO
xS$ = READ$(i)
IF xS$ <> "Z" THEN
cS$ = cS$ + CHR$(VAL(xS$))
INCR i
ELSE
EXIT DO
END IF
LOOP
DATA 32, 219,220,220,220,219,32,32
DATA 219,220,220,220,219,32,32
DATA 219,220,220,220,32,32
DATA 219,220,220,220,32,32,32
DATA 219,220,220,220,219,32,32
DATA 219,220,220,220,219,32,32
DATA 219,32,32,32,32,32
DATA 219
DATA Z
QPRINTs r+5, c+1, cS$, attr
cS$ = ""
INCR i
DO
xS$ = READ$(i)
IF xS$ <> "Z" THEN
cS$ = cS$ + CHR$(VAL(xS$))
INCR i
ELSE
EXIT DO
END IF
LOOP
DATA 32,219,32,32,32,219,32,32
DATA 219,32,32,32,219,32,32,32,32,32
DATA 219,32,32
DATA 219,32,32,32,32,32,32
DATA 219,32,32,32,219,32,32
DATA 219,32,32,32,219,32,32
DATA 219,32,32,32,32,32
DATA 219
DATA Z
QPRINTs r+6, c+1, cS$, attr
cS$ = ""
INCR i
DO
xS$ = READ$(i)
IF xS$ <> "Z" THEN
cS$ = cS$ + CHR$(VAL(xS$))
INCR i
ELSE
EXIT DO
END IF
LOOP
DATA 32,219,220,220,220,223,32,32
DATA 219,32,32,32,219,32,32
DATA 219,220,220,219,32,32
DATA 219,220,220,220,219,32,32
DATA 219,220,220,220,223,32,32
DATA 219,32,32,32,219,32,32
DATA 219,220,220,219,32,32
DATA 219,220,220,219
DATA Z
QPRINTs r+7, c+1, cS$, attr
QPRINTs r+9, c+20, "S I M U L A T O R", attr
IF ConsRows = 25 THEN EndBuffer
LOCATE 1, 1
CURSOR OFF
IF Gfx THEN
CALL ShowGfx
GfxRefresh 0
END IF
CALL ClearInpBuffer
IF zS$ <> "Q" THEN zS$ = UCASE$(WAITKEY$)
END SUB
SUB Manage (mo, md, runner) STATIC 'May return an offensive or defensive player
ON ERROR GOTO ERRORTRAP
REDIM PHList(1 TO 9) AS PHType
mo = 0
md = 0
runner = 0
RunnersOn = NUMBERON
IF amgr(id) = FALSE THEN GOTO SU200
' --------------------------------------------------------------
' Defensive Maneuvers
' --------------------------------------------------------------
' ** Shall I pull in the Infield? **
RunsAhead = itruns(id) - itruns(it)
IF iout < 2 AND ir3 <> 0 THEN 'guy on 3rd
IF inn <= RegInns - 3 THEN 'early in game
IF ir1 = 0 OR (ir1 > 0 AND iout = 0) THEN
IF (inn - RunsAhead) >= (RegInns - 3) THEN Tight = TRUE
'RunsAhead Inning
' tied 6
' -1 5
' -2 4
' -3 3
' -4 2
END IF
ELSE
'7th inning on:
IF RunsAhead < 2 THEN Tight = TRUE
END IF
END IF
'SP Normal Late Inn
' ** Shall I Pitch-Out? ** ' (@+30) (@+40)
IF RunsAhead <= 2 AND RunsAhead >= -4 THEN
'Not in the 9th inning if defense has a lead > 1 run
IF inn > (RegInns - 1) AND ABS(RunsAhead) > 1 THEN GOTO SU100
'Find Lead Runner (if any)
LR = 0
IF ir3 = 0 THEN
IF ir2 = 0 THEN
IF ir1 <> 0 THEN LR = ir1
ELSE
LR = ir2
END IF
ELSE
LR = ir3
END IF
'Bail out if no appropriate lead runner
IF LR = 0 OR LR = ir3 THEN GOTO SU100
'Check team and player attempt totals
runref = DataRef(LR, it)
POBoost = 0
IF StealAttemptsTeam(it) > 4 THEN
POBoost = POBoost + 10
END IF
IF StealAttemptsPlayer(runref, it) > 2 THEN
POBoost = POBoost + 20
END IF
IF LR = ir1 THEN
IF DataSpeed(ir1, it) < 5 THEN '4 0%
i = 140
ELSEIF DataSpeed(ir1, it) = 5 THEN '5 15%
i = 135
ELSEIF DataSpeed(ir1, it) = 6 THEN '6 25%
i = 135
ELSEIF DataSpeed(ir1, it) = 7 THEN '7 25%
i = 145
ELSEIF DataSpeed(ir1, it) = 8 THEN '8 30%
i = 150
ELSE '9 25%
i = 165
END IF
'Limit POuts during same At-Bat
i = i + BatPOut * 20
'Increase Pitchouts if limits are exceeded
i = i - POBoost
IF BatPOut < 2 THEN 'Will not pitch-out more than twice
IF (DataSpeed(ir1, it) * 10) + FRND(100) > i THEN POut = TRUE
END IF
'Late innings, close game situation:
IF inn > (RegInns - 2) AND ABS(RunsAhead) < 2 THEN
IF DataSpeed(ir1, it) > 5 THEN
IF BatPOut < 2 AND FRND(10) > 5 THEN POut = TRUE
END IF
END IF
END IF
IF LR = ir2 THEN
'Pitchout when trying to steal third?
'Not gonna steal/PO 3rd with potential winning run
IF RunsAhead = 0 AND inn > (RegInns - 2) THEN GOTO SU100
IF iout = 0 THEN i = 160
IF iout = 1 THEN i = 140
IF iout = 2 THEN i = 180
IF UCASE$(DataHand(ip, id)) = "R" THEN i = i + 20
'Limit POuts during same At-Bat
i = i + BatPOut * 20
'Increase Pitchouts if limits are exceeded
i = i - POBoost
IF BatPOut < 2 THEN 'Will not pitch-out more than twice
IF (DataSpeed(ir2, it) * 10) + FRND(100) > i THEN POut = TRUE
END IF
END IF
END IF
SU100:
' ** Shall I Pass this guy? **
' [Check for Desperate Situation - Message and Walk Switch]
' Home team batting in the ninth or later with score tied and
' winning run on third with less than two out
IF inn >= RegInns AND it = 2 THEN
IF RunsAhead = 0 THEN
IF iout < 2 THEN
IF ir3 > 0 AND (ir1 = 0 OR ir2 = 0) THEN
IWalk = TRUE
IF DelFac THEN
AddToAnnouncer id, "A tense situation now!"
AddToAnnouncer id, "They're gonna load 'em up!"
END IF
INCR zzziwalk1
GOTO CheckPitcher
END IF
END IF
END IF
END IF
' Other Intentional Walk Situations
IF inn >= (RegInns - 3) THEN
IF ir1 = 0 AND (ir2 > 0 OR ir3 > 0) THEN
IF RunsAhead < 6 THEN
IF RunsAhead > RunnersOn + 1 THEN 'Won't put tying run on base
i = ib + 1
IF i > 9 THEN i = 1
IF DataPos(i, it) = 1 THEN
'If we're thinking about getting to the pitcher
xF! = .06 'No. 8 guy has to be pretty good
ELSE
xF! = .04 'Not so strict about getting to other players
END IF
IF RND < .8 THEN
IF HITRATING!(ib, it) - HITRATING!(i, it) > xF! THEN
IWalk = TRUE
'gonna pitch around *
'to get to @
IF DelFac THEN
CALL Msg ("29", "0", "0", "18", ib, it, man2, team2)
CALL Msg ("29", "0", "0", "19", i, it, man2, team2)
END IF
IF xF! > .059 THEN INCR zzziwalk2 ELSE INCR zzziwalk3
END IF
END IF
END IF
END IF
END IF
END IF
'** Check Bullpen status **
CheckPitcher:
CALL CountAvPitchers (id, Av, LastGuy) '(The current pitcher is not counted)
IF Av < 1 THEN GOTO SU200
'A Bullpen pitcher is available...check on your current pitcher
IF PitchersPerGame(id) < 2.5 THEN
i = 11 - (2 * PitchersPerGame(id))
IF PitchersPerGame(id) < 1.2 THEN i = 10
j = i - 2
k = i - 3
ELSE
i = 5
j = 3
k = 2
END IF
'If given up 5+ runs in less than his first 2 innings of work get the hook:
IF mpr(ip, id) > i - 1 AND mpo(ip, id) < 6 THEN
BullD = TRUE
IF np(id)=1 THEN INCR RemoveReason(1)
GOTO SU999
END IF
'Get hook if given up 7-8+ runs
IF mpr(ip, id) + INT(RunnersOn / 2) > (i + 2) THEN
BullD = TRUE
IF np(id)=1 THEN INCR RemoveReason(2)
GOTO SU999
END IF
IF RunnersOn + 6 > ABS(RunsAhead) THEN 'was +4
IF np(id) = 1 THEN 'Starter is still in the game
'Starter is gone if gives up:
'Normal: Old-Time:
'Runs On-Base Runs On-Base
' 6+ nobody on 7+ nobody on
' 5 2+on 6 2+on
IF mpr(ip, id) + INT(RunnersOn / 2) > i THEN
BullD = TRUE
INCR RemoveReason(3)
GOTO SU999
END IF
ELSE
'Reliever in 1st 5 innings gone if gives up:
'Runs On-Base
' 3+ 2-on or loaded
IF inn < 6 THEN
IF mpr(ip, id) + INT(RunnersOn / 2) > j THEN BullD = TRUE: GOTO SU999
ELSE
'Reliever in 6th inning or later gone if gives up:
'Runs On-Base
' 2+ 2-on or loaded
IF mpr(ip, id) + INT(RunnersOn / 2) > k THEN BullD = TRUE: GOTO SU999
END IF
END IF
END IF
'Have we over-extended the current pitcher?
'Only check at start of an inning (sort of)
'The bigger FatRnd is, the more durable the pitcher
IF iout = 0 AND RunnersOn = 0 THEN
IF ithits(it) > 1 THEN
IF itruns(it) > 0 THEN
IF DataGames(ip, id) THEN
IF nPitch(id) > ExpectedPitchCount(ip, id) * FatRnd(id) THEN
BullD = TRUE
IF np(id)=1 THEN INCR RemoveReason(4)
GOTO SU999
END IF
END IF
END IF
END IF
END IF
'Cut down on complete games
IF Av > 2 THEN 'Reliver Available
IF PitcherBatted(id) = FALSE THEN 'Pitcher didn't bat last inning
IF inn = 8 AND iout = 0 AND RunnersOn = 0 THEN 'Beginning of 8th inning
IF np(id) = 1 THEN 'Starter still in game
IF DataGames(ip, id) THEN
IF nPitch(id) > .90 * ExpectedPitchCount(ip, id) THEN
IF ithits(it) > 2 THEN
x! = PitchersPerGame(id)
CG_Per_162GSeason! = 330.17 - 206.33*x! + 42.39*x!*x! - 2.84*x!*x!*x!
y! = CG_Per_162GSeason! / 162
y! = 1.0 - y! 'Chance of NOT pitching a complete game
IF y! < .01 THEN y! = .01
IF y! > .99 THEN y! = .99
IF RND < (y! / 2.2) THEN 'Remove pitcher % of the time!
BullD = TRUE
INCR RemoveReason(5)
GOTO SU999
END IF
END IF
END IF
END IF
END IF
END IF
END IF
END IF
'Bring in the closer in the late innings?
'Closer must not already be pitching
'Closer must be available
IF inn > 7 THEN
'Old-Style managers are not concerned with "closers", so we make up
'some criteria to decide if we want to look for a closer
IF PitchersPerGame(id) > 2.1 AND HiSaves(id) > 9 AND LastPiAd(id) > 16 THEN
IF CloserIn(id) = FALSE THEN
'Is this a Closer-Situation?
'Do not pull a pitcher with no-hitter or 1-hitter
'Defense must be between tied and 3 runs ahead
'8th inning: 2-3 run lead and tying run on base
'9+ inning: tied; runner on; at least one out: 20 chance for closer
' 1-3 run lead; tying run at plate or at start of inning
ClsSit = FALSE
IF ithits(it) > 1 THEN
IF RunsAhead > -1 AND RunsAhead < 4 THEN
x! = RND
IF StrictCloserRule THEN
IF inn > 8 AND RunsAhead > 1 AND ( (RunnersOn + 2 > RunsAhead) OR (iout = 0 AND RunnersOn = 0 AND x! < (1.0 - .10 * RunsAhead) ) ) THEN ClsSit = TRUE
IF inn > 8 AND RunsAhead = 1 AND ( (RunnersOn + 1 > RunsAhead) OR (iout = 0 AND RunnersOn = 0 AND x! < (1.0 - .10 * RunsAhead) ) ) THEN ClsSit = TRUE
ELSE
IF inn = 8 AND RunsAhead > 1 AND ( (RunnersOn + 2 > RunsAhead) AND iout > 0 AND mpo(ip, id) > 1 AND x! < .8) THEN ClsSit = TRUE
IF inn = 8 AND RunsAhead = 1 AND ( (RunnersOn + 1 > RunsAhead) AND iout > 0 AND mpo(ip, id) > 1 AND x! < .8) THEN ClsSit = TRUE
IF inn > 8 AND RunsAhead > 1 AND ( (RunnersOn + 2 > RunsAhead) OR (iout = 0 AND RunnersOn = 0 AND x! < (1.0 - .10 * RunsAhead) ) ) THEN ClsSit = TRUE
IF inn > 8 AND RunsAhead = 1 AND ( (RunnersOn + 1 > RunsAhead) OR (iout = 0 AND RunnersOn = 0 AND x! < (1.0 - .10 * RunsAhead) ) ) THEN ClsSit = TRUE
IF inn > 8 AND RunsAhead = 0 AND RunnersOn > 0 AND x! < .3 THEN ClsSit = TRUE
END IF
'Turn indicator off for shutouts unless opponent is knocking at the door
IF itruns(it) = 0 AND np(id) = 1 AND RunnersOn - 1 < RunsAhead THEN ClsSit = FALSE
'Turn indicator off if pitcher batted last inning.
'Manager would look dumb if he brought in a closer now.
IF PitcherBatted(id) = TRUE AND (iout + RunnersOn) < 2 THEN ClsSit = FALSE
IF ClsSit = TRUE THEN
'This code doesn't check for the possibility of a duplicate-
'name problem, but CountAvPitchers guarantees that SOMEONE is
'available.
IF NewStyleWithSaves(id) THEN
'Somebody with "Saves" available?
AvCls = 0
FOR i = 10 TO LastPiAd(id)
IF i <> ip AND iused(i, id) = 0 AND DataCS(i, id) > 0 THEN
IF SimDaysOff(i, id) = 0 OR DaysOffRule = FALSE THEN
INCR AvCls
END IF
END IF
NEXT
IF AvCls THEN
BullD = TRUE
GOTO SU999
END IF
ELSE
j = MIN&(15, LastPiAd(id)) 'usually 15 unless not that many pitchers
IF iused(j, id) = 0 AND ip <> j THEN
IF SimDaysOff(j, id) = 0 OR DaysOffRule = FALSE THEN
BullD = TRUE
GOTO SU999
END IF
END IF
END IF
END IF
END IF
END IF
END IF
END IF
END IF
'10 inning limit
IF mpo(ip, id) > 29 THEN BullD = TRUE: GOTO SU999
' ------------------------------------------------------------
' Offensive Maneuvers
' ------------------------------------------------------------
SU200:
IF amgr(it) = FALSE THEN GOTO SU999
RunsBehind = itruns(id) - itruns(it)
RunsAhead = itruns(it) - itruns(id)
RealPitcherUp = FALSE
IF DataPos(ib, it) = 1 THEN
LastRealPitcher$ = DataName(iyp(np(it), it), it)
IF DataName(ib, it) = LastRealPitcher$ THEN
RealPitcherUp = TRUE
END IF
END IF
' ** Consider a Pinch Hitter **
' Conditions to consider a pinch hitter:
' RunsBehind + Inning + RunnersOn - Outs > 7
' Weak hitter
' Available hitters on bench
' Another pitcher available if pinch-hitting for pitcher
'Is your pitcher up now? Make sure its a real pitcher and not a pinch-hitter already...
PullPitcher = FALSE
'IF DataPos(ib, it) = 1 AND DataRef(ib, it) <= LastPiAd(it) THEN
IF RealPitcherUp THEN
'Are there any more pitchers?
CALL CountAvPitchers (it, Av, LastGuy)
IF Av < 1 THEN GOTO SU250 'No more pitchers -- cannot Pinch hit!
IF ithits(id) = 0 THEN GOTO SU250 'No-hitter going! -- don't do it!
'Are you going to pull him at the start of the next inning anyway?
'Compare outs recorded by the pitcher this game with his average
'outs recorded per game. If he has exceeded them by 40 (starter)
'or 25 (reliever) he will be pulled the next inning unless he's
'a starter working on a no-hitter
j = ipa(it)
'PH for him because he'll be over-extended next inning:
IF DataGames(j, it) THEN
IF nPitch(it) + 7 > ExpectedPitchCount(j, it) * FatRnd(it) THEN
PullPitcher = TRUE
END IF
END IF
'PH for him if likelyhood of C.G is low and starter is still in
IF inn = (RegInns - 2) THEN '7th inn
IF np(it) = 1 THEN
x! = PitchersPerGame(it)
CG_Per_162GSeason! = 330.17 - 206.33*x! + 42.39*x!*x! - 2.84*x!*x!*x!
y! = CG_Per_162GSeason! / 162
y! = 1.0 - y! 'Chance of NOT pitching a complete game
IF y! > .99 THEN y! = .99
IF RND < (y! / 2.2) THEN
PullPitcher = TRUE
INCR RemoveReason(6)
END IF
END IF
END IF
'PH for him if he'll probably be lifted for the closer next inning anyway:
IF PitchersPerGame(it) > 2.1 AND LastPiAd(it) > 16 AND HiSaves(it) > 9 THEN
IF CloserIn(it) = FALSE THEN 'He's not the closer
IF inn > (RegInns - 2) THEN '8th inn or more
IF RunsAhead > -1 AND RunsAhead < 4 THEN '0 - 3 ahead
IF mpo(j, it) > 0 THEN 'Retired at least 1 batter
PullPitcher = TRUE
IF np(it) = 1 THEN INCR RemoveReason(7)
END IF
END IF
END IF
END IF
END IF
'Change my mind sometimes:
'If starter is still in, go ahead and try for a shutout
IF np(it) = 1 THEN
IF mpo(j, it) < 27 THEN
IF itruns(id) = 0 AND RunsAhead > 0 THEN PullPitcher = FALSE
END IF
END IF
END IF
IF inn > RegInns THEN Inning = RegInns ELSE Inning = inn
'Give more "weight" for runners in scoring position
iOn = RunnersOn
IF iOn = 1 THEN
IF ir2 OR ir3 THEN iOn = 2
END IF
'We rarely pinch-hit for the pitcher in old-time scenarios
IF RealPitcherUp AND PitchersPerGame(it) < 2.5 THEN
i = 11 - (3 * PitchersPerGame(it))
j = 2 * PitchersPerGame(it) - 2.3 ' - 3
ELSE
i = 2
j = 2
END IF
IF (Inning > i AND (RunsBehind + Inning + iOn - iout > (RegInns - j))) OR PullPitcher THEN
'Are there any pinch hitters available on the bench?
'Build list of eligible hitters with their rating - pay attention to defense
Av = 0
Def1 = DataPos(ib, it) 'Batter's defensive position
FOR i = LastPiAd(it) + 1 TO MAXPLAYERS 'Scan each player on bench
IF DataName(i, it) > "!" THEN 'If bench-player's name is non-blank
IF iused(i, it) = FALSE THEN 'If bench-player hasn't been in the game
IF DataRef(i, it) > LastPiAd(it) OR DataRef(i, it) < 10 THEN 'Bench player's a non-pitcher
'Is potential PH's name identical to the current or previously used pitcher?
ie = 0
FOR ii = 1 TO np(it)
IF DataName(i, it) = DataName(iyp(ii, it), it) THEN ie = -1
NEXT
'If NOT PH'ing for the pitcher, is the candidate also the last
'available pitcher (if cloned pitchers are involved)?
IF DupNameTeam(it) THEN
IF Def1 <> 1 THEN
CALL CountAvPitchers(it, AvP, LastGuy)
IF AvP = 1 AND DataName(LastGuy, it) = DataName(i, it) THEN
ie = -1
END IF
END IF
END IF
IF ie = 0 THEN
IF DataGbyP(i, it, 1) > 0 AND DataPosi(i, it, 1) > 0 THEN 'strict
SELECT CASE Def1
CASE 1, 10
GOSUB AddToPHList 'If current batter is pitcher, anyone will do
CASE ELSE 'Otherwise only add similar defensive players
IF FoundPosition(Def1, i, it) THEN GOSUB AddToPHList
END SELECT
ELSE 'old style - we're not so strict
SELECT CASE Def1
CASE 1
GOSUB AddToPHList 'If current batter is pitcher, anyone will do
CASE 2
IF DataPos(i, it) = 2 THEN GOSUB AddToPHList
CASE 3
IF DataPos(i, it) = 3 OR DataPos(i, it) = 5 THEN GOSUB AddToPHList
CASE 4
IF DataPos(i, it) = 4 OR DataPos(i, it) = 6 THEN GOSUB AddToPHList
CASE 5
IF DataPos(i, it) = 5 OR DataPos(i, it) = 6 THEN GOSUB AddToPHList
CASE 6
IF DataPos(i, it) = 6 THEN GOSUB AddToPHList
CASE 7 TO 9
IF DataPos(i, it) > 6 AND DataPos(i, it) < 10 THEN GOSUB AddToPHList
CASE 10
GOSUB AddToPHList
CASE ELSE
END SELECT
END IF
END IF
END IF
END IF
END IF
NEXT
IF Av > 0 THEN 'If the list is not empty
'Sort the PH List by the hitting rating
ARRAY SORT PHList(1) FOR Av, FROM 1 TO 4, DESCEND
'Convert top PH candidate's rating back to float
highF! = VAL(PHList(1).Criteria1) / 1000
'Compute Rating for our current hitter in the lineup
xF! = HITRATING!(ib, it)
'Set a threshhold value for our next equation based on
'the current inning. If its early in the game make the value
'higher so not many pinch hitters will occur
SELECT CASE inn
CASE 1 TO 3
yF! = .205 '.155
CASE 4
yF! = .165 '.135
CASE 5
yF! = .155
CASE 6
yF! = .145
CASE 7
yF! = .135
CASE ELSE
IF RealPitcherUp THEN
yF! = .040
ELSE
yF! = .070
END IF
END SELECT
'If our potential PH's hit-rating is greater than the current hitter's
'hit-rating by the threshhold value, or we're going to pull the pitcher
'anyway, go ahead and pinch hit
IF (highF! - xF! > yF!) OR PullPitcher THEN
'We know there are good hitters on the bench but now
're-sort giving boost to low AB/Game Ratio, R/L, and place in .DAT
ARRAY SORT PHList(1) FOR Av, FROM 5 TO 8, DESCEND
'Usually pick the top candidate but sometimes the 2nd or 3rd guy
zF! = RND
IF Av = 1 THEN
i = 1
ELSEIF Av = 2 THEN
IF zF! < .75 THEN i = 1 ELSE i = 2
ELSE
IF zF! < .70 THEN
i = 1
ELSEIF zF! < .85 THEN
i = 2
ELSE
i = 3
END IF
END IF
PH = TRUE
mo = PHList(i).Slot
IF RealPitcherUp AND np(it) = 1 THEN INCR RemoveReason(8)
INCR zzzPH
GOTO SU999
END IF
END IF
END IF
SU250:
'If we did *not* PH for pitcher, mark it.
IF RealPitcherUp THEN PitcherBatted(it) = TRUE
' ** Shall I Bunt? **
IF DataPos(ib, it) = 1 THEN 'Pitcher Bunts almost all the time
'Make sure its an actual pitcher, not a PH
IF RealPitcherUp THEN
IF ir3 = 0 AND ir1 <> 0 AND iout < 2 AND RND < .80 THEN
IF inn < (RegInns - 1) OR RunsBehind < 2 THEN
Bunt = TRUE: GOTO SU999
END IF
END IF
ELSE
GOTO SU260 'Pinch-hitters for pitcher don't bunt
END IF
ELSE
'Non-Pitcher
IF ir3 = 0 AND ir1 <> 0 THEN ' 3 ' .4
IF iout = 0 AND ABS(RunsBehind) < 2 AND DataHR(ib, it) < 20 AND inn > (RegInns - 3) AND RND < .7 THEN
Bunt = TRUE: GOTO SU999 'Normal Bunt Situation
END IF
END IF
END IF
'Anyone can try a squeeze
IF ir3 <> 0 AND ir2 = 0 THEN
IF iout = 1 AND ABS(RunsBehind) < 2 AND DataHR(ib, it) < 20 AND RND < .25 THEN
Bunt = TRUE: GOTO SU999 'Try Squeeze Play
END IF
END IF
SU260:
' ** Shall I ATTEMPT a Steal? **
IF ir3 = 0 AND ir2 = 0 AND ir1 = 0 THEN GOTO SU270 'Nobody on
IF ir3 <> 0 AND ir2 <> 0 THEN GOTO SU270 '2nd & 3rd or loaded
IF ir3 <> 0 AND ir2 = 0 AND ir1 = 0 THEN GOTO SU270 '3rd only
' That leaves only four possible steal situations:
' 1st base only
' 2nd base only
' 1st & 2nd
' 1st & 3rd
IF ir2 THEN IL = ir2 ELSE IL = ir1 'Lead runner (for steal)
'Reject:
IF IL = ir2 AND iout <> 1 THEN GOTO SU265 'Only try to steal 3rd with 1 out
IF IL = ir2 AND RunsBehind = 0 AND inn > (RegInns - 2) THEN GOTO SU270 'don't risk stealing 3rd with potential winning run
IF RunsBehind > 2 THEN GOTO SU270 'Behind by 3 or more (10/2/99)
IF RunsAhead > 4 THEN GOTO SU270 'Ahead by more than 4
IF RunsBehind > 1 AND inn > (RegInns - 2) THEN GOTO SU270 'Don't steal in late innings if behind by 2 or more
'Don't steal if pitcher is up and 0 or 2 out
IF RealPitcherUp AND iout <> 1 THEN GOTO SU270
IF ib < 9 THEN nxt = ib + 1 ELSE nxt = 1
'Don't steal if pitcher is next unless it's very late in game
IF DataPos(nxt, it) = 1 AND inn < (RegInns - 1) THEN GOTO SU270
'Determine SB Attempts
'a. No CS data
IF DataCS(IL, it) = 0 THEN
i = DataSpeed(IL, it)
IF i = 1 THEN yF! = .01
IF i = 2 THEN yF! = .03
IF i = 3 THEN yF! = .06
IF i = 4 THEN yF! = .09
IF i = 5 THEN yF! = .12
IF i = 6 THEN yF! = .16
IF i = 7 THEN yF! = .22
IF i = 8 THEN yF! = .30
IF i = 9 THEN yF! = .42
ELSE
'b. Have SB/CS data
singles = DataHits(IL, it) - DataHR(IL, it) - Data2B(IL, it) - Data3B(IL, it)
IF singles = 0 THEN singles = 1
yF! = (DataSB(IL, it) + DataCS(IL, it)) / (singles + DataBB(IL, it))
'Be more aggressive with 8 and 9's
i = DataSpeed(IL, it)
IF i = 7 THEN yF! = yF! * 1.05
IF i = 8 THEN yF! = yF! * 1.10
IF i = 9 THEN yF! = yF! * 1.15
END IF
'If runner is a pitcher, cut attempts
IF DataPos(IL, it) = 1 THEN yF! = yF! * .33
'Cut down prob. of attempting to steal 3rd, etc.
IF ir2 <> 0 THEN
IF UCASE$(DataHand(ip, id)) = "R" THEN
yF! = yF! * .20
ELSE
yF! = yF! * .80
END IF
ELSEIF UCASE$(DataHand(ip, id)) = "L" THEN
yF! = yF! * .40
ELSE
yF! = yF! * 1.1 '1.03 1.01 1.04 1.25 1.15 1.35 1.30 .90 .80 .85
END IF
'Raise probability of steal attempt in late innings of close games with a good runner
IF inn > (RegInns - 2) AND ABS(RunsBehind) < 2 AND yF! > .25 THEN yF! = yF! * 1.5
IF RND < yF! THEN
Steal = TRUE
IF DataPos(IL, it) = 1 THEN INCR zzsabp
GOTO SU999
END IF
SU265:
' ** Hit and Run
' The "reject" rules on stolen bases apply here too. (Branched to SU270)
IF ir1 <> 0 THEN
IF ir3 = 0 THEN
IF iout < 2 THEN
IF ir2 THEN IL = ir2 ELSE IL = ir1 'Lead runner (for steal)
IF DataSpeed(IL, it) > 3 THEN
yF! = (DataAB(ib, it) - DataHR(ib, it) - DataSO(ib, it)) / DataAB(ib, it)
xF! = RND
IF Year(it) < "1920" THEN zF! = .15 ELSE zF! = 0
IF yF! > .90 THEN
IF xF! > .65 + zF! THEN HitAndRun = TRUE '.60
ELSEIF yF! > .80 THEN
IF xF! > .80 + zF! THEN HitAndRun = TRUE '.75
ELSEIF yF! > .70 THEN
IF xF! > .90 + zF! THEN HitAndRun = TRUE '.90
END IF
END IF
END IF
END IF
END IF
SU270:
' ** Consider a Pinch Runner (for some combination of baserunners) **
IF inn > RegInns - 3 THEN
IF ABS(RunsBehind) < 3 THEN 'was < 4
LL = 100
runner = 0
IF ir1 <> 0 AND ir2 = 0 THEN runner = ir1
IF ir1 <> 0 AND ir2 <> 0 THEN runner = ir2
IF ir1 = 0 AND ir2 <> 0 THEN runner = ir2
IF runner THEN
'Are there any pinch runners available on the bench?
'Find eligible players - pay attention to defense - save fastest
SaveFastest = 0
SaveI = 0
Def1 = DataPos(runner, it) 'runner's current defensive position
IF Def1 <> 1 THEN 'No running for pitchers
'Scan each player on bench
FOR i = LastPiAd(it) + 1 TO MAXPLAYERS 'Scan each player on bench
IF DataName(i, it) > "A" THEN 'If bench-player's name is non-blank
IF iused(i, it) = FALSE THEN 'If bench-player hasn't been in the game
IF DataRef(i, it) > LastPiAd(it) OR DataRef(i, it) < 10 THEN 'Bench-player is a non-pitcher
'Fix 2/23/05
'Is potential PH's name identical to the current or previously used pitcher?
OK1 = TRUE
FOR ii = 1 TO np(it)
IF DataName(i, it) = DataName(iyp(ii, it), it) THEN OK1 = FALSE
NEXT
'Is the candidate also the last available pitcher
'(if cloned pitchers are involved)?
IF OK1 THEN
OK2 = TRUE
IF DupNameTeam(it) THEN
CALL CountAvPitchers(it, AvP, LastGuy)
'LastGuy is a pitcher's number
'Does his name match the candidate's name?
IF AvP = 1 AND DataName(LastGuy, it) = DataName(i, it) THEN
OK2 = FALSE
END IF
END IF
END IF
IF OK1 AND OK2 THEN
IF DataSpeed(i, it) - DataSpeed(runner, it) >= 3 THEN
'Found a faster guy
'Does he play the correct position?
OK = FALSE
FOR ii = 1 TO 4
IF DataPosi(i, it, ii) = Def1 THEN OK = TRUE: EXIT FOR
NEXT
IF OK THEN
IF DataSpeed(i, it) > SaveFastest THEN
SaveFastest = DataSpeed(i, it)
SaveI = i
END IF
END IF
END IF
END IF
END IF
END IF
END IF
NEXT
END IF
IF SaveI > 0 THEN 'The fastest elegible player
IF RND < .80 THEN '2007 - reduce pinching-running by manager slightly
PRun = TRUE
mo = SaveI
GOTO SU999
END IF
END IF
END IF
END IF
END IF
GOTO SU999
AddToPHList: 'in:[i]
'Uses n, xF!, h$, zF!
IF Av < 9 THEN
'1. Hit-rating
xF! = HITRATING!(i, it)
INCR Av
PHList(Av).Criteria1 = FLOAT2STR$(xF!)
'2. Boost hitters with lots of "unaccounted" games
IF DataGames(i, it) > 0 AND DataAB(i, it) > 40 THEN
GamesAllPos = 0
FOR n = 1 TO 4 '4 possible games by position
IF DataPosi(i, it, n) > 1 THEN
GamesAllPos = GamesAllPos + DataGbyP(i, it, n)
END IF
NEXT
IF GamesAllPos > 0 THEN
zF! = ((DataGames(i, it) - GamesAllPos) / DataGames(i, it)) / 5
IF zF! > .040 THEN zF! = .040 'bracket added 2008
xF! = xF! + zF!
END IF
END IF
'3. Boost hitters who are either switch hitters or opposite hand from pitcher
h$ = DataHand(i, it)
IF h$ = "S" OR h$ = "B" OR h$ <> UCASE$(DataHand(ip, id)) THEN
xF! = xF! + .060 ' + .030
END IF
'4. Give preference to first three listed on the bench in .DAT
IF DataRef(i, it) > LastPiAd(it) AND DataRef(i, it) < LastPiAd(it) + 4 THEN
xF! = xF! + .030 ' + .040
END IF
PHList(Av).Criteria2 = FLOAT2STR$(xF!)
PHList(Av).Slot = i
END IF
RETURN
ErrorTrap:
LOCATE 10, 30
PRINT "ERROR: Manage "; ERRCLEAR
LOCATE 11, 30
PRINT "Av:";Av;"i:";i;"it:";it;"id:";id;"ip:";ip;
x$ = WAITKEY$
SU999:
END SUB
SUB MoreOptionsIO (row, Flds, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
IF MenuOpt$ = "T" THEN r = row + 12 ELSE r = row + 16
CALL Drawfrm(row+rowO, 21+colO, r+rowO, 63+colO, defattr, "More Simulation Options", "ESC (or close window) to Continue", 1, 0, 1)
DATA 02,23,"Cross-Era Normalization [YYYYL] ",02,57,05,"X "
DATA 04,23,"Performance Focusing? [y/N] ",04,57,01,"XR"
DATA 06,23,"Pause after every game? [y/N] ",06,57,01,"XR"
DATA 08,23,"Pause after date change? [y/N] ",08,57,01,"XR"
DATA 10,23,"Delay Factor [0-7] ",10,57,01,"N "
DATA 12,23,"Auto-Lineup? [Y/n] ",12,57,01,"XR"
DATA 14,23,"Optimize Batting Order?[Y/n/c/f] ",14,57,01,"XR"
IF MenuOpt$ = "T" THEN Flds = 5 ELSE Flds = 7
c = 1
FOR i = 1 TO Flds
Flitrow(i) = VAL(READ$(c)) + row + rowO
Flitcol(i) = VAL(READ$(c+1)) + colO
Flit$(i) = READ$(c+2)
Frow(i) = VAL(READ$(c+3)) + row + rowO
Fcol(i) = VAL(READ$(c+4)) + colO
Flen(i) = VAL(READ$(c+5))
Fed$(i) = READ$(c+6)
c = c + 7
NEXT
'Set Defaults
REDIM FContents$(13)
FContents$(1) = ""
IF MenuOpt$ = "T" THEN
IF Year(1) <> Year(2) THEN 'Batter Normalization
FContents$(1) = "H"
END IF
END IF
FContents$(2) = "N"
FContents$(3) = "N"
FContents$(4) = "N"
FContents$(5) = "0"
FContents$(6) = "Y"
FContents$(7) = "Y"
IF MenuOpt$ <> "S" THEN Flen(4) = -1
IF LEN(CmdFavTeam$) THEN Flen(4) = -1
IF LEN(CmdFavLeague$) THEN Flen(4) = -1
IF CmdStat$ < "!" THEN Flen(2) = -1
CursorPtr = 1
DO
MoreOptLoop:
CALL ScreenIO(Keyed, KeyF3, 0, KeyEsc, Flds, CursorPtr, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
IF Keyed = KeyF3 THEN
EXIT SUB
END IF
'Edit Field Contents
Error1$ = "N"
x$ = RTRIM$(FContents$(1))
y$ = "Response must be [H, V, B] or [####L] where ####=Year L=League"
LL = LEN(x$)
IF LL = 1 THEN
IF x$ <> "H" AND x$ <> "V" AND x$ <> "B" THEN
CALL PopMsg (row+3+rowO, 7+colO, y$, errattr, 5, kc)
Error1$ = "Y": CursorPtr = 1: GOTO MoreOptLoop
END IF
END IF
IF LL = 5 THEN
x1$ = MID$(x$, 1, 4)
x2$ = MID$(x$, 5, 1)
IF NUMERIC(x1$, 0, 0) AND (x2$ >= "A" AND x2$ <= "Z") THEN
ELSE
CALL PopMsg (row+3+rowO, 7+colO, y$, errattr, 5, kc)
Error1$ = "Y": CursorPtr = 1: GOTO MoreOptLoop
END IF
END IF
IF LL > 1 AND LL < 5 THEN
CALL PopMsg (row+3+rowO, 7+colO, y$, errattr, 5, kc)
Error1$ = "Y": CursorPtr = 1: GOTO MoreOptLoop
END IF
IF INSTR("YN", FContents$(2)) = 0 THEN
Error1$ = "Y"
CursorPtr = 2
GOTO MoreOptLoop
END IF
IF INSTR("YN", FContents$(3)) = 0 THEN
Error1$ = "Y"
CursorPtr = 3
GOTO MoreOptLoop
END IF
IF INSTR("YN", FContents$(4)) = 0 THEN
Error1$ = "Y"
CursorPtr = 4
GOTO MoreOptLoop
END IF
IF INSTR("0123456789", FContents$(5)) = 0 THEN
Error1$ = "Y"
CursorPtr = 5
GOTO MoreOptLoop
END IF
IF INSTR("YN", FContents$(6)) = 0 THEN
Error1$ = "Y"
CursorPtr = 6
END IF
IF INSTR("YNCF", FContents$(7)) = 0 THEN
Error1$ = "Y"
CursorPtr = 7
END IF
LOOP WHILE Error1$ = "Y"
CmdEra$ = RTRIM$(FContents$(1))
CmdFocus$ = FContents$(2)
CmdPauseAftGame$ = FContents$(3)
CmdPauseAftDate$ = FContents$(4)
DelFac = VAL(FContents$(5))
OrgSimDelFac = DelFac
IF MenuOpt$ <> "T" THEN
AutoLineupSw(1) = (FContents$(6) = "Y")
AutoLineupSw(2) = AutoLineupSw(1)
AdjustBO(1) = FContents$(7)
AdjustBO(2) = AdjustBO(1)
END IF
END SUB
SUB MovePitHitStats (pl, tm)
IF pl < 1 OR pl > MAXPLAYERS OR tm < 1 OR tm > 2 THEN
BEEP
EXIT SUB
END IF
r = ipa(tm)
DataRef(pl, tm) = r 'Pitcher's address takes over reference number
DataPos(pl, tm) = 1
DataName(pl, tm) = DataName(r, tm)
'Does pitcher's name exist on bench?
SearchName$ = DataName(pl, tm)
n = SearchDAT (LastPiAd(tm)+1, MAXPLAYERS, tm, SearchName$, 0)
IF n THEN
CALL CopyStats(n, pl, tm)
EXIT SUB
END IF
DataAB(pl, tm) = 100
xS$ = UCASE$(DataCode(r, tm))
code = ASC(xS$) - 64
IF code < 1 OR code > 5 THEN
IF RND < .5 THEN
DataHits(pl, tm) = 16
ELSE
DataHits(pl, tm) = 17
END IF
ELSE
DataHits(pl, tm) = 30 - (5 * code)
END IF
'1 A = .250
'2 B = .200
'3 C = .150 or .165
'4 D = .100
'5 E = .050
DataHR(pl, tm) = DataHits(pl, tm) * .025
DataSO(pl, tm) = 49.1 - DataHits(pl, tm) * 0.9
DataBB(pl, tm) = 5
IF DataPBatAB(r, tm) > 0 THEN
DataAB(pl, tm) = DataPBatAB(r, tm)
DataHits(pl, tm) = DataPBatHi(r, tm)
DataHR(pl, tm) = DataPBatHR(r, tm)
DataBB(pl, tm) = DataPBatBB(r, tm)
DataSO(pl, tm) = DataPBatSO(r, tm)
END IF
Data2B(pl, tm) = DataHits(pl, tm) * .14
Data3B(pl, tm) = DataHits(pl, tm) * .02
DataRBI(pl, tm) = DataHits(pl, tm) / 2.4
IF DataHand(ipa(tm), tm) = "r" THEN
DataHand(pl, tm) = "L"
ELSEIF DataHand(ipa(tm), tm) = "l" THEN
DataHand(pl, tm) = "R"
ELSE
DataHand(pl, tm) = DataHand(ipa(tm), tm)
END IF
DataDef(pl, tm) = 0
DataSB(pl, tm) = 1 'was 3
DataCS(pl, tm) = 1 'was 2
DataSpeed(pl, tm) = 3
FOR i = 1 TO 4
DataPosi(pl, tm, i) = 0
DataGByP(pl, tm, i) = 0
NEXT
END SUB
SUB MovePtrVisi (param$, row, col)
QPRINTs row + VisiPtr, col, " ", defattr
IF param$ = "U" THEN
IF VisiPtr > 1 THEN DECR VisiPtr
IF it = 1 THEN
IF VisiPtr = 7 THEN DECR VisiPtr
IF WarmUpRule = FALSE THEN
IF VisiPtr = 6 THEN DECR VisiPtr
END IF
ELSE
IF VisiPtr = 7 THEN DECR VisiPtr
END IF
ELSEIF param$ = "D" THEN
IF it = 1 THEN
IF VisiPtr < 10 THEN INCR VisiPtr
IF WarmUpRule = FALSE THEN
IF VisiPtr = 6 THEN INCR VisiPtr
END IF
IF VisiPtr = 7 THEN INCR VisiPtr
ELSE
IF VisiPtr < 11 THEN INCR VisiPtr
IF VisiPtr = 7 THEN INCR VisiPtr
END IF
END IF
QPRINTs row + VisiPtr, col, CHR$(175), defattr
END SUB
SUB MovePtrHome (param$, row, col)
QPRINTs row + HomePtr, col, " ", defattr
IF param$ = "U" THEN
IF HomePtr > 1 THEN DECR HomePtr
IF it = 2 THEN
IF HomePtr = 7 THEN DECR HomePtr
IF WarmUpRule = FALSE THEN
IF HomePtr = 6 THEN DECR HomePtr
END IF
ELSE
IF HomePtr = 7 THEN DECR HomePtr
END IF
ELSEIF param$ = "D" THEN
IF it = 2 THEN
IF HomePtr < 10 THEN INCR HomePtr
IF WarmUpRule = FALSE THEN
IF HomePtr = 6 THEN INCR HomePtr
END IF
IF HomePtr = 7 THEN INCR HomePtr
ELSE
IF HomePtr < 11 THEN INCR HomePtr
IF HomePtr = 7 THEN INCR HomePtr
END IF
END IF
QPRINTs row + HomePtr, col, CHR$(175), defattr
END SUB
SUB Msg (c$, p$, s$, t$, man, team, man2, team2) STATIC
'Retrieve specified message, enhance with name, add to Announcer
'STATIC work$, xS$, fS$
DIM MsgList$(15)
Find$ = c$ + p$ + s$ + t$ + "001"
CALL SearchPbyP (PbyP(), 1, 9, 1, PbyP_Cnt, Find$, FoundAt, mini)
IF FoundAt = 0 THEN
work$ = "PbyP not found:" + Find$
GOTO MessagAdd
END IF
'We have found the first message, now get the rest of them
i = FoundAt
j = 0
DO
INCR j
IF j < 16 THEN MsgList$(j) = PbyP(i).text
OldStuff$ = PbyP(i).class + PbyP(i).pos + PbyP(i).seq + PbyP(i).trk
INCR i
IF i <= PbyP_Cnt THEN
NewStuff$ = PbyP(i).class + PbyP(i).pos + PbyP(i).seq + PbyP(i).trk
ELSE
EXIT DO
END IF
LOOP WHILE NewStuff$ = OldStuff$
n = RND(1, j)
work$ = MsgList$(n)
IF DelFac = 0 AND amgr(1) AND amgr(2) THEN GOTO MessagAdd
hh = INSTR(work$, "@") 'full name
ii = INSTR(work$, "*") 'last name
jj = INSTR(work$, "#") 'position
kk = 0
IF (ii > 0 OR hh > 0) AND man > 0 THEN
xS$ = LASTNAME$(DataName(man, team))
'Last name now in xS$
'Stick first name in front of it for special cases @
j = INSTR(DataName(man, team), ",")
IF hh > 0 AND j > 0 THEN
xS$ = FULLNAME$(DataName(man, team))
END IF
IF hh THEN kk = hh
IF ii THEN kk = ii
END IF
IF jj > 0 THEN
xS$ = PosDesc(WhoAtPos)
kk = jj
END IF
IF kk > 0 THEN
'Replace "*/#/@/%" with name xS$ or position
nn = kk
GOSUB InsertString
END IF
'Check for 2nd name %
mm = INSTR(work$, "%")
IF mm > 0 AND man2 > 0 THEN
xS$ = LASTNAME$(DataName(man2, team2))
nn = mm
GOSUB InsertString
END IF
MessagAdd:
IF LEFT$(work$, 1) <> "~" THEN
work$ = LEFT$(work$, 38 + colO)
CALL AddToAnnouncer(team, work$)
END IF
EXIT SUB
InsertString:
L = LEN(work$)
IF nn = L THEN
work$ = MID$(work$, 1, nn - 1) + xS$
ELSEIF nn > 1 AND nn < L THEN
work$ = MID$(work$, 1, nn - 1) + xS$ + MID$(work$, nn + 1)
ELSEIF nn = 1 THEN
work$ = xS$ + MID$(work$, 2)
END IF
RETURN
END SUB
SUB MyBeep
BEEP
END SUB
SUB OptionSetup (row, Flds, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), _
Flitcol(), FContents$())
DATA 08,24,"Quick-Play game: [Y/N] ",08,52,01,"X " '1
DATA 09,24,"Auto Manager: ",00,00,00," " '2
DATA 10,24," Visitor [Y/N] ",10,52,01,"XR" '3
DATA 11,24," Home [Y/N] ",11,52,01,"XR" '4
DATA 12,24,"Delay (Play-by-Play) [0-7] ",12,52,01,"NR" '5
DATA 13,24,"Color Scheme [1-6] ",13,52,01,"NR" '6
DATA 14,24,"Change Background [Y/N] ",14,52,01,"XR" '7
DATA 15,24,"Sound [Y/N] ",15,52,01,"XR" '8
DATA 16,24,"Announcer Audio [Y/N] ",16,52,01,"XR" '9
DATA 17,24,"Focusing [Y/N] ",17,52,01,"XR" '10
DATA 18,24,"Pause After Each Game [Y/N] ",18,52,01,"XR" '11
DATA 19,24,"Pause After Each Date [Y/N] ",19,52,01,"XR" '12
Flds = 12
row = 0
c = 1
FOR i = 1 TO Flds
Flitrow(i) = VAL(READ$(c)) + rowO
Flitcol(i) = VAL(READ$(c+1)) + colO
Flit$(i) = READ$(c+2)
Frow(i) = VAL(READ$(c+3))
IF Frow(i) > 0 THEN Frow(i) = Frow(i) + rowO
Fcol(i) = VAL(READ$(c+4))
IF Fcol(i) > 0 THEN Fcol(i) = Fcol(i) + colO
Flen(i) = VAL(READ$(c+5))
Fed$(i) = READ$(c+6)
c = c + 7
NEXT
IF CmdStat$ > "!" THEN Flen(10) = 1 ELSE Flen(10) = -1
IF MenuOpt$ <> "M" THEN Flen(11) = 1 ELSE Flen(11) = -1
IF MenuOpt$ = "S" THEN Flen(12) = 1 ELSE Flen(12) = -1
IF LEN(CmdFavTeam$) THEN Flen(12) = -1
IF LEN(CmdFavLeague$) THEN Flen(12) = -1
IF (ConsRows = 25 AND ConsCols = 80) THEN Flen(7) = -1
IF amgr(1) AND amgr(2) THEN
IF DelFac = 0 THEN
Flen(1) = -1
END IF
END IF
REDIM FContents$(13)
END SUB
SUB OptionWindow (Flds, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
IF Flen(1) = -1 THEN CursorPtr = 3 ELSE CursorPtr = 1
'Set Defaults
FContents$(1) = "N"
IF amgr(1) THEN FContents$(3) = "Y" ELSE FContents$(3) = "N"
IF amgr(2) THEN FContents$(4) = "Y" ELSE FContents$(4) = "N"
FContents$(5) = RIGHT$(STR$(DelFac), 1)
FContents$(6) = LTRIM$(STR$(ColorScheme))
FContents$(7) = "N"
IF SoundOn THEN FContents$(8) = "Y" ELSE FContents$(8) = "N"
IF AnnouncerOn THEN FContents$(9) = "Y" ELSE FContents$(9) = "N"
FContents$(10) = CmdFocus$
FContents$(11) = CmdPauseAftGame$
FContents$(12) = CmdPauseAftDate$
DO
TopOfCWLoop:
CALL ScreenIO(Keyed, KeyEsc, 0, KeyEsc, Flds, CursorPtr, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
'Edit Field Contents
Error1$ = "N"
IF FContents$(1) <> "Y" AND FContents$(1) <> "N" THEN
Error1$ = "Y": CursorPtr = 1: CALL MyBeep: GOTO TopOfCWLoop
END IF
FOR i = 3 TO 12 'Edit the Y/N responses
IF i <> 5 AND i <> 6 THEN
IF FContents$(i) <> "Y" AND FContents$(i) <> "N" THEN
Error1$ = "Y": CursorPtr = i: CALL MyBeep: GOTO TopOfCWLoop
END IF
END IF
NEXT
IF FContents$(5) = "0" THEN FContents$(8) = "N"
IF FContents$(6) < "1" OR FContents$(6) > "6" THEN
Error1$ = "Y": CursorPtr = 6
CALL PopMsg(18+rowO, 22+colO, " Color Scheme out of range [1-6]", errattr, 2, kc)
GOTO TopOfCWLoop
END IF
IF FContents$(3) = "N" OR FContents$(4) = "N" THEN
IF FContents$(5) = "0" THEN
Error1$ = "Y": CursorPtr = 5
CALL PopMsg(18+rowO, 17+colO, " Delay cannot be 0 if either AutoManager = N ", errattr, 2, kc)
GOTO TopOfCWLoop
END IF
END IF
LOOP WHILE Error1$ = "Y"
CURSOR OFF 'turn off cursor
amgr(1) = (FContents$(3) = "Y")
amgr(2) = (FContents$(4) = "Y")
DelFac = VAL(FContents$(5))
ColorScheme = VAL(FContents$(6))
CmdChangePhoto$ = FContents$(7)
SoundOn = (FContents$(8) = "Y")
AnnouncerOn = (FContents$(9) = "Y")
CmdFocus$ = FContents$(10)
CmdPauseAftGame$ = FContents$(11)
CmdPauseAftDate$ = FContents$(12)
IF FContents$(1) = "Y" THEN
amgr(1) = TRUE
amgr(2) = TRUE
DelFac = 0
SoundOn = FALSE
END IF
END SUB
SUB Outfield (AtPos) STATIC
OutfErr = 0
wag = WHOATGUY (AtPos)
defperF! = DEFPCT!(wag)
'Increase factor to improve defense
zF! = defperF! + (1 - defperF!) * .5
IF RND < zF! THEN EXIT SUB
OutfErr = -1
'Outfielder Error: botched it!
INCR inne
INCR innadverr
i = DataRef(wag, id)
INCR GpPos(i, id, AtPos)
INCR merr(i, id)
INCR SumErrors(AtPos)
INCR iterrs(id)
'Some (1/2) of these errors will be throwing errors!
IF DelFac THEN
IF RND < .5 THEN
'bad throw by *
CALL Msg ("30", "0", "0", "03", wag, id, man2, team2)
ELSE
'ball gets away from *
CALL Msg ("30", "0", "0", "04", wag, id, man2, team2)
END IF
IF NUMBERON > 1 THEN t$ = "05" ELSE t$ = "04"
CALL Msg ("31", "0", "0", t$, 0, it, man2, team2)
'runner(s) advance(s)
END IF
i = Errorx
Errorx = TRUE
CALL Advanc(1, 1, 1)
Errorx = i
Result$ = Result$ + "/E-" + LTRIM$(STR$(AtPos))
END SUB
SUB OutOrError STATIC
ON ERROR GOTO ERRORTRAP
'Forced outcome for debugging through variable fr7
IF fr7=300 THEN
CALL StrikeOutRoutine
fr7=0
EXIT SUB
END IF
IF fr7=100 OR fr7=200 OR fr7=201 THEN
GOTO OutDIRECTION
END IF
'Find the percentage of outs which are strike-outs
i = DataAB(ib, it) - DataHits(ib, it)
IF i <> 0 THEN
hsoF! = DataSO(ib, it) / i '% of Outs that are StrikeOuts
ELSE
hsoF! = .250
END IF
psoF! = DataSO(ip, id) / (DataAB(ip, id) * 3)
' 0 to bpkF! is a K
' bpkF! to bpgF! is a ground out
' bpgF! to 1 is a fly out
IF pkbaseF(id) > 0 THEN y! = pkbaseF(id) ELSE y! = .239
x! = hsoF! * (psoF! / y!)
bpkF! = x! / (x! + ( (1-hsoF!)*(1-psoF!)/(1-y!) ) )
'Use Pitcher Fatigue to influence ground/fly ratio
adjF! = 1.85 'See below **
'Pitcher Fatigue
IF NewStyle(id) AND DataGames(ip, id) AND DataAB(ip, id) THEN
'New Style has "Games" and "Starts"
FatFac! = nPitch(id) / ExpectedPitchCount(ip, id)
adjF! = adjF! + (0.25 * FatFac! - 0.15) '**
IF adjF! > 2.2 THEN adjF! = 2.2 '2.20-> 45.5% grounders
END IF '1.95-> 51.3%
'1.70-> 58.8%
bpgF! = bpkF! + ((1 - bpkF!) / adjF!) '1.9 produces 52.6% grounders
'1.85 produces 54.1% grounders
'1.75 produces 57.1% grounders
IF HitAndRun = FALSE THEN
xrF! = RND
IF xrF! < bpkF! THEN
CALL StrikeOutRoutine
EXIT SUB
END IF
ELSE
'On Hit-and-run's we don't process strike outs here
'Find a new random number between bpkF! and 1.0
n = (1.0 - bpkF!) * 1000
j = 1000 - FRND(n)
xrF! = j / 1000
CALL Msg ("25", "0", "0", "02", 0, it, 0, 0) 'Hit-and-run
END IF
OutDIRECTION:
REM ** PULLED ? ** ' Hit Somewhere
ppF! = FindPP!
IF fr7=100 THEN GOTO OutGROUND 'ground
IF fr7=200 OR fr7 = 201 THEN GOTO OutFLY 'fly
IF xrF! > bpgF! THEN GOTO OutFLY ' GOTO Fly
'** GROUNDER ** ' Ground Ball
OutGROUND:
WhoAtPos = GROUNDBALLWHOAT (ppF!)
IF WhoAtPos = 1 THEN
wag = ip
defperF! = NormDEF(1)
ELSE
wag = WHOATGUY(WhoAtPos)
defperF! = DEFPCT!(wag)
END IF
p$ = LTRIM$(STR$(WhoAtPos))
'Since most errors occur on grounders, fudge defperF! down to produce more errors
zF! = defperF! * .98
IF RND > zF! THEN 'FIELDING or THROWING ERROR!
Errorx = TRUE
INCR iterrs(id)
INCR inne
i = DataRef(wag, id)
INCR GpPos(i, id, WhoAtPos)
INCR merr(i, id)
INCR SumErrors(WhoAtPos)
IF DelFac THEN CALL Msg ("02", p$, "1", "00", wag, id, man2, team2)
IF fr4 = 1 THEN '25% of infield errors are throwing errors
IF DelFac THEN
IF p$ = "3" THEN
AddToAnnouncer id, "He flips to the pitcher covering..."
ELSE
CALL Msg ("02", p$, "2", "00", wag, id, man2, team2) 'fields & throws
END IF
'No indication of where he's throwing it
CALL Msg ("30", "0","0", "02", wag, id, man2, team2) 'bad throw
END IF
ThrowError = TRUE
ELSEIF p$ < "3" THEN
IF DelFac THEN CALL Msg ("21", p$, "0", "00", wag, id, man2, team2) 'boots it
OneBaseError = TRUE
ELSE
'The ball is at an infielder (3-4-5-6) and it's a fielding error
IF fr4 > 2 THEN 'one base adv
IF DelFac THEN CALL Msg ("21", p$, "0", "01", wag, id, man2, team2) 'boots it
OneBaseError = TRUE
ELSE 'two base adv
IF DelFac THEN CALL Msg ("21", p$, "0", "02", wag, id, man2, team2) 'right by him
END IF
END IF
IF DelFac THEN CALL Msg ("30", "0","0", "09", wag, id, man2, team2) 'error
Result$ = "E-" + LTRIM$(STR$(WhoAtPos))
CALL SingleRoutine 'Sound handled in SingleRoutine
EXIT SUB
END IF
'No error (yet)
Result$ = LTRIM$(STR$(WhoAtPos))
CALL Ground 'handles sound
INCR mpo(ip, id)
EXIT SUB
'** FLY **
OutFLY: 'where did the fly go?
FoulBall = FALSE
xF! = RND 'about 70% go to outfield
i = OUTFIELDWHOAT(ppF!) 'returns 7, 8 or 9 only
IF i = 7 THEN
IF xF! > .24 THEN WhoAtPos = 7 ELSE WhoAtPos = 7 - FRND(2)
' 7 .76
' 6 .12
' 5 .12
ELSEIF i = 8 THEN
IF xF! > .47 AND xF! < .52 THEN '.05
WhoAtPos = 2
ELSEIF xF! > .20 THEN '.75
WhoAtPos = 8
ELSEIF xF! > .10 THEN '.10
WhoAtPos = 6
ELSE '.10
WhoAtPos = 4
END IF
ELSE
IF xF! > .24 THEN WhoAtPos = 9 ELSE WhoAtPos = 5 - FRND(2)
' 9 .76
' 4 .12
' 3 .12
END IF
wag = WHOATGUY(WhoAtPos)
'Infield flys:
DPsw = FALSE
xF! = RND
IF WhoAtPos < 7 THEN
IF xF! < .10 AND WhoAtPos <> 2 THEN
IF DelFac THEN
CALL Msg ("04", "0", "0", "00", wag, id, man2, team2) 'Line Shot
IF SoundOn THEN CALL WavLineDrive
END IF
IF xF! < .05 OR HitAndRun THEN '1/2 of linedrives
DPsw = TRUE 'Double play! (possibility)
END IF
ELSE
IF DelFac THEN
IF SoundOn THEN CALL WavPopUp
CALL Msg ("05", "0", "1", "00", 0, it, man2, team2) 'pop up
CALL Msg ("05", "0", "2", "00", wag, id, man2, team2) '* under it
END IF
xFF! = RND
IF (WhoAtPos = 5 OR WhoAtPos = 3) AND xFF! < .3 THEN FoulBall = TRUE
IF WhoAtPos = 2 AND xFF! < .7 THEN FoulBall = TRUE
IF FoulBall THEN
'Drifts into Foul Territory...
IF DelFac THEN CALL Msg ("29", "0", "0", "20", wag, id, man2, team2)
END IF
END IF
END IF
defperF! = DEFPCT!(wag)
Dramatic = (RND < .11)
deep = FALSE
'Outfield flys
IF WhoAtPos > 6 THEN
IF RND < .06 THEN
'Teaser for Home Run
IF DelFac THEN
IF SoundOn THEN CALL WavBigFly
CALL Msg ("09", "0", "1", "01", wag, id, man2, team2) 'There's a drive
IF RND < .1 THEN t$ = "02" ELSE t$ = "01"
CALL Msg ("09", "0", "2", t$, wag, id, man2, team2) '* going back
t$ = "01"
END IF
Dramatic = TRUE
deep = TRUE
GOTO 10060
END IF
'Outfield fly messages
t$ = LTRIM$(STR$(RND(1, 2)))
t$ = PADZEROS$(t$, 2)
IF DelFac THEN
IF Dramatic THEN
IF SoundOn THEN
IF t$ = "01" THEN
CALL WavBigFly
ELSE
CALL WavShortFly
END IF
END IF
CALL Msg ("07", "0", "1", t$, wag, id, man2, team2)
CALL Msg ("07", "0", "2", t$, wag, id, man2, team2)
CALL Msg ("07", "0", "3", t$, wag, id, man2, team2)
ELSE
IF SoundOn THEN CALL WavRegularFly
CALL Msg ("06", "0", "1", "00", wag, id, man2, team2)
CALL Msg ("06", "0", "2", "00", wag, id, man2, team2)
END IF
ELSE
deep = (RND < .38)
END IF
END IF
'Not many errors occur on fly balls (both outfield and infield here)
IF WhoAtPos < 7 THEN 'Infield Fly
zF! = defperF! * 1.03
IF zF! > .99999 THEN zF! = .99999
ELSE 'Outfield Fly
zF! = defperF! + (1 - defperF!) * .4 'was .5
END IF
IF RND > zF! THEN
'Dropped, but Infield fly rule in effect
IF ir1 > 0 AND ir2 > 0 AND iout < 2 AND WhoAtPos < 7 AND FoulBall = FALSE THEN
IF DelFac THEN
CALL Msg ("30", "0", "0", "01", wag, id, man2, team2) 'Dropped!
AddToAnnouncer id, "Infield fly rule is in effect! (No error)"
AddToAnnouncer id, "Batter is declared out! No advance..."
END IF
Result$ = "I-FLY-" + LTRIM$(STR$(WhoAtPos))
INCR iout
INCR mpo(ip, id)
EXIT SUB
END IF
Errorx = TRUE 'Error on the fly
INCR iterrs(id)
INCR inne
i = DataRef(wag, id)
INCR GpPos(i, id, WhoAtPos)
INCR merr(i, id)
INCR SumErrors(WhoAtPos)
IF DelFac THEN
CALL Msg ("30", "0", "0", "01", wag, id, man2, team2) 'Dropped!
CALL Msg ("30", "0", "0", "09", wag, id, man2, team2) 'Error
END IF
Result$ = "E-" + LTRIM$(STR$(WhoAtPos))
IF FoulBall THEN
CALL AddToScoreCrd(it, DataRef(ib, it), " ", Result$ + " (Foul)")
CALL ResetBatter
EXIT SUB
END IF
SaveSound = SoundOn
SoundOn = FALSE
IF WhoAtPos < 7 THEN 'pop-up - 1 base error
OneBaseError = TRUE
CALL SingleRoutine 'handles sound (already done)
SoundOn = SaveSound
EXIT SUB
END IF
CALL DoubleRoutine '2 base error on outfielder - handles sound
SoundOn = SaveSound
EXIT SUB
END IF
10060:
Result$ = LTRIM$(STR$(WhoAtPos))
IF FoulBall THEN Result$ = Result$ + " (Foul)"
INCR PutOuts(DataRef(wag, id), id, WhoAtPos)
CALL Fly(DPsw, Dramatic, deep, t$)
INCR mpo(ip, id)
EXIT SUB
ErrorTrap:
LOCATE 10, 30
PRINT "OUTorERR_Error"; ERRCLEAR
x$ = WAITKEY$
END SUB
SUB ParseCommand (xS$, nargs)
'Parses xS$ into ArgList(). Counts nargs.
REGISTER i AS INTEGER
nargs = 0
DIM Args$(20)
REDIM ArgList(20) AS GLOBAL ArgType
IF LEN(xS$) = 0 THEN EXIT SUB
i = 1
inword = FALSE
DO WHILE i <= LEN(xS$)
cS$ = MID$(xS$, i, 1)
IF cS$ = "/" THEN
inword = TRUE
INCR nargs
Args$(nargs) = Args$(nargs) + cS$
ELSEIF cS$ <> " " AND inword THEN
Args$(nargs) = Args$(nargs) + cS$
ELSEIF cS$ = " " THEN
inword = FALSE
END IF
INCR i
LOOP
'Special Case to pull off a /CMD file:
IF nargs = 1 THEN
y$ = UCASE$(Args$(1))
z$ = LEFT$(y$, 5)
IF z$ = "/CMD:" THEN
CmdCmdFile$ = MID$(y$, 6)
END IF
END IF
'Copy results into the global dynamic array
FOR i = 1 TO nargs
ArgList(i).Arg = Args$(i)
NEXT
END SUB
SUB PauseIt
' routine to clear keyboard CALL Clrkbd
CALL ClearInpBuffer
x$ = WAITKEY$
END SUB
SUB PickAFile (Fil$, FileLimit, List1() AS List1Type, RetKey, Pick, mous, FrameStyle)
'Return Pick and RetKey
DIM F$(9)
d = INSTR(Fil$, "|")
IF d THEN
F$(1) = MID$(Fil$, 1, d-1)
F$(2) = MID$(Fil$, d+1)
c = 2
ELSE
F$(1) = Fil$
c = 1
END IF
n = 0
FOR i = 1 TO c
CALL LoadFilesToList1 (F$(i), List1(), FileLimit, n) 'returns "n" = total files found
NEXT
IF n = 1 THEN
IF RTRIM$(List1(1).ListItem) = ".." OR _
RTRIM$(List1(1).ListItem) = "C:\" THEN
n = 0
END IF
END IF
IF n > FileLimit THEN
CALL MyBeep
x$ = "Error: Too Many Files. Limit is " + STR$(FileLimit)
CALL ErrorBox (x$)
n = FileLimit
END IF
IF n THEN ARRAY SORT List1(1) FOR n, DESCEND
SELECT CASE MenuOpt$
CASE "S"
zS$ = "Schedule Files"
yS$ = "[E]dit [N]ew ESC:Menu"
CALL PrintSCHHelp
CASE "E"
zS$ = "Series Files"
yS$ = "[V]iew [E]dit [N]ew ESC:Menu"
CALL PrintSERHelp
CASE "A"
zS$ = "Statistics Files"
yS$ = "DEL:Delete ESC:Menu"
CALL PrintSTAHelp
CASE ELSE
zS$ = ""
yS$ = ""
END SELECT
IF MenuOpt$ <> "1" THEN
row1 = 2 + rowO
col1 = 2 + colO
row2 = 10 + rowO
col2 = 46 + colO
Shadow = 0
ESCPoint = 2
r = 4 + rowO
columns = 3
itemsincol = 7
ELSE
row1 = 3 + rowO
col1 = 62 + colO
row2 = 21 + rowO
col2 = 76 + colO
Shadow = 0
ESCPoint = 2
r = 10 + rowO
columns = 1
itemsincol = 17
END IF
CALL Drawfrm (row1, col1, row2, col2, defattr, zS$, yS$, Shadow, FrameStyle, ESCPoint)
IF FrameStyle = 0 THEN x1$ = CHR$(193): x2$ = CHR$(194) ELSE x1$ = CHR$(208): x2$ = CHR$(209)
QPRINTs r, col2, x1$, defattr
QPRINTs r + 1, col2, UpPtr$, defattr
QPRINTs r + 2, col2, DnPtr$, defattr
QPRINTs r + 3, col2, x2$, defattr
DO
CALL PickFromList(List1(), n, itemsincol, columns, 12, row1,col1,row2,col2, dimattr, revattr, Pick, RetKey, nulls$, mous, ms$)
IF ms$ = CHR$(249) THEN RetKey = -61
' LOCATE 1, 1 : print "pick:";Pick;" RetKey:"; RetKey
IF RetKey THEN 'was just > 0 but need to catch negative ones too sometimes
SELECT CASE MenuOpt$
CASE "S"
CALL ExitPickForSCH(List1(), Pick, RetKey)
CASE "E"
CALL ExitPickForDAT(List1(), Pick, RetKey)
CASE "A"
CALL ExitPickForSTS(List1(), Pick, RetKey)
CASE ELSE
END SELECT
END IF
LOOP WHILE RetKey = -99
END SUB
SUB PickFromList (List1() AS List1Type, ItemsInList, ItemsInColumn, Columns, ItemLen, row, col, row2, col2, colattr, revattr, Pick, RetKey, OutDevice$, mous, ms$) STATIC
'Row and Col are coordinates of the upper-left corner of the FRAME
'Requires SUB ChangeAttribute
'Lots of the internal variables need to be STATIC because sometimes
'we jump back into the middle of this routine
IF RetKey = -99 THEN GOTO Pick1WaitForKey
IF RetKey = -97 OR RetKey = -98 THEN DisplayOnly = -1
MaxPages = 99
REDIM FirstItemOnPage(MaxPages)
Pick1BeginPage:
pageno = 1
PageItemPtr = 1
FirstItemOnPage(1) = 1
Pick1Reentry:
PageMaxItems = ItemsInColumn * Columns
ItemNum = FirstItemOnPage(pageno)
PageItemCtr = 1
PageFull = FALSE
EndOfList = FALSE
HiLiteA = colattr
IF ConsRows = 25 AND ConsCols = 80 THEN BeginBuffer
DO UNTIL PageFull
'Don't read past End of List
IF ItemNum > ItemsInList THEN
'Blank Rest of Screen
tmpPageItemCtr = PageItemCtr
DO WHILE tmpPageItemCtr <= PageMaxItems
stak = (tmpPageItemCtr - 1) \ ItemsInColumn + 1
c = col + (stak - 1) * (ItemLen + 2) + 2
r = row + tmpPageItemCtr - (stak - 1) * ItemsInColumn
QPRINTs r, c, SPACE$(ItemLen), colattr
INCR tmpPageItemCtr
LOOP
EndOfList = TRUE
PageFull = TRUE
EXIT DO
END IF
'Figure where to locate
stak = (PageItemCtr - 1) \ ItemsInColumn + 1
c = col + (stak - 1) * (ItemLen + 2) + 2
r = row + PageItemCtr - (stak - 1) * ItemsInColumn
attr = colattr
IF DisplayOnly = FALSE THEN 'Hilite item
IF PageItemCtr = PageItemPtr THEN
attr = revattr
HiLiteR = r
HiLiteC = c
END IF
END IF
IF DisplayOnly AND LEFT$(List1(ItemNum).ListItem, 1) = "~" THEN
attr = defattr
xS$ = MID$(List1(ItemNum).ListItem, 2)
ELSEIF LEFT$(List1(ItemNum).ListItem, 1) = "%" THEN
attr = skipattr
xS$ = MID$(List1(ItemNum).ListItem, 2)
IF PageItemCtr = PageItemPtr THEN
INCR PageItemPtr
END IF
ELSE
xS$ = List1(ItemNum).ListItem
END IF
QPRINTs r, c, PADRIGHT$(xS$, ItemLen), attr
INCR PageItemCtr
INCR ItemNum
IF PageItemCtr > PageMaxItems THEN PageFull = TRUE
LOOP
IF ConsRows = 25 AND ConsCols = 80 THEN EndBuffer
IF RetKey = -97 THEN Pick = 0: GOTO Pick1Exit
Pick1WaitForKey:
'Wait for arrow Items / PageUp / PageDown / Enter
DO
mous = 0
msx = 0
msy = 0
INPUT FLUSH
KyS$ = WAITKEY$
s% = INSHIFT
IF LEN(KyS$) = 1 THEN 'regular key pressed
kc = ASC(KyS$)
KyS$ = UCASE$(KyS$)
ELSEIF LEN(KyS$) = 2 THEN 'F-key pressed
kc = -ASC(RIGHT$(KyS$, 1))
ELSEIF LEN(KyS$) = 4 THEN 'mouse event
IF ASC(KyS$, 3) = 2 THEN
DoubleClick = TRUE
ELSE
DoubleClick = FALSE
END IF
mous = TRUE
msx = MOUSEX
msy = MOUSEY
ms$ = CHR$(SCREEN(msy, msx))
IF ms$ = CHR$(249) THEN
kc = 27
GOSUB FlashMouse
ELSEIF ms$ = CloseButton$ THEN
kc = 13
GOSUB FlashMouse
ELSEIF msx > col AND msx < col2 AND msy > row AND msy < row2 THEN
'INSIDE frame
IF ItemsInList THEN
'Determine PageItemPtr
PageItemPtr = msy - row + INT((msx - col - 2) / (ItemLen + 2)) * ItemsInColumn
IF PageItemPtr < 1 THEN PageItemPtr = 1
IF PageItemPtr > PageItemCtr - 1 THEN PageItemPtr = PageItemCtr - 1
DO
GOSUB PMHiLite1
'Is this a skipped field?
CALL ReadFromScreen (r, c, ItemLen, field$, "", Valid$)
IF HiLiteA <> skipattr AND _
field$ <> STRING$(ItemLen, CHR$(196)) THEN EXIT DO
'yes, skip this field
INCR PageItemPtr
IF PageItemPtr > PageItemCtr - 1 THEN
PageItemPtr = 1
END IF
LOOP
IF DoubleClick THEN
kc = 13
ELSE
GOTO PContinueLoop
END IF
ELSE
GOTO PContinueLoop
END IF
ELSEIF msx < col OR msx > col2 OR msy < row OR msy > row2 THEN
'OUTSIDE the frame - ESC
kc = 27
ELSE
'ON the frame
SELECT CASE ms$
CASE "V", "E", "A", "N", "F", "P", "Q"
KyS$ = ms$
kc = ASC(KyS$)
GOSUB FlashMouse
CASE DnPtr$
kc = -81
GOSUB FlashMouse
CASE UpPtr$
kc = -73
GOSUB FlashMouse
CASE ELSE
kc = 27
END SELECT
END IF
END IF
IF kc = -72 THEN 'Up
IF PageItemPtr > 1 THEN
DECR PageItemPtr
DO
GOSUB PMHiLite1
'Is this a skipped field?
CALL ReadFromScreen (r, c, ItemLen, field$, "", Valid$)
IF HiLiteA <> skipattr AND _
field$ <> STRING$(ItemLen, CHR$(196)) THEN EXIT DO
'Yes
DECR PageItemPtr
IF PageItemPtr < 1 THEN
PageItemPtr = PageItemCtr - 1
END IF
LOOP
GOTO PContinueLoop
END IF
END IF
IF kc = -80 THEN 'Down
IF PageItemPtr < PageItemCtr - 1 THEN
INCR PageItemPtr
DO
GOSUB PMHiLite1
'Is this a skipped field?
CALL ReadFromScreen (r, c, ItemLen, field$, "", Valid$)
IF HiLiteA <> skipattr AND _
field$ <> STRING$(ItemLen, CHR$(196)) THEN EXIT DO 'No
'Yes - experiment
INCR PageItemPtr
IF PageItemPtr > PageItemCtr - 1 THEN
PageItemPtr = 1
END IF
LOOP
GOTO PContinueLoop
END IF
END IF
IF kc = -75 THEN 'Left
IF PageItemPtr > ItemsInColumn THEN
PageItemPtr = PageItemPtr - ItemsInColumn
GOSUB PMHiLite1
GOTO PContinueLoop
END IF
END IF
IF kc = -77 THEN 'Right
IF PageItemPtr + ItemsInColumn < PageItemCtr THEN
PageItemPtr = PageItemPtr + ItemsInColumn
GOSUB PMHiLite1
GOTO PContinueLoop
END IF
END IF
IF kc = -73 THEN 'PageUp
IF pageno > 1 THEN DECR pageno
PageItemPtr = 1
GOTO Pick1Reentry
END IF
IF kc = -81 AND EndOfList = FALSE THEN 'PageDown
IF pageno < MaxPages THEN INCR pageno
FirstItemOnPage(pageno) = ItemNum
PageItemPtr = 1
GOTO Pick1Reentry
END IF
IF kc = 13 OR kc = -83 OR KyS$ = "V" OR KyS$ = "E" OR KyS$ = "A" THEN
'ENTER or DEL or V or E or A to set Pick and escape
Pick = FirstItemOnPage(pageno) + PageItemPtr - 1
IF Pick > ItemsInList THEN Pick = ItemsInList
EXIT DO
END IF
IF KyS$ = "N" THEN
'N for "new"
Pick = 0
EXIT DO
END IF
IF kc = 113 OR kc = 81 OR kc = -61 OR kc = 27 OR kc = -68 THEN
'q/Q,F3,ESC, F10 to Abort
Pick = 0
EXIT DO
END IF
IF kc = KeyF4 THEN
Pick = 0
EXIT DO
END IF
IF kc = 112 OR kc = 80 THEN '[P]rint
' xS$ = "LPT" + LTRIM$(STR$(LPTNum))
xS$ = "LPT1"
CALL DumpList(List1(), ItemsInList, xS$, FALSE)
END IF
IF kc = 102 OR kc = 70 THEN '[F]ile
IF OutDevice$ > "!" THEN
xS$ = CmdWritePath$ + OutDevice$
CALL DumpList(List1(), ItemsInList, xS$, TRUE)
CALL PopMsg(18+rowO, 26+colO, " Screen dumped to: " + xS$, errattr, 2, kc)
END IF
END IF
PContinueLoop:
LOOP
RetKey = kc
GOTO Pick1Exit
PMHiLite1:
'Feed this routine "PageItemPtr" and it hi-lites the right item
IF DisplayOnly THEN RETURN
'Reset old hilite item
CALL ChangeAttribute(HiLiteR, HiLiteC, ItemLen, HiLiteA)
'Set new hilite item
stak = (PageItemPtr - 1) \ ItemsInColumn + 1
c = col + (stak - 1) * (ItemLen + 2) + 2
r = row + PageItemPtr - (stak - 1) * ItemsInColumn
HiLiteA = SCREENATTR(r, c) 'save original color attr
'IF HiLiteA <> skipattr THEN
CALL ChangeAttribute(r, c, ItemLen, revattr) 'change to reverse
'END IF
HiLiteR = r
HiLiteC = c
RETURN
FlashMouse:
CALL FlashField (msy, msx, 1, 2, 100, 0)
RETURN
Pick1Exit:
DisplayOnly = 0
LOCATE 1, 1
END SUB
SUB PickFromPlyList (PlyList() AS PlyListType, ItemsInList, ItemsInColumn, Columns, ItemLen, row, col, row2, col2, colattr, revattr, Pick, RetKey, OutDevice$, FreezePtr) STATIC
ON ERROR GOTO ERRORTRAP
'Row and Col are coordinates of the upper-left corner of the FRAME
'Requires SUB ChangeAttribute
'Lots of the internal variables need to be STATIC because sometimes
'we jump back into the middle of this routine
IF RetKey = -99 THEN GOTO Pick2WaitForKey
DisplayOnly = (RetKey = -98)
MaxPages = 99
REDIM FirstItemOnPage(MaxPages)
Pick2BeginPage:
pageno = 1
IF FreezePtr THEN
IF PageItemPtr < 1 THEN PageItemPtr = 1
ELSE
PageItemPtr = 1
END IF
FirstItemOnPage(1) = 1
Pick2Reentry:
PageMaxItems = ItemsInColumn * Columns
ItemNum = FirstItemOnPage(pageno)
PageItemCtr = 1
PageFull = FALSE
EndOfList = FALSE
IF ConsRows = 25 AND ConsCols = 80 THEN BeginBuffer
DO UNTIL PageFull
'Don't read past End of List
IF ItemNum > ItemsInList THEN
'Blank Rest of Screen
tmpPageItemCtr = PageItemCtr
DO WHILE tmpPageItemCtr <= PageMaxItems
stak = (tmpPageItemCtr - 1) \ ItemsInColumn + 1
c = col + (stak - 1) * (ItemLen + 2) + 2
r = row + tmpPageItemCtr - (stak - 1) * ItemsInColumn
QPRINTs r, c, SPACE$(ItemLen), colattr
INCR tmpPageItemCtr
LOOP
EndOfList = TRUE
PageFull = TRUE
EXIT DO
END IF
'Figure where to locate
stak = (PageItemCtr - 1) \ ItemsInColumn + 1
c = col + (stak - 1) * (ItemLen + 2) + 2
r = row + PageItemCtr - (stak - 1) * ItemsInColumn
attr = colattr
IF DisplayOnly = FALSE THEN 'Hilite item
IF PageItemCtr = PageItemPtr THEN
attr = revattr
HiLiteR = r
HiLiteC = c
END IF
END IF
a$ = PlyList(ItemNum).Item
a$ = PADRIGHT$(a$, ItemLen)
QPRINTs r, c, a$, attr
INCR PageItemCtr
INCR ItemNum
IF PageItemCtr > PageMaxItems THEN PageFull = TRUE
LOOP
IF ConsRows = 25 AND ConsCols = 80 THEN EndBuffer
Pick2WaitForKey:
'Wait for arrow Items / PageUp / PageDown / Enter
DO
msx = 0
msy = 0
KyS$ = WAITKEY$
s% = INSHIFT
IF LEN(KyS$) = 1 THEN
kc = ASC(KyS$)
KyS$ = UCASE$(KyS$)
ELSEIF LEN(KyS$) = 2 THEN
kc = -ASC(RIGHT$(KyS$, 1))
ELSEIF LEN(KyS$) = 4 THEN
IF ASC(KyS$, 3) = 2 THEN
DoubleClick = TRUE
ELSE
DoubleClick = FALSE
END IF
msx = MOUSEX
msy = MOUSEY
ms$ = CHR$(SCREEN(msy, msx))
IF ms$ = CHR$(249) THEN
kc = 27
ELSEIF ms$ = CloseButton$ THEN
kc = 13
ELSEIF msx > col AND msx < col2 AND msy > row AND msy < row2 THEN
'INSIDE frame
'Determine PageItemPtr
PageItemPtr = msy - row + INT((msx - col - 2) / (ItemLen + 2)) * ItemsInColumn
IF PageItemPtr < 1 THEN PageItemPtr = 1
IF PageItemPtr > PageItemCtr - 1 THEN PageItemPtr = PageItemCtr - 1
GOSUB PMHiLite2
IF DoubleClick THEN
kc = 13
ELSE
GOTO PContinueLoop2
END IF
ELSEIF msx < col OR msx > col2 OR msy < row OR msy > row2 THEN
'OUTSIDE the frame - ESC
kc = 27
ELSE
'ON the frame
SELECT CASE ms$
CASE "V", "E", "A", "N", "Q", "F", "P"
KyS$ = ms$
kc = ASC(KyS$)
GOSUB FlashMouse
CASE DnPtr$
kc = -81
GOSUB FlashMouse
CASE UpPtr$
kc = -73
GOSUB FlashMouse
CASE ELSE
kc = 27
END SELECT
END IF
END IF
IF kc = -72 THEN 'Up
IF PageItemPtr > 1 THEN
DECR PageItemPtr
GOSUB PMHiLite2
GOTO PContinueLoop2
END IF
END IF
IF kc = -80 THEN 'Down
IF PageItemPtr < PageItemCtr - 1 THEN
INCR PageItemPtr
GOSUB PMHiLite2
GOTO PContinueLoop2
END IF
END IF
IF kc = -75 THEN 'Left
IF PageItemPtr > ItemsInColumn THEN
PageItemPtr = PageItemPtr - ItemsInColumn
GOSUB PMHiLite2
GOTO PContinueLoop2
END IF
END IF
IF kc = -77 THEN 'Right
IF PageItemPtr + ItemsInColumn < PageItemCtr THEN
PageItemPtr = PageItemPtr + ItemsInColumn
GOSUB PMHiLite2
GOTO PContinueLoop2
END IF
END IF
IF kc = -73 THEN 'PageUp
IF pageno > 1 THEN DECR pageno
PageItemPtr = 1
GOTO Pick2Reentry
END IF
IF kc = -81 AND EndOfList = FALSE THEN 'PageDown
IF pageno < MaxPages THEN INCR pageno
FirstItemOnPage(pageno) = ItemNum
PageItemPtr = 1
GOTO Pick2Reentry
END IF
IF kc = 13 THEN 'Enter : set Pick and escape
Pick = FirstItemOnPage(pageno) + PageItemPtr - 1
EXIT DO
END IF
IF kc = 113 OR kc = 81 OR kc = -61 OR kc = 27 THEN
'q,Q,F3,ESC to Abort
Pick = 0
EXIT DO
END IF
PContinueLoop2:
LOOP
RetKey = kc
GOTO Pick2Exit
PMHiLite2:
'Reset old hilite item
CALL ChangeAttribute(HiLiteR, HiLiteC, ItemLen, colattr)
'set new hilite item
stak = (PageItemPtr - 1) \ ItemsInColumn + 1
c = col + (stak - 1) * (ItemLen + 2) + 2
r = row + PageItemPtr - (stak - 1) * ItemsInColumn
CALL ChangeAttribute(r, c, ItemLen, revattr)
HiLiteR = r
HiLiteC = c
RETURN
FlashMouse:
CALL FlashField (msy, msx, 1, 2, 100, 0)
RETURN
Pick2Exit:
LOCATE 1, 1
EXIT SUB
ErrorTrap:
LOCATE 10, 30
PRINT "ERROR: PickFrPL"; ERRCLEAR
x$ = WAITKEY$
END SUB
SUB PickTheStarter(tm, r, N)
' [in: tm, r(ow)] [out: Pick] r = 8
REDIM PlyList(1 TO 21) AS PlyListType
REDIM StartsList(1 TO 21) AS RankType
'Decide if we're going to sort by number of starts or just pick first 5
'Count how many pitchers have "starts" : Av
Av = 0
FOR j = 10 TO LastPiAd(tm)
IF DataPos(j, tm) = 1 AND DataGbyP(j, tm, 1) > 0 THEN
IF Av < 20 THEN
INCR Av
xS$ = LTRIM$(STR$(DataGbyP(j, tm, 1))) 'Starts
StartsList(Av).Criteria = PADZEROS$(xS$, 4)
StartsList(Av).Slot = j
END IF
END IF
NEXT
'fS$ = "\ \ \\ ## ## ### ## #### #### ### ### #.##"
IF Av < 5 THEN 'Punt -- just list first five
i = 0
IF LastPiAd(tm) < 14 THEN k = LastPiAd(tm) ELSE k = 14
IF k = 0 THEN k = 11
FOR j = 10 TO k
a$ = SPACE$(60)
IF CmdStat$ > "!" AND DaysOffRule = TRUE THEN
m = GetDaysOff (j, tm)
IF m THEN
MID$(a$, 1, 1) = LFORMAT$(m, "#")
END IF
END IF
MID$(a$, 3, 17) = DataName(j, tm)
MID$(a$, 22, 1) = DataHand(j, tm)
MID$(a$, 26, 2) = LFORMAT$(DataDef(j, tm), "##")
MID$(a$, 29, 2) = LFORMAT$(DataSB(j, tm), "##")
MID$(a$, 32, 3) = LFORMAT$(DataGames(j, tm), "##")
MID$(a$, 36, 2) = LFORMAT$(DataGbyP(j, tm, 1), "##")
MID$(a$, 39, 4) = LFORMAT$(DataAB(j, tm), "####")
MID$(a$, 44, 4) = LFORMAT$(DataHits(j, tm), "####")
MID$(a$, 49, 3) = LFORMAT$(DataBB(j, tm), "###")
MID$(a$, 53, 3) = LFORMAT$(DataSO(j, tm), "###")
MID$(a$, 57, 4) = FFORMAT$(DataRBI(j, tm) / 100, "#.##")
INCR i
PlyList(i).Item = a$
PlyList(i).Ref = j
NEXT
Av = k - 10 + 1
ELSE 'list the starters
ARRAY SORT StartsList(1) FOR Av, FROM 1 TO 4, DESCEND
i = 0
FOR k = 1 TO Av
j = StartsList(k).Slot
a$ = SPACE$(60)
IF CmdStat$ > "!" AND DaysOffRule = TRUE THEN
m = GetDaysOff (j, tm)
IF m THEN
MID$(a$, 1, 1) = LFORMAT$(m, "#")
END IF
END IF
MID$(a$, 3, 17) = DataName(j, tm)
MID$(a$, 22, 1) = DataHand(j, tm)
MID$(a$, 26, 2) = LFORMAT$(DataDef(j, tm), "##")
MID$(a$, 29, 2) = LFORMAT$(DataSB(j, tm), "##")
MID$(a$, 32, 3) = LFORMAT$(DataGames(j, tm), "##")
MID$(a$, 36, 2) = LFORMAT$(DataGbyP(j, tm, 1), "##")
MID$(a$, 39, 4) = LFORMAT$(DataAB(j, tm), "####")
MID$(a$, 44, 4) = LFORMAT$(DataHits(j, tm), "####")
MID$(a$, 49, 3) = LFORMAT$(DataBB(j, tm), "###")
MID$(a$, 53, 3) = LFORMAT$(DataSO(j, tm), "###")
MID$(a$, 57, 4) = FFORMAT$(DataRBI(j, tm) / 100, "#.##")
INCR i
PlyList(i).Item = a$
PlyList(i).Ref = j
NEXT
END IF
' r2 = r + 12 'Allows display of 10 starters
' r2 = r + 15 'Allows display of 13 starters
r2 = r + Av + 2
IF r2 > 23 THEN r2 = 23
FreezePtr = FALSE
IF MenuOpt$ = "M" THEN 'Manual Mode
CALL Drawfrm(r+rowO, 7+colO, r2+rowO, 71+colO, defattr, "Select Starting Pitcher for '" + Names(tm), "Dbl-click (or Enter) selection or ESC to Abort", 1, 0, 2)
ELSEIF MMx THEN 'Manual Manage within a Schedule
CALL Drawfrm(r+rowO, 7+colO, r2+rowO, 71+colO, defattr, "Select Starting Pitcher for '" + Names(tm), "Dbl-click (or Enter) selection", 1, 0, 1)
ELSE 'Two-Team Mode
CALL Drawfrm(r+rowO, 7+colO, r2+rowO, 71+colO, defattr, "Select Pitching Rotation for '" + Names(tm), "Dbl-click (or Enter) selection -- ESC When Done", 1, 0, 2)
IF SelX > 0 THEN FreezePtr = TRUE
END IF
QPRINTs r+1+rowO, 10+colO, " Name L/R W L G St Inn Hits BB SO ERA", dimattr
PTSTryAgain:
CALL PickFromPlyList (PlyList(), Av, r2-r-2, 1, 60, r+1+rowO, 8+colO, r2+rowO, 71+colO, dimattr, revattr, Pick, RetKey, nulls$, FreezePtr)
IF Pick > 0 THEN
N = PlyList(Pick).Ref
ELSE
N = 0
END IF
IF MMx AND CmdStat$ > "!" AND DaysOffRule = TRUE THEN
'What if all pitchers are tired?
AllAreTired = TRUE
FOR i = 1 TO Av
ii = PlyList(i).Ref
IF GetDaysOff (ii, tm) = 0 THEN AllAreTired = FALSE
NEXT
IF AllAreTired = FALSE THEN
IF GetDaysOff (N, tm) > 0 THEN
x$ = " That pitcher seems to have the day off. | "
x$ = x$ + "Start this pitcher anyway? [Y/n] "
CALL PopMsg(MidRow+8, MidCol-20, x$, errattr, 0, kc)
IF UCASE$(CHR$(kc)) = "N" THEN
GOTO PTSTryAgain
END IF
END IF
END IF
END IF
ERASE PlyList
END SUB
SUB PinchHit (m)
ON ERROR GOTO ERRORTRAP
IF amgr(it) THEN
IF m > LastPiAd(it) THEN 'AutoManager has already selected PHitter
GOTO P50
ELSE
GOTO P999
END IF
END IF
'Select Bench List
REDIM PlyList(1 TO 30) AS PlyListType 'was 15
Av = 0
FOR j = LastPiAd(it) + 1 TO MAXPLAYERS
IF Av < 30 THEN
IF DataName(j, it) < "." THEN pend = j - 1: EXIT FOR
IF DataAB(j, it) = 0 THEN
BAF! = 0
ELSE
BAF! = DataHits(j, it) / DataAB(j, it)
END IF
flag$ = " "
IF iused(j, it) THEN flag$ = "x"
'Is the bench player's name identical to a current or used pitcher?
FOR i = 1 TO np(it)
IF DataName(j, it) = DataName(iyp(i,it), it) THEN flag$ = "x"
NEXT
'f$ = "\\\ \ \\ ### ### ### ## ### ### ### ### \\## ### ## ### .###"
a$ = SPACE$(73)
MID$(a$, 1, 1) = flag$
MID$(a$, 3, 16) = DataName(j, it)
MID$(a$, 20, 2) = Pos(DataPos(j, it))
MID$(a$, 23, 3) = LFORMAT$(DataAB(j, it), "###")
MID$(a$, 27, 3) = LFORMAT$(DataHits(j, it), "###")
MID$(a$, 31, 3) = LFORMAT$(Data2B(j, it), "###")
MID$(a$, 35, 2) = LFORMAT$(Data3B(j, it), "##")
MID$(a$, 38, 3) = LFORMAT$(DataHR(j, it), "###")
MID$(a$, 42, 3) = LFORMAT$(DataRBI(j, it), "###")
MID$(a$, 46, 3) = LFORMAT$(DataBB(j, it), "###")
MID$(a$, 50, 3) = LFORMAT$(DataSO(j, it), "###")
MID$(a$, 54, 1) = DataHand(j, it)
MID$(a$, 56, 2) = LFORMAT$(DataSpeed(j, it), "##")
MID$(a$, 59, 3) = LFORMAT$(DataSB(j, it), "###")
MID$(a$, 63, 2) = LFORMAT$(DataCS(j, it), "##")
MID$(a$, 66, 3) = LFORMAT$(DataDef(j, it), "###")
MID$(a$, 70, 4) = FFORMAT$(BAF!, ".###")
INCR Av
PlyList(Av).Item = a$
PlyList(Av).Ref = j
END IF
NEXT
'Display Bench
QPush
P5:
r = Av + 7 + rowO
IF r > (ConsRows - 2) THEN r = ConsRows - 2
IF Gfx THEN CALL GraphHole(30, 5+rowO, 2+colO, r+1, 80+colO)
CALL Drawfrm(5+rowO, 2+colO, r, 78+colO, defattr, "'" + RTRIM$(Names(it)) + " Bench", "Dbl-click (or Enter) selection or ESC", 1, 0, 2)
IF Av > (r-7-rowO) THEN
x1$ = CHR$(193): x2$ = CHR$(194)
col2 = 78+colO
row2 = (5 + rowO + r ) \ 2 - 1
QPRINTs row2, col2, x1$, defattr
QPRINTs row2 + 1, col2, UpPtr$, defattr
QPRINTs row2 + 2, col2, DnPtr$, defattr
QPRINTs row2 + 3, col2, x2$, defattr
END IF
xS$ = " Name P AB HIT 2B 3B HR RBI BB SO B S SB CS Def Avg"
IF ERRSw(it) THEN MID$(xS$, 67, 3) = "ERR"
QPRINTs 6+rowO, 3+colO, xS$, defattr
'Row and Col are coordinates of the upper-left corner of the FRAME
' (PlyList() AS PlyListType, ItemsInList, ItemsInColumn, Columns, ItemLen, row, col, row2, col2, colattr, revattr, Pick, RetKey, OutDevice$, FreezePtr)
CALL PickFromPlyList (PlyList(), Av, r-7-rowO, 1, 74, 6+rowO, 2+colO, r, 78+colO, dimattr, revattr, Pick, RetKey, nulls$, 0)
IF Pick > 0 THEN
m = PlyList(Pick).Ref
ELSE
m = 0
ERASE PlyList
GOTO P999
END IF
IF iused(m, it) THEN
CALL PopMsg(r, 16+colO, " Player has already hit the showers! Try again. ", errattr, 2, kc)
GOTO P5
END IF
'Is the selected player's name identical to a current or used pitcher?
ie = 0
FOR i = 1 TO np(it)
IF DataName(m, it) = DataName(iyp(i,it), it) THEN ie = -1
NEXT
IF ie THEN
CALL PopMsg(r, 16+colO, " Already used as a pitcher! Try again. ", errattr, 2, kc)
GOTO P5
END IF
'Pinch-hitter selected "m"
P50:
CALL AddToScoreCrd(it, DataRef(ib, it), "9", "(for PH)") 'EX:
IF DataPos(ib, it) = 1 THEN 'Pinch hitting for pitcher
IF NOT amgr(it) THEN 'Patch 03-21-08
SaveDaysOffRule = DaysOffRule
DaysOffRule = FALSE
END IF
CALL CountAvPitchers (it, AvP, LastGuy)
IF NOT amgr(it) THEN 'Patch 03-21-08
DaysOffRule = SaveDaysOffRule
END IF
IF AvP < 1 THEN
IF NOT amgr(it) THEN
CALL PopMsg(r, 23+colO, " You don't have any pitchers left! ", errattr, 2, kc)
END IF
m = 0
GOTO P999
END IF
CALL Switch(m, ib, it) 'Pinch hitter takes pitchers spot
DataPos(ib, it) = 1 'Call pinch hitter a pitcher temporarily
iused(m, it) = TRUE 'Mark replaced hitter (the old pitcher) as used
'I question whether the above statement should use a reference number
'instead of "m"
iused(ipa(it), it) = TRUE 'Mark old pitcher as used in his pitcher slot
ELSE 'Pinch hitting for a non-pitcher
OldPos = DataPos(ib, it) 'Save defensive position of player being pulled
CALL Switch(m, ib, it) 'Call switch routine to swap players M and IB on team IT
DataPos(ib, it) = OldPos 'Pinch hitter goes into play the old defensive position
iused(m, it) = TRUE 'Mark replaced hitter as used
' see comment above
END IF
CALL AddToRefByBO (ib, it, DataRef(ib, it)) 'bat position, team, ref
P999:
IF NOT amgr(it) THEN
QPop
IF Gfx THEN
CALL EliminateHole(30)
CALL UnfreezeAndRefresh
END IF
END IF
EXIT SUB
ErrorTrap:
LOCATE 10, 30
PRINT "ERROR: PinchH "; ERRCLEAR
x$ = WAITKEY$
END SUB
SUB PinchRun (m, runner)
ON ERROR GOTO ERRORTRAP
IF amgr(it) THEN
IF m > LastPiAd(it) THEN 'AutoManager has already selected PRunner
GOTO PR50
ELSE
GOTO PR999
END IF
END IF
QPush
'Display baserunners
IF ir1 = 0 AND ir2 = 0 AND ir3 = 0 THEN
CALL PopMsg(18+rowO, 27+colO, " There are no baserunners! ", errattr, 2, kc)
GOTO PR999
END IF
'What if there's only 1 baserunner?
IF (ir1 > 0 AND ir2 = 0 AND ir3 = 0) THEN runner = ir1: GOTO PR12
IF (ir2 > 0 AND ir1 = 0 AND ir3 = 0) THEN runner = ir2: GOTO PR12
IF (ir3 > 0 AND ir1 = 0 AND ir2 = 0) THEN runner = ir3: GOTO PR12
'Display Baserunners
IF Gfx THEN CALL GraphHole(30, 2+rowO, 8+colO, 9+rowO, 74+colO)
CALL Drawfrm(2+rowO, 8+colO, 8+rowO, 72+colO, defattr, nulls$, nulls$, 1, 0, 1)
QPRINTs 3+rowO, 27+colO, "The Baserunners are:", defattr
k = 4 + rowO 'Line counter
IF ir1 THEN
xS$ = LASTNAME$(DataName(ir1, it))
z$ = "1) First Base - " + xS$
QPRINTs k, 27+colO, z$, defattr
END IF
IF ir2 THEN
INCR k
xS$ = LASTNAME$(DataName(ir2, it))
z$ = "2) Second Base - " + xS$
QPRINTs k, 27+colO, z$, defattr
END IF
IF ir3 THEN
INCR k
xS$ = LASTNAME$(DataName(ir3, it))
z$ = "3) Third Base - " + xS$
QPRINTs k, 27+colO, z$, defattr
END IF
'Find out who we are pinch running for:
PR10:
QPRINTs 7+rowO, 10+colO, "Indicate by base number who you are running for [1 2 3]: ", defattr
n = VAL(MYINPUT$(FALSE, KeyEscape, CustomEscKey, KeyAccept, kc, revfor, revbac, 7+rowO, 67+colO, 1, "NE", 1, 3, nulls$, msx, msy))
'Handle all mouse stuff here since the edit code is "NE" which doesn't
'return anything through MYINPUT$
'Any "bad" mouse click should close this and return
IF msx > 0 AND msy > 0 THEN
a$ = CHR$(SCREEN(msy, msx))
IF a$ > "0" AND a$ < "4" THEN
QPRINTs 7+rowO, 67+colO, a$, defattr
n = VAL(a$)
ELSE
n = 0
END IF
END IF
IF n = 0 THEN
m = 0
GOTO PR999
END IF
IF (n = 1 AND ir1 = 0) OR (n = 2 AND ir2 = 0) OR (n = 3 AND ir3 = 0) THEN
CALL MyBeep
GOTO PR10
END IF
IF n = 1 THEN runner = ir1
IF n = 2 THEN runner = ir2
IF n = 3 THEN runner = ir3
PR12:
'Build Bench List
REDIM PlyList(1 TO 30) AS PlyListType
Av = 0
FOR j = LastPiAd(it) + 1 TO MAXPLAYERS
IF Av < 30 THEN
IF DataName(j, it) < "." THEN pend = j - 1: EXIT FOR
IF DataAB(j, it) = 0 THEN
BAF! = 0
ELSE
BAF! = DataHits(j, it) / DataAB(j, it)
END IF
IF iused(j, it) THEN flag$ = "x" ELSE flag$ = " "
'Is the bench player's name identical to a current or used pitcher?
FOR i = 1 TO np(it)
IF DataName(j, it) = DataName(iyp(i,it), it) THEN flag$ = "x"
NEXT
'f$ = "\\\ \ \\ ### ### ### ## ### ### ### ### \\## ### ## ### .###"
a$ = SPACE$(73)
MID$(a$, 1, 1) = flag$
MID$(a$, 3, 16) = DataName(j, it)
MID$(a$, 20, 2) = Pos(DataPos(j, it))
MID$(a$, 23, 3) = LFORMAT$(DataAB(j, it), "###")
MID$(a$, 27, 3) = LFORMAT$(DataHits(j, it), "###")
MID$(a$, 31, 3) = LFORMAT$(Data2B(j, it), "###")
MID$(a$, 35, 2) = LFORMAT$(Data3B(j, it), "##")
MID$(a$, 38, 3) = LFORMAT$(DataHR(j, it), "###")
MID$(a$, 42, 3) = LFORMAT$(DataRBI(j, it), "###")
MID$(a$, 46, 3) = LFORMAT$(DataBB(j, it), "###")
MID$(a$, 50, 3) = LFORMAT$(DataSO(j, it), "###")
MID$(a$, 54, 1) = DataHand(j, it)
MID$(a$, 56, 2) = LFORMAT$(DataSpeed(j, it), "##")
MID$(a$, 59, 3) = LFORMAT$(DataSB(j, it), "###")
MID$(a$, 63, 2) = LFORMAT$(DataCS(j, it), "##")
MID$(a$, 66, 3) = LFORMAT$(DataDef(j, it), "###")
MID$(a$, 70, 4) = FFORMAT$(BAF!, ".###")
INCR Av
PlyList(Av).Item = a$
PlyList(Av).Ref = j
END IF
NEXT
'Display/Pick Player
PR15:
r = Av + 12 + rowO
IF r > (ConsRows-2) THEN r = ConsRows-2
IF Gfx THEN CALL GraphHole(32, 10+rowO, 2+colO, r+1, 80+colO)
CALL Drawfrm(10+rowO, 2+colO, r, 78+colO, defattr, "'" + RTRIM$(Names(it)) + " Bench", "Dbl-click (or Enter) selection or ESC", 1, 0, 2)
IF Av > (r-12-rowO) THEN
x1$ = CHR$(193): x2$ = CHR$(194)
col2 = 78+colO
row2 = (10 + rowO + r ) \ 2 - 1
QPRINTs row2, col2, x1$, defattr
QPRINTs row2 + 1, col2, UpPtr$, defattr
QPRINTs row2 + 2, col2, DnPtr$, defattr
QPRINTs row2 + 3, col2, x2$, defattr
END IF
xS$ = " Name P AB HIT 2B 3B HR RBI BB SO B S SB CS Def Avg"
IF ERRSw(it) THEN MID$(xS$, 67, 3) = "ERR"
QPRINTs 11+rowO, 3+colO, xS$, defattr
'Row and Col are coordinates of the upper-left corner of the FRAME
CALL PickFromPlyList (PlyList(), Av, r-12-rowO, 1, 74, 11+rowO, 2+colO, r, 78+colO, dimattr, revattr, Pick, RetKey, nulls$, 0)
IF Pick > 0 THEN
m = PlyList(Pick).Ref
ELSE
m = 0
ERASE PlyList
GOTO PR999
END IF
IF iused(m, it) THEN
CALL PopMsg(r, 17+colO, " You've already used that guy! Try again. ", errattr, 2, kc)
GOTO PR15
END IF
'Fix: 2/23/05
'Is the selected player's name identical to a current or used pitcher?
ie = 0
FOR i = 1 TO np(it)
IF DataName(m, it) = DataName(iyp(i,it), it) THEN ie = -1
NEXT
IF ie THEN
CALL PopMsg(r, 17+colO, " Already used as a pitcher! Try again. ", errattr, 2, kc)
GOTO PR15
END IF
PR50:
'Pinch-runner has been seleted (m)
'Pinch running for the pitcher
CALL AddToScoreCrd(it, DataRef(runner, it), "9", "(for PR)") 'EX:
IF DataPos(runner, it) = 1 THEN
IF NOT amgr(it) THEN 'Patch 03-21-08
SaveDaysOffRule = DaysOffRule
DaysOffRule = FALSE
END IF
CALL CountAvPitchers (it, AvP, LastGuy)
IF NOT amgr(it) THEN 'Patch 03-21-08
DaysOffRule = SaveDaysOffRule
END IF
IF AvP < 1 THEN
IF NOT amgr(it) THEN CALL PopMsg(18+rowO, 20+colO, " You don't have any pitchers left! ", errattr, 2, kc)
m = 0
GOTO PR999
END IF
'Mark old pitcher as used
iused(ipa(it), it) = TRUE
'info 09/03/05
' x$ = "Runner=" + STR$(runner) + "|"
' x$ = x$ + "ipa(it)=" + STR$(ipa(it)) + "|"
' x$ = x$ + "DataRef(runner,it)=" + STR$(DataRef(runner,it))
' CALL ErrorBox (x$)
END IF
'Swap players m (from the bench) and runner on team "it"
OldPos = DataPos(runner, it)
CALL Switch(m, runner, it)
DataPos(runner, it) = OldPos
iused(m, it) = TRUE 'I wonder if this should be the ref#(m) instead
CALL AddToRefByBO (runner, it, DataRef(runner, it)) 'bat pos, team, ref
CALL AddToScoreCrd(it, DataRef(runner, it), "7", "")
PR999:
IF NOT amgr(it) THEN
QPop
IF Gfx THEN
CALL EliminateHole(30)
CALL EliminateHole(32)
CALL UnfreezeAndRefresh
END IF
END IF
EXIT SUB
ErrorTrap:
LOCATE 10, 30
PRINT "ERROR: PinchR "; ERRCLEAR
x$ = WAITKEY$
END SUB
SUB PitchersWLS (team, player, w, l, s, era!)
w = 0
l = 0
s = 0
era! = 0.
IF CmdStat$ > "!" THEN
Find$ = League(team) + PADRIGHT$(Names(team), 12) + PADRIGHT$(NameRef(player, team), 16)
TotalRecs = PSum(0).PGameCtr
CALL BinarySearchP (PSum(), 1, 29, 1, TotalRecs, Find$, FoundAt, mini)
IF FoundAt THEN
w = PSum(FoundAt).PWin
l = PSum(FoundAt).PLoss
s = PSum(FoundAt).PSave
IF PSum(FoundAt).PInns > 0 THEN
era! = PSum(FoundAt).PERuns * 9.0 / _
(PSum(FoundAt).PInns + PSum(FoundAt).P3rds / 3)
IF era! > 99.9 THEN era! = 99.9
ELSE
era! = 0.
END IF
END IF
END IF
END SUB
SUB PopMsg (row, col, xS$, attr, waittime, kc)
' row, col are Upper Left Corner
' Support string argument parsed by "|"
n = PARSECOUNT(xS$, "|")
' Find length of the longest segment
LMax = 0
FOR i = 1 TO n
x$ = PARSE$(xS$, "|", i)
L = LEN(x$)
IF L > LMax THEN LMax = L
NEXT
'Save screen
IF Gfx AND RegDsply THEN
CALL GraphHole(31, row, col, row+n-1, col+LMax-1)
END IF
CALL GetScreen(ScrString$, row, col, row+n-1, col+LMax-1)
'Print
r = row
FOR i = 1 TO n
x$ = PARSE$(xS$, "|", i)
L = LEN(x$)
IF L < LMax THEN x$ = x$ + SPACE$(LMax - L)
QPRINTs r, col, x$, attr
INCR r
NEXT
'Pause for reply
IF waittime THEN
SLEEP waittime * 1000
kc = 0
ELSE
a$ = WAITKEY$
IF LEN(a$) = 4 THEN
kc = SCREEN(MOUSEY, MOUSEX)
ELSE
kc = ASC(a$)
END IF
END IF
'Restore screen
CALL PutScreen(ScrString$, row, col, row+n-1, col+LMax-1)
IF Gfx AND RegDsply THEN
CALL EliminateHole(31)
CALL UnfreezeAndRefresh
END IF
END SUB
SUB PopWindow (row1, col1, row2, col2, win)
' win = 1 is offense window, = 2 is defense window
COLOR deffor, defbac
col = col1 + 1
IF win = 1 THEN
QPRINTs row1 + 1, col, " On Off", defattr
QPRINTs row1 + 2, col, " EXIT ", defattr
QPRINTs row1 + 3, col, " Pinch Hit ", defattr
QPRINTs row1 + 4, col, " Pinch Run ", defattr
QPRINTs row1 + 5, col, " View Line-up ", defattr
QPRINTs row1 + 6, col, " View Opponent ", defattr
IF WarmUpRule THEN attr = defattr ELSE attr = CALCATTR(0, 1) 'black on blue
QPRINTs row1 + 7, col, " Call Bullpen ", attr
QPRINTs row1 + 8, col, STRING$(20, CHR$(196)), defattr
QPRINTs row1 + 9, col, " Steal ", defattr
QPRINTs row1 + 10, col, " Bunt/Squeeze ", defattr
QPRINTs row1 + 11, col, " Hit & Run ", defattr
END IF
IF win = 2 THEN
QPRINTs row1 + 1, col, " On Off", defattr
QPRINTs row1 + 2, col, " EXIT ", defattr
QPRINTs row1 + 3, col, " Visit Mound ", defattr
QPRINTs row1 + 4, col, " Substitute ", defattr
QPRINTs row1 + 5, col, " Swap Positions ", defattr
QPRINTs row1 + 6, col, " View Line-up ", defattr
QPRINTs row1 + 7, col, " View Opponent ", defattr
QPRINTs row1 + 8, col, STRING$(20, CHR$(196)), defattr
QPRINTs row1 + 9, col, " Intent. Walk ", defattr
QPRINTs row1 + 10, col, " Infield In ", defattr
QPRINTs row1 + 11, col, " Pitch-Out ", defattr
QPRINTs row1 + 12, col, " Pitch-Around ", defattr
END IF
END SUB
SUB PostAnnouncer (PauseAfterEachLine, FlashWhoAt)
REGISTER i AS INTEGER, c AS INTEGER
L = 38 + colO
xS$ = SPACE$(L)
IF DelFac = 0 AND amgr(1) AND amgr(2) THEN
QPRINTs 2, 42, xS$, scdattr
QPRINTs 3, 42, " Quick Play Mode ", scdattr
QPRINTs 4, 42, xS$, scdattr
ELSE
'Is it an "instant win" situation?
IF inn >= RegInns AND it = 2 THEN
IF itruns(2) > itruns(1) THEN
IF IGone THEN AddToAnnouncer it, "Gone!"
AddToAnnouncer it, "Game's over!"
END IF
END IF
c = 0
FOR i = 1 TO ANx
'Clear Box Method
IF i = 1 OR i = 4 OR i = 7 OR i = 10 THEN
QPRINTs 2, 42, xS$, scdattr
QPRINTs 3, 42, xS$, scdattr
QPRINTs 4, 42, xS$, scdattr
c = 0
END IF
dS$ = LEFT$(Announcer(i).mgs, L)
INCR c
IF SoundOn AND AnnouncerOn THEN
QPRINTs c + 1, 42, dS$, scdattr
REPLACE "..." WITH ": " IN dS$
REPLACE "--" WITH ": " IN dS$
REPLACE "0 for " WITH "oh for " IN dS$
REPLACE "retired!" WITH "retired" IN dS$
REPLACE "there!" WITH "there" IN dS$
'Look for announcer.exe first
IF LEN(DIR$("announcer.exe")) THEN
zS$ = "announcer.exe " + dS$
ELSEIF LEN(DIR$("blabber.exe")) THEN
zS$ = "blabber.exe " + dS$
ELSE
zS$ = null$
END IF
IF zS$ > "!" THEN
ShowWindState& = 0
ConsoleShell zS$, ShowWindState&
'More time for announcer to speak
L = LEN(dS$)
SLEEP (L * 35)
END IF
ELSE
QPRINTs c + 1, 42, dS$, scdattr
END IF
IF i < ANx THEN
IF PauseAfterEachLine THEN
IF i = 1 AND FlashWhoAt THEN
IF OrgWhoAtPos THEN WhoAtPos = OrgWhoAtPos
IF WhoAtPos THEN CALL Flash(WhoAtPos, FALSE)
END IF
IF i = 3 OR i = 6 THEN
SLEEP (DelFac * 175) 'A little extra time before the screen is erased on next line
END IF
SLEEP (DelFac * 250) 'was 300
END IF
END IF
NEXT
END IF
END SUB
SUB PrintSCHHelp
CALL Drawfrm(12+rowO, 8+colO, 24+rowO, 71+colO, defattr, nulls$, nulls$, 1, 0, 0)
r = 13 + rowO
c = 10 + colO
QPRINTs r, c, " SCH files are a database of games played by date. You can ", dimattr
QPRINTs r+1, c, "interrupt a SCH and the stats and re-start data are saved ", dimattr
QPRINTs r+2, c, "so you can continue later (but be sure to specify the same ", dimattr
QPRINTs r+3, c, "stat file). ", dimattr
QPRINTs r+4, c, " To manage one or more teams yourself, press E to edit the ", dimattr
QPRINTs r+5, c, "schedule. Then select the starting date when YOU want to ", dimattr
QPRINTs r+6, c, "manage your team(s). In the Options column, type in /vm:+ (to", dimattr
QPRINTs r+7, c, "indicate you wish to manage the visiting team) or /hm:+ (to ", dimattr
QPRINTs r+8, c, "indicate the home team). To remove your team(s) from manual ", dimattr
QPRINTs r+9, c, "control type in /vm:- or /hm:- on the date when you want the ", dimattr
QPRINTs r+10,c, "computer to take over. See documentation for details. ", dimattr
END SUB
SUB PrintSERHelp
CALL Drawfrm(12+rowO, 8+colO, 23+rowO, 71+colO, defattr, nulls$, nulls$, 1, 0, 0)
r = 13 + rowO
c = 10 + colO
QPRINTs r, c, " SER files are just a simple text listing of games to be ", dimattr
QPRINTs r+1, c, "played. A simulation based on a SER file CANNOT be restarted ", dimattr
QPRINTs r+2, c, "at the point it was interrupted, so you usually want to let ", dimattr
QPRINTs r+3, c, "them finish once you start one. Generally you want SBS to ", dimattr
QPRINTs r+4, c, "manage all the teams and crank through the simulation as ", dimattr
QPRINTs r+5, c, "quickly as possible. ", dimattr
QPRINTs r+6, c, " Hit [V] or [E] to view or edit. Notice that /H: and /V: ", dimattr
QPRINTs r+7, c, "specify home and visitor and /n: specifies the number of ", dimattr
QPRINTs r+8, c, "games to run. Those are usually the only options that a SER ", dimattr
QPRINTs r+9, c, "file uses. See documentation for details. ", dimattr
END SUB
SUB PrintSTAHelp
CALL Drawfrm(14+rowO, 8+colO, 22+rowO, 71+colO, defattr, nulls$, nulls$, 1, 0, 0)
r = 15 + rowO
c = 10 + colO
QPRINTs r, c, " These are the statistics files that have been specified by", dimattr
QPRINTs r+1, c, "the user in the [Statistics Recording Options] window. No ", dimattr
QPRINTs r+2, c, "matter which simulation type you choose (manual, two-team, ", dimattr
QPRINTs r+3, c, "SCH or SER) you have the option of saving the statistics that", dimattr
QPRINTs r+4, c, "are generated. You can then build a report at any time by ", dimattr
QPRINTs r+5, c, "selecting the file. Or hit the [Delete] key to permanently ", dimattr
QPRINTs r+6, c, "discard the file. ", dimattr
END SUB
SUB Prompt (special) STATIC
QPRINTs ConsRows, 1, SPACE$(ConsCols - 9), scdattr
QPRINTs ConsRows, ConsCols - 10, " SBS v4.9.3", scoattr
IF MenuOpt$ = "M" THEN QPRINTs ConsRows, 59, "Manual ", scdattr
IF MenuOpt$ = "S" THEN QPRINTs ConsRows, 59, "Schedule", scdattr
IF MenuOpt$ = "E" THEN QPRINTs ConsRows, 59, "Series ", scdattr
IF MenuOpt$ = "T" THEN QPRINTs ConsRows, 59, "Two-Team", scdattr
IF special > 0 THEN 'closing
xS$ = " New Box Card Results Stats Doc Quit "
QPRINTs ConsRows, 1, xS$, scdattr
a = ConsRows: b = 2: c = 1: d = prmfor: e = prmbac
GOSUB PromptSub1
b = 7
GOSUB PromptSub1
b = 12
GOSUB PromptSub1
b = 18
GOSUB PromptSub1
b = 27
GOSUB PromptSub1
b = 34
GOSUB PromptSub1
b = 39
GOSUB PromptSub1
ELSEIF amgr(1) AND amgr(2) THEN
QPRINTs ConsRows, 1, " ptions ox ard esults ", scdattr
QPRINTs ConsRows, 2, "O", prmattr
QPRINTs ConsRows, 11, "B", prmattr
QPRINTs ConsRows, 16, "C", prmattr
QPRINTs ConsRows, 22, "R", prmattr
IF DelFac = 0 THEN
QPRINTs ConsRows, 31, " oggle Display uit ", scdattr
QPRINTs ConsRows, 31, "T", prmattr
QPRINTs ConsRows, 47, "Q", prmattr
ELSE
QPRINTs ConsRows, 31, " uit ", scdattr
QPRINTs ConsRows, 31, "Q", prmattr
END IF
ELSE
'min len = 37 max len = 54
xS$ = EnterPtr$ + " Options Box Card Doc "
IF NewUI = TRUE THEN
IF NOT amgr(1) THEN xS$ = xS$ + "Visitor "
IF NOT amgr(2) THEN xS$ = xS$ + "Home "
ELSE
IF NOT amgr(1) THEN xS$ = xS$ + "S=Visi "
IF NOT amgr(2) THEN xS$ = xS$ + "5=Home "
END IF
xS$ = xS$ + "Quit "
LLeng = LEN(xS$)
QPRINTs ConsRows, 1, xS$, scdattr
a = ConsRows: b = 2: c = 3: d = prmfor: e = prmbac
GOSUB PromptSub1
b = 7: c = 1
GOSUB PromptSub1 'Options
b = 16
GOSUB PromptSub1 'Box
b = 21
GOSUB PromptSub1 'Card
b = 27
GOSUB PromptSub1 'Doc
b = 32
GOSUB PromptSub1
'catch the Quit
IF LLeng > 36 THEN
b = LLeng - 4
GOSUB PromptSub1
END IF
'catch Home if both Visi and Home
IF LEN(xS$) = 51 THEN 'Visitor Home Quit '
b = 41
GOSUB PromptSub1
END IF
IF LEN(xS$) = 52 THEN 'S=Visi 5=Home Quit '
b = 40
GOSUB PromptSub1
END IF
END IF
LOCATE 1, 1
CURSOR OFF
EXIT SUB
PromptSub1:
attr = (e * 16) + d
CALL ChangeAttribute(a, b, c, attr)
RETURN
END SUB
SUB PutPitHitStatsInBO
FOR tm = 1 TO 2
j = 0
DO
IF j > 8 THEN j = 9: EXIT DO
INCR j
LOOP UNTIL DataPos(j, tm) = 1
CALL MovePitHitStats (j, tm) 'puts hitting stats in slot j
NEXT
END SUB
SUB PutScreen (ScrSave$, row1, col1, row2, col2)
IF ConsRows = 25 THEN BeginBuffer
i = 1
FOR r = row1 TO row2
FOR c = col1 TO col2
b$ = MID$(ScrSave$, i, 1)
attr = ASC(MID$(ScrSave$, i+1, 1))
QPRINTs r, c, b$, attr
i = i + 2
NEXT
NEXT
IF ConsRows = 25 THEN EndBuffer
END SUB
SUB QPRINTs (row AS LONG, col AS LONG, xS$, attr AS LONG) STATIC
IF ConsRows = 25 AND ConsCols = 80 AND Gfx = FALSE THEN
QPRINT row, col, xS$, attr
ELSE
L = LEN(xS$)
LOCATE row, col
forg = attr MOD 16
bacg = attr \ 16
COLOR forg, bacg
IF (col + L) < (ConsCols + 2) THEN
PRINT xS$;
' IF row < ConsRows THEN STDOUT xS$;
' IF row = ConsRows THEN PRINT xS$;
END IF
END IF
END SUB
SUB QSortRand (myfile$, fp, Reclen, start, leng, ASCorDES$)
OPEN myfile$ FOR BINARY AS fp
RecCount = LOF(fp) \ Reclen
CALL QSRand(1, RecCount, fp, Reclen, start, leng)
CLOSE fp
END SUB
SUB QSRand (L, R, fp, Reclen, start, leng)
' Does not support "Descending" order!
i = L: j = R
s = (L + R) \ 2
IF s < 1 THEN BEEP: PRINT " Sort Error "; : GOTO QSRandEscape
xsortfield$ = FindRA$(s, fp, Reclen, start, leng)
DO
DO WHILE FindRA$(i, fp, Reclen, start, leng) < xsortfield$
INCR i
LOOP
DO WHILE xsortfield$ < FindRA$(j, fp, Reclen, start, leng)
DECR j
LOOP
IF i <= j THEN
SEEK fp, (i - 1) * Reclen + 1
GET$ fp, Reclen, y$
SEEK fp, (j - 1) * Reclen + 1
GET$ fp, Reclen, z$
SEEK fp, (j - 1) * Reclen + 1
PUT$ fp, y$
SEEK fp, (i - 1) * Reclen + 1
PUT$ fp, z$
INCR i
DECR j
END IF
LOOP UNTIL i > j
IF L < j THEN CALL QSRand(L, j, fp, Reclen, start, leng)
IF L < R THEN CALL QSRand(i, R, fp, Reclen, start, leng)
QSRandEscape:
END SUB
SUB ReadFromScreen (row, col, leng, field$, edit$, Valid$) STATIC
field$ = ""
L = col + leng - 1
FOR c = col TO L
field$ = field$ + CHR$(SCREEN(row, c))
NEXT c
Valid$ = "Y"
x1$ = MID$(edit$, 1, 1)
x2$ = MID$(edit$, 2, 1)
IF x2$ = "R" THEN 'Required
IF field$ = SPACE$(leng) THEN Valid$ = "N"
END IF
IF x1$ = "N" THEN
IF x2$ = "E" OR x2$ = " " THEN
IF NOT NUMERIC(field$, TRUE, FALSE) THEN Valid$ = "N"
ELSE
IF NOT NUMERIC(field$, FALSE, FALSE) THEN Valid$ = "N"
END IF
END IF
END SUB
SUB ReadSCHSlot
SubRecOff = 10 + (SchSlotPtr - 1) * SubRecLen
CmdVFil$ = UCASE$(RTRIM$(MID$(SchBuffer$, SubRecOff + VisiOffset, 8)))
CmdHFil$ = UCASE$(RTRIM$(MID$(SchBuffer$, SubRecOff + HomeOffset, 8)))
CmdSlotGames = 1
xS$ = MID$(SchBuffer$, SubRecOff + OptiOffset, 12)
IF xS$ <> SPACE$(12) THEN 'just parses the option list
CALL ParseCommand (xS$, nargs)
CALL SetSwitches (nargs)
END IF
'Scan Rest Of SCHRec
IF SchSlotPtr = SchGamesPerRecord THEN 'formerly 7
LastGameThisDate = TRUE
ELSE
LastGameThisDate = TRUE
FOR i = SchSlotPtr + 1 TO SchGamesPerRecord 'formerly 7
SubRecOff = 10 + (i - 1) * SubRecLen
xS$ = MID$(SchBuffer$, SubRecOff + VisiOffset, 8)
yS$ = MID$(SchBuffer$, SubRecOff + HomeOffset, 8)
IF xS$ > "!" AND yS$ > "!" THEN
LastGameThisDate = FALSE
EXIT FOR
END IF
NEXT
END IF
'If looking for Specific League/Team/Date, is it here?
FilterOK = TRUE
'One League only? 'File name must be YYLTTTTT.DAT or YYYYLTTT.DAT
IF LEN(CmdFavLeague$) THEN
IF LEN(CmdVFil$) AND LEN(CmdHFil$) THEN
IF NUMERIC(MID$(CmdVFil$, 1, 4), FALSE, FALSE) THEN
xS$ = MID$(CmdVFil$, 5, 1)
ELSE
xS$ = MID$(CmdVFil$, 3, 1)
END IF
IF NUMERIC(MID$(CmdHFil$, 1, 4), FALSE, FALSE) THEN
yS$ = MID$(CmdHFil$, 5, 1)
ELSE
yS$ = MID$(CmdHFil$, 3, 1)
END IF
xS$ = UCASE$(xS$)
yS$ = UCASE$(yS$)
IF CmdFavLeague$ <> xS$ AND CmdFavLeague$ <> yS$ THEN FilterOK = FALSE
END IF
END IF
'One Team only?
IF LEN(CmdFavTeam$) THEN
IF LEN(CmdVFil$) AND LEN(CmdHFil$) THEN
IF CmdFavTeam$ <> CmdVFil$ AND CmdFavTeam$ <> CmdHFil$ THEN FilterOK = FALSE
END IF
END IF
'If Date Range is active, is this date OK?
IF LEN(CmdDateL$) AND LEN(CmdDateH$) THEN
IF SCHDate$ < CmdDateL$ OR SCHDate$ > CmdDateH$ THEN FilterOK = FALSE
END IF
END SUB
SUB ResetBatter
ResetHitter = TRUE
DECR ibp(it)
DECR mab(ref, it)
IF UCASE$(DataHand(ip, id)) = "L" THEN
DECR mabLHP(ref, it)
ELSE
DECR mabRHP(ref, it)
END IF
END SUB
SUB RestFrSnapShot
FOR it = 1 TO 2
REDIM Positions (10)
FOR i = 1 TO 9
Positions(DataPos(i,it)) = 1
NEXT
FOR i = 2 TO 9
IF Positions(i) = 0 THEN
x$ = "RESTFRSNAP1 error: Defense position " + STR$(i) + " is empty "
CALL ErrorBox (x$)
END IF
NEXT
NEXT
FOR it = 1 TO 2
L = 1
DO UNTIL L > MAXPLAYERS
j = RefOrgSave(L, it).RefNo
'Search For Reference #j
FoundSw = FALSE
k = 1
DO UNTIL k > MAXPLAYERS
IF DataRef(k, it) = j THEN FoundSw = TRUE: EXIT DO
INCR k
IF k = 10 THEN k = LastPiAd(it) + 1
LOOP
IF FoundSw THEN
IF k <> L THEN
CALL Switch(L, k, it)
END IF
END IF
DataPos(L, it) = RefOrgSave(L, it).RefPos
INCR L
IF L = 10 THEN L = LastPiAd(it) + 1
LOOP
NEXT
FOR it = 1 TO 2
REDIM Positions (10)
FOR i = 1 TO 9
Positions(DataPos(i,it)) = 1
NEXT
FOR i = 2 TO 9
IF Positions(i) = 0 THEN
x$ = "RESTFRSNAP2 error: Defense position " + STR$(i) + " is empty "
CALL ErrorBox (x$)
END IF
NEXT
NEXT
END SUB
SUB RotationMethIO (Flds, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
CALL Drawfrm(6+rowO, 16+colO, 15+rowO, 64+colO, defattr, "Default Pitching Rotation Method", "ESC:Continue F3:Abort", 1, 0, 2)
DATA 8,25,"Number In Rotation [2-5]: ",08,58, 1,"X "
DATA 10,25,"[S]equential or [R]andom Order?: ",10,58, 1,"X "
DATA 12,25,"Use Spot Starters?: ",12,58, 1,"X "
Flds = 3
c = 1
FOR i = 1 TO Flds
Flitrow(i) = VAL(READ$(c)) + rowO
Flitcol(i) = VAL(READ$(c+1)) + colO
Flit$(i) = READ$(c+2)
Frow(i) = VAL(READ$(c+3)) + rowO
Fcol(i) = VAL(READ$(c+4)) + colO
Flen(i) = VAL(READ$(c+5))
Fed$(i) = READ$(c+6)
c = c + 7
NEXT
REDIM FContents$(13)
FContents$(1) = "5"
FContents$(2) = "S"
FContents$(3) = "Y"
CursorPtr = 1
DO
RotationMethLoop:
CALL ScreenIO(Keyed, KeyF3, 0, KeyEsc, Flds, CursorPtr, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
IF Keyed = KeyF3 THEN
CmdSP$ = nulls$
EXIT SUB
END IF
'Edit Field Contents
Error1$ = "N"
IF INSTR("12345", FContents$(1)) = 0 THEN
Error1$ = "Y"
CursorPtr = 1
GOTO RotationMethLoop
END IF
IF INSTR("RS12345", FContents$(2)) = 0 THEN
Error1$ = "Y"
CursorPtr = 2
GOTO RotationMethLoop
END IF
IF INSTR("YN", FContents$(3)) = 0 THEN
Error1$ = "Y"
CursorPtr = 3
END IF
LOOP WHILE Error1$ = "Y"
CmdSpot$ = FContents$(3)
CmdSP$ = FContents$(2) + FContents$(1)
END SUB
SUB SameTeamsSetup (kc, Flds, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
CALL DrawFrm(18+rowO, 22+colO, 22+rowO, 61+colO, defattr, nulls$, "ESC:Continue F3:Cancel", 0, 0, 2)
FContents$(1) = "N"
Flds = 1
DATA 20,24,"Play again with same teams? [y/N] ",20,58,01,"X "
c = 1
FOR i = 1 TO Flds
Flitrow(i) = VAL(READ$(c)) + rowO
Flitcol(i) = VAL(READ$(c+1)) + colO
Flit$(i) = READ$(c+2)
Frow(i) = VAL(READ$(c+3)) + rowO
Fcol(i) = VAL(READ$(c+4)) + colO
Flen(i) = VAL(READ$(c+5))
Fed$(i) = READ$(c+6)
c = c + 7
NEXT
CursorPtr = 1
DO
s = defattr
defattr = dimattr
CALL ScreenIO(Keyed, KeyF3, 0, KeyEsc, Flds, CursorPtr, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
defattr = s
ErrorSw$ = "N"
'Cancel
IF Keyed = KeyF3 THEN EXIT DO
IF FContents$(1) <> "Y" AND FContents$(1) <> "N" THEN ErrorSw$ = "Y"
LOOP WHILE ErrorSw$ = "Y"
kc = Keyed
END SUB
SUB SCHDateTeamIO (Keyed, Flds, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
DATA 08,20,"Single League [A/N] :",08,43, 1,"X "
DATA 10,20,"Single Team [filename]:",10,43, 8,"X "
DATA 12,20,"Date Range [MM/DD/YY]:",12,43, 8,"X "
DATA 12,51,"-", 12,52, 8,"X "
Flds = 4
c = 1
FOR i = 1 TO Flds
Flitrow(i) = VAL(READ$(c)) + rowO
Flitcol(i) = VAL(READ$(c+1)) + colO
Flit$(i) = READ$(c+2)
Frow(i) = VAL(READ$(c+3)) + rowO
Fcol(i) = VAL(READ$(c+4)) + colO
Flen(i) = VAL(READ$(c+5))
Fed$(i) = READ$(c+6)
c = c + 7
NEXT
REDIM FContents$(13)
CursorPtr = 1
CALL Drawfrm(6+rowO, 18+colO, 15+rowO, 61+colO, defattr, "Schedule Filter", "ESC:Continue F3:Abort", 1, 0, 2)
QPRINTs 14+rowO, 27+colO,"[Leave Blank for All Games]", dimattr
DO
CALL ScreenIO(Keyed, KeyF3, 0, KeyEsc, Flds, CursorPtr, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
'Trap F3
IF Keyed = KeyF3 THEN EXIT SUB
'Edit Field Contents
Error1$ = "N"
CmdFavLeague$ = UCASE$(RTRIM$(FContents$(1)))
CmdFavTeam$ = UCASE$(RTRIM$(FContents$(2)))
CmdDateL$ = RTRIM$(FContents$(3))
CmdDateH$ = RTRIM$(FContents$(4))
IF LEN(CmdDateH$) THEN
IF NOT ValidMMDDYY(CmdDateH$) THEN
MyBeep
LOCATE 13+rowO, 23+colO: PRINT "** Date must be in MM/DD/YY form **";
SLEEP 1000
CursorPtr = 4
Error1$ = "Y"
END IF
END IF
IF LEN(CmdDateL$) THEN
IF NOT ValidMMDDYY(CmdDateL$) THEN
MyBeep
LOCATE 13+rowO, 20+colO: PRINT "** Date must be in MM/DD/YY form **";
SLEEP 1000
CursorPtr = 3
Error1$ = "Y"
END IF
END IF
IF LEN(CmdFavTeam$) THEN
k = CountGamesInSCH (nulls$, CmdFavTeam$, nulls$, nulls$, SubRecLen, VisiOffset, HomeOffset, OptiOffset)
IF k = 0 THEN
MyBeep
LOCATE 13+rowO, 20+colO: PRINT "** Team does not appear in .SCH! **";
SLEEP 1000
CursorPtr = 2
Error1$ = "Y"
END IF
END IF
LOOP WHILE Error1$ = "Y"
IF LEN(CmdDateL$) > 0 AND LEN(CmdDateH$) = 0 THEN CmdDateH$ = CmdDateL$
END SUB
SUB ScreenIO (Keyed, EscKey, CustomEscKey, AcceptKey, Flds, CursorPtr, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
' Print screen literals and field contents
' Flen's which are NEGATIVE are to be dimmed and skipped
FOR i = 1 TO Flds
IF Flitrow(i) > 0 AND Flitrow(i) <= ConsRows AND Flitcol(i) > 0 AND Flitcol(i) <= ConsCols THEN
IF Flen(i) < 0 THEN attr = dimattr ELSE attr = defattr
QPRINTs Flitrow(i), Flitcol(i), Flit$(i), attr
END IF
IF Frow(i) > 0 AND Frow(i) <= ConsRows AND Fcol(i) > 0 AND Fcol(i) <= ConsCols THEN
IF Flen(i) < 0 THEN attr = dimattr ELSE attr = revattr
'Print field contents or blanks
IF LEN(FContents$(i)) = 0 THEN
QPRINTs Frow(i), Fcol(i), SPACE$(ABS(Flen(i))), attr
ELSE
QPRINTs Frow(i), Fcol(i), PADRIGHT$(FContents$(i), ABS(Flen(i))), attr
END IF
END IF
NEXT i
InsToggle = 0 'overwrite mode
CsrSize = 100
' Find 1st Input Field (not necessarily Fld = 1)
' Flen's which are NEGATIVE are to be dimmed and skipped
i = 1
DO WHILE Frow(i) = 0 OR Fcol(i) = 0 OR Flen(i) < 0
INCR i
IF i > Flds THEN i = 1: EXIT DO
LOOP
FirstInputField = i
Fldptr = CursorPtr
LOCATE Frow(Fldptr), Fcol(Fldptr)
COLOR revfor, revbac
' Loop until Escape-Key. Data is manipulated on-screen and returned in the
' FContents$() array
DO
ResetPtr:
GOSUB ScrIOSpecialCases
'ResetPtr:
row = Frow(Fldptr)
col = Fcol(Fldptr)
leng = ABS(Flen(Fldptr)) 'Just in case I screwed up
edit$ = Fed$(Fldptr)
default$ = FContents$(Fldptr)
'Get Input from keyboard or mouse
FContents$(FldPtr) = MYINPUT$(TRUE, EscKey, CustomEscKey, AcceptKey, kc, revfor, revbac, row, col, leng, edit$, 0, 999999, default$, msx, msy)
'If returning from mouse input (kc=-99), we might have clicked anywhere
IF msy > 0 AND msx > 0 THEN
'mouse click somewhere
CALL FlashField (msy, msx, 1, 2, 100, 0)
IF CHR$(SCREEN(msy, msx)) = CloseButton$ THEN 'ESC button (but accept input)
kc = AcceptKey
'L = PlayWav("4540.wav")
EXIT DO
END IF
IF CHR$(SCREEN(msy, msx)) = AbortButton$ THEN 'Abort button
kc = EscKey
EXIT DO
END IF
'Did we click in an input field?
FOR i = 1 TO Flds
IF Frow(i) > 0 AND Fcol(i) > 0 AND Flen(i) > 0 THEN
IF msx >= Fcol(i) AND msx < Fcol(i) + Flen(i) AND msy = Frow(i) THEN
Fldptr = i
GOTO ResetPtr
END IF
END IF
NEXT
'Did we click inside one of the "literal" areas?
FOR i = 1 TO Flds
IF Flitrow(i) > 0 AND Flitcol(i) > 0 AND Flen(i) > 0 AND _
Frow(i) > 0 AND Fcol(i) > 0 THEN
'Within Literal-Area?
IF (msx >= Flitcol(i) AND msx < Flitcol(i) + LEN(FLit$(i)) AND _
msy = Flitrow(i)) THEN
Fldptr = i
a$ = UCASE$(CHR$(SCREEN(msy, msx)))
IF a$ >= "0" AND a$ <= "Z" THEN FContents$(FldPtr) = a$
GOTO ResetPtr
END IF
END IF
NEXT
'"TakeFromAnywhere"?
IF TakeFromAnywhere = 1 THEN 'DefSwitch Special case
a$ = UCASE$(CHR$(SCREEN(msy, msx)))
IF a$ >= "0" AND a$ <= "Z" THEN FContents$(FldPtr) = a$
LOCATE row, col
PRINT a$;
END IF
IF TakeFromAnywhere = 2 THEN 'StatRecordIO Special case for F4
IF msy = 8+rowO AND msx > 39+colO AND msx < 44+colO THEN
kc = CustomEscKey
END IF
END IF
IF CHR$(SCREEN(msy, msx)) = "+" THEN 'Custom ESC
kc = CustomEscKey
END IF
END IF
' Shift-tab or Up-arrow or Left-arrow
IF kc = -15 OR kc = -72 OR kc = -75 THEN
DO
DECR Fldptr
LOOP UNTIL (Frow(Fldptr) <> 0 AND Fcol(Fldptr) <> 0 AND Flen(Fldptr) > 0) OR Fldptr < 1
IF Fldptr < 1 THEN Fldptr = FirstInputField
LOCATE Frow(Fldptr), Fcol(Fldptr)
' C/R, R-Tab, Down-arrow, Right-arrow
ELSE
DO
INCR Fldptr
IF Fldptr > Flds THEN Fldptr = FirstInputField: EXIT DO
LOOP UNTIL Frow(Fldptr) <> 0 AND Fcol(Fldptr) <> 0 AND Flen(Fldptr) > 0
LOCATE Frow(Fldptr), Fcol(Fldptr)
'L = PlayWav("37979.wav")
END IF
LOOP UNTIL kc = EscKey OR kc = AcceptKey OR kc = CustomEscKey
Keyed = kc
COLOR deffor, defbac
LOCATE 1, 1
CURSOR OFF
EXIT SUB
ScrIOSpecialCases:
'For Ground Rule Screen
IF LEFT$(Flit$(1), 9) = "Automatic" THEN
FOR i = 2 TO 3
IF FContents$(i) = "Y" THEN
xS$ = "Computer will manage '" + Names(i - 1)
ELSE
xS$ = "Player will manage '" + Names(i - 1)
END IF
QPRINTs i+2+rowO, 34+colO, xS$, dimattr
NEXT
END IF
RETURN
END SUB
SUB ScoreBrd (DoFrame, DoAllInns) STATIC
' DoFrame -
' DoAllInns -
' Nothing done with announcer in this routine
'DIM ss AS STRING * 2
ss$ = " "
CURSOR OFF
IF DoFrame = FALSE THEN
GOTO ScoreBoardNumbers
END IF
'Scoreboard box
xS$ = STRING$(39, 205)
QPRINTs 1, 1, CHR$(213) + xS$, scoattr
QPRINTs 2, 1, CHR$(179) + " 1 2 3 4 5 6 7 8 9 10 R H E", scoattr
QPRINTs 3, 1, CHR$(179), scoattr
QPRINTs 4, 1, CHR$(179), scoattr
QPRINTs 5, 1, CHR$(212)+CHR$(205)+CHR$(181)+CHR$(32), scoattr
QPRINTs 5, 5, "Out:", prmattr
x$ = CHR$(32)+CHR$(198)+LEFT$(xS$, 28)
QPRINTs 5, 11, x$, scoattr
'Draw blank announcer's box
xS$ = STRING$(ConsCols - 42, 205)
QPRINTs 1, 41, CHR$(209), scoattr
x$ = xS$ + CHR$(184)
QPRINTs 1, 42, x$, scoattr
QPRINTs 2, 41, CHR$(179), scoattr
QPRINTs 2, ConsCols, CHR$(179), scoattr
QPRINTs 3, 41, CHR$(179), scoattr
QPRINTs 3, ConsCols, CHR$(179), scoattr
QPRINTs 4, 41, CHR$(179), scoattr
QPRINTs 4, ConsCols, CHR$(179), scoattr
QPRINTs 5, 41, CHR$(207), scoattr
x$ = xS$ + CHR$(190)
QPRINTs 5, 42, x$, scoattr
xS$ = SPACE$(ConsCols - 42)
QPRINTs 2, 42, xS$, scdattr
QPRINTs 3, 42, xS$, scdattr
QPRINTs 4, 42, xS$, scdattr
ScoreBoardNumbers:
'Handle Home Runs
IF IGone THEN
'Is it an "instant win" situation?
'If it is we need to show the numbers, because program will not
'get another chance to update the scoreboard. Any other home run
'will not update the scoreboard here.
IF inn >= RegInns AND it = 2 THEN
IF itruns(2) > itruns(1) THEN GOTO ScoreBoardPost
END IF
'If not, do not show the numbers
GOTO ScoreBoardX
END IF
ScoreBoardPost:
'Put up the numbers
'Erase scoreboard numbers if necessary
IF DoAllInns OR (innct = 1 AND it = 1) THEN
xS$ = STRING$(20, 32)
QPRINTs 3, 12, xS$, scdattr
QPRINTs 4, 12, xS$, scdattr
END IF
IF it = 1 THEN
attr1 = scoattr
attr2 = scdattr
ELSE
attr1 = scdattr
attr2 = scoattr
END IF
QPRINTs 3, 2, LEFT$(Names(1), 10), attr1
QPRINTs 4, 2, LEFT$(Names(2), 10), attr2
'Visitor
FOR i = 1 TO 10
IF it = 1 AND i = innct THEN attr = revattr ELSE attr = scdattr
IF i <= innct THEN
IF i = innct AND it = 1 THEN
IF iScoreBd(1, i) = 0 THEN
ss$ = CHR$(219)+CHR$(32)
ELSE
IF iScoreBd(1, i) < 10 THEN
ss$ = CHR$(219) + LTRIM$(STR$(iScoreBd(1, i)))
ELSE
ss$ = LTRIM$(STR$(iScoreBd(1, i)))
END IF
END IF
ELSE
ss$ = PADLEFT$(LTRIM$(STR$(iScoreBd(1, i))), 2)
END IF
IF DoAllInns OR i = innct THEN
QPRINTs 3, (10 + i*2), ss$, attr
END IF
END IF
NEXT
'Home
FOR i = 1 TO 10
IF it = 2 AND i = innct THEN attr = revattr ELSE attr = scdattr
IF i <= innct THEN
IF i = innct THEN
IF it = 2 THEN
IF iScoreBd(2, i) = 0 THEN
ss$ = CHR$(219) + CHR$(32)
ELSEIF iScoreBd(2, i) < 10 THEN
ss$ = CHR$(219) + LTRIM$(STR$(iScoreBd(2, i)))
ELSE
ss$ = LTRIM$(STR$(iScoreBd(2, i)))
END IF
QPRINTs 4, (10 + i*2), ss$, attr
END IF
ELSE
IF (i = innct - 1) OR DoAllInns THEN
ss$ = PADLEFT$(LTRIM$(STR$(iScoreBd(2, i))), 2)
QPRINTs 4, (10 + i*2), ss$, attr
END IF
END IF
END IF
NEXT
ScoreBoardTots:
a$ = SPACE$(9)
MID$(a$, 1, 3) = LFORMAT$(itruns(1),"###")
MID$(a$, 4, 3) = LFORMAT$(ithits(1),"###")
MID$(a$, 7, 3) = LFORMAT$(iterrs(1),"###")
QPRINTs 3, 32, a$, scdattr
a$ = SPACE$(9)
MID$(a$, 1, 3) = LFORMAT$(itruns(2),"###")
MID$(a$, 4, 3) = LFORMAT$(ithits(2),"###")
MID$(a$, 7, 3) = LFORMAT$(iterrs(2),"###")
QPRINTs 4, 32, a$, scdattr
ScoreBoardX:
QPRINTs 5, 9, STR$(iout), prmattr
END SUB
SUB SearchPbyP (ARRAYx() AS PbyP_OVL, beg, leng, rangelo, rangehi, Find$, FoundAt, mini) STATIC
FoundAt = 0 'no matching element yet
mini = rangelo
maxi = rangehi
DO
Try = (mini + maxi) \ 2 'start testing in middle
xS$ = ARRAYx(Try).PbyP_Rec
xS$ = MID$(xS$, beg, leng)
IF xS$ = Find$ THEN 'found it!
FoundAt = Try 'return matching element
EXIT DO 'all done
END IF
IF xS$ > Find$ THEN 'too high, cut in half
maxi = Try - 1
ELSE
mini = Try + 1 'too low, cut other way
END IF
LOOP WHILE maxi >= mini
END SUB
SUB SearchStandingsTable (Lg$, Dv$, Team$, ndx)
ON ERROR GOTO ERRORTRAP
i = 1
DO
IF i > WLx THEN
INCR WLx
WLRec(WLx).WLTeam = Team$
WLRec(WLx).WLWins = 0
WLRec(WLx).WLLoss = 0
WLRec(WLx).WLLeague = Lg$
WLRec(WLx).WLDiv = Dv$
WLRec(WLx).WLPct = "0000"
ndx = WLx
EXIT DO
END IF
IF WLRec(i).WLLeague = Lg$ AND RTRIM$(WLRec(i).WLTeam) = RTRIM$(Team$) THEN
ndx = i
EXIT DO
END IF
INCR i
LOOP
EXIT SUB
ErrorTrap:
LOCATE 10, 30
PRINT "ERROR: SearchSta"; ERRCLEAR
x$ = WAITKEY$
END SUB
SUB SelectPhotoIO(List1() AS List1Type, choices, Selection$)
Shadow = 0
ESCPoint = 2
zS$ = ""
yS$ = "Where ya wanna go today? [PgUp/PgDown]"
row1 = 2 + rowO
col1 = 3 + colO
row2 = 21 + rowO
col2 = 78 + colO
QPush
'CALL GetScreen(Scr3$, row1, col1, row2, col2)
CALL Drawfrm (row1, col1, row2, col2, defattr, zS$, yS$, Shadow, 0, ESCPoint)
r = 9 + rowO
columns = 1
itemsincol = 18
x1$ = CHR$(193): x2$ = CHR$(194)
QPRINTs r, col2, x1$, defattr
QPRINTs r + 1, col2, UpPtr$, defattr
QPRINTs r + 2, col2, DnPtr$, defattr
QPRINTs r + 3, col2, x2$, defattr
CALL PickFromList(List1(), choices, itemsincol, columns, 73, row1,col1,row2,col2, dimattr, revattr, Pick, RetKey, nulls$, mous, ms$)
IF Pick > 0 AND Pick <= choices THEN
rec$ = List1(Pick).ListItem
Selection$ = RTRIM$(MID$(rec$, 1, 20))
ELSE
Selection$ = ""
END IF
'CALL PutScreen(Scr3$, row1, col1, row2, col2)
QPop
END SUB
SUB SetColors (ColorScheme)
IF ColorScheme = 1 THEN
fldfor = 14: fldbac = 2 'yellow on green
runfor = 0: runbac = 2 'black on green
END IF
IF ColorScheme = 2 THEN
fldfor = 15: fldbac = 2 'bright on green
runfor = 0: runbac = 2 'black on green
END IF
IF ColorScheme = 3 THEN
fldfor = 0: fldbac = 2 'black on green
runfor = 0: runbac = 2 'black on green
END IF
IF ColorScheme = 4 THEN
fldfor = 14: fldbac = 3 'yellow on sky-blue
runfor = 0: runbac = 3 'black on sky-blue
END IF
IF ColorScheme = 5 THEN
fldfor = 15: fldbac = 3 'bright on sky-blue
runfor = 0: runbac = 3 'black on sky-blue
END IF
IF ColorScheme = 6 THEN
fldfor = 0: fldbac = 3 'black on sky-blue
runfor = 0: runbac = 3 'black on sky-blue
END IF
fldattr = CALCATTR(fldfor, fldbac)
'labattr only used for smaller screens where stats are displayed
'in the middle of the screen
labfor = 0
labbac = fldbac
labattr = CALCATTR(labfor, labbac)
END SUB
SUB SetDH
IF CmdDH$ = "Y" OR CmdDH$ = "A" THEN dh = -1
IF CmdDH$ = "N" THEN dh = 0
IF CmdDH$ = "H" THEN
IF League(2) = "A" THEN
IF Century(2) = "19" AND MID$(Names(2), 1, 2) > "73" THEN
dh = -1
ELSEIF Century(2) = "20" THEN
dh = -1
ELSE
dh = 0
END IF
ELSE
dh = 0
END IF
'DAT Override switch: *DH=Y
IF DHDATOvr(2) = -1 THEN dh = -1
'DAT Override switch: *DH=N
IF DHDATOvr(2) = 1 THEN dh = 0
END IF
IF CmdDH$ = "E" THEN
IF DHinDAT(1) OR DHinDAT(2) THEN dh = -1 ELSE dh = 0
END IF
IF dh THEN
CALL SwitchToDH (1)
CALL SwitchToDH (2)
ELSE
'Also puts pitcher's hitting stats in correct slot
CALL SwitchToNoDH (1)
CALL SwitchToNoDH (2)
END IF
END SUB
SUB SetHomeTorF (t$, DspSw)
' This always works with the window on the right side - the Home side
IF t$ = "T" THEN TorF = TRUE
IF t$ = "F" THEN TorF = FALSE
IF DspSw THEN
IF TorF = FALSE THEN
QPRINTs 11 + RowO + HomePtr, 47+ColO, " ", defattr
QPRINTs 11 + RowO + HomePtr, 65+ColO, "x", defattr
ELSE
QPRINTs 11 + RowO + HomePtr, 47+ColO, "x", defattr
QPRINTs 11 + RowO + HomePtr, 65+ColO, " ", defattr
END IF
ELSE
FOR i = 1 TO 3
QPRINTs 11 + RowO + HomePtr, 47+ColO, "*", defattr
QPRINTs 11 + RowO + HomePtr, 65+ColO, "*", defattr
SLEEP 40
QPRINTs 11 + RowO + HomePtr, 47+ColO, " ", defattr
QPRINTs 11 + RowO + HomePtr, 65+ColO, " ", defattr
SLEEP 40
NEXT
END IF
IF it = 2 THEN
SELECT CASE HomePtr
CASE 1
HomeReady = TorF
CASE 2
PH = TorF
CASE 3
PRun = TorF
CASE 4
ViewHome = TorF
CASE 5
ViewVisi = TorF
CASE 6
IF WarmUpRule THEN BULLO = TorF
CASE 8
Steal = TorF
CASE 9
Bunt = TorF
CASE 10
HitAndRun = TorF
CASE ELSE
END SELECT
END IF
IF it = 1 THEN
SELECT CASE HomePtr
CASE 1
HomeReady = TorF
CASE 2
BullD = TorF
CASE 3
Subx = TorF
CASE 4
SwPos = TorF
CASE 5
ViewHome = TorF
CASE 6
ViewVisi = TorF
CASE 8
IWalk = TorF
CASE 9
Tight = TorF
CASE 10
POut = TorF
CASE 11
PAround = TorF
CASE ELSE
END SELECT
END IF
END SUB
SUB SetVisiTorF (t$, DspSw)
'This always works with the window on the left side - the Visitor side
IF t$ = "T" THEN TorF = TRUE
IF t$ = "F" THEN TorF = FALSE
IF DspSw THEN
IF TorF = FALSE THEN
LOCATE 11+RowO + VisiPtr, 16+ColO
PRINT " ";
LOCATE 11+RowO + VisiPtr, 34+ColO
PRINT "x";
ELSE
LOCATE 11+RowO + VisiPtr, 16+ColO
PRINT "x";
LOCATE 11+RowO + VisiPtr, 34+ColO
PRINT " ";
END IF
ELSE
FOR i = 1 TO 3
LOCATE 11+RowO + VisiPtr, 16+ColO
PRINT "*";
LOCATE 11+RowO + VisiPtr, 34+ColO
PRINT "*";
SLEEP 40
LOCATE 11+RowO + VisiPtr, 16+ColO
PRINT " ";
LOCATE 11+RowO + VisiPtr, 34+ColO
PRINT " ";
SLEEP 40
NEXT
END IF
IF it = 1 THEN
SELECT CASE VisiPtr
CASE 1
VisiReady = TorF
CASE 2
PH = TorF
CASE 3
PRun = TorF
CASE 4
ViewVisi = TorF
CASE 5
ViewHome = TorF
CASE 6
IF WarmUpRule THEN BULLO = TorF
CASE 8
Steal = TorF
CASE 9
Bunt = TorF
CASE 10
HitAndRun = TorF
CASE ELSE
END SELECT
END IF
IF it = 2 THEN
SELECT CASE VisiPtr
CASE 1
VisiReady = TorF
CASE 2
BullD = TorF
CASE 3
Subx = TorF
CASE 4
SwPos = TorF
CASE 5
ViewVisi = TorF
CASE 6
ViewHome = TorF
CASE 8
IWalk = TorF
CASE 9
Tight = TorF
CASE 10
POut = TorF
CASE 11
PAround = TorF
CASE ELSE
END SELECT
END IF
END SUB
SUB SetPlatoon
FOR it = 1 TO 2
id = 3 - it
zS$ = UCASE$(DataHand(iyp(1, id), id)) 'handedness of opposing pitcher
FOR i = 1 TO 9
IF DataPos(i, it) <> 1 THEN
IF DataPlat(i, it) <> " " AND DataHand(i, it) = zS$ THEN
yS$ = DataPlat(i, it)
FOR j = LastPiAd(it) + 1 TO MAXPLAYERS
IF yS$ = DataPlat(j, it) AND DataHand(j, it) <> zS$ THEN
k = DataPos(i, it)
'Can the sub guy (j) play position (k)?
OK = FALSE
'Are we playing "strict" or "loose"?
IF DataPosi(j, it, 1) > 0 THEN 'Strict
IF FoundPosition (k, j, it) THEN
OK = TRUE
END IF
ELSE
subdefPos = DataPos(j, it)
SELECT CASE k
CASE 2
IF subdefPos = 2 THEN OK = TRUE
CASE 3
IF subdefPos = 3 OR subdefPos = 5 THEN OK = TRUE
CASE 4
IF subdefPos = 4 OR subdefPos = 6 THEN OK = TRUE
CASE 5
IF subdefPos = 5 OR subdefPos = 6 THEN OK = TRUE
CASE 6
IF subdefPos = 6 THEN OK = TRUE
CASE 7, 8, 9
IF subdefPos = 7 OR subdefPos = 8 OR subdefPos = 9 THEN OK = TRUE
END SELECT
END IF
'Is the sub guy's name the same as the starting pitcher?
IF DataName(j, it) = DataName(ipa(it), it) THEN OK = FALSE
IF OK THEN
CALL Switch(i, j, it) 'Swap players i and j on team it
DataPos(i, it) = k
END IF
END IF
NEXT
END IF
END IF
NEXT
NEXT
END SUB
SUB SetRefByBO
FOR tm = 1 TO 2
FOR i = 1 TO 9
zS$ = LTRIM$(STR$(DataRef(i, tm)))
RefByBO(i, tm) = PADZEROS$(zS$, 2)
NEXT
NEXT
END SUB
SUB SetRestartData
'The active CmdStat$ must have been picked earlier
SETSCHDate$ = nulls$
IF CmdStat$ > "!" THEN
'Schedule Restart info
IF LEN(DIR$(CmdWritePath$ + CmdStat$ + ".RES")) THEN
OPEN CmdWritePath$ + CmdStat$ + ".RES" FOR RANDOM AS #5 LEN = LEN(RestartRec)
GET #5, 1, RestartRec
SETSCHDate$ = RestartRec.ResSCHDate
SETSlotPtr = RestartRec.ResSCHSlotPtr
SETSlotGameCtr = RestartRec.ResSlotGameCtr
SETSlotGames = RestartRec.ResSlotGames
SimGameCtr = RestartRec.ResSimGameCtr
CLOSE #5
END IF
' Pitching Rotations
IF LEN(DIR$(CmdWritePath$ + CmdStat$ + ".ROT")) THEN
OPEN CmdWritePath$ + CmdStat$ + ".ROT" FOR RANDOM AS #6 LEN = LEN(RotRec(1))
RTx = LOF(6) / LEN(RotRec(1))
FOR i = 1 TO RTx
GET #6, i, RotRec(i)
NEXT
CLOSE #6
END IF
' Standings
IF LEN(DIR$(CmdWritePath$ + CmdStat$ + ".STD")) THEN
OPEN CmdWritePath$ + CmdStat$ + ".STD" FOR RANDOM AS #7 LEN = LEN(WLRec(1))
WLx = LOF(7) / LEN(WLRec(1))
FOR i = 1 TO WLx
GET #7, i, WLRec(i)
NEXT
CLOSE #7
END IF
END IF
'SetPositioninSCH
SoundOn = FALSE
'Reopen to get first line of .SCH file or read until we get valid teams
OPEN CmdPath$ + CmdSCH$ FOR BINARY AS #2
RecLen = 0
L& = LOF(2)
IF L& MOD 210 = 0 THEN RecLen = 210: SchGamesPerRecord = 7
IF L& MOD 430 = 0 THEN RecLen = 430: SchGamesPerRecord = 15
IF RecLen > 0 THEN SchRecords = L& / RecLen ELSE SchRecords = 0
SchBuffer$ = SPACE$(RecLen)
GET #2 ,, SchBuffer$ 'Skip 1st rec
rec = 1
OUTTAHERE = FALSE
DO
SchSlotPtr = 0
INCR rec
IF rec > SchRecords THEN EXIT DO
GET #2 ,, SchBuffer$
IF MID$(SchBuffer$, 1, 1) = "D" THEN ITERATE DO
'Set SCHDate$
SCHDate$ = MID$(SchBuffer$, 3, 8)
DO WHILE SchSlotPtr < SchGamesPerRecord 'formerly 7
INCR SchSlotPtr
CALL ReadSCHSlot
IF CmdVFil$ > "!" AND CmdHFil$ > "!" AND FilterOK THEN
IF SETSCHDate$ > "!" THEN
IF SCHDate$ = SETSCHDate$ AND SchSlotPtr = SETSlotPtr THEN
IF SETSlotGameCtr < SETSlotGames THEN
SlotGameCtr = SETSlotGameCtr
OUTTAHERE = TRUE
EXIT DO
ELSE
SlotGameCtr = 0
SETSCHDate$ = nulls$
END IF
END IF
ELSE
OUTTAHERE = TRUE
EXIT DO
END IF
END IF
LOOP
LOOP UNTIL OUTTAHERE
END SUB
SUB SetSCHBookMark
REGISTER i AS INTEGER
IF CmdStat$ < "!" THEN EXIT SUB
a$ = nulls$
xS$ = CmdWritePath$ + CmdStat$ + ".RES"
yS$ = CmdWritePath$ + CmdStat$ + ".ROT"
zS$ = CmdWritePath$ + CmdStat$ + ".STD"
IF EOF(2) THEN 'SCH is over! [perhaps with "filters"]
a$ = "DEL"
IF LEN(DIR$(xS$)) THEN
KILL xS$
END IF
IF LEN(DIR$(yS$)) THEN
KILL yS$
END IF
IF LEN(DIR$(zS$)) THEN
KILL zS$
END IF
ELSE 'SCH not over - create/update Restart File
OPEN xS$ FOR RANDOM AS #5 LEN = LEN(RestartRec)
RestartRec.ResSCHName = CmdSCH$
RestartRec.ResSCHDate = SCHDate$
RestartRec.ResSCHSlotPtr = SCHSlotPtr
RestartRec.ResSlotGameCtr = SlotGameCtr
RestartRec.ResSlotGames = CmdSlotGames
RestartRec.ResSimGameCtr = SimGameCtr
PUT #5, 1, RestartRec
CLOSE #5
IF RTx > 0 THEN
OPEN yS$ FOR RANDOM AS #6 LEN = LEN(RotRec(1))
FOR i = 1 TO RTx
PUT #6,, RotRec(i)
NEXT
CLOSE #6
END IF
IF WLx > 0 THEN
OPEN zS$ FOR RANDOM AS #7 LEN = LEN(WLRec(1))
FOR i = 1 TO WLx
PUT #7,, WLRec(i)
NEXT
CLOSE #7
END IF
END IF
END SUB
SUB SetSwitches (nargs)
'In:
' ArgList()
' nargs
'Out:
' CmdVM$
' CmdHM$
' CmdSound$
' CmdDH$
' CmdNoOpt$
' CmdSlotGames
REGISTER i AS INTEGER
CmdVM$ = nulls$
CmdHM$ = nulls$
CmdHomeFieldAdv$ = "Y"
CmdSlotGames = 1
CmdDelIsOnCommandLine = FALSE
FOR i = 1 TO nargs
ArgList(i).Arg = UCASE$(ArgList(i).Arg)
Temp$ = RTRIM$(ArgList(i).Arg)
IF INSTR(Temp$, "/P:") THEN CmdPath$ = MID$(Temp$, 4)
IF INSTR(Temp$, "/PW:") THEN CmdWritePath$ = MID$(Temp$, 5)
IF INSTR(Temp$, "/V:") THEN CmdVFil$ = MID$(Temp$, 4)
IF INSTR(Temp$, "/H:") THEN CmdHFil$ = MID$(Temp$, 4)
IF INSTR(Temp$, "/N:") THEN CmdSlotGames = VAL(MID$(Temp$, 4))
IF INSTR(Temp$, "/SCH:") THEN CmdSch$ = MID$(Temp$, 6)
IF INSTR(Temp$, "/SER:") THEN CmdSER$ = MID$(Temp$, 6)
IF INSTR(Temp$, "/ST:") THEN CmdStat$ = MID$(Temp$, 5)
IF INSTR(Temp$, "/STB:") THEN CmdStar$ = MID$(Temp$, 6)
IF INSTR(Temp$, "/BX:") THEN CmdBoxF$ = MID$(Temp$, 5)
IF INSTR(Temp$, "/SC:") THEN CmdScrF$ = MID$(Temp$, 5)
IF INSTR(Temp$, "/LS:") THEN CmdLinF$ = MID$(Temp$, 5)
IF INSTR(Temp$, "/SP:") THEN CmdSP$ = MID$(Temp$, 5)
IF INSTR(Temp$, "/VP:") THEN CmdVP$ = MID$(Temp$, 5)
IF INSTR(Temp$, "/HP:") THEN CmdHP$ = MID$(Temp$, 5)
IF INSTR(Temp$, "/AUL:") THEN CmdAutoLU$ = MID$(Temp$, 6)
IF Temp$ ="/AUL" THEN CmdAutoLU$ = "Y"
IF INSTR(Temp$, "/AL:") THEN CmdAutoLU$ = MID$(Temp$, 5)
IF Temp$ ="/AL" THEN CmdAutoLU$ = "Y"
IF INSTR(Temp$, "/VAL:") THEN CmdVAutoLU$ = MID$(Temp$, 6)
IF Temp$ ="/VAL" THEN CmdVAutoLU$ = "Y"
IF INSTR(Temp$, "/HAL:") THEN CmdHAutoLU$ = MID$(Temp$, 6)
IF Temp$ ="/HAL" THEN CmdHAutoLU$ = "Y"
IF INSTR(Temp$, "/ABO:") THEN CmdAdjustBO$ = MID$(Temp$, 6)
IF Temp$ ="/ABO" THEN CmdAdjustBO$ = "Y"
IF INSTR(Temp$, "/VBO:") THEN CmdVAdjustBO$ = MID$(Temp$, 6)
IF Temp$ ="/VBO" THEN CmdVAdjustBO$ = "Y"
IF INSTR(Temp$, "/HBO:") THEN CmdHAdjustBO$ = MID$(Temp$, 6)
IF Temp$ ="/HBO" THEN CmdHAdjustBO$ = "Y"
IF INSTR(Temp$, "/FOC:") THEN CmdFocus$ = MID$(Temp$, 6)
IF Temp$ ="/FOC" THEN CmdFocus$ = "Y"
IF INSTR(Temp$, "/SPT:") THEN CmdSpot$ = MID$(Temp$, 6)
IF Temp$ ="/SPT" THEN CmdSpot$ = "Y"
IF INSTR(Temp$, "/VSPT:") THEN CmdVSpot$ = MID$(Temp$, 7)
IF Temp$ ="/VSPT" THEN CmdVSpot$ = "Y"
IF INSTR(Temp$, "/HSPT:") THEN CmdHSpot$ = MID$(Temp$, 7)
IF Temp$ ="/HSPT" THEN CmdHSpot$ = "Y"
IF INSTR(Temp$, "/VAM:") THEN CmdVAutoMgr$ = MID$(Temp$, 6)
IF Temp$ ="/VAM" THEN CmdVAutoMgr$ = "Y"
IF INSTR(Temp$, "/HAM:") THEN CmdHAutoMgr$ = MID$(Temp$, 6)
IF Temp$ ="/HAM" THEN CmdHAutoMgr$ = "Y"
IF INSTR(Temp$, "/VM:") THEN CmdVM$ = MID$(Temp$, 5)
IF INSTR(Temp$, "/HM:") THEN CmdHM$ = MID$(Temp$, 5)
IF INSTR(Temp$, "/DH:") THEN CmdDH$ = MID$(Temp$, 5)
IF Temp$ ="/DH" THEN CmdDH$ = "Y"
IF INSTR(Temp$, "/DEL:") THEN CmdDel = VAL(MID$(Temp$, 6)) : CmdDelIsOnCommandLine = TRUE
IF INSTR(Temp$, "/C:") THEN CmdColor$ = MID$(Temp$, 4)
IF Temp$ ="/C" THEN CmdColor$ = "Y"
IF INSTR(Temp$, "/S:") THEN CmdSound$ = MID$(Temp$, 4)
IF Temp$ ="/S" THEN CmdSound$ = "Y"
IF INSTR(Temp$, "/PG:") THEN CmdPauseAftGame$ = MID$(Temp$, 5)
IF Temp$ ="/PG" THEN CmdPauseAftGame$ = "Y"
IF INSTR(Temp$, "/PD:") THEN CmdPauseAftDate$ = MID$(Temp$, 5)
IF Temp$ ="/PD" THEN CmdPauseAftDate$ = "Y"
IF INSTR(Temp$, "/ERA:") THEN CmdERA$ = MID$(Temp$, 6)
IF INSTR(Temp$, "/DEBUG") THEN CmdDeBug$ = "Y"
IF INSTR(Temp$, "/NOOPT") THEN CmdNoOpt$ = "Y"
IF INSTR(Temp$, "/CC:") THEN CmdCols$ = MID$(Temp$, 5)
IF INSTR(Temp$, "/CR:") THEN CmdRows$ = MID$(Temp$, 5)
IF INSTR(Temp$, "/X:") THEN CmdAutoExit$ = MID$(Temp$, 4) 'new 4.8
IF Temp$ ="/X" THEN CmdAutoExit$ = "Y"
IF INSTR(Temp$, "/T:") THEN CmdHomeFieldAdv$ = MID$(Temp$, 4) 'new 4.8
IF Temp$ ="/T" THEN CmdHomeFieldAdv$= "N"
NEXT
'Edit CmdVFil$ and CmdHFil$ a bit
ii = INSTR(CmdVFil$, ".")
IF ii > 0 THEN CmdVFil$ = MID$(CmdVFil$, 1, ii-1)
IF LEN(CmdVFil$) > 8 THEN CmdVFil$ = MID$(CmdVFil$, 1, 8)
ii = INSTR(CmdHFil$, ".")
IF ii > 0 THEN CmdHFil$ = MID$(CmdHFil$, 1, ii-1)
IF LEN(CmdHFil$) > 8 THEN CmdHFil$ = MID$(CmdHFil$, 1, 8)
IF CmdCols$ <> nulls$ THEN
n = VAL(CmdCols$)
IF n > 0 AND n < 200 THEN ConsCols = n
END IF
IF CmdRows$ <> nulls$ THEN
n = VAL(CmdRows$)
IF n > 0 AND n < 100 THEN ConsRows = n
END IF
CmdVM$ = RTRIM$(CmdVM$)
CmdHM$ = RTRIM$(CmdHM$)
CmdERA$ = RTRIM$(CmdERA$)
IF CmdVM$ = "+" THEN
IF NOT FoundInMMList (CmdVFil$) THEN CALL AddToMMList (CmdVFil$)
ELSEIF CmdVM$ = "-" THEN
CALL DelFrMMList (CmdVFil$)
END IF
IF CmdHM$ = "+" THEN
IF NOT FoundInMMList (CmdHFil$) THEN CALL AddToMMList (CmdHFil$)
ELSEIF CmdHM$ = "-" THEN
CALL DelFrMMList (CmdHFil$)
END IF
IF CmdPath$ <> nulls$ THEN
IF RIGHT$(CmdPath$, 1) <> "\" THEN CmdPath$ = CmdPath$ + "\"
END IF
IF CmdWritePath$ <> nulls$ THEN
IF RIGHT$(CmdWritePath$, 1) <> "\" THEN CmdWritePath$ = CmdWritePath$ + "\"
END IF
IF CmdSch$ <> nulls$ THEN
SchedSw = TRUE
i = INSTR(CmdSch$, ".")
IF i THEN CmdSch$ = LEFT$(CmdSch$, i - 1)
CmdSch$ = RTRIM$(CmdSch$) + ".SCH"
END IF
IF CmdSER$ <> nulls$ THEN
SeriesSw = TRUE
i = INSTR(CmdSER$, ".")
IF i THEN CmdSER$ = LEFT$(CmdSER$, i - 1)
CmdSER$ = RTRIM$(CmdSER$) + ".SER"
END IF
IF CmdStat$ <> nulls$ THEN
i = INSTR(CmdStat$, ".")
IF INSTR(CmdStat$, ".") THEN
CmdStat$ = LEFT$(CmdStat$, i - 1)
ELSE
CmdStat$ = RTRIM$(CmdStat$)
END IF
END IF
IF CmdSP$ = nulls$ THEN CmdSP$ = "S5"
'Sound Defaults: if using a .sch/.ser file default is "no" else "yes"
SoundOn = (CmdSound$ = "Y")
IF CmdAutoLU$ = "Y" THEN
AutoLineUpSw(1) = TRUE
AutoLineUpSw(2) = TRUE
END IF
IF CmdVAutoLU$ = "Y" THEN AutoLineUpSw(1) = TRUE
IF CmdHAutoLU$ = "Y" THEN AutoLineUpSw(2) = TRUE
IF CmdAdjustBO$ = "Y" OR CmdAdjustBO$ = "C" OR CmdAdjustBO$ = "F" THEN
AdjustBO(1) = CmdAdjustBO$
AdjustBO(2) = CmdAdjustBO$
END IF
IF CmdVAdjustBO$ = "Y" OR CmdVAdjustBO$ = "C" OR CmdVAdjustBO$ = "F" THEN AdjustBO(1) = CmdVAdjustBO$
IF CmdHAdjustBO$ = "Y" OR CmdHAdjustBO$ = "C" OR CmdHAdjustBO$ = "F" THEN AdjustBO(2) = CmdHAdjustBO$
IF CmdPauseAftGame$ <> "Y" THEN CmdPauseAftGame$ = "N"
IF CmdPauseAftDate$ <> "Y" THEN CmdPauseAftDate$ = "N"
'Color Defaults
'Override color if desired
IF CmdColor$ <> nulls$ THEN mon$ = CmdColor$
'1=dark blue 2=green 3=sky-blue 4=red 5=purple 6=brown 7=grey
CALL SetColors (ColorScheme) 'sets field and label colors
deffor = 15: defbac = 1 'bright on dark blue
revfor = 0: revbac = 7 'black on grey
drtfor = 15: drtbac = 6 'bright on brown DIRT
prmfor = 14: prmbac = 0 'yellow on black
linfor = 0: linbac = 7 'black on grey
errfor = 15: errbac = 4 'bright on red
scofor = 15: scobac = 0 'bright on black
scdfor = 7: scdbac = 0 'grey on black
drkfor = 3: drkbac = 0 'sky blue on black
dimfor = 7: dimbac = 1 'grey on dark blue
defattr = CALCATTR(deffor, defbac)
revattr = CALCATTR(revfor, revbac)
drtattr = CALCATTR(drtfor, drtbac)
prmattr = CALCATTR(prmfor, prmbac)
linattr = CALCATTR(linfor, linbac)
errattr = CALCATTR(errfor, errbac)
scoattr = CALCATTR(scofor, scobac)
scdattr = CALCATTR(scdfor, scdbac)
drkattr = CALCATTR(drkfor, drkbac)
dimattr = CALCATTR(dimfor, dimbac)
skipattr = CALCATTR(0, 1) 'black on blue
END SUB
SUB ShowDoc
'This will launch Wordpad in separate window
IF LEN(DIR$("BASEBALL.RTF")) THEN
zS$ = WordPadSpec$ + " BASEBALL.RTF"
ELSEIF LEN(DIR$("BASEBALL.DOC")) THEN
zS$ = WordPadSpec$ + " BASEBALL.DOC"
ELSE
CALL PopMsg(18+rowO, 12+colO, " BASEBALL.RTF or BASEBALL.DOC not found in current directory", errattr, 2, kc)
EXIT SUB
END IF
ShowWindState& = 1
ConsoleShell zS$, ShowWindState&
END SUB
SUB ShowStandings (delayy) STATIC
ON ERROR GOTO ErrorTrap
REGISTER i AS LONG
IF SaveL = 0 THEN DIM SaveDivByLeagues(3) AS LONG
IF WLx < 1 THEN GOTO ExitShowStandings
'Compute WLPct(i)
FOR i = 1 TO WLx
Games = WLRec(i).WLWins + WLRec(i).WLLoss
IF Games > 0 THEN
xF! = WLRec(i).WLWins / Games
n = xF! * 1000
xS$ = LTRIM$(STR$(n))
WLRec(i).WLPct = PADZEROS$(xS$, 4)
ELSE
WLRec(i).WLPct = "0000"
END IF
NEXT
'Sort the WLRec by WLLeague/WLDiv/WLPct
ARRAY SORT WLRec(1) FOR WLx, FROM 21 TO 26, DESCEND
'Count Leagues and Divisions
REDIM DivByLeagues(3) AS LONG
L=0
i=1
DO WHILE i <= WLx
D=0
IF L = 3 THEN EXIT DO
INCR L
SaveLeague$ = WLRec(i).WLLeague
DO WHILE SaveLeague$ = WLRec(i).WLLeague AND i <= WLx
IF D = 3 THEN EXIT DO
INCR D
SaveDiv$ = WLRec(i).WLDiv
DO WHILE SaveDiv$ = WLRec(i).WLDiv AND _
SaveLeague$ = WLRec(i).WLLeague AND i <= WLx
INCR i
IF i > WLx THEN EXIT DO
LOOP
IF L < 4 THEN DivByLeagues(L) = D
IF i > WLx THEN EXIT DO
LOOP
IF i > WLx THEN EXIT DO
LOOP
'Decide whether to print veritically or horizontally
Horz = FALSE
FOR i = 1 TO L
IF DivByLeagues(i) > 2 THEN Horz = TRUE
NEXT
'Decide whether we need to erase the screen or not
erasescreen = 0
IF L > SaveL THEN SaveL = L: erasescreen = -1
FOR i = 1 TO L
IF DivByLeagues(i) <> SaveDivByLeagues(i) THEN
SaveDivByLeagues(i) = DivByLeagues(i)
erasescreen = -1
END IF
NEXT
IF erasescreen THEN
COLOR deffor, defbac
CLS
CALL Prompt(0) '0 = [O]ptions [T]oggle display '1 = [N]ew
END IF
QPRINTs 1, MidCol-5, "Standings", defattr
i = 1
LegCtr = 0
BiggestRow = 0
DO
SaveLeague$ = WLRec(i).WLLeague
SELECT CASE SaveLeague$
CASE "A"
LeagueName$ = "A.L."
CASE "N"
LeagueName$ = "N.L."
CASE "F"
LeagueName$ = "Federal"
CASE ELSE
LeagueName$ = SaveLeague$
END SELECT
IF Horz THEN
IF LegCtr = 0 THEN r = 2
IF LegCtr = 1 THEN r = 12
c = 1
ELSE
c = LegCtr * 31 + 1 '27
r = 2
END IF
IF c < 56 THEN
QPRINTs r, c, LeagueName$, defattr
END IF
DivCtr = 0
DO WHILE WLRec(i).WLLeague = SaveLeague$ AND i <= WLx
IF Horz THEN
IF LegCtr = 0 THEN r = 3
IF LegCtr = 1 THEN r = 12
c = DivCtr * 27 + 1
ELSE
r = DivCtr * 9 + 3
c = LegCtr * 31 + 1 '27
END IF
SaveDiv$ = WLRec(i).WLDiv
IF (Horz AND LegCtr = 0) OR (NOT Horz) THEN
DivName$ = SPACE$(16)
IF SaveDiv$ = "N" THEN DivName$ = "North"
IF SaveDiv$ = "S" THEN DivName$ = "South"
IF SaveDiv$ = "E" THEN DivName$ = "East"
IF SaveDiv$ = "C" THEN DivName$ = "Central"
IF SaveDiv$ = "W" THEN DivName$ = "West"
IF c < 56 AND r < 13 THEN
QPRINTs r, c, DivName$, defattr
IF r = 3 THEN
INCR r
IF MenuOpt$ = "T" THEN
QPRINTs r, c, " Won Lost Pct", defattr
ELSE
QPRINTs r, c, " Won Lost Pct", defattr
END IF
END IF
END IF
END IF
DO WHILE WLRec(i).WLDiv = SaveDiv$ AND WLRec(i).WLLeague = SaveLeague$ AND i <= WLx
INCR r
IF Horz THEN
IF LegCtr = 0 AND r > 11 THEN GOTO SSNextRec
END IF
IF r > 19 THEN GOTO SSNextRec
IF c < 56 THEN
IF MenuOpt$ = "T" THEN
a$ = SPACE$(29)
MID$(a$, 1, 11) = WLRec(i).WLTeam
MID$(a$, 12, 6) = LFORMAT$(WLRec(i).WLWins, "######")
MID$(a$, 19, 6) = LFORMAT$(WLRec(i).WLLoss, "######")
IF WLRec(i).WLPct > "0998" THEN
MID$(a$, 26, 4) = "1.00"
ELSE
MID$(a$, 26, 1) = "."
MID$(a$, 27, 3) = RIGHT$(WLRec(i).WLPct, 3)
END IF
ELSE
a$ = SPACE$(24)
MID$(a$, 1, 11) = WLRec(i).WLTeam
MID$(a$, 12, 4) = LFORMAT$(WLRec(i).WLWins, "####")
MID$(a$, 16, 4) = LFORMAT$(WLRec(i).WLLoss, "####")
IF WLRec(i).WLPct > "0998" THEN
MID$(a$, 21, 4) = "1.00"
ELSE
MID$(a$, 21, 1) = "."
MID$(a$, 22, 3) = RIGHT$(WLRec(i).WLPct, 3)
END IF
END IF
QPRINTs r, c, a$, dimattr
IF r > BiggestRow THEN BiggestRow = r
END IF
SSNextRec:
INCR i
IF i > WLx THEN EXIT DO
LOOP
'Division Changed
INCR DivCtr
IF i > WLx THEN EXIT DO
LOOP
'League Changed
INCR LegCtr
LOOP UNTIL i > WLx
'Display Hi-lites
IF HLx > 0 AND HLx <> HLxOld THEN
HLxOld = HLx
REDIM List1(1 TO 400) AS List1Type
i = 0
DO WHILE i < HLx
INCR i
xS$ = PADRIGHT$(LTRIM$(STR$(HLRec(i).HLGameNo)), 6) + HLRec(i).HLMessage
List1(i).ListItem = xS$
LOOP
r1 = BiggestRow + 2
r2 = ConsRows - 1
c1 = 2
c2 = ConsCols - 1
QPRINTs r1-1, c1, SPACE$(c2-c1+1), defattr 'blank line
IF Delayy = FALSE THEN
CALL Drawfrm(r1, c1, r2, c2, defattr, "Hi-Lites", "", 0, 0, 0)
RetKey = -97 'Display and return instantly
ELSE
CALL Drawfrm(r1, c1, r2, c2, defattr, "Hi-Lites", "ESC PgUp/PgDown", 0, 0, 0)
RetKey = -98 'Display and wait for paging keys
END IF
CALL PickFromList(List1(), HLx, r2-r1-1, 2, INT((c2-c1)/2)-2, r1, c1, r2, c2, dimattr, revattr, Pick, RetKey, nulls$, mous, ms$)
ERASE List1
EXIT SUB
END IF
ExitShowStandings:
IF Delayy THEN PauseIt
EXIT SUB
ErrorTrap:
LOCATE 10, 30
PRINT "ERROR: Standings"; ERRCLEAR
x$ = WAITKEY$
END SUB
SUB ShowVirtWin (p1, maxLines, RowOff, ColOff, startline, startcol, rowlock, collock, collimit)
'Clear out viewing window
'maxLines = 10
'startline = 3
'startcol = 3
'rowlock = 10
'collock = 20
'collimit = 76
'locate 6, 30: PRINT "Entering ShowVirtWin "; : xS$ = Waitkey$
'locate 6, 30: PRINT " ";
'Scroll Down 10, 3, 3, 12, 78
'SCROLL DOWN maxLines, startline, startcol, startline + maxLines - 1, startcol + collimit - 1
'locate 6, 30: PRINT "Just did a scroll down"; : xS$ = Waitkey$
'locate 6, 30: PRINT " ";
IF ConsRows = 25 AND ConsCols = 80 THEN BeginBuffer
sr = startline - 1
FOR r = 1 TO rowlock
xS$ = MID$(VirtualWin(r).item, 1, collock)
GOSUB FixAttr
INCR sr
QPRINTs sr, startcol, xS$, attr
xS$ = MID$(VirtualWin(r).item, collock + ColOff + 1)
xS$ = PADRIGHT$(xS$, collimit - collock)
QPRINTs sr, startcol + collock, xS$, attr
NEXT
'locate 6, 30: PRINT "Just did first part "; : xS$ = Waitkey$
'locate 6, 30: PRINT " ";
r = rowlock + RowOff + p1
DO WHILE (sr - startline + 1) < maxLines
IF r > MAXPLAYERS + 4 THEN EXIT DO
xS$ = MID$(VirtualWin(r).item, 1, collock)
L = LEN(xS$)
' IF xS$ = SPACE$(L) THEN EXIT DO
IF xS$ < " !" THEN xS$ = SPACE$(L)
INCR sr
GOSUB FixAttr
QPRINTs sr, startcol, xS$, attr
xS$ = MID$(VirtualWin(r).item, collock + ColOff + 1)
L = LEN(xS$)
IF xS$ < " !" THEN xS$ = SPACE$(L)
xS$ = PADRIGHT$(xS$, collimit - collock)
QPRINTs sr, startcol + collock, xS$, attr
IF xS$ = SPACE$(L) THEN EXIT DO
INCR r
LOOP
'locate 6, 30: PRINT "Just did 2nd part "; : xS$ = Waitkey$
'locate 6, 30: PRINT "Out of ShowVirtWin ";
IF ConsRows = 25 AND ConsCols = 80 THEN EndBuffer
EXIT SUB
FixAttr:
IF LEFT$(xS$, 1) = "~" THEN
xS$ = MID$(xS$, 2) + " "
attr = defattr
ELSE
attr = dimattr
END IF
RETURN
END SUB
SUB SingleRoutine
InfieldHit = FALSE
ConsiderExtraBase = FALSE
IF Errorx = FALSE THEN
'Decide where the hit went
ppF! = FindPP!
ELSE
'An infielder made an error on the play
IF SoundOn THEN CALL WavRegularGrounder
IF OneBaseError THEN
ii = 1
jj = 1
GOTO SingleAdvance
ELSEIF ThrowError THEN
ii = 2
jj = 2
GOTO SingleAdvance
ELSE
'The ground ball error has gone to the outfield
OrgWhoAtPos = WhoAtPos
WhoAtPos = OUTfrIN(WhoAtPos, 0)
END IF
END IF
IF Errorx = FALSE THEN
IF RND < .6 THEN 'FLY (60% of hits)
WhoAtPos = OUTFIELDWHOAT(ppF!)
wag = WHOATGUY(WhoAtPos)
IF DelFac THEN
IF RND < .10 THEN
'Short dramatic flys
IF SoundOn THEN CALL WavShortFly
CALL Msg ("07", "0", "1", "02", 0, id, man2, team2)
CALL Msg ("07", "0", "2", "02", wag, id, man2, team2)
CALL Msg ("07", "0", "3", "02", 0, id, man2, team2)
CALL Msg ("29", "0", "0", "15", 0, id, man2, team2)
CALL Msg ("29", "0", "0", "09", ib, it, man2, team2)
ELSE
'Regular flys
IF SoundOn THEN CALL WavRegularHit
p$ = LTRIM$(STR$(WhoAtPos))
t$ = PADZEROS$(LTRIM$(STR$(RND(1,4))) , 2)
IF t$ = "02" THEN i = ib: j = it ELSE i = wag: j = id
CALL Msg ("12", p$, "1", t$, 0, id, man2, team2)
CALL Msg ("12", p$, "2", t$, i, j, man2, team2)
CALL Msg ("12", p$, "3", t$, ib, it, man2, team2)
END IF
END IF
ELSE 'GROUND (40% of hits)
WhoAtPos = GROUNDBALLWHOAT (ppF!)
wag = WHOATGUY(WhoAtPos)
p$ = LTRIM$(STR$(WhoAtPos))
x! = RND
'Infield Hit?
IF RND < .25 OR p$ < "3" THEN 'Set % of infield hits (25% of 40% = 10%)
'Possibility of Infield Hit and wild throw (Hit and error)
WildThrow = FALSE
IF WhoAtPos <> 3 THEN
defperF! = DEFPCT!(wag)
zF! = (1.0 - defperF!) * .65 'Increase constant for fewer errors
IF RND > (defperF! + zF!) THEN WildThrow = TRUE
END IF
IF DelFac THEN
IF x! < .15 THEN 'set "type" of infield hit
t$ = "01" ' (most are "slow")
ELSEIF x! < .30 THEN
t$ = "02"
ELSE
t$ = "04"
END IF
IF p$ = "1" THEN t$ = "04"
IF SoundOn THEN
IF t$ = "04" THEN
CALL WavSoftGrounder
ELSE
CALL WavRegularGrounder
END IF
END IF
CALL Msg ("03", p$, "1", t$, 0, id, man2, team2)
CALL Msg ("03", p$, "2", t$, wag, id, man2, team2)
CALL Msg ("03", p$, "3", t$, wag, id, man2, team2)
'Not in time
CALL Msg ("23", "0","0","01", 0, it, man2, team2)
IF WildThrow THEN
AddToAnnouncer id, "Wild throw! Into the dugout!"
IF NUMBERON > 0 THEN
AddToAnnouncer it, "Everybody gets an extra base!"
END IF
AddToAnnouncer it, "The hitter will wind up on second."
AddToAnnouncer it, "Score that one: a hit and an error."
ELSE
CALL Msg ("23", "0","0","02", 0, it, man2, team2)
END IF
END IF
InfieldHit = TRUE
ELSE
'Shot through the infield somewhere
IF DelFac THEN
IF x! < .5 THEN 'No "slow" or "right at"
t$ = "01"
ELSE
t$ = "02"
END IF
IF SoundOn THEN CALL WavRegularGrounder
CALL Msg ("03", p$, "1", t$, 0, id, man2, team2)
IF RND < .6 THEN 'tough chance/can't get there
CALL Msg ("22", "0", "0", "00", wag, id, man2, team2)
END IF
'Do PostAnnouncer here to flash the infielder
CALL PostAnnouncer (TRUE, TRUE)
SLEEP 1000
ANx = 0
'Next time it should flash the outfielder
CALL Msg ("29", "0", "0", "09", ib, it, man2, team2) 'BASE HIT
END IF
Middle = FALSE
IF p$ = "4" AND t$ = "01" THEN Middle = TRUE
IF p$ = "6" AND t$ = "02" THEN Middle = TRUE
WhoAtPos = OUTfrIN (WhoAtPos, Middle) 'Point action to outfield
wag = WHOATGUY(WhoAtPos)
END IF
END IF
END IF
'How far to advance runners? (default)
ThrowOutChance1 = 0
ThrowOutChance2 = 0
ThrowToThird = FALSE
ConcedeRun = FALSE
Gamble = 0
ii = 1
jj = 1
IF HitAndRun OR InfieldHit THEN
IF HitAndRun AND InfieldHit THEN
IF RND < .33 THEN '2009 - was .51
ii = 2
jj = 2
END IF
ELSEIF HitAndRun THEN
IF RND < .9 THEN '2009 - was always
ii = 2
jj = 2
END IF
END IF
GOTO SingleTOCheck
END IF
IF ir2 THEN
IF ir3 THEN i = 2 ELSE i = 1
IF (itruns(it) + i < itruns(id)) THEN 'Tying run will not score...
IF ir1 THEN
IF amgr(id) = 0 AND AutoDefense = 0 THEN
CALL PostAnnouncer (TRUE, TRUE)
ANx = 0
SLEEP 1500
r = 10+rowO
c = 25+colO
x$ = " Defense: Throw to 3rd? [y/N] "
CALL PopMsg(r, c, x$, errattr, 0, kc)
IF UCASE$(CHR$(kc)) = "Y" THEN
ThrowToThird = TRUE
jj = 2 'Concede run - throw to third
END IF
ELSE
'When should defense throw to 3rd instead of to home?
'Faster runner on 2nd or slow runner on 1st
IF ( (DataSpeed(ir2, it) - DataSpeed(ir1, it) > 1) OR _
DataSpeed(ir1, it) < 4 ) THEN
ThrowToThird = TRUE
jj = 2
END IF
END IF
ELSE 'ir1 = 0
IF amgr(id) = 0 AND AutoDefense = 0 THEN
CALL PostAnnouncer (TRUE, TRUE)
ANx = 0
SLEEP 1500
r = 10+rowO
c = 16+colO
IF ir3 = 0 THEN
x$ = " Defense: Concede run / Hold batter on 1st? [y/N] "
ELSE
x$ = " Defense: Concede runs / Hold batter on 1st? [y/N] "
END IF
CALL PopMsg(r, c, x$, errattr, 0, kc)
IF UCASE$(CHR$(kc)) = "Y" THEN
ConcedeRun = TRUE
jj = 2 'Concede run - throw to 2nd
END IF
ELSE
'When should defense concede run[s] and just keep batter on 1st?
'Runner on 2nd is fast OR Batter is fast
IF ( (DataSpeed(ir2, it) > 6) OR _
DataSpeed(ib, it) > 7 ) THEN
ConcedeRun = TRUE
jj = 2 'Concede run - throw to 2nd
END IF
END IF
END IF
END IF
END IF
IF ir2 > 0 AND ThrowToThird = FALSE AND ConcedeRun = FALSE THEN
'Advance runner on 2nd jj
'Safe% 2nd-Home
'Sp 0/1out 2out new
' 1 64 76
' 2 68 80
' 3 72 84
' 4 76 88
' 5 80 92
' 6 84 96
' 7 88 98
' 8 92 98
' 9 96 98
IF iout = 2 THEN i = 12 ELSE i = 0
n = 4 * DataSpeed(ir2, it) + 60 + i '4.6
n = n + (7 - FRND(13)) '+/- 6
IF n > 98 THEN n = 98
IF amgr(it) = 0 AND AutoCoach = 0 THEN
CALL PostAnnouncer (TRUE, TRUE)
ANx = 0
SLEEP 1500
r = 10+rowO
c = 22+colO
x$ = " Score runner from 2nd? [y/N] (" + LFORMAT$(n, "##") + "%)"
CALL PopMsg(r, c, x$, errattr, 0, kc)
IF UCASE$(CHR$(kc)) = "Y" THEN
jj = 2
ThrowOutChance1 = 100 - n
END IF
ELSE
IF iout = 0 THEN SucLim = 80 '84
IF iout = 1 THEN SucLim = 72 '76
IF iout = 2 THEN SucLim = 68 '72
'Special Case:
IF iout = 2 THEN
RunsBehind = itruns(id) - itruns(it)
IF ir3 THEN a = 2 ELSE a = 1
IF RunsBehind = a OR RunsBehind = (a - 1) THEN
SucLim = 50
END IF
END IF
IF n >= SucLim THEN
jj = 2
ThrowOutChance1 = 100 - n 'chance of getting thrown out at home
IF SucLim = 50 AND n < 79 THEN
Gamble = TRUE
ii = 2
ThrowOutChance2 = 3 'chance of getting thrown out at third
GOTO SingleTOCheck
END IF
END IF
END IF
END IF
IF ir1 THEN 'Advance runner on 1st ii
IF (ir2 <> 0 AND jj = 1) THEN
ii = 1 'Don't overrun somebody
ELSE
'Safe% 1st-3rd
'
' left center right
'Sp 0/1out 2out 0/1out 2out 0/1out 2out
'
' 1 48 60 56 68 64 76
' 2 52 64 60 72 68 80
' 3 56 68 64 76 72 84
' 4 60 72 68 80 76 88
' 5 64 76 72 84 80 92
' 6 68 80 76 88 84 96
' 7 72 84 80 92 88 98
' 8 76 88 84 96 92 98
' 9 80 92 88 98 96 98
IF iout = 2 THEN i = 12 ELSE i = 0
n = 4 * DataSpeed(ir1, it) + 52 + i
IF ThrowToThird THEN n = n - 20
IF WhoAtPos = 7 THEN i = -8
IF WhoAtPos = 8 THEN i = 0
IF WhoAtPos = 9 THEN i = 8
n = n + i
n = n + (9 - FRND(15)) '+/- 8
IF n > 98 THEN n = 98
IF amgr(it) = 0 AND AutoCoach = 0 THEN
CALL PostAnnouncer (TRUE, TRUE)
ANx = 0
SLEEP 1500
r = 10+rowO
c = 26+colO
x$ = " Go 1st-to-3rd? [y/N] (" + LFORMAT$(n, "##") + "%)"
CALL PopMsg(r, c, x$, errattr, 0, kc)
IF UCASE$(CHR$(kc)) = "Y" THEN
ii = 2
ThrowOutChance2 = 100 - n
END IF
ELSE
IF iout = 0 THEN SucLim = 88 '90 88
IF iout = 1 THEN SucLim = 70 '76 74
IF iout = 2 THEN SucLim = 92 '92 90
IF n >= SucLim THEN 'Try to go 1st-3rd
ii = 2
ThrowOutChance2 = 100 - n
END IF
END IF
END IF
END IF
SingleTOCheck:
IF DelFac THEN
IF ir3 > 0 THEN CALL AnnScoring(ir3)
IF Gamble THEN
xS$ = "They'll gamble to score " + LASTNAME$(DataName(ir2, it)) + "..."
CALL AddToAnnouncer (it, xS$)
END IF
END IF
IF ir1 OR ir2 THEN
CALL ThrowOutCheck (ii, jj, ThrowOutChance1, ThrowOutChance2, ThrowToThird, ConcedeRun)
IF jj = 2 AND ref2 = 0 AND ConcedeRun = FALSE THEN
'Had a chance to throw out somebody but did not
'Sometimes take extra base
ConsiderExtraBase = TRUE
END IF
END IF
SingleAdvance:
CALL Advanc(ii, jj, 1)
IF ref2 THEN INCR iout 'Anybody get thrown out?
ir1 = ib
mpp(ib) = ip
IF Errorx THEN
mpp(ib) = -mpp(ib) 'Flip to negative to show batter got on via an error
IF OneBaseError OR ThrowError THEN GOTO SubEXIT
ELSE
CALL CreditHit
Result$ = "1B"
'Possibility of throwing error on infield hits
IF InfieldHit THEN
IF WildThrow THEN
INCR iterrs(id)
INCR inne
INCR innadverr
i = DataRef(wag, id)
INCR GpPos(i, id, WhoAtPos)
INCR merr(i, id)
INCR SumErrors(WhoAtPos)
Errorx = TRUE
CALL Advanc(1, 1, 1) 'Everybody advances one extra base
Errorx = FALSE
Result$ = Result$ + "/E-" + LTRIM$(STR$(WhoAtPos))
WildThrow = FALSE
END IF
END IF
IF InfieldHit THEN GOTO SubEXIT
'Done, if infield hit
END IF
'Did the outfielder muff the ball?
'Not if runner was thrown out!
'Not if throw went through even if runner was not thrown out
IF (ref2 > 0 OR ConsiderExtraBase = TRUE) AND ir2 = 0 THEN
'Runner on 1st can sometimes take extra base on the throw
IF DataSpeed(ir1, it) + FRND(10) > 12 THEN '13?
ir2 = ir1
ir1 = 0
IF DelFac THEN AddToAnnouncer it, "Runner moves up on the throw."
GOTO SubEXIT 'Never outfield muff if move up on throw
END IF
END IF
IF ref2 > 0 THEN GOTO SubEXIT 'Never outfield muff if somebody thrown out
'Check for Outfielder muff
CALL Outfield (WhoAtPos)
'Gamble to stretch single (and some infield errors) into a double? It's not an infield hit or 1-base error.
IF OutFErr = FALSE THEN
IF amgr(it) = 0 AND AutoCoach = 0 THEN
IF ir1 = ib AND ir2 = 0 THEN
'criteria to gamble
RunsBehind = itruns(id) - itruns(it)
IF ir3 THEN a = 2 ELSE a = 1
IF inn > (RegInns - 4) AND (RunsBehind = a OR RunsBehind = a-1) THEN
CALL PostAnnouncer (TRUE, TRUE)
ANx = 0
SLEEP 1500
r = 10+rowO
c = 23+colO
n = 5 * DataSpeed(ir1, it) + 30
x$ = " Stretch hit to a double? [y/N] (" + LFORMAT$(n, "##") + "%)"
CALL PopMsg(r, c, x$, errattr, 0, kc)
IF UCASE$(CHR$(kc)) = "Y" THEN
IF DelFac THEN CALL Msg ("31", "0", "0", "09", ir1, it, man2, team2)
'He's going to try for second!
IF DelFac THEN CALL Msg ("31", "0", "0", "06", ir1, it, man2, team2)
'He slides...
IF RND < (n / 100) THEN
'Made it
IF Errorx = FALSE THEN
INCR m2b(ref, it)
IF UCASE$(DataHand(ip, id)) = "L" THEN
INCR m2bLHP(ref, it)
ELSE
INCR m2bRHP(ref, it)
END IF
INCR mp2b(ip, id)
Result$ = "2B"
END IF
ir2 = ib
ir1 = 0
IF DelFac THEN CALL Msg ("15", "0", "0", "09", ir2, it, man2, team2)
'Safe
IF DelFac THEN CALL Msg ("31", "0", "0", "11", ir2, it, man2, team2)
'Gamble pays off!
ELSE
'Didn't make it
INCR mpo(ip, id)
IF DelFac THEN CALL Msg ("14", "0", "0", "02", ir1, it, man2, team2)
'OUT! The gamble failed.
ref2 = DataRef(ir1, it)
' Result2$ = "X-@2nd"
INCR Assists(DataRef(WHOATGUY(WhoAtPos), id), id, WhoAtPos)
IF WhoAtPos = 7 THEN m = 4 ELSE m = 6 'who took throw?
INCR PutOuts(DataRef(WHOATGUY(m), id), id, m)
Result2$ = LTRIM$(STR$(WhoAtPos)) + "-" + LTRIM$(STR$(m))
Code2$ = "2"
ir1 = 0
INCR iout
END IF
END IF
END IF
END IF
END IF
END IF
SubEXIT:
END SUB
SUB SnapShot
' make sure RefOrg has been REDIMed (cleared)
' make sure RefByBO has been erased
REDIM RefOrg(MAXPLAYERS, 2) AS GLOBAL RefOrgType
REDIM RefOrgSave(MAXPLAYERS, 2) AS GLOBAL RefOrgType
REDIM RefByBO(9, 2) AS GLOBAL STRING
FOR tm = 1 TO 2
FOR i = 1 TO MAXPLAYERS
ref = DataRef(i, tm)
p = DataPos(i, tm)
RefOrg(i, tm).RefNo = ref
RefOrg(i, tm).RefPos = p
RefOrgSave(i, tm).RefNo = ref
RefOrgSave(i, tm).RefPos = p
' Copy starting lineups positions to RefByBO
IF i < 10 THEN CALL AddToRefByBO (i, tm, ref)
NEXT
NEXT
END SUB
SUB SoundQAdd(SoundCode)
IF SQx < 10 THEN
INCR SQx
SoundQ(SQx) = SoundCode
END IF
END SUB
SUB StatsIO (Flds, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
CALL Drawfrm(8+rowO, 10+colO, 21+rowO, 69+colO, defattr, "Statistics Report Options", "ESC (or close window):Generate Report F3:Cancel", 1, 0, 2)
DATA 10,12,"Statistics File: ", 10,30,38,"X "
DATA 12,12,"Standings [Y,n]", 12,44, 1,"X "
DATA 13,12,"Highlights [Y,n]", 13,44, 1,"X "
DATA 14,12,"Batting/Pitching/Fielding [Y,n]", 14,44, 1,"X "
DATA 15,12," Min. AB ", 15,42, 3,"N "
DATA 16,12," Batting R/L Breakdown [y,N]", 16,44, 1,"X "
DATA 17,12," Fielding [Y,n]", 17,44, 1,"X "
DATA 18,12," Fielding Detail [y,N]", 18,44, 1,"X "
DATA 19,12,"League Leaders [Y,n]", 19,44, 1,"X "
Flds = 9
c = 1
FOR i = 1 TO Flds
Flitrow(i) = VAL(READ$(c)) + rowO
Flitcol(i) = VAL(READ$(c+1)) + colO
Flit$(i) = READ$(c+2)
Frow(i) = VAL(READ$(c+3)) + rowO
Fcol(i) = VAL(READ$(c+4)) + colO
Flen(i) = VAL(READ$(c+5))
Fed$(i) = READ$(c+6)
c = c + 7
NEXT
REDIM FContents$(13)
FContents$(1) = CmdWritePath$ + CmdStat$
FContents$(2) = "Y" 'standings
FContents$(3) = "Y" 'hilights
FContents$(4) = "Y" 'main
FContents$(5) = " 0" 'include AB >= this
FContents$(6) = "N" 'batting r/l
FContents$(7) = "Y" 'fielding
FContents$(8) = "N" 'fielding bd
FContents$(9) = "Y" 'leaders
CursorPtr = 1
DO
StatsLoop:
s = deffor
deffor = dimfor
CALL ScreenIO(Keyed, KeyF3, 0, KeyEsc, Flds, CursorPtr, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
deffor = s
'Trap F3
IF Keyed = KeyF3 THEN EXIT SUB
' Edit Field Contents
Error1$ = "N"
IF FContents$(1) < "!" THEN EXIT SUB
FOR i = 9 TO 2 STEP -1
IF i <> 5 THEN
IF FContents$(i) <> "Y" AND FContents$(i) <> "N" THEN
CursorPtr = i
Error1$ = "Y"
END IF
END IF
NEXT
LOOP WHILE Error1$ = "Y"
PrtStandings = (FContents$(2) = "Y")
PrtHighlights = (FContents$(3) = "Y")
PrtMain = (FContents$(4) = "Y")
RL = (FContents$(6) = "Y")
PrtFielding = (FContents$(7) = "Y")
FieldBD = (FContents$(8) = "Y")
PrtLeaders = (FContents$(9) = "Y")
CALL Stats (RTRIM$(FContents$(1)), OutFile$, PrtStandings, PrtHighlights, PrtMain, PrtFielding, PrtLeaders, VAL(FContents$(5)), RL, FieldBD)
CALL ListFile (OutFile$)
END SUB
SUB Stats (StatFile$, OutFile$, PrtStandings, PrtHighlights, PrtMain, PrtFielding, PrtLeaders, OtherAB, RL, FieldBD)
DIM SR AS StatSummary
DIM BR AS BatSummary
DIM SaveBR AS BatSummary
DIM PR AS PitSummary
DIM FR AS FldSummary
DIM QualPA AS STRING * 4
DIM QualIP AS STRING * 4
DIM SaveTeam AS STRING * 12
DIM LeagueArg AS STRING * 1
DIM NameArg AS STRING * 12
TeamsInLeagueLim = 20
DIM TeamBatSum(1 TO TeamsInLeagueLim) AS STRING
DIM TeamPitSum(1 TO TeamsInLeagueLim) AS STRING
DIM TeamFldSum(1 TO TeamsInLeagueLim) AS STRING
i = 51
REDIM SaveOther(i) AS BatSummary
COLOR deffor, defbac
CLS
IF StatFile$ < "!" THEN BEEP: EXIT SUB
i = INSTR(StatFile$, ".")
IF i > 0 THEN StatFile$ = MID$(StatFile$, 1, i - 1) ELSE StatFile$ = RTRIM$(StatFile$)
IF LEN(DIR$(StatFile$ + ".STS")) = 0 THEN
BEEP
CALL PopMsg(11, 20, "Statistics File: " + StatFile$ + ".STS not found. ", errattr, 0, kc)
CALL PopMsg(11, 12, "Please check to make sure the stat file you want exists. ", errattr, 5, kc)
EXIT SUB
END IF
IF LEN(DIR$(StatFile$ + ".STP")) THEN
CALL CheckForValidFile (StatFile$ + ".STP", 126, Valid1)
ELSE
BEEP
CALL PopMsg(MidRow, MidCol-12, "No Pitcher File Found.", errattr, 0, kc)
EXIT SUB
END IF
IF LEN(DIR$(StatFile$ + ".STB")) THEN
CALL CheckForValidFile (StatFile$ + ".STB", 162, Valid2)
ELSE
BEEP
CALL PopMsg(MidRow, MidCol-12, "No Batter File Found.", errattr, 0, kc)
EXIT SUB
END IF
IF NOT Valid1 OR NOT Valid2 THEN
BEEP
CALL PopMsg(MidRow, MidCol-24, "Sorry. Statistics File: " + StatFile$ + " is an old format. ", errattr, 0, kc)
EXIT SUB
END IF
Outdevice$ = StatFile$ + ".PRN"
CALL Drawfrm(8+rowO, 14+colO, 13+rowO, 66+colO, defattr, nulls$, nulls$, 1, 0, 0)
QPRINTs 10+rowO, 16+colO, "One moment, please.", dimattr
x$ = Outdevice$ + " being generated..."
QPRINTs 11+rowO, 16+colO, x$, dimattr
'=========== .STS Section ==============
IF STATTEAMLIMIT = 0 THEN STATTEAMLIMIT = 300 '.CMD Option
REDIM SA(STATTEAMLIMIT) AS STSAnal
STSHdl = FREEFILE
OPEN StatFile$ + ".STS" FOR RANDOM AS #STSHdl LEN = LEN(SR)
TblMax = 15 'League Leaders tables (number of players to put in each table)
TblEnd = 0 'Running count of number of teams encountered (not related to TblMax)
SumRecs = LOF(STSHdl) / LEN(SR)
EndOfFile = 0
rec = 1
GET #STSHdl,,SR
DO
IF SR.VLeague = "A" THEN SR.VLeague = "a"
LeagueArg = SR.VLeague
NameArg = SR.VNam
GOSUB SearchTable
v = ndx
SA(v).ALeague = SR.VLeague
SA(v).ADiv = SR.VDiv
SA(v).ARuns = SA(v).ARuns + SR.VRuns
SA(v).AOppRuns = SA(v).AOppRuns + SR.HRuns
SA(v).AHits = SA(v).AHits + SR.VHits
SA(v).AErrs = SA(v).AErrs + SR.VErrs
SA(v).ALOB = SA(v).ALOB + SR.VLOB
SA(v).ADP = SA(v).ADP + SR.VDPs
SA(v).AVRunsS = SA(v).AVRunsS + SR.VRuns
SA(v).AVRunsA = SA(v).AVRunsA + SR.HRuns
IF SR.HLeague = "A" THEN SR.HLeague = "a"
LeagueArg = SR.HLeague
NameArg = SR.HNam
GOSUB SearchTable
h = ndx
IF SR.HLeague = "A" THEN SR.HLeague = "a"
SA(h).ALeague = SR.HLeague
SA(h).ADiv = SR.HDiv
SA(h).ARuns = SA(h).ARuns + SR.HRuns
SA(h).AOppRuns = SA(h).AOppRuns + SR.VRuns
SA(h).AHits = SA(h).AHits + SR.HHits
SA(h).AErrs = SA(h).AErrs + SR.HErrs
SA(h).ALOB = SA(h).ALOB + SR.HLOB
SA(h).ADP = SA(h).ADP + SR.HDPs
SA(h).AHRunsS = SA(h).AHRunsS + SR.HRuns
SA(h).AHRunsA = SA(h).AHRunsA + SR.VRuns
IF SR.HRuns > SR.VRuns THEN
INCR SA(h).AWins
INCR SA(h).AHomWins
INCR SA(v).ALosses
INCR SA(v).AVisLosses
ELSE
INCR SA(v).AWins
INCR SA(v).AVisWins
INCR SA(h).ALosses
INCR SA(h).AHomLosses
END IF
INCR rec
IF rec > SumRecs THEN
EndOfFile = -1
ELSE
GET #STSHdl,,SR
END IF
LOOP UNTIL EndOfFile
CLOSE #STSHdl
' Go thru arrays to create winning array
' Figure max number of games played by a single team
MaxGamesTm = 0
FOR i = 1 TO TblEnd
xF! = SA(i).AWins / (SA(i).AWins + SA(i).ALosses)
n = xF! * 1000
xS$ = LTRIM$(STR$(n))
SA(i).APct = PADZEROS$(xS$, 4)
IF SA(i).AWins + SA(i).ALosses > MaxGamesTm THEN
MaxGamesTm = SA(i).AWins + SA(i).ALosses
END IF
NEXT
' Use these figure for qualifying B.A. and ERA stats
QualPlate = MaxGamesTm * 3.1
QualInn = MaxGamesTm
IF QualInn < 1 THEN QualInn = 1
QualPA = STR$(QualPlate)
QualIP = STR$(QualInn)
' Sort by League/Div/Pct
ARRAY SORT SA(1) FOR TblEnd, FROM 1 TO 6, DESCEND
OUTHdl = FREEFILE
OPEN Outdevice$ FOR OUTPUT AS #OUTHdl
PageNo = 1
PRINT #OUTHdl,
PRINT #OUTHdl, "SBS 4.9.3"; TAB(35); "Strategic Baseball Statistics"
PRINT #OUTHdl, "Date: "; DATE$
PRINT #OUTHdl, "Time: "; TIME$
PRINT #OUTHdl, "File: "; StatFile$
PRINT #OUTHdl,
IF PrtStandings = 0 THEN GOTO TryPrtHighlights
LeagueCtr = 0
i = 1
DO
SaveLeague$ = SA(i).ALeague
GOSUB GetLeagueName
PRINT #OutHdl,
PRINT #OUTHdl, LeagueName$
' 0 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 0 0 1 1 2 2 3 3 4
' 1 5 0 5 0 5 0 5 0 5 0 5 0 5 0 5 0 5 0 5 0 5 0 5 0 5 0
PRINT #OUTHdl, " --------- Home -------- --------- Road -------- Avg. "
PRINT #OUTHdl, "Team W L Pct GB W L RS RA W L RS RA RS RA Hits Errs LOB DP Score"
LeagueCtr = LeagueCtr + 1
LegHomWins = 0
LegHomLosses = 0
LegHomRunsS = 0
LegHomRunsA = 0
LegVisWins = 0
LegVisLosses = 0
LegVisRunsS = 0
LegVisRunsA = 0
LegRuns = 0
LegOppRuns = 0
LegHits = 0
LegErrs = 0
LegLOB = 0
LegDP = 0
LegGames = 0
DO WHILE SA(i).ALeague = SaveLeague$ AND i <= TblEnd
SaveDiv$ = SA(i).ADiv
DivName$ = SPACE$(16)
IF SaveDiv$ = "E" THEN DivName$ = "E Division"
IF SaveDiv$ = "C" THEN DivName$ = "C Division"
IF SaveDiv$ = "W" THEN DivName$ = "W Division"
PRINT #OutHdl,
PRINT #OUTHdl, DivName$
d = 1
DO WHILE SA(i).ADiv = SaveDiv$ AND SA(i).ALeague = SaveLeague$ AND i <= TblEnd
IF d = 1 THEN a = SA(i).AWins - SA(i).ALosses
Games = SA(i).AWins + SA(i).ALosses
b = SA(i).AWins - SA(i).ALosses
c = (a - b) \ 2
xF! = (a - b) / 2
IF d = 1 OR (c = 0 AND xF! < .002) THEN
GB$ = " -"
ELSEIF c < 0 THEN
GB$ = " "
ELSE
GB$ = LTRIM$(STR$(c))
END IF
IF xF! - .002 > c THEN GB$ = GB$ + ".5"
GB$ = PADLEFT$(GB$, 5)
a$ = SPACE$(139)
MID$(a$, 1, 12) = SA(i).ANam
MID$(a$, 13, 6) = LFORMAT$(SA(i).AWins, "######")
MID$(a$, 19, 6) = LFORMAT$(SA(i).ALosses, "######")
IF SA(i).APct > "0998" THEN
MID$(a$, 26, 5) = "1.000"
ELSE
MID$(a$, 27, 1) = "."
MID$(a$, 28, 3) = RIGHT$(SA(i).APct, 3)
END IF
MID$(a$, 31, 5) = GB$
MID$(a$, 36, 6) = LFORMAT$(SA(i).AHomWins, "######")
MID$(a$, 42, 6) = LFORMAT$(SA(i).AHomLosses, "######")
MID$(a$, 48, 7) = LFORMAT$(SA(i).AHRunsS, "#######")
MID$(a$, 55, 7) = LFORMAT$(SA(i).AHRunsA, "#######")
MID$(a$, 62, 6) = LFORMAT$(SA(i).AVisWins, "######")
MID$(a$, 68, 6) = LFORMAT$(SA(i).AVisLosses, "######")
MID$(a$, 74, 7) = LFORMAT$(SA(i).AVRunsS, "#######")
MID$(a$, 81, 7) = LFORMAT$(SA(i).AVRunsA, "#######")
MID$(a$, 90, 7) = LFORMAT$(SA(i).ARuns, "#######")
MID$(a$, 97, 7) = LFORMAT$(SA(i).AOppRuns, "#######")
MID$(a$,104, 7) = LFORMAT$(SA(i).AHits, "#######")
MID$(a$,111, 6) = LFORMAT$(SA(i).AErrs, "######")
MID$(a$,117, 7) = LFORMAT$(SA(i).ALOB, "#######")
MID$(a$,124, 6) = LFORMAT$(SA(i).ADP, "######")
MID$(a$,131, 4) = FFORMAT$(SA(i).ARuns / Games, "##.#")
MID$(a$,135, 1) = "-"
MID$(a$,136, 4) = LTRIM$(FFORMAT$(SA(i).AOppRuns / Games, "##.#"))
PRINT #OUTHdl, a$
LegHomWins = LegHomWins + SA(i).AHomWins
LegHomLosses = LegHomLosses + SA(i).AHomLosses
LegHomRunsS = LegHomRunsS + SA(i).AHRunsS
LegHomRunsA = LegHomRunsA + SA(i).AHRunsA
LegVisWins = LegVisWins + SA(i).AVisWins
LegVisLosses = LegVisLosses + SA(i).AVisLosses
LegVisRunsS = LegVisRunsS + SA(i).AVRunsS
LegVisRunsA = LegVisRunsA + SA(i).AVRunsA
LegRuns = LegRuns + SA(i).ARuns
LegOppRuns = LegOppRuns + SA(i).AOppRuns
LegHits = LegHits + SA(i).AHits
LegErrs = LegErrs + SA(i).AErrs
LegLOB = LegLOB + SA(i).ALOB
LegDP = LegDP + SA(i).ADP
LegGames = LegGames + Games
i = i + 1
d = d + 1
LOOP ' Division Changed
LOOP 'League Changed
'Print League Totals
a$ = SPACE$(139)
MID$(a$, 1, 28) = "League Totals"
MID$(a$, 36, 6) = LFORMAT$(LegHomWins, "######")
MID$(a$, 42, 6) = LFORMAT$(LegHomLosses, "######")
MID$(a$, 48, 7) = LFORMAT$(LegHomRunsS, "#######")
MID$(a$, 55, 7) = LFORMAT$(LegHomRunsA, "#######")
MID$(a$, 62, 6) = LFORMAT$(LegVisWins, "######")
MID$(a$, 68, 6) = LFORMAT$(LegVisLosses, "######")
MID$(a$, 74, 7) = LFORMAT$(LegVisRunsS, "#######")
MID$(a$, 81, 7) = LFORMAT$(LegVisRunsA, "#######")
MID$(a$, 90, 7) = LFORMAT$(LegRuns, "#######")
MID$(a$, 97, 7) = LFORMAT$(LegOppRuns, "#######")
MID$(a$,104, 7) = LFORMAT$(LegHits, "#######")
MID$(a$,111, 6) = LFORMAT$(LegErrs, "######")
MID$(a$,117, 7) = LFORMAT$(LegLOB, "#######")
MID$(a$,124, 6) = LFORMAT$(LegDP, "######")
MID$(a$,131, 4) = FFORMAT$(LegRuns / LegGames, "##.#")
MID$(a$,135, 1) = "-"
MID$(a$,136, 4) = LTRIM$(FFORMAT$(LegOppRuns / LegGames, "##.#"))
PRINT #OUTHdl, a$
'Add to Grand Totals
TotHomWins = TotHomWins + LegHomWins
TotHomLosses = TotHomLosses + LegHomLosses
TotHomRunsS = TotHomRunsS + LegHomRunsS
TotHomRunsA = TotHomRunsA + LegHomRunsA
TotVisWins = TotVisWins + LegVisWins
TotVisLosses = TotVisLosses + LegVisLosses
TotVisRunsS = TotVisRunsS + LegVisRunsS
TotVisRunsA = TotVisRunsA + LegVisRunsA
TotRuns = TotRuns + LegRuns
TotOppRuns = TotOppRuns + LegOppRuns
TotHits = TotHits + LegHits
TotErrs = TotErrs + LegErrs
TotLOB = TotLOB + LegLOB
TotDP = TotDP + LegDP
TotGames = TotGames + LegGames
LOOP UNTIL i > TblEnd
'Print Grand Totals
IF LeagueCtr > 1 THEN
a$ = SPACE$(139)
MID$(a$, 1, 28) = "**** Grand Totals ****"
MID$(a$, 36, 6) = LFORMAT$(TotHomWins, "######")
MID$(a$, 42, 6) = LFORMAT$(TotHomLosses, "######")
MID$(a$, 48, 7) = LFORMAT$(TotHomRunsS, "#######")
MID$(a$, 55, 7) = LFORMAT$(TotHomRunsA, "#######")
MID$(a$, 62, 6) = LFORMAT$(TotVisWins, "######")
MID$(a$, 68, 6) = LFORMAT$(TotVisLosses, "######")
MID$(a$, 74, 7) = LFORMAT$(TotVisRunsS, "#######")
MID$(a$, 81, 7) = LFORMAT$(TotVisRunsA, "#######")
MID$(a$, 90, 7) = LFORMAT$(TotRuns, "#######")
MID$(a$, 97, 7) = LFORMAT$(TotOppRuns, "#######")
MID$(a$,104, 7) = LFORMAT$(TotHits, "#######")
MID$(a$,111, 6) = LFORMAT$(TotErrs, "######")
MID$(a$,117, 7) = LFORMAT$(TotLOB, "#######")
MID$(a$,124, 6) = LFORMAT$(TotDP, "######")
MID$(a$,131, 4) = FFORMAT$(TotRuns / TotGames, "##.#")
MID$(a$,135, 1) = "-"
MID$(a$,136, 4) = LTRIM$(FFORMAT$(TotOppRuns / TotGames, "##.#"))
PRINT #OUTHdl, a$
END IF
'=========== Highlight Section ==============
TryPrtHighlights:
ERASE SA
IF PrtHighlights = 0 THEN GOTO TryPrtMain
IF LEN(DIR$(StatFile$ + ".STH")) THEN
STHHdl = FREEFILE
OPEN StatFile$ + ".STH" FOR BINARY AS #STHHdl
IF LOF(STHHdl) = 0 THEN
CLOSE #STHHdl
ELSE
CLOSE #STHHdl
PRINT #OUTHdl,
PRINT #OUTHdl, "Highlights of this Simulation"
PRINT #OUTHdl,
PRINT #OUTHdl, "Game/Event"
OPEN StatFile$ + ".STH" FOR INPUT AS #STHHdl
DO
LINE INPUT #STHHdl, rec$
PRINT #OUTHdl, rec$
LOOP WHILE NOT EOF(STHHdl)
CLOSE #STHHdl
END IF
END IF
'======= Print long batting streaks still in progress =======
PRINT #OUTHdl,
PRINT #OUTHdl, "Batting Streaks in Progress (at least 10 games)"
PRINT #OUTHdl,
STBHdl = FREEFILE
OPEN StatFile$ + ".STB" FOR RANDOM AS #STBHdl LEN = LEN(BR)
BatRecs = LOF(STBHdl) / LEN(BR)
BatRecs = BatRecs - 2 'Ignore 1st and last records
GET #STBHdl ,, BR 'Read sequentially
GET #STBHdl ,, BR 'Skip 1st record
rec = 1
i = 0
EndOfFile = 0
DO WHILE NOT EndOfFile
'Process "rec"
IF BR.BStreak > 9 THEN
PRINT #OUTHdl, BR.BTmNam; " "; BR.BNam; " "; BR.BStreak
i = -1
END IF
rec = rec + 1
IF rec > BatRecs THEN
EndOfFile = -1
ELSE
GET #STBHdl, , BR
END IF
LOOP
IF i = 0 THEN PRINT #OUTHdl, "None"
CLOSE #STBHdl
'=========== Main Batting / Pitching /Fielding Section ==============
' Both files should already be sorted by League/Team/Player
' Summarize and Print
TryPrtMain:
IF PrtMain = 0 AND PrtLeaders = 0 THEN CLOSE #OUTHdl: GOTO QuickExit
STBHdl = FREEFILE
OPEN StatFile$ + ".STB" FOR RANDOM AS #STBHdl LEN = LEN(BR)
STPHdl = FREEFILE
OPEN StatFile$ + ".STP" FOR RANDOM AS #STPHdl LEN = LEN(PR)
STFHdl = FREEFILE
OPEN StatFile$ + ".STF" FOR RANDOM AS #STFHdl LEN = LEN(FR)
BatRecs = LOF(STBHdl) / LEN(BR)
BatRecs = BatRecs - 2 'Ignore 1st and last records
GET #STBHdl ,, BR 'Read sequentially
GET #STBHdl ,, BR 'Skip 1st record
'IF CollapseYY THEN BR.BTmNam = "XX" + MID$(BR.BTmNam, 3, 10)
PitRecs = LOF(STPHdl) / LEN(PR) - 1 'Last record is ZZZZZZZ's
PRPointer = 2 'Start at 2nd record
FldRecs = LOF(STFHdl) / LEN(FR) - 1 'Last record is ZZZZZZZ's
FRPointer = 2 'Start at 2nd record
rec = 1
EndOfFile = 0
PREndOfFile = 0
FREndOfFile = 0
DO WHILE NOT EndOfFile
SaveLeague$ = BR.BLeague
GOSUB GetLeagueName
IF PrtMain THEN
GOSUB NewPage
PRINT #OUTHdl,
PRINT #OUTHdl, "League: "; LeagueName$
END IF
'League-leader value arrays
REDIM TblP1!(TblMax)
REDIM TblP2!(TblMax)
REDIM TblP3!(TblMax)
REDIM TblP4 (TblMax)
REDIM TblP5 (TblMax)
REDIM TblP6!(TblMax)
REDIM TblPAvg!(TblMax)
REDIM TblPRuns(TblMax)
REDIM TblPHits(TblMax)
REDIM TblP2B(TblMax)
REDIM TblP3B(TblMax)
REDIM TblPHR(TblMax)
REDIM TblPRBI(TblMax)
REDIM TblPBB(TblMax)
REDIM TblPSB(TblMax)
REDIM TblPInn!(TblMax)
REDIM TblPERA!(TblMax)
REDIM TblPSO(TblMax)
REDIM TblPWins(TblMax)
REDIM TblPSaves(TblMax)
'League-leader name arrays
REDIM TblP1N(TblMax) AS SortStrType
REDIM TblP2N(TblMax) AS SortStrType
REDIM TblP3N(TblMax) AS SortStrType
REDIM TblP4N(TblMax) AS SortStrType
REDIM TblP5N(TblMax) AS SortStrType
REDIM TblP6N(TblMax) AS SortStrType
REDIM TblPAvgN(TblMax) AS SortStrType
REDIM TblPRunsN(TblMax) AS SortStrType
REDIM TblPHitsN(TblMax) AS SortStrType
REDIM TblP2BN(TblMax) AS SortStrType
REDIM TblP3BN(TblMax) AS SortStrType
REDIM TblPHRN(TblMax) AS SortStrType
REDIM TblPRBIN(TblMax) AS SortStrType
REDIM TblPBBN(TblMax) AS SortStrType
REDIM TblPSBN(TblMax) AS SortStrType
REDIM TblPInnN(TblMax) AS SortStrType
REDIM TblPERAN(TblMax) AS SortStrType
REDIM TblPSON(TblMax) AS SortStrType
REDIM TblPWinsN(TblMax) AS SortStrType
REDIM TblPSavesN(TblMax) AS SortStrType
FOR i = 1 TO TblMax: TblPERA!(i) = 99999.99: NEXT
FOR i = 1 TO TblMax: TblP6!(i) = 99999.99: NEXT
LegBGames = 0
LegBAB = 0
LegBRuns = 0
LegBHits = 0
LegB2B = 0
LegB3B = 0
LegBHR = 0
LegBRBI = 0
LegBBB = 0
LegBSO = 0
LegBSB = 0
LegBCS = 0
LegBERRs = 0
LegBHB = 0
LegBGDP = 0
LegBSacF = 0
LegBSacB = 0
LegPCG = 0
LegPShO = 0
LegPInn = 0
LegP3rds = 0
LegPRuns = 0
LegPERuns = 0
LegPHits = 0
LegPHR = 0
LegPBB = 0
LegPSO = 0
LegPHB = 0
LegPBF = 0
LegFErr = 0
LegFAss = 0
LegFPOs = 0
tdx = 0
DO WHILE BR.BLeague = SaveLeague$ AND NOT EndOfFile
TmGames = 0
TmAB = 0
TmRuns = 0
TmHits = 0
Tm2B = 0
Tm3B = 0
TmHR = 0
TmRBI = 0
TmBB = 0
TmSO = 0
TmSB = 0
TmCS = 0
TmERRs = 0
TmHB = 0
TmGDP = 0
TmSacF = 0
TmSacB = 0
octr = 0
SaveTeam = BR.BTmNam
IF PrtMain THEN
PRINT #OUTHdl,
PRINT #OUTHdl,
xS$ = RTRIM$(UCASE$(BR.BTmNam)) + " "
PRINT #OUTHdl, xS$ + STRING$(181 - LEN(xS$), "-")
PRINT #OUTHdl,
PRINT #OUTHdl, "Batting"
PRINT #OUTHdl,
PRINT #OUTHdl, "Name Avg G AB Runs Hits TB 2B 3B HR RBI SH SF HB BB SO SB CS SB% GIDP ERR OB Slg HR OPS TAvg RC/27"
END IF
DO WHILE SaveTeam = BR.BTmNam AND SaveLeague$ = BR.BLeague AND NOT EndOfFile
IF rec = 32767 THEN
EndOfFile = -1
EXIT DO
END IF
IF BR.BABs >= OtherAB THEN
GOSUB PrintDetail
ELSE
INCR octr
SaveOther(octr) = BR 'save record in array
END IF
'Throw stuff into the "Leader Lists"
IF PAvg! > TblPAvg!(TblMax) AND BR.BABs + BR.BBBs + BR.BHB >= QualPlate THEN
TblPAvg!(TblMax) = PAvg!
TblPAvgN(TblMax).SSItem = SaveTeam + " " + BR.BNam
CALL BubbleSortFlt(TblPAvg!(), TblPAvgN(), "D")
END IF
IF BR.BRuns > TblPRuns(TblMax) THEN
TblPRuns(TblMax) = BR.BRuns
TblPRunsN(TblMax).SSItem = SaveTeam + " " + BR.BNam
CALL BubbleSortInt(TblPRuns(), TblPRunsN())
END IF
IF BR.BHits > TblPHits(TblMax) THEN
TblPHits(TblMax) = BR.BHits
TblPHitsN(TblMax).SSItem = SaveTeam + " " + BR.BNam
CALL BubbleSortInt(TblPHits(), TblPHitsN())
END IF
IF BR.B2Bs > TblP2B(TblMax) THEN
TblP2B(TblMax) = BR.B2Bs
TblP2BN(TblMax).SSItem = SaveTeam + " " + BR.BNam
CALL BubbleSortInt(TblP2B(), TblP2BN())
END IF
IF BR.B3Bs > TblP3B(TblMax) THEN
TblP3B(TblMax) = BR.B3Bs
TblP3BN(TblMax).SSItem = SaveTeam + " " + BR.BNam
CALL BubbleSortInt(TblP3B(), TblP3BN())
END IF
IF BR.BHRs > TblPHR(TblMax) THEN
TblPHR(TblMax) = BR.BHRs
TblPHRN(TblMax).SSItem = SaveTeam + " " + BR.BNam
CALL BubbleSortInt(TblPHR(), TblPHRN())
END IF
IF BR.BRBIs > TblPRBI(TblMax) THEN
TblPRBI(TblMax) = BR.BRBIs
TblPRBIN(TblMax).SSItem = SaveTeam + " " + BR.BNam
CALL BubbleSortInt(TblPRBI(), TblPRBIN())
END IF
IF BR.BBBs > TblPBB(TblMax) THEN
TblPBB(TblMax) = BR.BBBs
TblPBBN(TblMax).SSItem = SaveTeam + " " + BR.BNam
CALL BubbleSortInt(TblPBB(), TblPBBN())
END IF
IF BR.BSBs > TblPSB(TblMax) THEN
TblPSB(TblMax) = BR.BSBs
TblPSBN(TblMax).SSItem = SaveTeam + " " + BR.BNam
CALL BubbleSortInt(TblPSB(), TblPSBN())
END IF
IF rc27! > TblP1!(TblMax) AND BR.BABs + BR.BBBs + BR.BHB >= QualPlate THEN
TblP1!(TblMax) = rc27!
TblP1N(TblMax).SSItem = SaveTeam + " " + BR.BNam
CALL BubbleSortFlt(TblP1!(), TblP1N(), "D")
END IF
IF OnBase! > TblP2!(TblMax) AND BR.BABs + BR.BBBs + BR.BHB >= QualPlate THEN
TblP2!(TblMax) = OnBase!
TblP2N(TblMax).SSItem = SaveTeam + " " + BR.BNam
CALL BubbleSortFlt(TblP2!(), TblP2N(), "D")
END IF
IF slug! > TblP3!(TblMax) AND BR.BABs + BR.BBBs + BR.BHB >= QualPlate THEN
TblP3!(TblMax) = slug!
TblP3N(TblMax).SSItem = SaveTeam + " " + BR.BNam
CALL BubbleSortFlt(TblP3!(), TblP3N(), "D")
END IF
TmAB = TmAB + BR.BABs
TmRuns = TmRuns + BR.BRuns
TmHits = TmHits + BR.BHits
Tm2B = Tm2B + BR.B2Bs
Tm3B = Tm3B + BR.B3Bs
TmHR = TmHR + BR.BHRs
TmRBI = TmRBI + BR.BRBIs
TmBB = TmBB + BR.BBBs
TmSO = TmSO + BR.BKs
TmSB = TmSB + BR.BSBs
TmCS = TmCS + BR.BCSs
TmERRs = TmERRs + BR.BERRs
TmHB = TmHB + BR.BHB
TmGDP = TmGDP + BR.BGDP
TmSacF = TmSacF + BR.BSacF
TmSacB = TmSacB + BR.BSacB
INCR rec
IF rec > BatRecs THEN
EndOfFile = -1
ELSE
GET #STBHdl, , BR
'IF CollapseYY THEN BR.BTmNam = "XX" + MID$(BR.BTmNam, 3, 10)
END IF
IF INKEY$ = CHR$(27) THEN
PRINT
PRINT "Report Aborted!"
EndOfFile = -1
END IF
LOOP
'Team changed
'Sum the "Other" array
OABs = 0
OGames = 0
ORuns = 0
OHits = 0
ORBIs = 0
O2Bs = 0
O3Bs = 0
OHRs = 0
OSBs = 0
OCSs = 0
OBBs = 0
OKs = 0
OErrs = 0
OHB = 0
OGDP = 0
OSacF = 0
OSacB = 0
FOR i = 1 TO octr
OABs = OABs + SaveOther(i).BABs
OGames = OGames + SaveOther(i).BGames
ORuns = ORuns + SaveOther(i).BRuns
OHits = OHits + SaveOther(i).BHits
ORBIs = ORBIs + SaveOther(i).BRBIs
O2Bs = O2Bs + SaveOther(i).B2Bs
O3Bs = O3Bs + SaveOther(i).B3Bs
OHRs = OHRs + SaveOther(i).BHRs
OSBs = OSBs + SaveOther(i).BSBs
OCSs = OCSs + SaveOther(i).BCSs
OBBs = OBBs + SaveOther(i).BBBs
OKs = OKs + SaveOther(i).BKs
OErrs = OErrs + SaveOther(i).BErrs
OHB = OHB + SaveOther(i).BHB
OGDP = OGDP + SaveOther(i).BGDP
OSacF = OSacF + SaveOther(i).BSacF
OSacB = OSacB + SaveOther(i).BSacB
NEXT
IF octr > 0 THEN
SaveBR = BR
BR.BNam = "[Other]"
BR.BTmNam = ""
BR.BLeague = ""
BR.BABs = OABs
BR.BGames = 0
BR.BRuns = ORuns
BR.BHits = OHits
BR.BRBIs = ORBIs
BR.B2Bs = O2Bs
BR.B3Bs = O3Bs
BR.BHRs = OHRs
BR.BSBs = OSBs
BR.BCSs = OCSs
BR.BBBs = OBBs
BR.BKs = OKs
BR.BErrs = OErrs
BR.BHB = OHB
BR.BGDP = OGDP
BR.BSacF = OSacF
BR.BSacB = OSacB
GOSUB PrintDetail
BR = SaveBR
END IF
'Print TEAM BATTING TOTALS
IF TmAB <> 0 THEN TmAvg! = TmHits / TmAB ELSE TmAvg! = 0
'Expanded team batting statistics
TB = TmHits + Tm2B + 2 * Tm3B + 3 * TmHR
IF TmAB > 0 THEN
Slug! = TB / TmAB
ELSE
Slug! = 0.
END IF
IF TmAB > 0 THEN
HRPct! = TmHR / TmAB * 100
ELSE
HRPct! = 0.
END IF
IF TmAB > 0 THEN
OnBase! = (TmBB + TmHB + TmHits) / (TmBB + TmHB + TmAB)
ELSE
OnBase! = 0.
END IF
Prod! = OnBase! + Slug!
IF TmSB <> 0 THEN
Rate! = TmSB / (TmSB + TmCS) * 100
ELSE
Rate! = 0.
END IF
IF (TmCS + TmAB - TmHits) > 0 THEN
TotAvg! = (TB + TmSB + TmBB + TmHB) / (TmCS + TmAB - TmHits)
ELSE
TotAvg! = 0.
END IF
rc27! = RunsCreated27!(TmAB, TmHits, Tm2B, Tm3B, TmHR, TmBB, TmHB, TmSacB, TmSacF, TmSB, TmCS, TmGDP)
IF PrtMain THEN
'Name Avg AB Runs Hits TB 2B 3B HR RBI SH SF HB BB SO SB CS SB% GIDP ERR OB Slg HR OPS TAvg RC/27
' .#### ###### ###### ###### ###### ##### ##### ###### ###### ##### ##### ##### ###### ###### ##### ##### ###.# ##### ##### #.### #.### ##.# #.### #.### ##.##
a$ = SPACE$(185)
MID$(a$, 1, 15) = "TEAM TOTALS:"
MID$(a$, 20, 5) = FFORMAT$(TmAvg!, ".####")
MID$(a$, 31, 7) = LFORMAT$(TmAB, "#######")
MID$(a$, 38, 7) = LFORMAT$(TmRuns, "#######")
MID$(a$, 45, 7) = LFORMAT$(TmHits, "#######")
MID$(a$, 52, 7) = LFORMAT$(TB, "#######")
MID$(a$, 59, 6) = LFORMAT$(Tm2B, "######")
MID$(a$, 65, 6) = LFORMAT$(Tm3B, "######")
MID$(a$, 71, 7) = LFORMAT$(TmHR, "#######")
MID$(a$, 78, 7) = LFORMAT$(TmRBI, "#######")
MID$(a$, 85, 6) = LFORMAT$(TmSacB, "######")
MID$(a$, 91, 6) = LFORMAT$(TmSacF, "######")
MID$(a$, 97, 6) = LFORMAT$(TmHB, "######")
MID$(a$,103, 7) = LFORMAT$(TmBB, "#######")
MID$(a$,110, 7) = LFORMAT$(TmSO, "#######")
MID$(a$,117, 6) = LFORMAT$(TmSB, "######")
MID$(a$,123, 6) = LFORMAT$(TmCS, "######")
MID$(a$,130, 5) = FFORMAT$(Rate!, "##0.#")
MID$(a$,135, 6) = LFORMAT$(TmGDP, "######")
MID$(a$,141, 6) = LFORMAT$(TmERRs, "######")
MID$(a$,148, 5) = FFORMAT$(Onbase!, "#.###")
MID$(a$,154, 5) = FFORMAT$(Slug!, "#.###")
MID$(a$,160, 4) = FFORMAT$(HRPct!, "#0.#")
MID$(a$,165, 5) = FFORMAT$(Prod!, "#.###")
MID$(a$,171, 5) = FFORMAT$(TotAvg!, "#.###")
MID$(a$,177, 5) = FFORMAT$(rc27!, "#0.##")
GOSUB StripNulls
PRINT #OUTHdl, a$
IF tdx < TeamsInLeagueLim THEN
INCR tdx
MID$(a$, 1, 15) = SaveTeam
TeamBatSum(tdx) = a$
END IF
END IF
LegBAB = LegBAB + TmAB
LegBRuns = LegBRuns + TmRuns
LegBHits = LegBHits + TmHits
LegB2B = LegB2B + Tm2B
LegB3B = LegB3B + Tm3B
LegBHR = LegBHR + TmHR
LegBRBI = LegBRBI + TmRBI
LegBBB = LegBBB + TmBB
LegBSO = LegBSO + TmSO
LegBSB = LegBSB + TmSB
LegBCS = LegBCS + TmCS
LegBERRs = LegBERRs + TmERRs
LegBHB = LegBHB + TmHB
LegBGDP = LegBGDP + TmGDP
LegBSacF = LegBSacF + TmSacF
LegBSacB = LegBSacB + TmSacB
'Print TEAM PITCHING -----------------------------------
'Goto first record for this team in the pitching file
GET #STPHdl, PRpointer, PR
IF PR.PTmNam <> SaveTeam OR PR.PLeague <> SaveLeague$ THEN
PRINT #OUTHdl, "File Synchronization Problem"
END IF
TmCG = 0
TmShO = 0
TmInn = 0
Tm3rds = 0
TmRuns = 0
TmERuns = 0
TmHits = 0
Tm2b = 0
Tm3b = 0
TmHR = 0
TmBB = 0
TmSO = 0
TmWin = 0
TmLoss = 0
TmSave = 0
TmBSave = 0
TmPHB = 0
TmPBF = 0
IF PrtMain THEN
PRINT #OUTHdl,
PRINT #OUTHdl, "Pitching"
PRINT #OUTHdl, " Opp Opp Opp Opp"
PRINT #OUTHdl, "Name W L S BS ERA G GS CG ShO Inns Hits Runs ERun HR HB BB SO SO/9 Avg Slg OB OPS"
END IF
SaveTeam = PR.PTmNam
DO WHILE PR.PTmNam = SaveTeam AND SaveLeague$ = PR.PLeague AND NOT PREndOfFile
Inns! = PR.PInns + PR.P3rds / 3
IF Inns! < .1 THEN Inns! = .1
PERA! = PR.PERuns / Inns! * 9!
IF PERA! > 99.99 THEN PERA! = 99.99
'Expanded individual pitching statistics
TB = PR.PHits + PR.P2Bs + 2 * PR.P3Bs + 3 * PR.PHRs
IF (PR.PBF - PR.PBBs - PR.PHB) > 0 THEN
Avg! = PR.PHits / (PR.PBF - PR.PBBs - PR.PHB)
Slug! = TB / (PR.PBF - PR.PBBs - PR.PHB)
ELSE
Avg! = 0.
Slug! = 0.
END IF
IF PR.PBF > 0 THEN
OnBase! = (PR.PBBs + PR.PHB + PR.PHits) / PR.PBF
ELSE
OnBase! = 0.
END IF
Prod! = OnBase! + Slug!
SO9! = PR.PSOs / (Inns! / 9.)
xS$ = LEFT$(PR.PNam, 15)
i = INSTR(PR.PNam, ",")
IF i > 0 THEN yS$ = MID$(PR.PNam, 1, i - 1) ELSE yS$ = xS$
IF PrtMain THEN
'ame W L S BS ERA G GS CG ShO Inns Hits Runs ERun HR HB BB SO SO/9 Avg Slg OB OPS
' \ ##### ##### ##### #### ##.### ##### ##### ##### #### ######.# ###### ###### ###### ###### ##### ###### ###### ##.## #.### #.### #.### #.### \ \
a$ = SPACE$(175)
MID$(a$, 1, 15) = xS$
MID$(a$, 17, 1) = PR.PThrows
MID$(a$, 18, 5) = LFORMAT$(PR.PWin, "#####")
MID$(a$, 24, 5) = LFORMAT$(PR.PLoss, "#####")
MID$(a$, 30, 5) = LFORMAT$(PR.PSave, "#####")
MID$(a$, 36, 4) = LFORMAT$(PR.PBS, "####")
MID$(a$, 41, 6) = FFORMAT$(PERA!, "#0.###")
MID$(a$, 48, 5) = LFORMAT$(PR.PGames, "#####")
MID$(a$, 54, 5) = LFORMAT$(PR.PStarts,"#####")
MID$(a$, 60, 5) = LFORMAT$(PR.PCGs, "#####")
MID$(a$, 66, 4) = LFORMAT$(PR.PShOs, "####")
IF Inns! < .3 THEN InnsX! = 0.0 ELSE InnsX! = Inns!
MID$(a$, 71, 8) = FFORMAT$(InnsX!, "######.#")
MID$(a$, 80, 6) = LFORMAT$(PR.PHits, "######")
MID$(a$, 87, 6) = LFORMAT$(PR.PRuns, "######")
MID$(a$, 94, 6) = LFORMAT$(PR.PERuns, "######")
MID$(a$,101, 6) = LFORMAT$(PR.PHRs, "######")
MID$(a$,108, 5) = LFORMAT$(PR.PHB, "#####")
MID$(a$,114, 6) = LFORMAT$(PR.PBBs, "######")
MID$(a$,121, 6) = LFORMAT$(PR.PSOs, "######")
MID$(a$,128, 5) = FFORMAT$(SO9!, "#0.##")
MID$(a$,134, 5) = FFORMAT$(Avg!, "#.###")
MID$(a$,140, 5) = FFORMAT$(Slug!, "#.###")
MID$(a$,146, 5) = FFORMAT$(Onbase!, "#.###")
MID$(a$,152, 5) = FFORMAT$(Prod!, "#.###")
MID$(a$,158, 15) = yS$
GOSUB StripNulls
PRINT #OUTHdl, a$
END IF
'Throw stuff into the Pitcher "Leader Lists"
IF PERA! < TblPERA!(TblMax) AND Inns! >= CSNG(QualInn) THEN
TblPERA!(TblMax) = PERA!
TblPERAN(TblMax).SSItem = SaveTeam + " " + PR.PNam
CALL BubbleSortFlt(TblPERA!(), TblPERAN(), "A")
END IF
IF Inns! > TblPInn!(TblMax) THEN
TblPInn!(TblMax) = Inns!
TblPInnN(TblMax).SSItem = SaveTeam + " " + PR.PNam
CALL BubbleSortFlt(TblPInn!(), TblPInnN(), "D")
END IF
IF PR.PWin > TblPWins(TblMax) THEN
TblPWins(TblMax) = PR.PWin
TblPWinsN(TblMax).SSItem = SaveTeam + " " + PR.PNam
CALL BubbleSortInt(TblPWins(), TblPWinsN())
END IF
IF PR.PSave > TblPSaves(TblMax) THEN
TblPSaves(TblMax) = PR.PSave
TblPSavesN(TblMax).SSItem = SaveTeam + " " + PR.PNam
CALL BubbleSortInt(TblPSaves(), TblPSavesN())
END IF
IF PR.PSOs > TblPSO(TblMax) THEN
TblPSO(TblMax) = PR.PSOs
TblPSON(TblMax).SSItem = SaveTeam + " " + PR.PNam
CALL BubbleSortInt(TblPSO(), TblPSON())
END IF
IF PR.PCGs > TblP4(TblMax) THEN
TblP4(TblMax) = PR.PCGs
TblP4N(TblMax).SSItem = SaveTeam + " " + PR.PNam
CALL BubbleSortInt(TblP4(), TblP4N())
END IF
IF PR.PShOs > TblP5(TblMax) THEN
TblP5(TblMax) = PR.PShOs
TblP5N(TblMax).SSItem = SaveTeam + " " + PR.PNam
CALL BubbleSortInt(TblP5(), TblP5N())
END IF
IF Prod! < TblP6!(TblMax) AND Inns! >= CSNG(QualInn) THEN
TblP6!(TblMax) = Prod!
TblP6N(TblMax).SSItem = SaveTeam + " " + PR.PNam
CALL BubbleSortFlt(TblP6!(), TblP6N(), "A")
END IF
TmCG = TmCG + PR.PCGs
TmShO = TmShO + PR.PShOs
TmInn = TmInn + PR.PInns
Tm3rds = Tm3rds + PR.P3rds
TmRuns = TmRuns + PR.PRuns
TmERuns = TmERuns + PR.PERuns
TmHits = TmHits + PR.PHits
Tm2B = Tm2B + PR.P2Bs
Tm3B = Tm3B + PR.P3Bs
TmHR = TmHR + PR.PHRs
TmBB = TmBB + PR.PBBs
TmSO = TmSO + PR.PSOs
TmWin = TmWin + PR.PWin
TmLoss = TmLoss + PR.PLoss
TmSave = TmSave + PR.PSave
TmBSave = TmBSave + PR.PBS
TmPHB = TmPHB + PR.PHB
TmPBF = TmPBF + PR.PBF
PRPointer = PRPointer + 1
IF PRPointer > PitRecs THEN
PREndOfFile = -1
ELSE
GET #STPHdl, PRPointer, PR
END IF
LOOP
'Print TEAM PITCHING TOTALS
Inns! = TmInn + Tm3rds / 3
IF Inns! = 0 THEN Inns! = .33
PERA! = TmERuns / Inns! * 9!
IF PERA! > 99.99 THEN PERA! = 99.99
'Expanded team pitching statistics
'Old Way
'Avg! = TmHits / (.955 * (Inns! * 3 + TmHits))
'Slug! = TB / (.955 * (Inns! * 3 + TmHits))
'OnBase! = (TmBB + TmPHB + TmHits) / (.955 * (TmBB + TmPHB + Inns! * 3 + TmHits))
TB = TmHits + Tm2b + 2 * Tm3b + 3 * TmHR
IF (TmPBF - TmBB - TmPHB) > 0 THEN
Avg! = TmHits / (TmPBF - TmBB - TmPHB)
Slug! = TB / (TmPBF - TmBB - TmPHB)
ELSE
Avg! = 0.
Slug! = 0.
END IF
IF TmPBF > 0 THEN
OnBase! = (TmBB + TmPHB + TmHits) / TmPBF
ELSE
OnBase! = 0.
END IF
Prod! = OnBase! + Slug!
SO9! = TmSO / (Inns! / 9.)
IF PrtMain THEN
'ame W L S BS ERA G GS CG ShO Inns Hits Runs ERun HR HB BB SO SO/9 Avg Slg OB OPS
' \ ##### ##### ##### #### ##.### ##### ##### ##### #### ######.# ###### ###### ###### ###### ##### ###### ###### ##.## #.### #.### #.### #.###
a$ = SPACE$(175)
MID$(a$, 1, 15) = "TEAM TOTALS:"
MID$(a$, 17, 6) = LFORMAT$(TmWin, "######")
MID$(a$, 23, 6) = LFORMAT$(TmLoss, "######")
MID$(a$, 29, 6) = LFORMAT$(TmSave, "######")
MID$(a$, 35, 5) = LFORMAT$(TmBSave, "#####")
MID$(a$, 41, 6) = FFORMAT$(PERA!, "#0.###")
MID$(a$, 59, 6) = LFORMAT$(TmCG, "######")
MID$(a$, 65, 5) = LFORMAT$(TmShO, "#####")
MID$(a$, 70, 9) = FFORMAT$(Inns!, "#######.#")
MID$(a$, 79, 7) = LFORMAT$(TmHits, "#######")
MID$(a$, 86, 7) = LFORMAT$(TmRuns, "#######")
MID$(a$, 93, 7) = LFORMAT$(TmERuns, "#######")
MID$(a$,100, 7) = LFORMAT$(TmHR, "#######")
MID$(a$,107, 6) = LFORMAT$(TmPHB, "######")
MID$(a$,113, 7) = LFORMAT$(TmBB, "#######")
MID$(a$,120, 7) = LFORMAT$(TmSO, "#######")
MID$(a$,128, 5) = FFORMAT$(SO9!, "#0.##")
MID$(a$,134, 5) = FFORMAT$(Avg!, "#.###")
MID$(a$,140, 5) = FFORMAT$(Slug!, "#.###")
MID$(a$,146, 5) = FFORMAT$(Onbase!, "#.###")
MID$(a$,152, 5) = FFORMAT$(Prod!, "#.###")
GOSUB StripNulls
PRINT #OUTHdl, a$
IF tdx < TeamsInLeagueLim THEN
MID$(a$, 1, 15) = SaveTeam
TeamPitSum(tdx) = a$
END IF
END IF
LegPCG = LegPCG + TmCG
LegPShO = LegPShO + TmShO
LegPInn = LegPInn + TmInn
LegP3rds = LegP3rds + Tm3rds
LegPRuns = LegPRuns + TmRuns
LegPERuns = LegPERuns + TmERuns
LegPHits = LegPHits + TmHits
LegP2B = LegP2B + Tm2b
LegP3B = LegP3B + Tm3b
LegPHR = LegPHR + TmHR
LegPBB = LegPBB + TmBB
LegPSO = LegPSO + TmSO
LegPHB = LegPHB + TmPHB
LegPBF = LegPBF + TmPBF
'Print TEAM FIELDING -------------------------------------
'Goto first record for this team in the fielding file
GET #STFHdl, FRpointer, FR
IF FR.FTmNam <> SaveTeam OR FR.FLeague <> SaveLeague$ THEN
PRINT #OUTHdl, "File Synchronization Problem"
END IF
TmFErr = 0
TmFAss = 0
TmFPOs = 0
IF PrtMain AND PrtFielding THEN
PRINT #OUTHdl,
PRINT #OUTHdl, "Fielding"
PRINT #OUTHdl,
PRINT #OUTHdl, " Games-By-Position"
'old PRINT #OUTHdl, "Name Tot P C 1B 2B 3B SS LF CF RF DH Errs Assts POs Pct%"
PRINT #OUTHdl, "Name Tot P C 1B 2B 3B SS LF CF RF DH Errors Assts POs Pct%"
END IF
SaveTeam = FR.FTmNam
DO WHILE FR.FTmNam = SaveTeam AND SaveLeague$ = FR.FLeague AND NOT FREndOfFile
xS$ = LEFT$(FR.FNam, 15)
i = INSTR(FR.FNam, ",")
IF i > 0 THEN yS$ = MID$(FR.FNam, 1, i - 1) ELSE yS$ = xS$
IF PrtMain AND PrtFielding THEN
'ame Tot P C 1B 2B 3B SS LF CF RF DH Errors Assts POs Pct%"
' \ ###### ###### ###### ###### ###### ###### ###### ###### ###### ###### ###### ####### ####### ####### #.###
a$ = SPACE$(143)
MID$(a$, 1, 15) = xS$
MID$(a$, 17, 6) = LFORMAT$(FR.FCount, "######")
ee = 0
ai = 0
po = 0
FOR i = 1 TO 10
IF FR.FGamesByPos(i) > 0 THEN
MID$(a$, (7*i + 17), 6) = LFORMAT$(FR.FGamesByPos(i), "######")
ELSE
MID$(a$, (7*i + 22), 1) = "-"
END IF
ee = ee + FR.FErrsByPos(i)
ai = ai + FR.FAssistsByPos(i)
po = po + FR.FPutOutsByPos(i)
NEXT
MID$(a$, 96, 7) = LFORMAT$(ee, "#######")
MID$(a$,104, 7) = LFORMAT$(ai, "#######")
MID$(a$,112, 7) = LFORMAT$(po, "#######")
IF ee + ai + po > 0 THEN
dpct! = (ai + po) / (ee + ai + po)
ELSE
dpct! = 1.000
END IF
MID$(a$,120, 6) = FFORMAT$(dpct!, "#.####")
MID$(a$,128, 15) = yS$
PRINT #OUTHdl, a$
'Add to team totals
TmFErr = TmFErr + ee
TmFAss = TmFAss + ai
TmFPOs = TmFPOs + po
IF FieldBD THEN
'Count how many positions were played (pp) and
'store what the were - ignore DH
REDIM plist(9) AS INTEGER
pp = 0
FOR p = 1 TO 9
IF FR.FGamesByPos(p) > 0 THEN
INCR pp
plist(pp) = p
END IF
NEXT
'Break out individual positions
IF pp > 1 THEN
FOR i = 1 TO pp
p = plist(i)
' a$ = SPACE$(115)
' MID$(a$, 4, 3) = Pos(p)
' MID$(a$, (5*p + 17), 4) = LFORMAT$(FR.FGamesByPos(p), "####")
' MID$(a$, 74, 5) = LFORMAT$(FR.FErrsByPos(p), "#####")
' MID$(a$, 80, 5) = LFORMAT$(FR.FAssistsByPos(p),"#####")
' MID$(a$, 86, 5) = LFORMAT$(FR.FPutOutsByPos(p),"#####")
a$ = SPACE$(126)
MID$(a$, 4, 3) = Pos(p)
MID$(a$, (7*p + 17), 6) = LFORMAT$(FR.FGamesByPos(p), "######")
MID$(a$, 96, 7) = LFORMAT$(FR.FErrsByPos(p), "#######")
MID$(a$,104, 7) = LFORMAT$(FR.FAssistsByPos(p),"#######")
MID$(a$,112, 7) = LFORMAT$(FR.FPutOutsByPos(p),"#######")
ee = FR.FErrsByPos(p)
ai = FR.FAssistsByPos(p)
po = FR.FPutOutsByPos(p)
IF ee + ai + po > 0 THEN
dpct! = (ai + po) / (ee + ai + po)
ELSE
dpct! = 1.000
END IF
' MID$(a$, 92, 5) = FFORMAT$(dpct!, "#.###")
MID$(a$,120, 6) = FFORMAT$(dpct!, "#.####")
PRINT #OUTHdl, a$
NEXT
END IF
END IF
END IF
'Throw stuff into the Fielding "Leader Lists"
FRPointer = FRPointer + 1
IF FRPointer > FldRecs THEN
FREndOfFile = -1
ELSE
GET #STFHdl, FRPointer, FR
END IF
LOOP
'Print TEAM FIELDING TOTALS
IF PrtMain AND PrtFielding THEN
a$ = SPACE$(143)
MID$(a$, 1, 15) = "TEAM TOTALS:"
' MID$(a$, 74, 5) = LFORMAT$(TmFErr, "#####")
' MID$(a$, 80, 5) = LFORMAT$(TmFAss, "#####")
' MID$(a$, 86, 5) = LFORMAT$(TmFPOs, "#####")
MID$(a$, 96, 7) = LFORMAT$(TmFErr, "#######")
MID$(a$,104, 7) = LFORMAT$(TmFAss, "#######")
MID$(a$,112, 7) = LFORMAT$(TmFPOs, "#######")
ee = TmFErr
ai = TmFAss
po = TmFPOs
IF ee + ai + po > 0 THEN
dpct! = (ai + po) / (ee + ai + po)
ELSE
dpct! = 1.000
END IF
' MID$(a$, 92, 6) = FFORMAT$(dpct!, "#.####")
MID$(a$,120, 6) = FFORMAT$(dpct!, "#.####")
PRINT #OUTHdl, a$
IF tdx < TeamsInLeagueLim THEN
z$ = SPACE$(46)
MID$(z$, 1, 15) = SaveTeam
' MID$(z$, 17, 24) = MID$(a$, 74, 24)
MID$(z$, 17, 30) = MID$(a$, 96, 30)
TeamFldSum(tdx) = z$
END IF
END IF
LegFErr = LegFErr + TmFErr
LegFAss = LegFAss + TmFAss
LegFPOs = LegFPOs + TmFPOs
LOOP
'League Changed
'Print League BATTING Totals
PRINT #OUTHdl,
PRINT #OUTHdl,
PRINT #OUTHdl,
PRINT #OUTHdl, "LEAGUE BATTING SUMMARY BY TEAM"
PRINT #OUTHdl,
'oldPRINT #OUTHdl, "Team Avg AB Runs Hits TB 2B 3B HR RBI SH SF HB BB SO SB CS SB% GIDP ERR OB Slg HR% OPS TAvg RC/27"
PRINT #OUTHdl, "Team Avg AB Runs Hits TB 2B 3B HR RBI SH SF HB BB SO SB CS SB% GIDP ERR OB Slg HR OPS TAvg RC/27"
ARRAY SORT TeamBatSum() FOR tdx, FROM 39 TO 44, DESCEND
FOR i = 1 TO tdx
x$ = TeamBatSum(i)
PRINT #OUTHdl, x$
NEXT
IF LegBAB <> 0 THEN LegAvg! = LegBHits / LegBAB ELSE LegAvg! = 0
'Expanded league BATTING statistics
TB = LegBHits + LegB2B + 2 * LegB3B + 3 * LegBHR
IF LegBAB > 0 THEN
Slug! = TB / LegBAB
ELSE
Slug! = 0.
END IF
IF LegBAB > 0 THEN
HRPct! = LegBHR / LegBAB * 100
ELSE
HRPct! = 0.
END IF
IF LegBAB > 0 THEN
OnBase! = (LegBBB + LegBHB + LegBHits) / (LegBBB + LegBHB + LegBAB)
ELSE
OnBase! = 0.
END IF
Prod! = OnBase! + Slug!
IF LegBSB <> 0 THEN
Rate! = LegBSB / (LegBSB + LegBCS) * 100
ELSE
Rate! = 0.
END IF
IF (LegBCS + LegBAB - LegBHits) > 0 THEN
TotAvg! = (TB + LegBSB + LegBBB + LegBHB) / (LegBCS + LegBAB - LegBHits)
ELSE
TotAvg! = 0.
END IF
rc27! = RunsCreated27!(LegBAB, LegBHits, LegB2B, LegB3B, LegBHR, LegBBB, LegBHB, LegBSacB, LegBSacF, LegBSB, LegBCS, LegBGDP)
IF PrtMain THEN
PRINT #OUTHdl,
a$ = SPACE$(185)
MID$(a$, 1, 12) = "LEAGUE BAT.:"
MID$(a$, 14, 1) = SaveLeague$
MID$(a$, 20, 5) = FFORMAT$(LegAvg!, ".####")
MID$(a$, 30, 8) = LFORMAT$(LegBAB, "########")
MID$(a$, 38, 7) = LFORMAT$(LegBRuns,"#######")
MID$(a$, 45, 7) = LFORMAT$(LegBHits,"#######")
MID$(a$, 52, 7) = LFORMAT$(TB, "#######")
MID$(a$, 59, 6) = LFORMAT$(LegB2B, "######")
MID$(a$, 65, 6) = LFORMAT$(LegB3B, "######")
MID$(a$, 71, 7) = LFORMAT$(LegBHR, "#######")
MID$(a$, 78, 7) = LFORMAT$(LegBRBI, "#######")
MID$(a$, 85, 6) = LFORMAT$(LegBSacB, "######")
MID$(a$, 91, 6) = LFORMAT$(LegBSacF, "######")
MID$(a$, 97, 6) = LFORMAT$(LegBHB, "######")
MID$(a$, 103, 7) = LFORMAT$(LegBBB, "#######")
MID$(a$, 110, 7) = LFORMAT$(LegBSO, "#######")
MID$(a$, 117, 6) = LFORMAT$(LegBSB, "######")
MID$(a$, 123, 6) = LFORMAT$(LegBCS, "######")
MID$(a$, 130, 5) = FFORMAT$(Rate!, "##0.#")
MID$(a$, 135, 6) = LFORMAT$(LegBGDP, "######")
MID$(a$, 141, 6) = LFORMAT$(LegBERRs, "######")
MID$(a$, 148, 5) = FFORMAT$(Onbase!, "#.###")
MID$(a$, 154, 5) = FFORMAT$(Slug!, "#.###")
MID$(a$, 160, 4) = FFORMAT$(HRPct!, "#0.#")
MID$(a$, 165, 5) = FFORMAT$(Prod!, "#.###")
MID$(a$, 171, 5) = FFORMAT$(TotAvg!, "#.###")
MID$(a$, 177, 5) = FFORMAT$(rc27!, "#0.##")
GOSUB StripNulls
PRINT #OUTHdl, a$
END IF
'Print League PITCHING Totals
PRINT #OUTHdl,
PRINT #OUTHdl,
PRINT #OUTHdl,
PRINT #OUTHdl, "LEAGUE PITCHING SUMMARY BY TEAM"
PRINT #OUTHdl,
'oldPRINT #OUTHdl, "Team W L S BS ERA CG ShO Inns Hits Runs ERun HR HB BB SO SO/9 Avg Slg OB OPS"
PRINT #OUTHdl, " Opp Opp Opp Opp"
PRINT #OUTHdl, "Name W L S BS ERA CG ShO Inns Hits Runs ERun HR HB BB SO SO/9 Avg Slg OB OPS"
ARRAY SORT TeamPitSum() FOR tdx, FROM 87 TO 92, ASCEND
FOR i = 1 TO tdx
x$ = TeamPitSum(i)
PRINT #OUTHdl, x$
NEXT
Inns! = LegPInn + LegP3rds / 3
IF Inns! = 0 THEN Inns! = .33
PERA! = LegPERuns / Inns! * 9!
IF PERA! > 99.99 THEN PERA! = 99.99
'Expanded League PITCHING Statistics
TB = LegPHits + LegP2B + 2 * LegP3B + 3 * LegPHR
IF (LegPBF - LegPBB - LegPHB) > 0 THEN
Avg! = LegPHits / (LegPBF - LegPBB - LegPHB)
Slug! = TB / (LegPBF - LegPBB - LegPHB)
ELSE
Avg! = 0.
Slug! = 0.
END IF
IF LegPBF > 0 THEN
OnBase! = (LegPBB + LegPHB + LegPHits) / LegPBF
ELSE
OnBase! = 0.
END IF
Prod! = OnBase! + Slug!
SO9! = LegPSO / (Inns! / 9.)
IF PrtMain THEN
PRINT #OUTHdl,
a$ = SPACE$(175)
MID$(a$, 1, 12) = "LEAGUE PIT.:"
MID$(a$, 14, 1) = SaveLeague$
MID$(a$, 41, 6) = FFORMAT$(PERA!, "#0.###")
MID$(a$, 60, 5) = LFORMAT$(LegPCG, "#####")
MID$(a$, 65, 5) = LFORMAT$(LegPShO, "#####")
MID$(a$, 70, 9) = FFORMAT$(Inns!, "#######.#")
MID$(a$, 79, 7) = LFORMAT$(LegPHits, "#######")
MID$(a$, 86, 7) = LFORMAT$(LegPRuns, "#######")
MID$(a$, 93, 7) = LFORMAT$(LegPERuns, "#######")
MID$(a$, 100, 7) = LFORMAT$(LegPHR, "#######")
MID$(a$, 107, 6) = LFORMAT$(LegPHB, "######")
MID$(a$, 113, 7) = LFORMAT$(LegPBB, "#######")
MID$(a$, 120, 7) = LFORMAT$(LegPSO, "#######")
MID$(a$, 128, 5) = FFORMAT$(SO9!, "#0.##")
MID$(a$, 134, 5) = FFORMAT$(Avg!, "#.###")
MID$(a$, 140, 5) = FFORMAT$(Slug!, "#.###")
MID$(a$, 146, 5) = FFORMAT$(Onbase!, "#.###")
MID$(a$, 152, 5) = FFORMAT$(Prod!, "#.###")
GOSUB StripNulls
PRINT #OUTHdl, a$
END IF
'Print League FIELDING Totals
PRINT #OUTHdl,
PRINT #OUTHdl,
PRINT #OUTHdl,
PRINT #OUTHdl, "LEAGUE FIELDING SUMMARY BY TEAM"
PRINT #OUTHdl,
ARRAY SORT TeamFldSum() FOR tdx, FROM 41 TO 46, DESCEND
PRINT #OUTHdl, "Team Errs Assts POs Pct%"
ee = 0: ai = 0: po = 0
FOR i = 1 TO tdx
x$ = TeamFldSum(i)
ee = ee + VAL(MID$(x$, 17, 7))
ai = ai + VAL(MID$(x$, 25, 7))
po = po + VAL(MID$(x$, 33, 7))
PRINT #OUTHdl, x$
NEXT
a$ = SPACE$(46)
MID$(a$, 17, 7) = LFORMAT$(ee, "#######")
MID$(a$, 25, 7) = LFORMAT$(ai, "#######")
MID$(a$, 33, 7) = LFORMAT$(po, "#######")
IF ee + ai + po > 0 THEN
dpct! = (ai + po) / (ee + ai + po)
ELSE
dpct! = 1.000
END IF
MID$(a$, 41, 6) = FFORMAT$(dpct!, "#.####")
PRINT #OUTHdl, a$
'Print Individual League Batting Leaders
IF PrtLeaders = 0 THEN GOTO EscLeaders
PRINT #OUTHdl,
PRINT #OUTHdl,
PRINT #OUTHdl,
PRINT #OUTHdl, "============================="
PRINT #OUTHdl, "League Batting Leaders - "; LeagueName$
PRINT #OUTHdl, "============================="
PRINT #OUTHdl,
PRINT #OUTHdl, "Batting Avg (Based on"; QualPA; " PA) ====== Runs ================================"
' 1 \ .### \ \ ####"
' 2 \ .### "
' 3 \ \ ####"
FOR i = 1 TO TblMax
IF TblPAvg!(i) < .001 AND TblPRuns(i) > 0 THEN
a$ = SPACE$(80)
MID$(a$, 41, 29) = TblPRunsN(i).SSItem
MID$(a$, 72, 6) = LFORMAT$(TblPRuns(i), "######")
PRINT #OUTHdl, a$
ELSEIF TblPAvg!(i) > .001 AND TblPRuns(i) = 0 THEN
a$ = SPACE$(80)
MID$(a$, 1, 29) = TblPAvgN(i).SSItem
MID$(a$, 33, 4) = FFORMAT$(TblPAvg!(i), ".###")
PRINT #OUTHdl, a$
ELSEIF TblPAvg!(i) > .001 AND TblPRuns(i) > 0 THEN
a$ = SPACE$(80)
MID$(a$, 1, 29) = TblPAvgN(i).SSItem
MID$(a$, 33, 4) = FFORMAT$(TblPAvg!(i), ".###")
MID$(a$, 41, 29) = TblPRunsN(i).SSItem
MID$(a$, 72, 6) = LFORMAT$(TblPRuns(i), "######")
PRINT #OUTHdl, a$
END IF
NEXT
PRINT #OUTHdl,
PRINT #OUTHdl, "Hits =============================== Home Runs ==========================="
' 1 \ #### \ \ ####"
' 2 \ #### "
' 3 \ \ ####"
FOR i = 1 TO TblMax
IF TblPHits(i) = 0 AND TblPHR(i) > 0 THEN
a$ = SPACE$(80)
MID$(a$, 41, 29) = TblPHRN(i).SSItem
MID$(a$, 72, 6) = LFORMAT$(TblPHR(i), "######")
PRINT #OUTHdl, a$
ELSEIF TblPHits(i) > 0 AND TblPHR(i) = 0 THEN
a$ = SPACE$(80)
MID$(a$, 1, 29) = TblPHitsN(i).SSItem
MID$(a$, 31, 6) = LFORMAT$(TblPHits(i), "######")
PRINT #OUTHdl, a$
ELSEIF TblPHits(i) > 0 AND TblPHR(i) > 0 THEN
a$ = SPACE$(80)
MID$(a$, 1, 29) = TblPHitsN(i).SSItem
MID$(a$, 31, 6) = LFORMAT$(TblPHits(i), "######")
MID$(a$, 41, 29) = TblPHRN(i).SSItem
MID$(a$, 72, 6) = LFORMAT$(TblPHR(i), "######")
PRINT #OUTHdl, a$
END IF
NEXT
PRINT #OUTHdl,
PRINT #OUTHdl, "Doubles ============================ Triples ============================="
FOR i = 1 TO TblMax
IF TblP2B(i) = 0 AND TblP3B(i) > 0 THEN
a$ = SPACE$(80)
MID$(a$, 41, 29) = TblP3BN(i).SSItem
MID$(a$, 72, 6) = LFORMAT$(TblP3B(i), "######")
PRINT #OUTHdl, a$
ELSEIF TblP2B(i) > 0 AND TblP3B(i) = 0 THEN
a$ = SPACE$(80)
MID$(a$, 1, 29) = TblP2BN(i).SSItem
MID$(a$, 31, 6) = LFORMAT$(TblP2B(i), "######")
PRINT #OUTHdl, a$
ELSEIF TblP2B(i) > 0 AND TblP3B(i) > 0 THEN
a$ = SPACE$(80)
MID$(a$, 1, 29) = TblP2BN(i).SSItem
MID$(a$, 31, 6) = LFORMAT$(TblP2B(i), "######")
MID$(a$, 41, 29) = TblP3BN(i).SSItem
MID$(a$, 72, 6) = LFORMAT$(TblP3B(i), "######")
PRINT #OUTHdl, a$
END IF
NEXT
PRINT #OUTHdl,
PRINT #OUTHdl, "RBI ================================ Walks ==============================="
FOR i = 1 TO TblMax
IF TblPRBI(i) = 0 AND TblPBB(i) > 0 THEN
a$ = SPACE$(80)
MID$(a$, 41, 29) = TblPBBN(i).SSItem
MID$(a$, 72, 6) = LFORMAT$(TblPBB(i), "######")
PRINT #OUTHdl, a$
ELSEIF TblPRBI(i) > 0 AND TblPBB(i) = 0 THEN
a$ = SPACE$(80)
MID$(a$, 1, 29) = TblPRBIN(i).SSItem
MID$(a$, 31, 6) = LFORMAT$(TblPRBI(i), "######")
PRINT #OUTHdl, a$
ELSEIF TblPRBI(i) > 0 AND TblPBB(i) > 0 THEN
a$ = SPACE$(80)
MID$(a$, 1, 29) = TblPRBIN(i).SSItem
MID$(a$, 31, 6) = LFORMAT$(TblPRBI(i), "######")
MID$(a$, 41, 29) = TblPBBN(i).SSItem
MID$(a$, 72, 6) = LFORMAT$(TblPBB(i), "######")
PRINT #OUTHdl, a$
END IF
NEXT
PRINT #OUTHdl,
PRINT #OUTHdl, "Stolen Bases ======================= On-Base Pct. ========================"
FOR i = 1 TO TblMax
IF TblPSB(i) = 0 AND TblP2!(i) > 0 THEN
a$ = SPACE$(80)
MID$(a$, 41, 29) = TblP2N(i).SSItem
MID$(a$, 74, 4) = FFORMAT$(TblP2!(i), ".###")
PRINT #OUTHdl, a$
ELSEIF TblPSB(i) > 0 AND TblP2!(i) = 0 THEN
a$ = SPACE$(80)
MID$(a$, 1, 29) = TblPSBN(i).SSItem
MID$(a$, 31, 6) = LFORMAT$(TblPSB(i), "######")
PRINT #OUTHdl, a$
ELSEIF TblPSB(i) > 0 AND TblP2!(i) > 0 THEN
a$ = SPACE$(80)
MID$(a$, 1, 29) = TblPSBN(i).SSItem
MID$(a$, 31, 6) = LFORMAT$(TblPSB(i), "######")
MID$(a$, 41, 29) = TblP2N(i).SSItem
MID$(a$, 74, 4) = FFORMAT$(TblP2!(i), ".###")
PRINT #OUTHdl, a$
END IF
NEXT
PRINT #OUTHdl,
PRINT #OUTHdl, "Slugging =========================== Runs Created Per 27 Outs ============"
FOR i = 1 TO TblMax
IF TblP3!(i) = 0 AND TblP1!(i) > 0 THEN
a$ = SPACE$(80)
MID$(a$, 41, 29) = TblP1N(i).SSItem
MID$(a$, 73, 5) = FFORMAT$(TblP1!(i), "#0.##")
PRINT #OUTHdl, a$
ELSEIF TblP3!(i) > 0 AND TblP1!(i) = 0 THEN
a$ = SPACE$(80)
MID$(a$, 1, 29) = TblP3N(i).SSItem
MID$(a$, 32, 5) = FFORMAT$(TblP3!(i), "#.###")
PRINT #OUTHdl, a$
ELSEIF TblP3!(i) > 0 AND TblP1!(i) > 0 THEN
a$ = SPACE$(80)
MID$(a$, 1, 29) = TblP3N(i).SSItem
MID$(a$, 32, 5) = FFORMAT$(TblP3!(i), "#.###")
MID$(a$, 41, 29) = TblP1N(i).SSItem
MID$(a$, 73, 5) = FFORMAT$(TblP1!(i), "#0.##")
PRINT #OUTHdl, a$
END IF
NEXT
'Print League Pitching Leaders
PRINT #OUTHdl,
PRINT #OUTHdl,
PRINT #OUTHdl,
PRINT #OUTHdl, "=============================="
PRINT #OUTHdl, "League Pitching Leaders - "; LeagueName$
PRINT #OUTHdl, "=============================="
PRINT #OUTHdl,
PRINT #OUTHdl, "Innings ============================ Wins ================================"
' 1 \####.# \ \ ####"
' 2 \####.# "
' 3 \ \ ####"
FOR i = 1 TO TblMax
IF TblPInn!(i) < .001 AND TblPWins(i) > 0 THEN
a$ = SPACE$(80)
MID$(a$, 41, 29) = TblPWinsN(i).SSItem
MID$(a$, 72, 6) = LFORMAT$(TblPWins(i), "######")
PRINT #OUTHdl, a$
ELSEIF TblPInn!(i) > .001 AND TblPWins(i) = 0 THEN
a$ = SPACE$(80)
MID$(a$, 1, 29) = TblPInnN(i).SSItem
MID$(a$, 29, 8) = FFORMAT$(TblPInn!(i), "######.#")
PRINT #OUTHdl, a$
ELSEIF TblPInn!(i) > .001 AND TblPWins(i) > 0 THEN
a$ = SPACE$(80)
MID$(a$, 1, 29) = TblPInnN(i).SSItem
MID$(a$, 29, 8) = FFORMAT$(TblPInn!(i), "######.#")
MID$(a$, 41, 29) = TblPWinsN(i).SSItem
MID$(a$, 72, 6) = LFORMAT$(TblPWins(i), "######")
PRINT #OUTHdl, a$
END IF
NEXT
PRINT #OUTHdl,
PRINT #OUTHdl, "ERA (Based on"; QualIP; " Inn) ============= Strike Outs ========================="
' 1 \##.### \ \ ####"
' 2 \##.### "
' 3 \ \ ####"
FOR i = 1 TO TblMax
IF TblPERA!(i) > 99.999 THEN TblPERA!(i) = 99.999
IF TblPERAN(i).SSItem < "!" AND TblPSO(i) > 0 THEN
a$ = SPACE$(80)
MID$(a$, 41, 29) = TblPSON(i).SSItem
MID$(a$, 72, 6) = LFORMAT$(TblPSO(i), "######")
PRINT #OUTHdl, a$
ELSEIF TblPERAN(i).SSItem > "!" AND TblPSO(i) = 0 THEN
a$ = SPACE$(80)
MID$(a$, 1, 29) = TblPERAN(i).SSItem
MID$(a$, 32, 5) = FFORMAT$(TblPERA!(i), "#0.##")
PRINT #OUTHdl, a$
ELSEIF TblPERAN(i).SSItem > "!" AND TblPSO(i) > 0 THEN
a$ = SPACE$(80)
MID$(a$, 1, 29) = TblPERAN(i).SSItem
MID$(a$, 32, 5) = FFORMAT$(TblPERA!(i), "#0.##")
MID$(a$, 41, 29) = TblPSON(i).SSItem
MID$(a$, 72, 6) = LFORMAT$(TblPSO(i), "######")
PRINT #OUTHdl, a$
END IF
NEXT
PRINT #OUTHdl,
PRINT #OUTHdl, "Saves ============================== Complete Games ======================"
' \ ####"
FOR i = 1 TO TblMax
IF TblPSaves(i) = 0 AND TblP4(i) > 0 THEN
a$ = SPACE$(80)
MID$(a$, 41, 29) = TblP4N(i).SSItem
MID$(a$, 72, 6) = LFORMAT$(TblP4(i), "######")
PRINT #OUTHdl, a$
ELSEIF TblPSaves(i) > 0 AND TblP4(i) = 0 THEN
a$ = SPACE$(80)
MID$(a$, 1, 29) = TblPSavesN(i).SSItem
MID$(a$, 31, 6) = LFORMAT$(TblPSaves(i), "######")
PRINT #OUTHdl, a$
ELSEIF TblPSaves(i) > 0 AND TblP4(i) > 0 THEN
a$ = SPACE$(80)
MID$(a$, 1, 29) = TblPSavesN(i).SSItem
MID$(a$, 31, 6) = LFORMAT$(TblPSaves(i), "######")
MID$(a$, 41, 29) = TblP4N(i).SSItem
MID$(a$, 72, 6) = LFORMAT$(TblP4(i), "######")
PRINT #OUTHdl, a$
END IF
NEXT
PRINT #OUTHdl,
PRINT #OUTHdl, "ShutOuts =========================== OPS (OBP + Slug.) ==================="
' \ ####"
FOR i = 1 TO TblMax
IF TblP5(i) = 0 AND TblP6!(i) < 99999. THEN
a$ = SPACE$(80)
MID$(a$, 41, 29) = TblP6N(i).SSItem
MID$(a$, 73, 5) = FFORMAT$(TblP6!(i), "#.###")
PRINT #OUTHdl, a$
ELSEIF TblP5(i) > 0 AND TblP6!(i) > 99999. THEN
a$ = SPACE$(80)
MID$(a$, 1, 29) = TblP5N(i).SSItem
MID$(a$, 31, 6) = LFORMAT$(TblP5(i), "######")
PRINT #OUTHdl, a$
ELSEIF TblP5(i) > 0 AND TblP6!(i) < 99999. THEN
a$ = SPACE$(80)
MID$(a$, 1, 29) = TblP5N(i).SSItem
MID$(a$, 31, 6) = LFORMAT$(TblP5(i), "######")
MID$(a$, 41, 29) = TblP6N(i).SSItem
MID$(a$, 73, 5) = FFORMAT$(TblP6!(i), "#.###")
PRINT #OUTHdl, a$
END IF
NEXT
EscLeaders:
LOOP
'End of File
CLOSE #STBHdl
CLOSE #STPHdl
CLOSE #STFHdl
CLOSE #OUTHdl
QuickExit:
OutFile$ = OutDevice$
COLOR deffor, defbac
LOCATE 1, 1
EXIT SUB
PrintDetail:
IF BR.BABs <> 0 THEN PAvg! = BR.BHits / BR.BABs ELSE PAvg! = 0
'Expanded individual batting statistics
TB = BR.BHits + BR.B2Bs + 2 * BR.B3Bs + 3 * BR.BHRs
IF BR.BABs > 0 THEN
Slug! = TB / BR.BABs
ELSE
Slug! = 0.0
END IF
IF BR.BABs > 0 THEN
HRPct! = BR.BHRs / BR.BABs * 100
ELSE
HRPct! = 0.0
END IF
IF BR.BABs > 0 THEN
OnBase! = (BR.BBBs + BR.BHB + BR.BHits) / (BR.BBBs + BR.BHB + BR.BABs)
ELSE
OnBase! = 0.0
END IF
Prod! = OnBase! + Slug!
IF BR.BSBs <> 0 THEN
Rate! = BR.BSBs / (BR.BSBs + BR.BCSs) * 100
ELSE
Rate! = 0.0
END IF
IF (BR.BCSs + BR.BABs - BR.BHits) > 0 THEN
TotAvg! = (TB + BR.BSBs + BR.BBBs + BR.BHB) / (BR.BCSs + BR.BABs - BR.BHits)
ELSE
TotAvg! = 0.0
END IF
rc27! = RunsCreated27!((BR.BABs), (BR.BHits), (BR.B2Bs), (BR.B3Bs), (BR.BHRs), (BR.BBBs), (BR.BHB), (BR.BSacB), (BR.BSacF), (BR.BSBs), (BR.BCSs), (BR.BGDP))
xS$ = LEFT$(BR.BNam, 15)
i = INSTR(BR.BNam, ",")
IF i > 0 THEN yS$ = MID$(BR.BNam, 1, i - 1) ELSE yS$ = xS$
IF PrtMain THEN
'old:
' Avg G AB Runs Hits TB 2B 3B HR RBI SH SF HB BB SO SB CS SB% GIDP ERR OB Slg HR OPS TAvg RC/27
' \ X #.### #### #### #### ##### ##### #### ### #### #### #### #### ### ##### ##### #### ### ###.# #### #### #.### #.### ##.# #.### #.### ##.## \ \
'new:
' Avg G AB Runs Hits TB 2B 3B HR RBI SH SF HB BB SO SB CS SB% GIDP ERR OB Slg HR OPS TAvg RC/27
' #.### ###### ###### ###### ###### ###### ##### ##### ###### ###### ##### ##### ##### ###### ###### ##### ##### ###.# ##### ##### #.### #.### ##.# #.### #.### ##.## \ \"
a$ = SPACE$(195)
MID$(a$, 1, 15) = xS$
MID$(a$, 17, 1) = BR.BBats
IF BR.BABs > 0 THEN
MID$(a$, 19, 5) = FFORMAT$(PAvg!, "#.###")
END IF
MID$(a$, 25, 6) = LFORMAT$(BR.BGames, "######")
MID$(a$, 32, 6) = LFORMAT$(BR.BABs, "######")
MID$(a$, 39, 6) = LFORMAT$(BR.BRuns, "######")
MID$(a$, 46, 6) = LFORMAT$(BR.BHits, "######")
MID$(a$, 53, 6) = LFORMAT$(TB, "######")
MID$(a$, 60, 5) = LFORMAT$(BR.B2Bs, "#####")
MID$(a$, 66, 5) = LFORMAT$(BR.B3Bs, "#####")
MID$(a$, 72, 6) = LFORMAT$(BR.BHRs, "######")
MID$(a$, 79, 6) = LFORMAT$(BR.BRBIs, "######")
MID$(a$, 86, 5) = LFORMAT$(BR.BSacB, "#####")
MID$(a$, 92, 5) = LFORMAT$(BR.BSacF, "#####")
MID$(a$, 98, 5) = LFORMAT$(BR.BHB, "#####")
MID$(a$,104, 6) = LFORMAT$(BR.BBBs, "######")
MID$(a$,111, 6) = LFORMAT$(BR.BKs, "######")
MID$(a$,118, 5) = LFORMAT$(BR.BSBs, "#####")
MID$(a$,124, 5) = LFORMAT$(BR.BCSs, "#####")
MID$(a$,130, 5) = FFORMAT$(Rate!, "##0.#")
MID$(a$,136, 5) = LFORMAT$(BR.BGDP, "#####")
MID$(a$,142, 5) = LFORMAT$(BR.BERRs, "#####")
MID$(a$,148, 5) = FFORMAT$(Onbase!, "#.###")
MID$(a$,154, 5) = FFORMAT$(Slug!, "#.###")
MID$(a$,160, 4) = FFORMAT$(HRPct!, "#0.#")
MID$(a$,165, 5) = FFORMAT$(Prod!, "#.###")
MID$(a$,171, 5) = FFORMAT$(TotAvg!, "#.###")
MID$(a$,177, 5) = FFORMAT$(rc27!, "#0.##")
MID$(a$,183, 12) = yS$
GOSUB StripNulls
PRINT #OUTHdl, a$
IF RL THEN
'vs RHP
a$ = SPACE$(170)
IF BR.BABsRHP <> 0 THEN SAvg! = BR.BHitsRHP / BR.BABsRHP ELSE SAvg! = 0
MID$(a$, 1, 15) = " .vs RHP"
IF SAvg! > 0 THEN
MID$(a$, 19, 5) = FFORMAT$(SAvg!, "#.###")
END IF
MID$(a$, 32, 6) = LFORMAT$(BR.BABsRHP, "######")
MID$(a$, 46, 6) = LFORMAT$(BR.BHitsRHP, "######")
MID$(a$, 60, 5) = LFORMAT$(BR.B2BsRHP, "#####")
MID$(a$, 66, 5) = LFORMAT$(BR.B3BsRHP, "#####")
MID$(a$, 72, 6) = LFORMAT$(BR.BHRsRHP, "######")
MID$(a$,104, 6) = LFORMAT$(BR.BBBsRHP, "######")
MID$(a$,111, 6) = LFORMAT$(BR.BKsRHP, "######")
'Expanded individual batting statistics
TB = BR.BHitsRHP + BR.B2BsRHP + 2 * BR.B3BsRHP + 3 * BR.BHRsRHP
MID$(a$, 53, 6) = LFORMAT$(TB, "######")
IF BR.BABsRHP > 0 THEN
Slugx! = TB / BR.BABsRHP
ELSE
Slugx! = 0.0
END IF
IF BR.BABsRHP > 0 THEN
HRPctx! = BR.BHRsRHP / BR.BABsRHP * 100
ELSE
HRPctx! = 0.0
END IF
IF BR.BHB > 0 AND BR.BABs > 0 THEN
BHBRHP = (BR.BABsRHP / BR.BABs) * BR.BHB
ELSE
BHBRHP = 0
END IF
IF BR.BABs > 0 THEN
OnBasex! = (BR.BBBsRHP + BHBRHP + BR.BHitsRHP) / _
(BR.BBBsRHP + BHBRHP + BR.BABsRHP)
ELSE
OnBasex! = 0.0
END IF
MID$(a$,148, 5) = FFORMAT$(Onbasex!, "#.###")
MID$(a$,154, 5) = FFORMAT$(Slugx!, "#.###")
MID$(a$,160, 4) = FFORMAT$(HRPctx!, "#0.#")
Prodx! = OnBasex! + Slugx!
MID$(a$,165, 5) = FFORMAT$(Prodx!, "#.###")
PRINT #OUTHdl, a$
'vs LHP
a$ = SPACE$(170)
IF BR.BABsLHP <> 0 THEN SAvg! = BR.BHitsLHP / BR.BABsLHP ELSE SAvg! = 0
MID$(a$, 1, 15) = " .vs LHP"
IF SAvg! > 0 THEN
MID$(a$, 19, 5) = FFORMAT$(SAvg!, "#.###")
END IF
MID$(a$, 32, 6) = LFORMAT$(BR.BABsLHP, "######")
MID$(a$, 46, 6) = LFORMAT$(BR.BHitsLHP, "######")
MID$(a$, 60, 5) = LFORMAT$(BR.B2BsLHP, "#####")
MID$(a$, 66, 5) = LFORMAT$(BR.B3BsLHP, "#####")
MID$(a$, 72, 6) = LFORMAT$(BR.BHRsLHP, "######")
MID$(a$,104, 6) = LFORMAT$(BR.BBBsLHP, "######")
MID$(a$,111, 6) = LFORMAT$(BR.BKsLHP, "######")
'Expanded individual batting statistics
TB = BR.BHitsLHP + BR.B2BsLHP + 2 * BR.B3BsLHP + 3 * BR.BHRsLHP
MID$(a$, 53, 6) = LFORMAT$(TB, "######")
IF BR.BABsLHP > 0 THEN
Slugx! = TB / BR.BABsLHP
ELSE
Slugx! = 0.0
END IF
IF BR.BABsLHP > 0 THEN
HRPctx! = BR.BHRsLHP / BR.BABsLHP * 100
ELSE
HRPctx! = 0.0
END IF
IF BR.BHB > 0 AND BR.BABs > 0 THEN
BHBLHP = (BR.BABsLHP / BR.BABs) * BR.BHB
ELSE
BHBLHP = 0
END IF
IF BR.BABs > 0 THEN
OnBasex! = (BR.BBBsLHP + BHBLHP + BR.BHitsLHP) / _
(BR.BBBsLHP + BHBLHP + BR.BABsLHP)
ELSE
OnBasex! = 0.0
END IF
MID$(a$,148, 5) = FFORMAT$(Onbasex!, "#.###")
MID$(a$,154, 5) = FFORMAT$(Slugx!, "#.###")
MID$(a$,160, 4) = FFORMAT$(HRPctx!, "#0.#")
Prodx! = OnBasex! + Slugx!
MID$(a$,165, 5) = FFORMAT$(Prodx!, "#.###")
PRINT #OUTHdl, a$
END IF
END IF
RETURN
StripNulls:
FOR ix = 1 TO LEN(a$)
IF MID$(a$, ix, 1) = CHR$(0) THEN MID$(a$, ix, 1) = " "
NEXT
RETURN
NewPage:
PRINT #OUTHdl,
PRINT #OUTHdl,
PageNo = PageNo + 1
PRINT #OUTHdl, "SBS 4.9.3"; TAB(35); "Strategic Baseball Statistics"
PRINT #OUTHdl,
LineCtr = 3
RETURN
SearchTable:
i = 1
DO
IF i > TblEnd THEN
IF TblEnd < STATTEAMLIMIT THEN
INCR TblEnd
SA(TblEnd).ALeague = LeagueArg
SA(TblEnd).ANam = NameArg
ELSE
PRINT " Team Limit Exceeded! "
PauseIt
END IF
ndx = TblEnd
EXIT DO
END IF
IF SA(i).ALeague = LeagueArg AND SA(i).ANam = NameArg THEN
ndx = i
EXIT DO
END IF
INCR i
LOOP
RETURN
GetLeagueName:
SELECT CASE UCASE$(SaveLeague$)
CASE "A"
LeagueName$ = "A.L."
CASE "N"
LeagueName$ = "N.L."
CASE "F"
LeagueName$ = "Federal"
CASE ELSE
LeagueName$ = SaveLeague$
END SELECT
RETURN
END SUB
SUB StatRecordSetup (Flds, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
CALL Drawfrm(2+rowO, 7+colO, 23+rowO, 73+colO, defattr, "Statistics Recording", "ESC (or close window) to Continue", 1, 0, 1)
QPRINTs rowO+3,colO+22, "Specify Files to Save Statistical Data", defattr
QPRINTs rowO+5,colO+9, "Note: These entries are all optional, but if you want to record ", dimattr
QPRINTs rowO+6,colO+9, "basic statistics in order to generate a stat report, you must ", dimattr
QPRINTs rowO+7,colO+9, "at least enter a filename for 'Statistics File'. To select an ", dimattr
QPRINTs rowO+8,colO+9, "existing Statistics file press .", dimattr
QPRINTs rowO+8,colO+40,"[F4]", defattr
DATA 9,52," Clear", 0,0,0,"X "
DATA 10,52,"Existing?",0,0,0,"X "
DATA 11,15,"Statistics File: ",11,32,16,"X "
DATA 0,00,"", 11,55,01,"XR"
DATA 13,15,"Line Score File: ",13,32,18,"X "
DATA 0,00,"", 13,55,01,"XR"
DATA 15,15,"Box Score File: ",15,32,18,"X "
DATA 0,00,"", 15,55,01,"XR"
DATA 17,15,"Score Card File: ",17,32,18,"X "
DATA 0,00,"", 17,55,01,"XR"
DATA 19,15,"StarBox File: ",19,32,18,"X "
DATA 0,00,"", 19,55,01,"XR"
QPRINTs rowO+21, colO+9, "The STARBOX file contains box scores of outstanding individual ", dimattr
QPRINTs rowO+22, colO+9, "performances. Leave fields BLANK where data is not desired. ", dimattr
QPRINTs rowO+11, colO+49, "+", revattr
QPRINTs rowO+11, colO+58, "Caution: ", dimattr
QPRINTs rowO+12, colO+58, "[Y] will erase ", dimattr
QPRINTs rowO+13, colO+58, "all data in ", dimattr
QPRINTs rowO+14, colO+58, "specified file.", dimattr
c = 1
FOR i = 1 TO 12
Flitrow(i) = VAL(READ$(c))
IF Flitrow(i) > 0 THEN Flitrow(i) = Flitrow(i) + rowO
Flitcol(i) = VAL(READ$(c+1))
IF Flitcol(i) > 0 THEN Flitcol(i) = Flitcol(i) + colO
Flit$(i) = READ$(c+2)
Frow(i) = VAL(READ$(c+3))
IF Frow(i) > 0 THEN Frow(i) = Frow(i) + rowO
Fcol(i) = VAL(READ$(c+4))
IF Fcol(i) > 0 THEN Fcol(i) = Fcol(i) + colO
Flen(i) = VAL(READ$(c+5))
Fed$(i) = READ$(c+6)
c = c + 7
NEXT
Flds = 12
'Set Defaults
REDIM FContents$(13)
FContents$(3) = CmdStat$ 'May not be defined yet
FContents$(4) = "N"
FContents$(5) = CmdLinF$
FContents$(6) = "N"
FContents$(7) = CmdBoxF$
FContents$(8) = "N"
FContents$(9) = CmdScrF$
FContents$(10) = "N"
FContents$(11) = CmdStar$
FContents$(12) = "N"
END SUB
SUB StatRecordIO (RetKey, Flds, CursorPtr, Plen(), Prow(), Pcol(), Ped$(), Plit$(), Plitrow(), Plitcol(), PContents$())
DO
StatRecordLoop:
CustomEscKey = -62 'F4
TakeFromAnywhere = 2
CALL ScreenIO(Keyed, KeyF3, CustomEscKey, KeyEsc, Flds, CursorPtr, Plen(), Prow(), Pcol(), Ped$(), Plit$(), Plitrow(), Plitcol(), PContents$())
TakeFromAnywhere = 0
IF Keyed = KeyF3 THEN
RetKey = Keyed
EXIT SUB
END IF
IF Keyed = CustomEscKey THEN 'F4 - Browse/Select .STS files
CALL GetScreen(Scr3$, 3+rowO, 62+colO, 21+rowO, 76+colO)
FileLimit = 500
REDIM List1(1 TO FileLimit) AS List1Type
x$ = MenuOpt$
MenuOpt$ = "1"
Fil$ = CmdWritePath$ + "*.STS"
CALL PickAFile (Fil$, FileLimit, List1(), RetKey, Pick, mous, 0)
MenuOpt$ = x$
IF Pick > 0 THEN
x$ = RTRIM$(List1(Pick).ListItem)
L = LEN(x$)
PContents$(3) = LEFT$(x$, L - 4)
END IF
ERASE List1
CALL PutScreen(Scr3$, 3+rowO, 62+colO, 21+rowO, 76+colO)
GOTO StatRecordLoop
END IF
' Edit Field Contents
Error1$ = "N"
i = 4
DO
IF PContents$(i) <> "Y" AND PContents$(i) <> "N" THEN
Error1$ = "Y": CursorPtr = i: CALL MyBeep: GOTO StatRecordLoop
END IF
i = i + 2
LOOP UNTIL i > 12
IF PContents$(3) > "!" THEN
IF PContents$(3) = PContents$(5) OR PContents$(3) = PContents$(7) OR PContents$(3) = PContents$(9) OR PContents$(3) = PContents$(11) THEN
CALL PopMsg(18+rowO, 26+colO, " File names must be different! ", errattr, 2, kc)
Error1$ = "Y"
CursorPtr = 3
GOTO StatRecordLoop
END IF
END IF
IF PContents$(7) > "!" AND LEFT$(PContents$(7), 3) <> "LPT" THEN
IF PContents$(7) = PContents$(9) THEN
CALL PopMsg(18+rowO, 26+colO, " File names must be different! ", errattr, 2, kc)
Error1$ = "Y"
CursorPtr = 8
GOTO StatRecordLoop
END IF
END IF
IF PContents$(3) > "!" THEN
zS$ = CmdWritePath$ + RTRIM$(PContents$(3)) + ".RES"
IF CmdSCH$ > "!" THEN
IF LEN(DIR$(zS$)) THEN
OPEN zS$ FOR RANDOM AS #5 LEN = LEN(RestartRec)
GET #5, 1, RestartRec
CLOSE #5
IF UCASE$(RTRIM$(RestartRec.ResSCHName)) <> UCASE$(RTRIM$(CmdSCH$)) THEN
QPush
CALL Drawfrm(9, 14, 22, 64, linattr, "*** ERROR ***", nulls$, 0, 0, 0)
QPRINTs 10, 16, " SBS believes this Stat File is currently ", errattr
QPRINTs 11, 16, " being used by another Schedule file. ", errattr
QPRINTs 13, 16, " Selected SCH Name: " + RTRIM$(CmdSCH$), errattr
QPRINTs 14, 16, " Restart File : " + zS$, errattr
QPRINTs 15, 16, " Restart SCH Name : " + RTRIM$(RestartRec.ResSCHName), errattr
QPRINTs 16, 16, " Restart Date : " + RestartRec.ResSCHDate, errattr
QPRINTs 17, 16, " Restart Slot : " + STR$(RestartRec.ResSCHSlotPtr), errattr
QPRINTs 18, 16, " Slot Game : " + STR$(RestartRec.ResSlotGameCtr), errattr
QPRINTs 19, 16, " of : " + STR$(RestartRec.ResSlotGames), errattr
QPRINTs 20, 16, " Restart Sch Game : " + STR$(RestartRec.ResSimGameCtr), errattr
QPRINTs 21, 16, " (The SCH names must match)", errattr
PauseIt
QPop
Error1$ = "Y"
CursorPtr = 3
GOTO StatRecordLoop
END IF
END IF
ELSE 'NOT in SCH mode
IF LEN(DIR$(zS$)) THEN 'but a .RES exists
QPush
CALL Drawfrm(9, 14, 14, 64, linattr, "*** WARNING ***", nulls$, 0, 0, 0)
QPRINTs 10, 16, " SBS believes this Stat File may be currently ", errattr
QPRINTs 11, 16, " in use by a Schedule file. ", errattr
QPRINTs 12, 16, " Do you want to use it anyway? [y/N]:", errattr
LOCATE 12, 54
xS$ = YESorNO$(revfor, revbac, deffor, defbac, "N")
QPop
IF xS$ <> "Y" THEN
Error1$ = "Y"
CursorPtr = 3
GOTO StatRecordLoop
END IF
END IF
END IF
END IF
LOOP WHILE Error1$ = "Y"
IF PContents$(3) > "!" THEN
CmdStat$ = PContents$(3)
i = INSTR(CmdStat$, ".")
IF i > 0 THEN CmdStat$ = LEFT$(CmdStat$, i - 1) ELSE CmdStat$ = RTRIM$(CmdStat$)
CmdStat$ = TRUNCFILENAME$(CmdStat$)
IF PContents$(4) = "Y" THEN
xS$ = CmdStat$ + ".STS"
GOSUB SIOchkkill
xS$ = CmdStat$ + ".STB"
GOSUB SIOchkkill
xS$ = CmdStat$ + ".STP"
GOSUB SIOchkkill
xS$ = CmdStat$ + ".STF"
GOSUB SIOchkkill
xS$ = CmdStat$ + ".STH"
GOSUB SIOchkkill
xS$ = CmdStat$ + ".RES"
GOSUB SIOchkkill
xS$ = CmdStat$ + ".ROT"
GOSUB SIOchkkill
xS$ = CmdStat$ + ".STD"
GOSUB SIOchkkill
END IF
ELSE
CmdStat$ = nulls$
END IF
IF PContents$(5) > "!" THEN
CmdLinF$ = RTRIM$(PContents$(5))
IF LEFT$(CmdLinF$, 3) <> "LPT" THEN
IF LEN(DIR$(CmdWritePath$ + CmdLinF$)) THEN
IF PContents$(6) = "Y" THEN KILL CmdWritePath$ + CmdLinF$
END IF
END IF
ELSE
CmdLinF$ = nulls$
END IF
IF PContents$(7) > "!" THEN
CmdBoxF$ = RTRIM$(PContents$(7))
IF LEFT$(CmdBoxF$, 3) <> "LPT" THEN
IF LEN(DIR$(CmdWritePath$ + CmdBoxF$)) THEN
IF PContents$(8) = "Y" THEN KILL CmdWritePath$ + CmdBoxF$
END IF
END IF
ELSE
CmdBoxF$ = nulls$
END IF
IF PContents$(9) > "!" THEN
CmdScrF$ = RTRIM$(PContents$(9))
IF LEFT$(CmdScrF$, 3) <> "LPT" THEN
IF LEN(DIR$(CmdWritePath$ + CmdScrF$)) THEN
IF PContents$(10) = "Y" THEN KILL CmdWritePath$ + CmdScrF$
END IF
END IF
ELSE
CmdScrF$ = nulls$
END IF
IF PContents$(11) > "!" THEN
CmdStar$ = RTRIM$(PContents$(11))
IF LEFT$(CmdStar$, 3) <> "LPT" THEN
IF LEN(DIR$(CmdWritePath$ + CmdStar$)) THEN
IF PContents$(12) = "Y" THEN KILL CmdWritePath$ + CmdStar$
END IF
END IF
ELSE
CmdStar$ = nulls$
END IF
RetKey = Keyed
EXIT SUB
SIOchkkill:
IF LEN(DIR$(CmdWritePath$ + xS$)) THEN KILL CmdWritePath$ + xS$
RETURN
END SUB
SUB STEALRoutine
ON ERROR GOTO ERRORTRAP
IF ir1 = 0 AND ir2 = 0 AND ir3 = 0 THEN
CALL PopMsg(18+rowO, 26+colO, " There are no baserunners! ", errattr, 2, 0)
GOTO 17900
END IF
DoubleSteal = FALSE
J1 = 0
J2 = 0
xF! = RND
'Who is the lead runner?
IF ir3 THEN 'runner on third
yF! = DataSpeed(ir3, it) / 10
IF POut THEN yF! = yF! * .50 'Cut chances (speed) by 50% if pitch-out
GOTO 17500
END IF
'No runner on third
IF ir2 = 0 THEN
'Only runner is on first
IL = ir1
J1 = 1
ELSE
'Runner on 2nd (maybe 1st too)
IL = ir2
J2 = 1
END IF
'Steal or H&Run
IF HitAndRun THEN t$ = "02" ELSE t$ = "01"
IF DelFac THEN CALL Msg ("25", "0", "0", t$, IL, it, man2, team2)
'Runners on 1st or 2nd or both; (and nobody on third)
17020 :
IF ir1 AND ir2 THEN
IF amgr(it) = 0 THEN
'Player is calling the shots
x$ = " Attempt double steal? [y/N]"
CALL PopMsg(10+rowO, 30+colO, x$, errattr, 0, kc)
IF UCASE$(CHR$(kc)) = "Y" THEN DoubleSteal = TRUE
ELSE
'Computer is in control
IF RND < .75 THEN DoubleSteal = TRUE
END IF
END IF
'Calculate probability of being safe
'Examine CS column
IF StBSw(it) <> 0 THEN 'Header indicates SB as opposed to Speed-Rating
s = 0 'Sum CS for non-pitchers
FOR i = 1 TO 9
IF DataPos(i, it) > 1 THEN
s = s + DataCS(i, it)
END IF
NEXT
END IF
'Using old "speed rating"
IF StBSw(it) = 0 THEN
yF! = DataSpeed(IL, it) / 10
ELSE
'Calculate raw success rate (yF!)
IF s = 0 THEN
n = DataSB(IL, it) * 0.27 '.40
ELSE
n = DataCS(IL, it)
END IF
'We have SB and CS data
IF DataSB(IL, it) + n > 10 THEN 'Plenty of data
yF! = DataSB(IL, it) / (DataSB(IL, it) + n)
ELSEIF DataSB(IL, it) + n > 0 THEN 'Limited data
yF! = DataSB(IL, it) / (DataSB(IL, it) + n)
'set limits for low-data situations
IF yF! < .2 THEN yF! = .2
IF yF! > .7 THEN yF! = .7
IF DataPos(IL, it) = 1 THEN yF! = .6
ELSE 'No data
yF! = .6
END IF
END IF
'Cut success rate for pitchouts and lefties
Adj! = 1.0
'No Pitchout
IF POut = FALSE THEN
INCR zzzNoPO
IF J1 = 1 THEN 'Lead runner is on 1st
IF UCASE$(DataHand(ip, id)) = "L" THEN
Adj! = Adj! - .16
ELSE
Adj! = Adj! + .02
END IF
ELSE 'Lead runner is on 2nd
IF UCASE$(DataHand(ip, id)) = "R" THEN
Adj! = Adj! - .16
ELSE
Adj! = Adj! + .02
END IF
END IF
ELSE
'Pitchout
' 4.7
' yF! Succ w/PO Cut
'.50 .16 68
'.60 .22 63
'.70 .32 54
'.80 .46 43
'.90 .70 22
'.99 .90 9
IF yF! < .50 THEN
Adj! = Adj! - .68
ELSE
zF! = .567 - (1.987 * yF!) + (2.340 * yF! * yF!) 'Success rate w/PO
cutit! = 1 - (zF! / yF!)
Adj! = Adj! - cutit!
END IF
IF yF! < .40 THEN
INCR zz0
ELSEIF yF! < .5 THEN
INCR zz1
ELSEIF yF! < .6 THEN
INCR zz2
ELSEIF yF! < .7 THEN
INCR zz3
ELSEIF yF! < .8 THEN
INCR zz4
ELSEIF yF! < .9 THEN
INCR zz5
ELSE
INCR zz6
END IF
INCR zzzPO
END IF
yF! = yF! * Adj!
IF yF! < .02 THEN yF! = .02
IF yF! > .98 THEN yF! = .98
wag = WHOATGUY(2)
IF DelFac THEN CALL Msg ("25", "0", "0", "07", wag, id, man2, team2) '*'s throw
IF xF! < yF! THEN 'Safe!
IF DataPos(IL, it) = 1 THEN INCR zzssbp
IF DelFac THEN
CALL Msg ("25", "0", "0", "03", IL, it, man2, team2) 'in there
CALL Msg ("25", "0", "0", "04", IL, it, man2, team2) 'SB!
END IF
'Credit Lead Runner with Stolen Base
GOSUB CreditSB
IF ir2 AND DoubleSteal = FALSE THEN
CALL Advanc(0, 1, 0)
ELSE
CALL Advanc(1, 1, 0)
END IF
CALL AddToScoreCrd(it, DataRef(IL, it), "6", "SB")
IF ITrail THEN CALL AddToScoreCrd(it, DataRef(ITrail, it), "6", "SB")
zzzsb = zzzsb + 1
ELSE 'Out! or Catcher throws it away!
f! = 4.7 - (TeamSpeed(it) / 2.)
IF f! < 2. THEN f! = 2.
defp! = DEFPCT!(wag)
zF! = 1.0 - (f! * (1.0 - defp!))
IF zF! < .7 THEN zF! = .7
IF RND > zF! THEN
'Catcher throwing error
INCR iterrs(id)
INCR inne
INCR innadverr
i = DataRef(wag, id)
INCR GpPos(i, id, 2)
INCR merr(i, id)
INCR SumErrors(2)
IF DelFac THEN
CALL Msg ("30", "0", "0", "02", 0, id, man2, team2) 'W.Throw
CALL Msg ("30", "0", "0", "09", wag, id, man2, team2) 'E-2
END IF
'Credit Runner with Stolen base
GOSUB CreditSB
Errorx = TRUE
CALL Advanc(2, 2, 1) 'Everybody advances
Errorx = FALSE
CALL AddToScoreCrd(it, DataRef(IL, it), "6", "SB/E-2")
IF ITrail THEN CALL AddToScoreCrd(it, DataRef(ITrail, it), "6", "SB")
zzzcer = zzzcer + 1
ELSE
'Out!
IF DelFac THEN CALL Msg ("25", "0", "0", "05", IL, it, man2, team2) 'OUT
INCR mcs(DataRef(IL, it), it)
IF DelFac THEN CALL Msg ("25", "0", "0", "06", wag, id, man2, team2) 'Nails him
IF J2 = 1 THEN ir2 = 0
IF J1 = 1 THEN ir1 = 0
ir2 = ir1
ir1 = 0
INCR Assists(DataRef(WHOATGUY(2), id), id, 2)
IF J2 = 1 THEN 'out at 3rd
Oat$ = "3"
n = 5
ELSE 'out at 2nd
Oat$ = "2"
IF DataHand(ib, it) = "R" THEN n = 4 ELSE n = 6
END IF
INCR PutOuts(DataRef(WHOATGUY(n), id), id, n)
INCR iout
INCR mpo(ip, id)
CALL AddToScoreCrd(it, DataRef(IL, it), Oat$, "CS 2-" + LTRIM$(STR$(n)) )
fr7 = 90 'signals runner thrown out
zzzcs = zzzcs + 1
END IF
END IF
GOTO 17900
'Trying to steal home - OR - 1st & 3rd and trying to steal 2nd
17500 :
IF ir2 = 0 AND ir1 <> 0 THEN '1st & 3rd
DoubleSteal = FALSE
IF amgr(it) = 0 THEN
'Player is calling the shots
x$ = " Attempt double steal? [y/N]"
CALL PopMsg(10+rowO, 30+colO, x$, errattr, 0, kc)
IF UCASE$(CHR$(kc)) = "Y" THEN DoubleSteal = TRUE
ELSE
'Computer is in control
IF RND < .10 THEN DoubleSteal = TRUE
END IF
IF NOT DoubleSteal THEN 'Just trying to steal 2nd
IL = ir1: J1 = 1
IF DelFac THEN
'There goes *!
CALL Msg ("25", "0", "0", "08", ir1, it, man2, team2)
END IF
GOTO 17020
ELSE 'Double Steal
wF! = .28
END IF
ELSE 'Lone runner on 3rd or bases-loaded
wF! = .48
END IF
IF DelFac THEN
AddToAnnouncer it, "The 'Steal' is on!!"
CALL Msg ("24", "0", "0", "10", ir3, it, man2, team2) 'here he comes
END IF
'Runner on 3rd (maybe 1st and/or 2nd too) trying to steal home
' xF! is a RND
' wF! is either .28 or .48
' yF! is Speed / 10 of guy on third
IF (xF! + wF!) < yF! THEN 'Safe (not too often)
'4:0% 5: 2% 6:12% 7:22% 8:32% 9:42% 'for wF! = .48 (naked steal of home)
'4:12% 5:22% 6:32% 7:42% 8:52% 9:62% 'for wF! = .28 (double steal)
'Safe at home!
IF DelFac THEN
CALL Msg ("15", "0", "0", "04", ir3, it, man2, team2) 'safe
AddToAnnouncer it, "He stole home!!!"
CALL Msg ("40", "0", "0", "00", 0, it, man2, team2) '!!!
END IF
'Credit guy who's about to score with SB
IL = ir3
INCR msb(DataRef(ir3, it), it)
DPsw = TRUE 'to fool Advanc into not awarding an RBI
CALL Advanc(1, 1, 1)
DPsw = FALSE
CALL AddToScoreCrd(it, DataRef(IL, it), "6", "SB")
'to zero out score reference on additional score card lines:
RunsBeforePlay = itruns(it)
'Credit guy now on third with a SB
IF ir3 THEN
INCR msb(DataRef(ir3, it), it)
CALL AddToScoreCrd(it, DataRef(ir3, it), "6", "SB")
END IF
'Credit guy now on second with a SB
IF ir2 THEN
INCR msb(DataRef(ir2, it), it)
CALL AddToScoreCrd(it, DataRef(ir2, it), "6", "SB")
END IF
ELSE
'Out at home
INCR mcs(DataRef(ir3, it), it)
IF DelFac THEN
CALL Msg ("14", "0", "0", "04", ir3, it, man2, team2) 'OUT
CALL Msg ("40", "0", "0", "00", 0, it, man2, team2) '!!!
END IF
IL = ir3
ir3 = ir2
ir2 = ir1
ir1 = 0
IF ir2 THEN INCR msb(DataRef(ir2, it), it)
IF ir3 THEN INCR msb(DataRef(ir3, it), it)
INCR PutOuts(DataRef(WHOATGUY(2), id), id, 2)
IF DataHand(ib, it) = "R" THEN n = 4 ELSE n = 6
INCR Assists(DataRef(WHOATGUY(n), id), id, n)
INCR iout
INCR mpo(ip, id)
fr7 = 90 'signals runner thrown out
' CALL AddToScoreCrd(it, DataRef(IL, it), "1", "X-CS")
CALL AddToScoreCrd(it, DataRef(IL, it), "4", "CS " + LTRIM$(STR$(n)) + "-2")
END IF
17900 : 'Reset batter pointer and ABs
CALL ResetBatter
EXIT SUB
CreditSB:
'Credit lead runner with Stolen Base
'We have not called ADVANC yet
INCR msb(DataRef(IL, it), it)
'Credit trailing runner with SB also
ITrail = 0
IF IL = ir2 THEN
IF ir1 AND DoubleSteal THEN
INCR msb(DataRef(ir1, it), it)
ITrail = ir1
END IF
END IF
RETURN
ErrorTrap:
LOCATE 10, 30
PRINT "STEAL_Error"; ERRCLEAR
x$ = WAITKEY$
END SUB
SUB StrikeOutRoutine
INCR iout
INCR mso(ref, it) 'credit hitter
IF UCASE$(DataHand(ip, id)) = "L" THEN
INCR msoLHP(ref, it)
ELSE
INCR msoRHP(ref, it)
END IF
INCR mpo(ip, id) 'credit pitcher
INCR mpk(ip, id) ' " " " " "
INCR PutOuts(DataRef(WHOATGUY(2), id), id, 2) 'give catcher a PutOut
'Struck him out!
IF DelFac THEN
IF HitAndRun THEN
AddtoAnnouncer it, "Swing and a miss!"
AddtoAnnouncer it, "Struck him out!"
CALL WavWhiff
ELSE
t$ = PADZEROS$( LTRIM$(STR$(RND(1, 2))) , 2)
CALL Msg ("19", "0", "1", t$, ib, it, man2, team2)
CALL Msg ("19", "0", "2", t$, ib, it, man2, team2)
IF t$ = "01" THEN CALL WavWhiff ELSE CALL WavPopMitt
END IF
END IF
Result$ = "K"
'
' DTS - Dropped Third Strike
'
'Not sure about the rule
IF ir1 = 0 AND ir2 = 0 AND ir3 = 0 THEN 'nobody on
'Wild Pitch or Passed Ball on third strike?
pbal = 0
wpit = 0
xF! = RND
yF! = DataBB(ip,id) / BattersFacedByPit! (DataAB(ip,id), DataHits(ip,id), DataBB(ip,id), DataSO(ip,id))
wp! = .017 * (yF! / pwbaseF(id)) / 9
IF xF! < wp! THEN
WildPit(id) = WildPit(id) + PADZEROS$(LTRIM$(STR$(ip)), 2)
Result$ = Result$ + "-DTS WP"
wpit = -1
ELSE
nn = WHOATGUY(2)
defperF! = DEFPCT!(nn)
zF! = (1.0 - defperF!) * .03
IF xF! < wp! + zF! THEN
PassedB(id) = PassedB(id) + PADZEROS$(LTRIM$(STR$(DataRef(nn, id))), 2)
Result$ = Result$ + "-DTS PB"
pbal = -1
ELSE
EXIT SUB
END IF
END IF
'Back out of some of the stats
DECR iout
DECR mpo(ip, id)
DECR PutOuts(DataRef(WHOATGUY(2), id), id, 2)
'Announcer
IF DelFac THEN
AddToAnnouncer id, "The ball gets away!"
AddToAnnouncer it, "And the batter is going to be safe at first!"
IF wpit THEN AddToAnnouncer id, "Score that one a 'wild pitch'"
IF pbal THEN AddToAnnouncer id, "Score that one a 'passed ball'"
END IF
'Put Batter on
ir1 = ib
mpp(ib) = ip
mpp(ib) = -mpp(ib)
END IF
END SUB
SUB Switch (p1, p2, team)
IF p1 < 1 OR p1 > MAXPLAYERS THEN
x$ = "Bad call to player switch: P1=" + STR$(p1)
CALL ErrorBox (x$)
GOTO SwEsc
END IF
IF p2 < 1 OR p2 > MAXPLAYERS THEN
x$ = "Bad call to player switch: P2=" + STR$(p2)
CALL ErrorBox (x$)
GOTO SwEsc
END IF
IF team < 1 OR team > 2 THEN
x$ = "Bad call to player switch: team=" + STR$(team)
CALL ErrorBox (x$)
GOTO SwEsc
END IF
SWAP iused(p1, team), iused(p2, team)
SWAP DataName(p1, team), DataName(p2, team)
SWAP DataPlat(p1, team), DataPlat(p2, team)
SWAP DataHand(p1, team), DataHand(p2, team)
SWAP DataCode(p1, team), DataCode(p2, team)
SWAP DataRef(p1, team), DataRef(p2, team)
SWAP DataPos(p1, team), DataPos(p2, team)
SWAP DataAB(p1, team), DataAB(p2, team)
SWAP DataHits(p1, team), DataHits(p2, team)
SWAP Data2B(p1, team), Data2B(p2, team)
SWAP Data3B(p1, team), Data3B(p2, team)
SWAP DataHR(p1, team), DataHR(p2, team)
SWAP DataBB(p1, team), DataBB(p2, team)
SWAP DataHP(p1, team), DataHP(p2, team)
SWAP DataSO(p1, team), DataSO(p2, team)
SWAP DataRBI(p1, team), DataRBI(p2, team)
SWAP DataDef(p1, team), DataDef(p2, team)
SWAP DataSB(p1, team), DataSB(p2, team)
SWAP DataCS(p1, team), DataCS(p2, team)
SWAP DataGames(p1, team), DataGames(p2, team)
FOR i = 1 TO 4
SWAP DataPosi(p1, team, i), DataPosi(p2, team, i)
SWAP DataGByP(p1, team, i), DataGByP(p2, team, i)
NEXT
SWAP DataSpeed(p1, team), DataSpeed(p2, team)
'SWAP DataPBatAB(p1, team), DataPBatAB(p2, team)
'SWAP DataPBatHi(p1, team), DataPBatHi(p2, team)
'SWAP DataPBatHR(p1, team), DataPBatHR(p2, team)
'SWAP DataPBatBB(p1, team), DataPBatBB(p2, team)
'SWAP DataPBatSO(p1, team), DataPBatSO(p2, team)
SwEsc:
END SUB
SUB SwitchToDH (tm)
FOR i = 1 TO 9
IF DataPos(i, tm) = 10 AND DataName(i, tm) > "A" THEN EXIT SUB
NEXT
' Create a hole for the DH and bring 1st player on bench into it
CALL Switch(8, 9, tm)
CALL Switch(7, 8, tm)
CALL Switch(6, 7, tm)
CALL Switch(5, 6, tm)
'Normally the pitcher will now be in slot 5, but that is not the case if
'in the .DAT file he bats something other than 9
'So, find the pitcher:
ps = 0
FOR i = 1 TO 9
IF DataPos(i, tm) = 1 THEN ps = i : EXIT FOR
NEXT
IF ps > 0 THEN
CALL Switch(ps, LastPiAd(tm) + 1, tm)
DataPos(ps, tm) = 10
ELSE
x$ = "No Pitcher Found in .DAT"
CALL ErrorBox (x$)
END IF
'Rotate the garbage in slot LastPiAd + 1 down to slot MAXPLAYERS
i = LastPiAd(tm) + 1
DO
CALL Switch(i, i + 1, tm)
INCR i
LOOP UNTIL i > MAXPLAYERS - 1
DataPos(MAXPLAYERS, tm) = 0
DataName(MAXPLAYERS, tm) = SPACE$(18)
FOR i = 1 TO 4
DataPosi(MAXPLAYERS, tm, i) = 0
DataGByP(MAXPLAYERS, tm, i) = 0
NEXT
END SUB
SUB SwitchToNoDH (tm)
'Look for DH already in lineup
s = 0
PitSlot = 0
FOR i = 1 TO 9
IF DataPos(i, tm) = 10 AND DataName(i, tm) > "A" THEN s = i
IF DataPos(i, tm) = 1 THEN PitSlot = i
NEXT
IF s = 0 THEN
IF PitSlot = 0 THEN PitSlot = 9
GOTO SwitchToNoDHX
END IF
' DH is in slot "s" -- get rid of it
' we assume no pitcher is in the lineup
' Push down bench - clear spot in LastPiAd + 1
i = MAXPLAYERS
DO
CALL Switch(i - 1, i, tm)
DECR i
LOOP UNTIL i = LastPiAd(tm) + 1
' Put former DH on the bench, position left field
CALL Switch(s, LastPiAd(tm) + 1, tm)
DataPos(LastPiAd(tm) + 1, tm) = 7
' Collapse starting lineup around where DH used to be
i = s
DO UNTIL i > 8
CALL Switch(i + 1, i, tm)
INCR i
LOOP
PitSlot = 9
SwitchToNoDHX:
' Move Pitcher's hitting stats to PitSlot
CALL MovePitHitStats (PitSlot, tm)
END SUB
SUB ThrowOutCheck (B1, B2, ThrowOutChance1, ThrowOutChance2, ThrowToThird, ConcedeRun) STATIC
ON ERROR GOTO ERRORTRAP
'Possibly throw out a baserunner:
'In: B1, B2 [number of bases to attempt to advance for 1st & 2nd, resp.]
'call this routine BEFORE Advanc
'We can't handle 2 people being thrown out on the same play, so as soon
'as someone gets nailed, return.
IF HitAndRun THEN xF! = .999 ELSE xF! = RND
IF HitType = 1 THEN
'Nobody gets thrown out if winning run will score from third
IF inn >= RegInns AND it = 2 THEN
IF ir3 > 0 THEN
IF itruns(2) + 1 > itruns(1) THEN
EXIT SUB
END IF
END IF
END IF
IF ir2 > 0 THEN
IF B2 = 2 THEN 'On a single can R/2nd score?
IF DelFac THEN
IF ThrowToThird THEN
' * scores as the throw goes to third...
CALL Msg ("31", "0", "0", "12", ir2, it, man2, team2)
ELSE
IF ConcedeRun = TRUE THEN
'* will score without a throw...
CALL Msg ("31", "0", "0", "15", ir2, it, man2, team2)
ELSE
'Rounds third and heads for home...
CALL Msg ("31", "0", "0", "01", ir2, it, man2, team2)
AddToAnnouncer it, "He is...."
END IF
END IF
END IF
yF! = ThrowOutChance1 / 100.0
IF xF! < yF! THEN
INCR mpo(ip, id)
IF DelFac THEN CALL Msg ("14", "0", "0", "07", ir2, it, man2, team2) 'OUT
ref2 = DataRef(ir2, it)
' "X-@Home"
Result2$ = LTRIM$(STR$(WhoAtPos)) + "-2"
Code2$ = "4"
INCR Assists(DataRef(WHOATGUY(WhoAtPos), id), id, WhoAtPos)
INCR PutOuts(DataRef(WHOATGUY(2), id), id, 2)
ir2 = 0
EXIT SUB
ELSE
IF DelFac THEN
IF ThrowToThird = FALSE AND ConcedeRun = FALSE THEN CALL Msg ("15", "0", "0", "09", ir2, it, man2, team2) 'SAFE
END IF
RunAnnounced = TRUE
END IF
ELSE
'slams on the brakes at third..."
IF DelFac THEN CALL Msg ("16", "0", "0", "03", ir2, it, man2, team2)
EXIT SUB
END IF
END IF
IF ir1 > 0 THEN
IF B1 = 2 THEN 'On a single can R/1st goto 3rd?
'* heads for third
IF DelFac THEN CALL Msg ("31", "0", "0", "02", ir1, it, man2, team2)
yF! = ThrowOutChance2 / 100.0
IF xF! < yF! + .15 THEN
IF DelFac THEN
'They've got a shot at him...
CALL Msg ("31", "0", "0", "13", ir1, it, man2, team2)
AddToAnnouncer it, "He is..."
END IF
END IF
IF xF! < yF! THEN
INCR mpo(ip, id)
IF DelFac THEN CALL Msg ("14", "0", "0", "03", ir1, it, man2, team2) 'OUT
ref2 = DataRef(ir1, it)
' Result2$ = "X-@3rd"
Result2$ = LTRIM$(STR$(WhoAtPos)) + "-5"
Code2$ = "3"
INCR Assists(DataRef(WHOATGUY(WhoAtPos), id), id, WhoAtPos)
INCR PutOuts(DataRef(WHOATGUY(5), id), id, 5)
ir1 = 0
EXIT SUB
ELSE
IF ANx > 2 THEN t$ = "09" ELSE t$ = "06"
IF DelFac THEN CALL Msg ("15", "0", "0", t$, ir1, it, man2, team2) 'SAFE
'He's in there...
'error possibility:
END IF
ELSE
'* stops at 2nd
IF DelFac THEN CALL Msg ("16", "0", "0", "02", ir1, it, man2, team2) 'HOLD
END IF
END IF
END IF
IF HitType = 2 AND ir1 > 0 THEN
'Nobody gets thrown out if winning run will score from 2nd or 3rd
IF inn >= RegInns AND it = 2 THEN
LeadRunners = 0
IF ir3 > 0 THEN INCR LeadRunners
IF ir2 > 0 THEN INCR LeadRunners
IF itruns(2) + LeadRunners > itruns(1) THEN
EXIT SUB
END IF
END IF
IF B1 = 3 THEN 'taking 3 bases on a double
'* rounds third
IF DelFac THEN
CALL Msg ("31", "0", "0", "01", ir1, it, man2, team2)
AddToAnnouncer it, "He is...."
END IF
yF! = ThrowOutChance1 / 100.0
IF xF! < yF! THEN
INCR mpo(ip, id)
'OUT at the plate!
IF DelFac THEN CALL Msg ("14", "0", "0", "07", ir1, it, man2, team2) 'OUT
ref2 = DataRef(ir1, it)
' Result2$ = "X-@Home"
Result2$ = LTRIM$(STR$(WhoAtPos)) + "-2"
Code2$ = "4"
INCR Assists(DataRef(WHOATGUY(WhoAtPos), id), id, WhoAtPos)
INCR PutOuts(DataRef(WHOATGUY(2), id), id, 2)
ir1 = 0
ELSE
IF DelFac THEN 'SAFE
AddToAnnouncer it, "SAFE!"
RunAnnounced = TRUE
END IF
END IF
ELSE
'* holds on at third
IF DelFac THEN CALL Msg ("16", "0", "0", "03", ir1, it, man2, team2) 'HOLD
END IF
END IF
EXIT SUB
ErrorTrap:
LOCATE 10, 30
PRINT "THROWOUT_Error"; ERRCLEAR
x$ = WAITKEY$
END SUB
SUB TripleDialog (wag)
x! = RND
IF WhoAtPos = 8 THEN
i = RND(1, 3)
ELSEIF WhoAtPos = 7 THEN
IF x! < .33 THEN
i = 1
ELSEIF x! < .67 THEN
i = 3
ELSE
i = 4
END IF
ELSE '9
IF x! < .33 THEN
i = 1
ELSEIF x! < .67 THEN
i = 2
ELSE
i = 4
END IF
END IF
t$ = LTRIM$(STR$(i))
t$ = PADZEROS$(t$, 2)
CALL Msg ("10", "0", "1", t$, 0, it, man2, team2) 'long drive
IF t$ <> "04" THEN m = wag: n = id ELSE m = ib: n = it
CALL Msg ("10", "0", "2", t$, m, n, man2, team2) '* going back
IF t$ = "01" THEN m = wag: n = id ELSE m = ib: n = it
CALL Msg ("10", "0", "3", t$, m, n, man2, team2) 'over his head
IF ir3 > 0 THEN CALL AnnScoring(ir3)
IF ir2 > 0 THEN CALL AnnScoring(ir2)
IF ir1 > 0 THEN CALL AnnScoring(ir1)
END SUB
SUB TripleRoutine
ppF! = FindPP!
WhoAtPos = OUTFIELDWHOAT (ppF!)
wag = WHOATGUY (WhoAtPos)
IF DelFac THEN CALL TripleDialog (wag)
CALL Advanc(3, 2, 1)
IF DelFac THEN
IF SoundOn THEN CALL WavRegularHit
CALL Msg ("10", "0", "4", "00", ib, it, man2, team2) 'he's not stopping
CALL Msg ("10", "0", "5", "00", ib, it, man2, team2) 'triple
END IF
ir3 = ib
mpp(ib) = ip
CALL CreditHit
INCR m3b(ref, it)
IF UCASE$(DataHand(ip, id)) = "L" THEN
INCR m3bLHP(ref, it)
ELSE
INCR m3bRHP(ref, it)
END IF
INCR mp3b(ip, id)
Result$ = "3B"
END SUB
SUB TwoTeamSetup (row, Flds, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
CALL Drawfrm(row+rowO, 12+colO, row+rowO+16, 69+colO, defattr, "Simulation Options", "ESC (or close window) to continue", 1, 0, 1)
COLOR 7, defbac
DATA 02,14,"How many games do you want to simulate?",02,54,6,"N "
DATA 04,14,"Auto-Lineup (Visitor) [y/N] ",04,53,01,"XR"
DATA 06,14," (Home) [y/N] ",06,53,01,"XR"
DATA 08,14,"Adjust Batting Order(Visitor)[y/N/c/f] ",08,53,01,"XR"
DATA 10,14," (Home) [y/N/c/f] ",10,53,01,"XR"
DATA 12,14,"Use Designated-Hitter? [Y/N] ",12,53,01,"XR"
DATA 14,14,"Use Spot Starters? [y/N] ",14,53,01,"XR"
Flds = 7
c = 1
FOR i = 1 TO Flds
Flitrow(i) = VAL(READ$(c)) + row + rowO
Flitcol(i) = VAL(READ$(c+1)) + colO
Flit$(i) = READ$(c+2)
Frow(i) = VAL(READ$(c+3)) + row + rowO
Fcol(i) = VAL(READ$(c+4)) + colO
Flen(i) = VAL(READ$(c+5))
Fed$(i) = READ$(c+6)
c = c + 7
NEXT
'Set Defaults
REDIM FContents$(13)
FContents$(2) = "N"
FContents$(3) = "N"
FContents$(4) = "N"
FContents$(5) = "N"
FContents$(6) = DefaultDHResponse$
FContents$(7) = "N"
END SUB
SUB TwoTeamIO (RetKey, Flds, CursorPtr, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
DO
TopOfTTLoop:
CALL ScreenIO(Keyed, KeyEsc, 0, KeyEsc, Flds, CursorPtr, Flen(), Frow(), Fcol(), Fed$(), Flit$(), Flitrow(), Flitcol(), FContents$())
'Edit Field Contents
Error1$ = "N"
i = 1
DO
IF i = 1 THEN
n = VAL(FContents$(i))
IF n < 1 THEN
Error1$ = "Y": CursorPtr = i: CALL MyBeep: GOTO TopOfTTLoop
END IF
ELSEIF i = 4 OR i = 5 THEN
IF FContents$(i) <> "Y" AND FContents$(i) <> "N" AND FContents$(i) <> "C" AND FContents$(i) <> "F" THEN
Error1$ = "Y": CursorPtr = i: CALL MyBeep: GOTO TopOfTTLoop
END IF
ELSE
IF FContents$(i) <> "Y" AND FContents$(i) <> "N" THEN
Error1$ = "Y": CursorPtr = i: CALL MyBeep: GOTO TopOfTTLoop
END IF
END IF
INCR i
LOOP UNTIL i > 7
LOOP WHILE Error1$ = "Y"
CURSOR OFF 'turn off cursor
END SUB
SUB TwoTeamStarters(tm, N)
'[in: tm out: N]
ResetList:
REDIM SelectedPit$(5)
REDIM SelectedRef(5)
SelX = 0
DO
CALL Drawfrm(18+rowO, 30+colO, 24+rowO, 50+colO, defattr, "Selected", nulls$, 0, 0, 0)
FOR i = 1 TO SelX
QPRINTs 18+rowO+i, 32+colO, SelectedPit$(i), dimattr
NEXT
r = 3
CALL PickTheStarter(tm, r, N) '[ENTER or [ESC] gets out of here
IF N > 0 THEN '[ENTER]
IF SelX < 5 THEN
INCR SelX
SelectedPit$(SelX) = DataName(N, tm)
SelectedRef(SelX) = N
END IF
END IF
IF N = 0 THEN '[ESC] '17,58 24,71 1,33 8,46
attr = (3 * 16) + 15
CALL GetScreen(Scr1$, 1+rowO, 33+colO, 8+rowO, 46+colO)
CALL Drawfrm(1+rowO, 33+colO, 8+rowO, 46+colO, attr, nulls$, nulls$, 0, 0, 0)
CALL Button( 2+rowO, 35+colO, errattr, " [O]K ", 1)
CALL Button( 4+rowO, 35+colO, errattr, " C[L]ear ", 1)
CALL Button( 6+rowO, 35+colO, errattr, " [C]ancel ", 1)
xS$ = WAITKEY$
IF LEN(xS$) = 4 THEN
msy = MOUSEY
msx = MOUSEX
xS$ = UCASE$(CHR$(SCREEN(msy, msx)))
CALL FlashField (msy, msx, 1, 2, 100, 0)
ELSE
xS$ = UCASE$(xS$)
END IF
IF xS$ = "O" OR xS$ = CHR$(13) THEN 'OK
EXIT DO
ELSEIF xS$ = "C" THEN 'Cancel
EXIT SUB
ELSE 'Clear
CALL PutScreen(Scr1$, 1+rowO, 33+colO, 8+rowO, 46+colO)
GOTO ResetList
END IF
END IF
LOOP
'Copy to rotation record [OK]
i = ROTATIONLIST (DataFil(tm)) 'Find Rot record for this team
IF i = 0 THEN
IF RTx < 1500 THEN
INCR RTx
i = RTx
END IF
END IF
CmdSP$ = "S" + LTRIM$(STR$(SelX))
RotRec(i).RotTeam = DataFil(tm) 'Update this Rot record
RotRec(i).RotMeth = CmdSP$
IF (tm = 1 AND CmdVSpot$ = "Y") OR _
(tm = 2 AND CmdHSpot$ = "Y") OR _
CmdSpot$ = "Y" THEN
RotRec(i).RotSpot = "Y"
ELSE
RotRec(i).RotSpot = " "
END IF
RotRec(i).RotIndex = 1
FOR j = 1 TO 5
RotRec(i).RotList(j) = 0
NEXT
FOR j = 1 TO SelX
RotRec(i).RotList(j) = SelectedRef(j)
NEXT
N = RotRec(i).RotList(1)
END SUB
SUB UpdSCHRecord1 (a$)
IF ProtectSCH THEN EXIT SUB
'Find CmdSTAT$ in the 1st record of the SCH file - or stop at 1st blank slot
GET #2, 1, SchBuffer$
i = 3
DO
i = i + 8
xS$ = MID$(SchBuffer$, i, 8)
IF UCASE$(RTRIM$(xS$)) = UCASE$(RTRIM$(CmdStat$)) THEN EXIT DO
LOOP UNTIL xS$ = SPACE$(8)
'Either found the current STAT file: i points to it OR
'Didn't find it: i points to first available slot OR
'There wasn't a STAT file: i = 11
IF a$ = "DEL" THEN
'Remove and collapse if found a STAT file
IF xS$ > "!" THEN
L = 91 - (i + 8)
MID$(SchBuffer$, i, L) = MID$(SchBuffer$, i + 8, L)
MID$(SchBuffer$, 83, 8) = SPACE$(8)
END IF
ELSE
'Update SCH w/current STAT file
IF CmdStat$ > "!" THEN
MID$(SchBuffer$, i, 8) = CmdStat$
END IF
END IF
PUT #2, 1, SchBuffer$
END SUB
SUB VisitorOptions (Pick)
REDIM List1(1 TO 10) AS List1Type
IF it = 1 THEN
List1(1).ListItem = " Pinch Hit "
List1(2).ListItem = " Pinch Run "
List1(3).ListItem = " View Lineup "
List1(4).ListItem = " View Opponent "
List1(5).ListItem = " Call Bullpen "
IF WarmUpRule = FALSE THEN List1(5).ListItem = "%" + List1(5).ListItem
List1(6).ListItem = STRING$(27,CHR$(196))
List1(7).ListItem = " Steal "
List1(8).ListItem = " Bunt/Squeeze "
List1(9).ListItem = " Hit and Run "
CALL Drawfrm(10+rowO, 8+colO, 20+rowO, 38+colO, defattr, RTRIM$(Names(1)), "", 0, 0, 2)
CALL PickFromList(List1(), 9, 9, 1, 27, 10+rowO, 8+colO, 20+rowO, 38+colO, dimattr, revattr, Pick, RetKey, nulls$, mous, ms$)
SELECT CASE Pick
CASE 1
PH = TRUE
CASE 2
PRun = TRUE
CASE 3
ViewVisi = TRUE
CASE 4
ViewHome = TRUE
CASE 5
BullO = TRUE
CASE 7
Steal = TRUE
CASE 8
Bunt = TRUE
CASE 9
HitAndRun = TRUE
CASE ELSE
END SELECT
ELSE
List1(1).ListItem = " Visit Mound "
List1(2).ListItem = " Player Substitution "
List1(3).ListItem = " Swap Positions "
List1(4).ListItem = " View Line-up "
List1(5).ListItem = " View Opponent "
List1(6).ListItem = STRING$(27, CHR$(196))
List1(7).ListItem = " Intentional Walk "
List1(8).ListItem = " Infield Tight "
List1(9).ListItem = " Pitch-Out "
List1(10).ListItem =" Pitch-Around "
CALL Drawfrm(10+rowO, 8+colO, 21+rowO, 38+colO, defattr, RTRIM$(Names(1)), "", 0, 0, 2)
CALL PickFromList(List1(), 10, 10, 1, 27, 10+rowO, 8+colO, 21+rowO, 38+colO, dimattr, revattr, Pick, RetKey, nulls$, mous, ms$)
SELECT CASE Pick
CASE 1
BullD = TRUE
CASE 2
SubX = TRUE
CASE 3
SwPos = TRUE
CASE 4
ViewVisi = TRUE
CASE 5
ViewHome = TRUE
CASE 7
IWalk = TRUE
CASE 8
Tight = TRUE
CASE 9
POut = TRUE
CASE 10
PAround = TRUE
CASE ELSE
END SELECT
END IF
ERASE List1
END SUB
SUB WalkRoutine
IF DelFac THEN
IF SoundOn THEN CALL WavPopMitt
IF IWalk THEN
CALL Msg ("18", "0", "0", "02", ib, it, man2, team2)
ELSE
CALL Msg ("18", "0", "0", "01", ib, it, man2, team2)
END IF
END IF
IF ir3 <> 0 AND ir2 <> 0 AND ir1 <> 0 THEN 'Bases Loaded
CALL Advanc(1, 1, 1)
ELSEIF ir1 THEN 'Runner on First
IF ir2 THEN 'Also on Second
CALL Advanc(1, 1, 0)
ELSE 'Nobody on Second
CALL Advanc(1, 0, 0)
END IF
END IF
' ** PUT BATTER ON 1ST **
ir1 = ib
mpp(ib) = ip
DECR mab(ref, it)
IF UCASE$(DataHand(ip, id)) = "L" THEN
DECR mabLHP(ref, it)
INCR mbbLHP(ref, it)
ELSE
DECR mabRHP(ref, it)
INCR mbbRHP(ref, it)
END IF
INCR mbb(ref, it)
INCR mpw(ip, id)
IF IWalk THEN
Result$ = "Int BB"
ELSE
Result$ = "BB"
END IF
END SUB
SUB WavBunt
IF NOT SoundOn THEN EXIT SUB
DIM WavList$(2)
WavList$(1) = "57435.wav"
WavList$(2) = "57435.wav"
i = FRND(2)
L = PlayWav(WavList$(i))
SLEEP 400
END SUB
SUB WavPopUp
IF NOT SoundOn THEN EXIT SUB
DIM WavList$(2)
WavList$(1) = "3017.wav"
WavList$(2) = "37979.wav"
i = FRND(2)
L = PlayWav(WavList$(i))
SLEEP 400
END SUB
SUB WavShortFly
IF NOT SoundOn THEN EXIT SUB
DIM WavList$(2)
WavList$(1) = "37880.wav"
WavList$(2) = "3017.wav"
i = FRND(2)
L = PlayWav(WavList$(i))
SLEEP 400
END SUB
SUB WavRegularFly
IF NOT SoundOn THEN EXIT SUB
DIM WavList$(4)
WavList$(1) = "3017.wav"
WavList$(2) = "57430.wav"
WavList$(3) = "37979.wav"
WavList$(4) = "hit.wav"
i = FRND(4)
L = PlayWav(WavList$(i))
SLEEP 400
END SUB
SUB WavBigFly
IF NOT SoundOn THEN EXIT SUB
DIM WavList$(4)
WavList$(1) = "37830.wav"
WavList$(2) = "37830.wav"
WavList$(3) = "57430.wav"
WavList$(4) = "hit.wav"
i = FRND(4)
L = PlayWav(WavList$(i))
SLEEP 400
IF IGone AND CmdHRWav$ > "!" THEN
L = PlayWav(CmdHRWav$)
END IF
END SUB
SUB WavLineDrive
IF NOT SoundOn THEN EXIT SUB
DIM WavList$(2)
WavList$(1) = "57430.wav"
WavList$(2) = "hit.wav"
i = FRND(2)
L = PlayWav(WavList$(i))
SLEEP 400
END SUB
SUB WavRegularHit
IF NOT SoundOn THEN EXIT SUB
DIM WavList$(4)
WavList$(1) = "57430.wav"
WavList$(2) = "57430.wav"
WavList$(3) = "3017.wav"
WavList$(4) = "hit.wav"
i = FRND(4)
L = PlayWav(WavList$(i))
SLEEP 400
END SUB
SUB WavSoftGrounder
IF NOT SoundOn THEN EXIT SUB
DIM WavList$(2)
WavList$(1) = "57435.wav"
WavList$(2) = "37906.wav"
i = FRND(2)
L = PlayWav(WavList$(i))
SLEEP 400
END SUB
SUB WavRegularGrounder
IF NOT SoundOn THEN EXIT SUB
DIM WavList$(3)
WavList$(1) = "61400.wav"
WavList$(2) = "61714.wav"
WavList$(3) = "hit.wav"
i = FRND(3)
L = PlayWav(WavList$(i))
SLEEP 400
END SUB
SUB WavWhiff
IF NOT SoundOn THEN EXIT SUB
DIM WavList$(2)
WavList$(1) = "21904.wav"
WavList$(2) = "61817.wav"
i = FRND(2)
L = PlayWav(WavList$(i))
SLEEP 400
END SUB
SUB WavPopMitt
IF NOT SoundOn THEN EXIT SUB
DIM WavList$(4)
WavList$(1) = "37909.wav"
WavList$(2) = "37910.wav"
WavList$(3) = "37910.wav"
WavList$(4) = "60290.wav"
i = FRND(4)
L = PlayWav(WavList$(i))
SLEEP 400
END SUB
'************* MISC GRAPHICS SUBROUTINES *****************
SUB HideGfx
GfxWindow %GFX_HIDE
END SUB
SUB ShowGfx
GfxWindow %GFX_SHOW
END SUB
SUB UnfreezeAndRefresh
GfxWindow NOT %GFX_FREEZE
GfxRefresh 0
GfxWindow %GFX_FREEZE
END SUB
SUB GraphHole (hole, row1, col1, row2, col2)
IF NOT Gfx THEN EXIT SUB
IF HoleStatus(hole) = -1 THEN EXIT SUB
'Could eliminate this nonsense if I passed the parameters "by value" I think
trow1 = row1
tcol1 = col1
trow2 = row2
tcol2 = col2
IF tcol1 < 1 THEN tcol1 = 1
IF tcol2 < 1 THEN tcol2 = 1
IF tcol1 > ConsCols THEN tcol1 = ConsCols
IF tcol2 > ConsCols THEN tcol2 = ConsCols
IF tcol2 < tcol1 THEN EXIT SUB
IF trow1 < 6 THEN trow1 = 6
IF trow2 < 6 THEN trow2 = 6
IF trow1 > ConsRows-1 THEN trow1 = ConsRows-1
IF trow2 > ConsRows-1 THEN trow2 = ConsRows-1
IF trow2 < trow1 THEN EXIT SUB
res = GfxTextHole (hole, tcol1, trow1, tcol2, trow2)
IF res = 0 THEN
HoleStatus(hole) = -1
ELSE
HoleStatus(hole) = 0
LOCATE 2, 50: PRINT " Bad Hole:" + STR$(hole) + " ": zz$ = WAITKEY$
END IF
END SUB
SUB EliminateHole (hole)
IF NOT Gfx THEN EXIT SUB
IF HoleStatus(hole) = 0 THEN EXIT SUB
res = FillHole (hole)
IF res = 0 THEN
HoleStatus(hole) = 0
ELSE
LOCATE 2, 50: PRINT " Bad fill:" + STR$(hole) + " ": zz$ = WAITKEY$
END IF
END SUB
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment