<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Lahman &#8211; Hardball Retro</title>
	<atom:link href="https://www.tuatarasoftware.com/tag/lahman/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.tuatarasoftware.com</link>
	<description>dedicated to the enrichment of casual and serious enthusiasts in all aspects of professional baseball</description>
	<lastBuildDate>Sun, 12 Jul 2026 13:34:47 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.10</generator>

<image>
	<url>https://www.tuatarasoftware.com/wp-content/uploads/2024/01/cropped-hardball_retro_icon-1-32x32.jpg</url>
	<title>Lahman &#8211; Hardball Retro</title>
	<link>https://www.tuatarasoftware.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Modern Season Disk Generation for Earl Weaver Baseball 1.5 &#8211; Lahman, R, and SeasonTool Integration</title>
		<link>https://www.tuatarasoftware.com/2026/06/14/modern-season-disk-generation-for-earl-weaver-baseball-1-5-lahman-r-and-seasontool-integration/</link>
					<comments>https://www.tuatarasoftware.com/2026/06/14/modern-season-disk-generation-for-earl-weaver-baseball-1-5-lahman-r-and-seasontool-integration/#respond</comments>
		
		<dc:creator><![CDATA[Derek Bain]]></dc:creator>
		<pubDate>Mon, 15 Jun 2026 00:59:34 +0000</pubDate>
				<category><![CDATA[Simulations]]></category>
		<category><![CDATA[batting]]></category>
		<category><![CDATA[CoPilot]]></category>
		<category><![CDATA[Daniel Guenther]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[Don Daglow]]></category>
		<category><![CDATA[draft]]></category>
		<category><![CDATA[earl weaver]]></category>
		<category><![CDATA[Earl Weaver Baseball]]></category>
		<category><![CDATA[Eddie Dombrower]]></category>
		<category><![CDATA[Electronic Arts]]></category>
		<category><![CDATA[export]]></category>
		<category><![CDATA[fielding]]></category>
		<category><![CDATA[IBM PC]]></category>
		<category><![CDATA[import]]></category>
		<category><![CDATA[Lahman]]></category>
		<category><![CDATA[master]]></category>
		<category><![CDATA[Mirage Graphics]]></category>
		<category><![CDATA[modern]]></category>
		<category><![CDATA[pitching]]></category>
		<category><![CDATA[R Studio]]></category>
		<category><![CDATA[roster]]></category>
		<category><![CDATA[SABR]]></category>
		<category><![CDATA[season disk]]></category>
		<category><![CDATA[SeasonTool]]></category>
		<category><![CDATA[simulation]]></category>
		<category><![CDATA[teams]]></category>
		<guid isPermaLink="false">https://www.tuatarasoftware.com/?p=21199</guid>

					<description><![CDATA[The SeasonTool utility was created by Daniel Guenther in the late-1990&#8217;s to facilitate the creation of season disks for Earl Weaver Baseball 1.5 for the IBM PC (EWB). SeasonTool relies on CSV files derived from the Lahman baseball database. However, modern Lahman releases (including SABR Lahman 2025) differ significantly from the Lahman 5.1 schema that ... <a title="Modern Season Disk Generation for Earl Weaver Baseball 1.5 &#8211; Lahman, R, and SeasonTool Integration" class="read-more" href="https://www.tuatarasoftware.com/2026/06/14/modern-season-disk-generation-for-earl-weaver-baseball-1-5-lahman-r-and-seasontool-integration/" aria-label="Read more about Modern Season Disk Generation for Earl Weaver Baseball 1.5 &#8211; Lahman, R, and SeasonTool Integration">Read more</a>]]></description>
										<content:encoded><![CDATA[
<p></p>



<p>The SeasonTool utility was created by Daniel Guenther in the late-1990&#8217;s to facilitate the creation of season disks for Earl Weaver Baseball 1.5 for the IBM PC (EWB). SeasonTool relies on CSV files derived from the Lahman baseball database. However, modern Lahman releases (including <a href="https://sabr.org/lahman-database/">SABR Lahman 2025</a>) differ significantly from the Lahman 5.1 schema that SeasonTool’s DOS-era executables were hard-coded to parse.</p>



<p>Attempting to use the current Lahman database files results in schema mismatches which cause SeasonTool to:<br>•  Misread player and team records<br>•  Generate corrupted MASTER files<br>•  Produce empty ROS files<br>•  Crash in STEP2REM and BATTINGR modules<br>•  Fail to import seasons</p>



<p>This project reconstructed the exact, byte-level schemas SeasonTool expects and produced a modern R-based converter that transforms Lahman 2025 data into fully SeasonTool-compatible CSVs.</p>



<p>I developed the initial script using <a href="https://posit.co/downloads">R Studio</a> to import the Lahman csv files and clean up some known issues (playerID and stintID errors). </p>



<p>Here&#8217;s a step-by-step video tutorial that outlines the process. </p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="Modern Season Disk Generation for Earl Weaver Baseball 1.5 - Lahman, R, and SeasonTool Integration" width="900" height="506" src="https://www.youtube.com/embed/KMneZFenGjY?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p>For a deeper dive, keep reading!</p>



<p></p>



<h3 class="wp-block-heading">Identifying the Problem</h3>



<p>I opened a session in <a href="https://copilot.microsoft.com">Microsoft CoPilot</a> to assist me in the troubleshooting. CoPilot proved to be very beneficial in analyzing the various text files that SeasonTool generates, pinning down the potential causes for a number of issues encountered along the way, and suggesting fixes to implement in my R script. It was necessary to &#8220;rein in&#8221; CoPilot at times. After being led on a few wild-goose chases, you become more familiar with CoPilot&#8217;s limitations and in turn, adjust your responses accordingly. The majority of the  SeasonTool’s failures were traced to several incompatibilities between modern Lahman CSVs and the legacy Lahman 5.1 format:<br>•  Missing fields (e.g., managerID, hofID, nameNote, college, lahman40ID, lahman45ID, holtzID, ZR)<br>•  Reordered or renamed fields<br>•  Additional fields in modern Lahman (e.g., WP/SB/CS in Fielding)<br>•  UTF-8 encoding and accented characters<br>•  Incorrect quoting and NA handling<br>•  Incorrect column counts<br>Because SeasonTool’s executables use fixed-position parsing, even a single missing or shifted field caused cascading corruption.</p>



<p></p>



<h3 class="wp-block-heading">Reconstructing the Correct Schemas</h3>



<p>Using my working SeasonTool installation (circa 2003) as the authoritative reference, I worked with CoPilot to reverse-engineer the exact schemas SeasonTool expects:<br>•  MASTER.csv — 32 columns<br>•  TEAMS.csv — 48 columns<br>•  BATTING.csv — 22 columns<br>•  PITCHING.csv — 27 columns<br>•  FIELDING.csv — 15 columns<br>•  FIELDINGOF.csv — 6 columns<br>These schemas differed from both Lahman 5.1 and Lahman 2025; SeasonTool uses a custom hybrid that must be matched exactly.</p>



<p></p>



<h3 class="wp-block-heading">Handling the Missing Fields</h3>



<p>The modern <a href="https://sabr.org/lahman-database/">Lahman Baseball Database</a> omits several fields SeasonTool requires. We added them back as blank columns to preserve the correct structure:<br>•  managerID<br>•  hofID<br>•  nameNote<br>•  college<br>•  lahman40ID<br>•  lahman45ID<br>•  holtzID<br>•  ZR (Zone Rating)<br>This ensured that every CSV matched the expected column count and order.</p>



<p></p>



<h3 class="wp-block-heading">Enforcing ASCII-Only Text</h3>



<p>SeasonTool and EWB cannot handle accented characters or extended Unicode. As a workaround, I  implemented a sanitization step in the R script to convert all player names and city names to pure ASCII.</p>



<p></p>



<h3 class="wp-block-heading">Enforcing Correct Quoting and NA Handling</h3>



<p>SeasonTool requires:<br>•  Text fields quoted<br>•  Numeric fields unquoted<br>•  Empty numeric fields as blank (&#8220;&#8221;)<br>•  CRLF line endings<br>•  No UTF-8 BOM<br>The final writer function enforces all of these.</p>



<p></p>



<h3 class="wp-block-heading">Final Result</h3>



<p>After applying all of the schema corrections and sanitization:<br>1893 imported successfully<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /><br>2005 imported successfully<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /><br>2025 imported successfully<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /><br>This confirms the pipeline is now fully SeasonTool-compatible.</p>



<p></p>



<h3 class="wp-block-heading">The Final SeasonTool-Compatible R Script</h3>



<pre class="wp-block-preformatted"><br>library(dplyr)<br>library(stringi)<br>library(readr)<br>library(dplyr)<br>library(stringr)<br>library(purrr)</pre>



<ol class="wp-block-list">
<li></li>
</ol>



<h4 class="wp-block-heading">CONFIG</h4>



<pre class="wp-block-preformatted">src_dir &lt;- "C:/stats/baseballdatabank-master/core"<br>out_dir &lt;- "C:/ewb15/seasonTool/lahman"<br>if (!dir.exists(out_dir)) { <br>dir.create(out_dir, recursive = TRUE, showWarnings = FALSE) }<br></pre>



<h4 class="wp-block-heading">LOGGING</h4>



<pre class="wp-block-preformatted">log_msg &lt;- function(…) { ts &lt;- format(Sys.time(), "%Y-%m-%d %H:%M:%S") <br>cat(ts, " ", paste0(…, collapse=" "), "\n") }</pre>



<pre class="wp-block-preformatted">log_msg("=== START LAHMAN 2025 → 5.1 CONVERSION ===")<br></pre>



<h4 class="wp-block-heading">SAFE CSV READER</h4>



<pre class="wp-block-preformatted">safe_read_csv &lt;- function(path, …) {<br>if (!file.exists(path)) {<br>log_msg("WARNING: file not found: ", path) return(NULL) }<br>log_msg("Reading: ", path) tryCatch( readr::read_csv(path, show_col_types = FALSE, progress = FALSE, …), error = function(e) {  <br>log_msg("ERROR reading ", path, ": ", conditionMessage(e)) NULL } ) }<br><br></pre>



<h4 class="wp-block-heading">SeasonTool TeamID Mapping Module</h4>



<p># Handles post-2003 Lahman teamID changes:</p>



<pre class="wp-block-preformatted"># ATH → OAK<br># LAA → ANA<br># MIA → FLO<br># WAS → MON<br># Applies to all tables: Teams, Batting, Pitching, Fielding<br># Includes validation + logging<br># ============================================================<br><br><br><strong>Mapping function</strong><br><br>map_teamid_seasontool &lt;- function(teamID, yearID) { <br>if (is.na(teamID) || is.na(yearID)) return(teamID) <br>if (yearID &gt; 2003) { <br>if (teamID == "ATH") return("OAK") <br>if (teamID == "LAA") return("ANA") <br>if (teamID == "MIA") return("FLO") <br>if (teamID == "WAS") return("MON") } return(teamID)}<br></pre>



<pre class="wp-block-preformatted"><strong>Vectorized wrapper</strong></pre>



<pre class="wp-block-preformatted">map_teamid_vec &lt;- function(df) { <br>if (!("teamID" %in% names(df)) || !("yearID" %in% names(df))) { <br>stop("Data frame must contain teamID and yearID columns.") } <br>df$teamID_original &lt;- df$teamID <br>df$teamID &lt;- mapply(map_teamid_seasontool, df$teamID, df$yearID, USE.NAMES = FALSE) df}<br><br><br><br><strong>Validation function</strong><br><br>validate_teamid_mapping &lt;- function(df, table_name = "Unknown Table") { <br>unmapped &lt;- df[df$teamID_original != df$teamID, ] <br>if (nrow(unmapped) == 0) { message(paste0("[OK] No teamID replacements needed for ", table_name)) return(invisible(df)) } <br>message(paste0("[INFO] TeamID replacements in ", table_name, ":")) print(unique(unmapped[, c("yearID", "teamID_original", "teamID")])) <br>invisible(df)}<br><br><br><strong>Apply to all Lahman tables</strong><br><br>apply_teamid_mapping_all &lt;- function(teams, batting, pitching, fielding, fldOF_old = NULL, fldOF_split = NULL) { <br>teams &lt;- map_teamid_vec(teams) <br>batting &lt;- map_teamid_vec(batting) <br>pitching &lt;- map_teamid_vec(pitching) <br>fielding &lt;- map_teamid_vec(fielding) <br># if (!is.null(fldOF_old)) {# fldOF_old &lt;- map_teamid_vec(fldOF_old)# } <br>if (!is.null(fldOF_split)) { fldOF_split &lt;- map_teamid_vec(fldOF_split) } <br><br><br><strong>Validation logs </strong><br><br>validate_teamid_mapping(teams, "teams") <br>validate_teamid_mapping(batting, "batting") <br>validate_teamid_mapping(pitching, "pitching") <br>validate_teamid_mapping(fielding, "fielding")</pre>



<pre class="wp-block-preformatted"># if (!is.null(fldOF_old)) {# validate_teamid_mapping(fldOF_old, "fldOF_old")# } <br>if (!is.null(fldOF_split)) { validate_teamid_mapping(fldOF_split, "fldOF_split") } list( teams = teams, batting = batting, pitching = pitching, fielding = fielding, fldOF_old = fldOF_old, fldOF_split = fldOF_split )}<br></pre>



<h4 class="wp-block-heading">LOAD TABLES</h4>



<pre class="wp-block-preformatted">master &lt;- safe_read_csv(file.path(src_dir, "People.csv"))<br>batting &lt;- safe_read_csv(file.path(src_dir, "Batting.csv"))<br>pitching &lt;- safe_read_csv(file.path(src_dir, "Pitching.csv"))<br>fielding &lt;- safe_read_csv(file.path(src_dir, "Fielding.csv"))<br>fldOF_old &lt;- safe_read_csv(file.path(src_dir, "FieldingOF.csv"))<br>fldOF_split &lt;- safe_read_csv(file.path(src_dir, "FieldingOFsplit.csv"))<br>teams &lt;- safe_read_csv(file.path(src_dir, "Teams.csv"))<br>required &lt;- list( master=master, batting=batting, pitching=pitching, fielding=fielding, fldOF_old=fldOF_old, fldOF_split=fldOF_split, teams=teams )</pre>



<pre class="wp-block-preformatted">missing &lt;- names(required)[vapply(required, is.null, logical(1))] if (length(missing) &gt; 0) stop("Missing required tables: ", paste(missing, collapse=", "))<br></pre>



<h4 class="wp-block-heading">FIX TEAMID MAPPING FOR Team Changes post-2003</h4>



<pre class="wp-block-preformatted">mapped &lt;- apply_teamid_mapping_all( teams, batting, pitching, fielding,# fldOF_old, fldOF_split)</pre>



<pre class="wp-block-preformatted">teams &lt;- mapped$teams<br>batting &lt;- mapped$batting<br>pitching &lt;- mapped$pitching<br>fielding &lt;- mapped$fielding<br>fieldingOF &lt;- mapped$fieldingOF<br>fieldingOFsplit&lt;- mapped$fieldingOFsplit<br>required &lt;- list( master=master, batting=batting, pitching=pitching, fielding=fielding, fldOF_old=fldOF_old, fldOF_split=fldOF_split, teams=teams)<br>missing &lt;- names(required)[vapply(required, is.null, logical(1))]<br>if (length(missing) &gt; 0) stop("Missing required tables: ", paste(missing, collapse=", "))<br></pre>



<h4 class="wp-block-heading">FIXES: PLAYER ID CORRECTIONS + VENDITTE</h4>



<pre class="wp-block-preformatted"># There is an incorrect playerID for Yuli Gurriel<br><br>log_msg("Applying ID fixes…")<br>fix_id &lt;- function(tbl, from, to) { <br>if ("playerID" %in% names(tbl)) { <br>tbl$playerID &lt;- ifelse(tbl$playerID == from, to, tbl$playerID) } tbl }<br>master &lt;- fix_id(master, "gourryu01", "gurriyu01")<br>batting &lt;- fix_id(batting, "gourryu01", "gurriyu01")<br>pitching &lt;- fix_id(pitching, "gourryu01", "gurriyu01")<br>fielding &lt;- fix_id(fielding, "gourryu01", "gurriyu01")<br>fldOF_old&lt;- fix_id(fldOF_old,"gourryu01", "gurriyu01")<br>fldOF_split&lt;-fix_id(fldOF_split,"gourryu01","gurriyu01")<br></pre>



<h4 class="wp-block-heading">Pat Venditte: THROWS = &#8220;S&#8221; → &#8220;L&#8221;</h4>



<pre class="wp-block-preformatted"># Earl Weaver Baseball 1.5 (along with most computer baseball sims from that era)<br># only allow pitchers to be "R" (right-hander) or "L" (left-hander)<br># Since there is no option for a "switch-pitcher", I elected to assign an "L" for<br># Pat Venditte's throwing handedness. The code below is not specifically looking for<br># Venditte; however he is the only player assigned as "S" (switch-pitcher) in the <br># Lahman database as of the 2025 edition. <br> <br>if ("throws" %in% names(master)) { master$throws &lt;- ifelse(master$throws == "S", "L", master$throws) }<br></pre>



<h4 class="wp-block-heading">MLB-ONLY FILTER (AL/NL ONLY)</h4>



<pre class="wp-block-preformatted">log_msg("Filtering to MLB-only players (AL/NL)…")<br>mlb_leagues &lt;- c("AL","NL") <br>players_bat &lt;- batting %&gt;% filter(lgID %in% mlb_leagues) %&gt;% distinct(playerID) players_pit &lt;- pitching %&gt;% filter(lgID %in% mlb_leagues) %&gt;% distinct(playerID) players_fld &lt;- fielding %&gt;% filter(lgID %in% mlb_leagues) %&gt;% distinct(playerID)<br>mlb_players &lt;- bind_rows(players_bat, players_pit, players_fld) %&gt;% distinct(playerID) %&gt;% pull(playerID)<br>master &lt;- master %&gt;% filter(playerID %in% mlb_players)</pre>



<pre class="wp-block-preformatted">log_msg("Master rows after MLB filter: ", nrow(master))<br></pre>



<h4 class="wp-block-heading">FIELDINGOF: 1871–1955 FROM OLD FILE + 1956+ FROM FIELDINGOF_split</h4>



<pre class="wp-block-preformatted">log_msg("Building FieldingOF (1871–1955 old file, 1956+ split file)…")<br>stop_if_missing &lt;- function(tbl, cols, name) { <br>miss &lt;- setdiff(cols, names(tbl)) <br>if (length(miss) &gt; 0) stop("Missing columns in ", name, ": ", paste(miss, collapse=", ")) }<br>stop_if_missing(fldOF_old, c("playerID","yearID","stint","Glf","Gcf","Grf"), "FieldingOF") <br>stop_if_missing(fldOF_split, c("playerID","yearID","stint","POS","G"), "FieldingOFsplit")<br>fldOF_old_51 &lt;- fldOF_old %&gt;% filter(yearID &lt;= 1955) %&gt;% transmute(playerID, yearID, stint, Glf, Gcf, Grf)<br>fldOF_new_51 &lt;- fldOF_split %&gt;% filter(POS %in% c("LF","CF","RF"), yearID &gt;= 1956) %&gt;% mutate( Glf = if_else(POS=="LF", as.integer(G), 0L), Gcf = if_else(POS=="CF", as.integer(G), 0L), Grf = if_else(POS=="RF", as.integer(G), 0L) ) %&gt;% group_by(playerID, yearID, stint) %&gt;% summarise( Glf=sum(Glf), Gcf=sum(Gcf), Grf=sum(Grf), .groups="drop" )<br>fldOF_51 &lt;- bind_rows(fldOF_old_51, fldOF_new_51) %&gt;% arrange(yearID, playerID, stint)</pre>



<pre class="wp-block-preformatted">log_msg("FieldingOF rows: ", nrow(fldOF_51))<br></pre>



<h4 class="wp-block-heading">NORMALIZE TO STRICT LAHMAN 5.1 SCHEMAS</h4>



<pre class="wp-block-preformatted">log_msg("Normalizing tables to Lahman 5.1 schemas…")<br>master_51 &lt;- master %&gt;% transmute(<br>ID = as.integer(ID),<br>playerID = as.character(playerID),</pre>



<pre class="wp-block-preformatted"># Missing in 2025 → must be blank</pre>



<pre class="wp-block-preformatted">managerID = "",<br>hofID = "",<br>birthYear = as.integer(birthYear),<br>birthMonth = as.integer(birthMonth),<br>birthDay = as.integer(birthDay),<br>birthCountry = as.character(birthCountry),<br>birthState = as.character(birthState),<br>birthCity = as.character(birthCity),<br>deathYear = as.integer(deathYear),</pre>



<pre class="wp-block-preformatted">deathMonth = as.integer(deathMonth),
deathDay = as.integer(deathDay),
deathCountry = as.character(deathCountry),
deathState = as.character(deathState),
deathCity = as.character(deathCity),
nameFirst = as.character(nameFirst),
nameLast = as.character(nameLast),
# Missing in 2025 → must be blank
nameNote = "",
nameGiven = as.character(nameGiven),
# Missing in 2025 → must be blank
nameNick = "",
weight = as.numeric(weight),
height = as.numeric(height),
bats = as.character(bats),
throws = as.character(throws),
debut = as.character(debut),
# Missing in 2025 → must be blank
college = "",
lahman40ID = "",
lahman45ID = "",
retroID = as.character(retroID),
# Missing in 2025 → must be blank
holtzID = "",
bbrefID = as.character(bbrefID))

batting_51 &lt;- batting %&gt;% transmute(
playerID = as.character(playerID),
yearID = as.integer(yearID),
stintID = as.integer(stint),
teamID = as.character(teamID),
lgID = as.character(lgID),
G = as.integer(G),
AB = as.integer(AB),
R = as.integer(R),
H = as.integer(H),
<code>2B</code> = as.integer(<code>2B</code>),
<code>3B</code> = as.integer(<code>3B</code>),
HR = as.integer(HR),
RBI = as.integer(RBI),
SB = as.integer(SB),
CS = as.integer(CS),
BB = as.integer(BB),
SO = as.integer(SO),
IBB = as.integer(IBB),
HBP = as.integer(HBP),
SH = as.integer(SH),
SF = as.integer(SF),
GIDP = as.integer(GIDP))

pitching_51 &lt;- pitching %&gt;% transmute(
playerID = as.character(playerID),
yearID = as.integer(yearID),
stintID = as.integer(stint),
teamID = as.character(teamID),
lgID = as.character(lgID),
W = as.integer(W),L = as.integer(L),G = as.integer(G),GS = as.integer(GS),CG = as.integer(CG),SHO = as.integer(SHO),SV = as.integer(SV),
IPOuts = as.integer(IPouts),H = as.integer(H),ER = as.integer(ER),HR = as.integer(HR),BB = as.integer(BB),SO = as.integer(SO),
BAOpp = as.numeric(BAOpp), # may be blank for early yearsERA = as.numeric(ERA),IBB = as.integer(IBB),WP = as.integer(WP),HBP = as.integer(HBP),BK = as.integer(BK),BFP = as.integer(BFP),GF = as.integer(GF),R = as.integer(R))
fielding_51 &lt;- fielding %&gt;% transmute(
playerID = as.character(playerID),
yearID = as.integer(yearID),
stintID = as.integer(stint),
teamID = as.character(teamID),
lgID = as.character(lgID),
POS = as.character(POS),
G = as.integer(G),
GS = as.integer(GS),
InnOuts = as.integer(InnOuts),
PO = as.integer(PO),
A = as.integer(A),
E = as.integer(E),
DP = as.integer(DP),
PB = as.integer(PB),
# ZR removed from modern Lahman → must be synthesized
ZR = 0L )</pre>



<pre class="wp-block-preformatted">teams_51 &lt;- teams %&gt;% filter(lgID %in% mlb_leagues) %&gt;% transmute(<br>yearID = as.integer(yearID),<br>lgID = as.character(lgID),<br>teamID = as.character(teamID),<br>franchID = as.character(franchID),<br>divID = as.character(divID),<br>Rank = as.integer(Rank),<br>G = as.integer(G),<br>Ghome = na_if(as.integer(Ghome), 0),<br>W = as.integer(W),<br>L = as.integer(L),<br>DivWin = as.character(DivWin),<br>WCWin = as.character(WCWin),<br>LgWin = as.character(LgWin),<br>WSWin = as.character(WSWin),</pre>



<pre class="wp-block-preformatted">#Batting totals (SeasonTool order)<br><br>R = as.integer(R),<br>AB = as.integer(AB),<br>H = as.integer(H),<br><code>2B</code> = as.integer(<code>2B</code>),<br><code>3B</code> = as.integer(<code>3B</code>),<br>HR = as.integer(HR),<br>BB = as.integer(BB),<br>SO = as.integer(SO),<br>SB = na_if(as.integer(SB), 0),<br>CS = na_if(as.integer(CS), 0),<br>HBP = na_if(as.integer(HBP), 0),<br>SF = na_if(as.integer(SF), 0),<br><br># Pitching totals<br><br>RA = as.integer(RA),<br>ER = as.integer(ER),<br>ERA = as.numeric(ERA),<br>CG = as.integer(CG),<br>SHO = as.integer(SHO),<br>SV = as.integer(SV),<br>IPOuts = as.integer(IPouts),<br>HA = as.integer(HA),<br>HRA = as.integer(HRA),<br>BBA = as.integer(BBA),<br>SOA = as.integer(SOA),<br><br># Fielding totals<br><br>E = as.integer(E),<br>DP = na_if(as.integer(DP), 0),<br>FP = as.numeric(FP),<br><br># Metadata<br><br>name = as.character(name),<br>park = as.character(park),<br>attendance = na_if(as.integer(attendance), 0),<br>BPF = as.integer(BPF),<br>PPF = as.integer(PPF),<br>teamIDBR = as.character(teamIDBR),<br>teamIDlahman45= as.character(teamIDlahman45),<br>teamIDretro = as.character(teamIDretro))</pre>



<pre class="wp-block-preformatted">fieldingOF_51 &lt;- fldOF_51 %&gt;% transmute(<br>playerID = as.character(playerID),<br>yearID = as.integer(yearID),<br>stintID = as.integer(stintID),<br>Glf = as.integer(Glf),<br>Gcf = as.integer(Gcf),<br>Grf = as.integer(Grf) )<br></pre>



<p><strong>Willard Brown (brownwi02) stintID correction</strong></p>



<p>#Negro League data introduced a mismatch:</p>



<p>#batting_51: stintID = 2<br>#fldOF_51: stintID = 1<br>#MLB stint for 1947 St. Louis Browns should be stintID = 1</p>



<pre class="wp-block-preformatted">batting_51$stintID &lt;- ifelse( batting_51$playerID == "brownwi02" &amp; batting_51$yearID == 1947, 1, batting_51$stintID )<br>fielding_51$stintID &lt;- ifelse( fielding_51$playerID == "brownwi02" &amp; fielding_51$yearID == 1947, 1, fielding_51$stintID )</pre>



<pre class="wp-block-preformatted">fieldingOF_51$stintID &lt;- ifelse( fieldingOF_51$playerID == "brownwi02" &amp; fieldingOF_51$yearID == 1947, 1, fieldingOF_51$stintID )<br></pre>



<h4 class="wp-block-heading">FIX NUMERIC NA VALUES FOR SEASONTOOL COMPATIBILITY</h4>



<pre class="wp-block-preformatted">fix_numeric_na &lt;- function(df) { <br>df %&gt;% mutate(across(where(is.numeric), ~ ifelse(is.na(.x), 0, .x))) }<br>#Special rule: ERA must be 99.99 instead of 0<br>pitching_51 &lt;- pitching_51 %&gt;% mutate( ERA = ifelse(is.na(ERA) | IPOuts == 0, 99.99, ERA), IPOuts = ifelse(IPOuts == 0 &amp; ER == 0, 1, IPOuts) )<br>batting_51 &lt;- fix_numeric_na(batting_51) pitching_51 &lt;- fix_numeric_na(pitching_51) fielding_51 &lt;- fix_numeric_na(fielding_51) fieldingOF_51 &lt;- fix_numeric_na(fieldingOF_51) <br>teams_51 &lt;- fix_numeric_na(teams_51) <br><br>ascii_sanitize &lt;- function(x) { <br>x &lt;- stri_trans_general(x, "Latin-ASCII") <br># remove accents <br>x &lt;- gsub("[^ -~]", "", x) <br># remove any remaining non-ASCII x } <br>master_51 &lt;- master_51 %&gt;% mutate( nameFirst = ascii_sanitize(nameFirst), nameLast = ascii_sanitize(nameLast), nameGiven = ascii_sanitize(nameGiven), nameNick = ascii_sanitize(nameNick), birthCity = ascii_sanitize(birthCity), deathCity = ascii_sanitize(deathCity), college = ascii_sanitize(college) )<br></pre>



<h4 class="wp-block-heading">WRITE CSV (QUOTES AROUND TEXT FIELDS ONLY!)</h4>



<pre class="wp-block-preformatted">write_seasontool_csv &lt;- function(df, path) {<br>write.table(<br>df,<br>file = path,<br>sep = ",",<br>row.names = FALSE,<br>col.names = FALSE,<br>quote = TRUE, # let R quote character fields normally<br>na = "" # empty fields become ,, not "" ) }<br><br>write_seasontool_csv(master_51, file.path(out_dir,"Master.csv"))<br>write_seasontool_csv(batting_51, file.path(out_dir,"Batting.csv"))<br>write_seasontool_csv(pitching_51, file.path(out_dir,"Pitching.csv"))<br>write_seasontool_csv(fielding_51, file.path(out_dir,"Fielding.csv"))<br>write_seasontool_csv(fieldingOF_51, file.path(out_dir,"FieldingOF.csv"))<br>write_seasontool_csv(teams_51, file.path(out_dir,"Teams.csv"))<br><br>log_msg("=== SEASON-SPECIFIC EXPORT COMPLETE ===")<br></pre>



<h3 class="wp-block-heading">Generating a Season Disk with SeasonTool</h3>



<p>Extract the SeasonTool files to a subfolder of your Earl Weaver Baseball 1.5 directory. </p>



<p>Open a DosBox session and change the directory to your EWB15\SeasonTool subfolder. </p>



<p>Type:    <strong>GETMASTR</strong>          This parses the newly-created Lahman MASTER.CSV file for use with SeasonTool.</p>



<p>Type:    <strong>IMPORT [YYYY]</strong>        where YYYY is the year of the season that you wish to import.</p>



<p>The import process takes a while to complete. You can increase the CPU cycles in DosBox by holding the CTRL key and repeatedly pressing the F12 key. You will see the CPU cycles increase at the top of the DosBox window. Use CTRL-F11 to decrease the cycles. I usually bump my DosBox session up to 40000 during the Import, but your mileage will vary depending on your computer&#8217;s processing power. When the Import is complete, you&#8217;ll see a &#8220;success&#8221; message and the command prompt will be visible. </p>



<p>Type:     <strong>DRAFT</strong>     </p>



<p>The draft process allows you to select or deselect players to be included on each team&#8217;s roster. You have a 25-man roster per team. I usually take care to select a minimum of 2 catchers. For current teams (2000-present) I go with a mix of 12 batters / 13 pitchers or 13 batters / 12 pitchers. Teams from 1920 through late 1990&#8217;s &#8211; depending on the team, maybe go with 15 batters / 10 pitchers, 14/11, etc. Deadball era teams usually have less than 25 players total, so you&#8217;re selecting nearly every player in most instances. There is a built-in help function to see the various keyboard shortcuts. Primarily I&#8217;m using A to move up or Z to move down one player at a time. S skips up 15 players at a clip while X skips down by 15. Select a player to be added to the roster with the space bar. You&#8217;ll see an &#8220;X&#8221; to the left of their name. Use the space bar to select or deselect players. Once you select 25 players on a given team, press R and wait a few seconds. A box will appear mid-screen, allowing you to specify the primary and secondary position for players appearing at multiple positions during that season. Use the A and Z keys to move up/down, then press the space bar to mark the currently selected position as the primary. Repeat this step to select the secondary position, at which time the next multiple-position player will appear in the box. If you accidentally select the incorrect position, make a note of it and cycle through the remaining players. Once you return to the main draft screen, move up or down to the player whose position needs to be adjusted, then press P. You can select the primary and secondary position for that player. </p>



<p>When you have all of the 25-man rosters configured and fielding positions assigned, press E to export. This process will run for several minutes. Assuming it is successfully completed, SeasonTool will respond that you need to run EXPORT.EXE at the command prompt. </p>



<p>Type:  <strong>EXPORT </strong>    </p>



<p>SeasonTool should respond that it created 3 files:   PLAYERS.DAT, LEAGNAME.DAT, PARKS.DAT</p>



<p>Use Windows Explorer (or the DOS command prompt if you prefer) to browse to your Earl Weaver Baseball 1.5 main program folder. Make a backup copy of any .DAT files to a subfolder. </p>



<p>Return to your SeasonTool subfolder and copy the 3 .DAT files into your Earl Weaver Baseball 1.5 main program folder. </p>



<p>At this point, I recommend running the Commissioner&#8217;s Disk (STATTOOL from the command prompt). Review the league structure in League/Division Editor:</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="480" height="238" src="https://www.tuatarasoftware.com/wp-content/uploads/2026/06/image-480x238.png" alt="" class="wp-image-21204" srcset="https://www.tuatarasoftware.com/wp-content/uploads/2026/06/image-480x238.png 480w, https://www.tuatarasoftware.com/wp-content/uploads/2026/06/image-300x149.png 300w, https://www.tuatarasoftware.com/wp-content/uploads/2026/06/image-768x381.png 768w, https://www.tuatarasoftware.com/wp-content/uploads/2026/06/image.png 1153w" sizes="(max-width: 480px) 100vw, 480px" /></figure>



<figure class="wp-block-image size-large"><img decoding="async" width="480" height="307" src="https://www.tuatarasoftware.com/wp-content/uploads/2026/06/image-1-480x307.png" alt="" class="wp-image-21206" srcset="https://www.tuatarasoftware.com/wp-content/uploads/2026/06/image-1-480x307.png 480w, https://www.tuatarasoftware.com/wp-content/uploads/2026/06/image-1-300x192.png 300w, https://www.tuatarasoftware.com/wp-content/uploads/2026/06/image-1-768x492.png 768w, https://www.tuatarasoftware.com/wp-content/uploads/2026/06/image-1.png 1003w" sizes="(max-width: 480px) 100vw, 480px" /></figure>



<p>You&#8217;ll notice 14 teams in the American League and 16 teams in the National League. Earl Weaver Baseball 1.5 pre-dates the MLB expansion in the mid-1990&#8217;s along with the switch to 3 divisions per league. Another issue that you&#8217;ll need to workaround &#8211; you can only create a schedule (Schedule A League) with an even number of teams in a league. In this case, I&#8217;ve left Houston in the National League. You may recall that the script renames several team ID&#8217;s (ATH, LAA, MIA, WAS) that did not exist prior to SeasonTool&#8217;s creation. Here, you can edit those team names with the city, abbreviation or team nickname. I recommend  using the Advanced Ball Park Editor in conjunction with the <a href="https://www.seamheads.com/ballparks/">Seamheads Ballparks Database</a> to modify the ballparks to reflect the modern-day field names and dimensions. </p>



<p></p>



<h3 class="wp-block-heading">Future State</h3>



<p>There were 30 MLB teams when Daniel Guenther created the SeasonTool utility. If and when MLB expands to 32 teams, I&#8217;m not sure if SeasonTool will be able to accommodate them. It may be necessary to modify the R script in order to exclude the new teams from the CSV files. Earl Weaver Baseball 1.5 can accommodate up to 32 teams, so it would at least be possible to import data for the 30 franchises that exist as of 2026, then manually create/edit the two expansion teams using the Commissioner&#8217;s Disk. We&#8217;ll leave that issue for another day.</p>



<p></p>



<h3 class="wp-block-heading">Wrap-Up</h3>



<p>This project successfully restored full compatibility between modern Lahman data and SeasonTool’s legacy import pipeline. The final R script produces CSVs that match SeasonTool’s expected schemas exactly, enabling successful imports for seasons from 1871 through 2025. We can extend the life of Earl Weaver Baseball 1.5 with a stable, future-proof workflow (well, at least until the next round of expansion) for generating SeasonTool-ready data.</p>



<p></p>



<h3 class="wp-block-heading">Resources</h3>



<p>SeasonTool is no longer available on the Internet (at least I wasn&#8217;t able to locate it). The software was freely available and I&#8217;m sharing it <a href="https://www.dropbox.com/scl/fo/lopntzi27fv195iefoenn/ANwd4CD9oPZjg9KDqrbnX3Q?rlkey=cbyj06djfd99olvbrfxd0l4ss&amp;st=y7afvlxg&amp;dl=0">here</a> for the handful of individuals that might be interested in using this program (the filename is SeasonTool1901-2003.zip). I will be periodically creating season disks for Earl Weaver Baseball 1.5 and uploading them here.</p>



<p><a href="https://www.dropbox.com/scl/fo/lopntzi27fv195iefoenn/ANwd4CD9oPZjg9KDqrbnX3Q?rlkey=cbyj06djfd99olvbrfxd0l4ss&amp;st=y7afvlxg&amp;dl=0">EWB 1.5 Season Disks</a></p>



<p>Many thanks to Daniel Guenther for creating SeasonTool, and of course to Don Daglow, Eddie Dombrower, Earl Weaver and the teams at Electronic Arts and Mirage Graphics (see the <a href="https://www.mobygames.com/game/3367/earl-weaver-baseball/credits/dos/?autoplatform=true">full list of credits</a> here) for the ground-breaking Earl Weaver Baseball game.</p>



<p>Don Daglow &#8211; SABR G&amp;S Virtual</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Stay Home With SABR: Don Daglow, baseball video game designer" width="900" height="506" src="https://www.youtube.com/embed/9Z0sdJDEeGE?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p>Eddie Dombrower &#8211; SABR G&amp;S Virtual</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Stay Home With SABR: Eddie Dombrower" width="900" height="675" src="https://www.youtube.com/embed/XEhreQZwOmQ?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fwww.tuatarasoftware.com%2F2026%2F06%2F14%2Fmodern-season-disk-generation-for-earl-weaver-baseball-1-5-lahman-r-and-seasontool-integration%2F&amp;linkname=Modern%20Season%20Disk%20Generation%20for%20Earl%20Weaver%20Baseball%201.5%20%E2%80%93%20Lahman%2C%20R%2C%20and%20SeasonTool%20Integration" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fwww.tuatarasoftware.com%2F2026%2F06%2F14%2Fmodern-season-disk-generation-for-earl-weaver-baseball-1-5-lahman-r-and-seasontool-integration%2F&amp;linkname=Modern%20Season%20Disk%20Generation%20for%20Earl%20Weaver%20Baseball%201.5%20%E2%80%93%20Lahman%2C%20R%2C%20and%20SeasonTool%20Integration" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_bluesky" href="https://www.addtoany.com/add_to/bluesky?linkurl=https%3A%2F%2Fwww.tuatarasoftware.com%2F2026%2F06%2F14%2Fmodern-season-disk-generation-for-earl-weaver-baseball-1-5-lahman-r-and-seasontool-integration%2F&amp;linkname=Modern%20Season%20Disk%20Generation%20for%20Earl%20Weaver%20Baseball%201.5%20%E2%80%93%20Lahman%2C%20R%2C%20and%20SeasonTool%20Integration" title="Bluesky" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd a2a_counter addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fwww.tuatarasoftware.com%2F2026%2F06%2F14%2Fmodern-season-disk-generation-for-earl-weaver-baseball-1-5-lahman-r-and-seasontool-integration%2F&#038;title=Modern%20Season%20Disk%20Generation%20for%20Earl%20Weaver%20Baseball%201.5%20%E2%80%93%20Lahman%2C%20R%2C%20and%20SeasonTool%20Integration" data-a2a-url="https://www.tuatarasoftware.com/2026/06/14/modern-season-disk-generation-for-earl-weaver-baseball-1-5-lahman-r-and-seasontool-integration/" data-a2a-title="Modern Season Disk Generation for Earl Weaver Baseball 1.5 – Lahman, R, and SeasonTool Integration"></a></p>]]></content:encoded>
					
					<wfw:commentRss>https://www.tuatarasoftware.com/2026/06/14/modern-season-disk-generation-for-earl-weaver-baseball-1-5-lahman-r-and-seasontool-integration/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Digital Diamond Baseball 13 &#8211; tutorial &#8211; create custom libraries</title>
		<link>https://www.tuatarasoftware.com/2025/05/29/digital-diamond-baseball-13-tutorial-create-custom-libraries/</link>
					<comments>https://www.tuatarasoftware.com/2025/05/29/digital-diamond-baseball-13-tutorial-create-custom-libraries/#respond</comments>
		
		<dc:creator><![CDATA[Derek Bain]]></dc:creator>
		<pubDate>Thu, 29 May 2025 15:22:50 +0000</pubDate>
				<category><![CDATA[Simulations]]></category>
		<category><![CDATA[Ballpark Database]]></category>
		<category><![CDATA[create]]></category>
		<category><![CDATA[custom library]]></category>
		<category><![CDATA[Digital Diamond Baseball]]></category>
		<category><![CDATA[import]]></category>
		<category><![CDATA[Lahman]]></category>
		<category><![CDATA[Lahman Database]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[Manager Profiles]]></category>
		<category><![CDATA[Mark Cohen]]></category>
		<category><![CDATA[Organization Editor]]></category>
		<category><![CDATA[pcgaming]]></category>
		<category><![CDATA[Player Editor]]></category>
		<category><![CDATA[Schedule Editor]]></category>
		<category><![CDATA[Seamheads]]></category>
		<category><![CDATA[simulation]]></category>
		<category><![CDATA[Team Editor]]></category>
		<category><![CDATA[tutorial]]></category>
		<guid isPermaLink="false">https://www.tuatarasoftware.com/?p=20857</guid>

					<description><![CDATA[I created a quick tutorial to discuss how to create custom libraries in Digital Diamond Baseball v13. Here&#8217;s a rundown of the requirements: Digital Diamond Baseball is developed by Mark Cohen and it was first published in 2011 for the IBM PC personal computer. I&#8217;m utilizing version 13.1.2 in my tutorial but the majority of ... <a title="Digital Diamond Baseball 13 &#8211; tutorial &#8211; create custom libraries" class="read-more" href="https://www.tuatarasoftware.com/2025/05/29/digital-diamond-baseball-13-tutorial-create-custom-libraries/" aria-label="Read more about Digital Diamond Baseball 13 &#8211; tutorial &#8211; create custom libraries">Read more</a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-embed-aspect-16-9 wp-has-aspect-ratio">I created a quick tutorial to discuss how to create custom libraries in Digital Diamond Baseball v13.</p>



<p class="wp-embed-aspect-16-9 wp-has-aspect-ratio">Here&#8217;s a rundown of the requirements:</p>



<ul class="wp-block-list wp-embed-aspect-16-9 wp-has-aspect-ratio">
<li>Digital Diamond Baseball v13.1.2 or higher</li>



<li>optional, but recommended: Seamheads Ballpark Database</li>
</ul>



<p class="wp-embed-aspect-16-9 wp-has-aspect-ratio">Digital Diamond Baseball is developed by Mark Cohen and it was first published in 2011 for the IBM PC personal computer. I&#8217;m utilizing version 13.1.2 in my tutorial but the majority of the instructions to create custom libraries are nearly identical since version 10. One exception is the &#8220;Import Just This Player&#8221; function, which is a new feature in version 13. Alternatively, you can follow the instructions below to import players from specific teams or seasons:</p>



<p>1. Open a Different Library &#8211; New Library Group &#8211; create a new group called &#8220;Year-by-Year Import&#8221;</p>



<p>2. Install a Library &#8211; select the season library that you wish to select players from. The library will be listed in the Favorites group by default. Select MOVE and move the library to the Year-by-Year Import group. Rename the library to &#8220;YYYY-Import-MLB&#8221; where YYYY is the year (such as <strong>1990-Import-MLB</strong>).</p>



<p>3. Repeat step 2 for each season library that you wish to import players from. For example, let&#8217;s say I want to create a library that contains player-seasons from 1990 through 1994. I would perform step 2 five times and the result would look like this:  </p>



<ol class="wp-block-list">
<li></li>
</ol>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="275" height="424" src="https://www.tuatarasoftware.com/wp-content/uploads/2025/05/image-1.png" alt="" class="wp-image-20860" srcset="https://www.tuatarasoftware.com/wp-content/uploads/2025/05/image-1.png 275w, https://www.tuatarasoftware.com/wp-content/uploads/2025/05/image-1-195x300.png 195w" sizes="auto, (max-width: 275px) 100vw, 275px" /></figure>
</div>


<p>optional &#8211; if you wish to use the combined statistics for the imported players who played for multiple teams in a given season, go to Player Editor &#8211; Edit All &#8211; Combine All Duplicate Players. Those individuals will be listed on the <strong>TOT</strong> team with their merged statistics.</p>



<p>4. Library &#8211; New Library &#8211; type the name of your new library. click OK. Optional &#8211; move your new library into a group. Click on your new library name to open it.</p>



<p>5. Team Editor &#8211; create your teams by entering the City/State, Name, Year and Tag. Optional &#8211; select a team logo, ballpark (this would require importing or creating ballparks first). </p>



<p>6. Player Editor &#8211; <a href="https://www.youtube.com/watch?v=fxtDlAAqya4"><strong>Import Players From Another Library</strong></a></p>



<p>Select the From Library (one of the Year-Import-MLB libraries created in step 2)</p>



<p>Select the<strong> From Team</strong> (the team that the player actually played for in the specified year &#8211; be sure to check the <strong>TOT</strong> team first for combined players!)</p>



<p>Select the <strong>Player(s)</strong> to be imported from that team.</p>



<p>Select the <strong>To Team</strong> &#8211; where the imported players will be drafted to.</p>



<p>Click <strong>IMPORT. </strong>Repeat process until all players are imported and 40-man rosters for each team are filled.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="477" height="402" src="https://www.tuatarasoftware.com/wp-content/uploads/2025/05/image_2025-05-29_104424270.png" alt="" class="wp-image-20858" srcset="https://www.tuatarasoftware.com/wp-content/uploads/2025/05/image_2025-05-29_104424270.png 477w, https://www.tuatarasoftware.com/wp-content/uploads/2025/05/image_2025-05-29_104424270-300x253.png 300w" sizes="auto, (max-width: 477px) 100vw, 477px" /></figure>
</div>


<p>If you wish to import multiple players on the FROM TEAM, you may select or deselect them, then click IMPORT.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="480" height="445" src="https://www.tuatarasoftware.com/wp-content/uploads/2025/05/image-2-480x445.png" alt="" class="wp-image-20861" srcset="https://www.tuatarasoftware.com/wp-content/uploads/2025/05/image-2-480x445.png 480w, https://www.tuatarasoftware.com/wp-content/uploads/2025/05/image-2-300x278.png 300w, https://www.tuatarasoftware.com/wp-content/uploads/2025/05/image-2.png 641w" sizes="auto, (max-width: 480px) 100vw, 480px" /></figure>
</div>


<p></p>



<p class="wp-embed-aspect-16-9 wp-has-aspect-ratio">View the <strong>Digital Diamond Baseball 13 &#8211; Create Custom Libraries</strong> video here:</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Digital Diamond Baseball v13 - tutorial - create custom libraries (IBM PC)" width="900" height="506" src="https://www.youtube.com/embed/JkeAMz3zObU?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<h2 class="wp-block-heading wp-embed-aspect-16-9 wp-has-aspect-ratio">References:</h2>



<p class="wp-embed-aspect-16-9 wp-has-aspect-ratio"><a href="https://store.steampowered.com/app/3383440/Digital_Diamond_Baseball_V13/">Digital Diamond Baseball 13 (on Steam)</a></p>



<p><a href="https://digitaldiamondbaseball.com/libraries.html">Digital Diamond Baseball &#8211; user-created custom libraries</a></p>



<p><a href="https://www.tapatalk.com/groups/thedigitaldiamondbaseballdugout/">Digital Diamond Dugout (Tapatalk forum)</a></p>



<p>SABR Stay at Home &#8211; Mark Cohen</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Stay Home With SABR: Mark Cohen, Digital Diamond Baseball" width="900" height="675" src="https://www.youtube.com/embed/GVOPV_ct8xw?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fwww.tuatarasoftware.com%2F2025%2F05%2F29%2Fdigital-diamond-baseball-13-tutorial-create-custom-libraries%2F&amp;linkname=Digital%20Diamond%20Baseball%2013%20%E2%80%93%20tutorial%20%E2%80%93%20create%20custom%20libraries" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fwww.tuatarasoftware.com%2F2025%2F05%2F29%2Fdigital-diamond-baseball-13-tutorial-create-custom-libraries%2F&amp;linkname=Digital%20Diamond%20Baseball%2013%20%E2%80%93%20tutorial%20%E2%80%93%20create%20custom%20libraries" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_bluesky" href="https://www.addtoany.com/add_to/bluesky?linkurl=https%3A%2F%2Fwww.tuatarasoftware.com%2F2025%2F05%2F29%2Fdigital-diamond-baseball-13-tutorial-create-custom-libraries%2F&amp;linkname=Digital%20Diamond%20Baseball%2013%20%E2%80%93%20tutorial%20%E2%80%93%20create%20custom%20libraries" title="Bluesky" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd a2a_counter addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fwww.tuatarasoftware.com%2F2025%2F05%2F29%2Fdigital-diamond-baseball-13-tutorial-create-custom-libraries%2F&#038;title=Digital%20Diamond%20Baseball%2013%20%E2%80%93%20tutorial%20%E2%80%93%20create%20custom%20libraries" data-a2a-url="https://www.tuatarasoftware.com/2025/05/29/digital-diamond-baseball-13-tutorial-create-custom-libraries/" data-a2a-title="Digital Diamond Baseball 13 – tutorial – create custom libraries"></a></p>]]></content:encoded>
					
					<wfw:commentRss>https://www.tuatarasoftware.com/2025/05/29/digital-diamond-baseball-13-tutorial-create-custom-libraries/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
