Ahem: The Boston Public Plot Generator

An original Perl work by magicmanzach.

It has often been proposed that the plotlines on the popular David E. Kelley TV show Boston Public are formulaic and illogical enough that they could easily be generated by a computer. Sample results:

Chapter One - Kevin generates controversy. Milton expels Steven in the student lounge. Lauren gets pregnant. Also, a sexy student generates controversy. The Superintendent punches a sexy student near urban Boston.

Chapter Two - Kevin gets pregnant. Marilyn turns in Guber in an apartment. Milton dies. Also, Lauren overdoses. Guber sexually harasses the valedictorian near the dungeon.

Chapter Three - Ronnie leads a protest. Danny fires Marilyn in the basement. Guber gives birth. Also, Guber leads a protest. Marla punches Louisa near outside.

This piece of software is, of course, distributed under the GPL, so that it can be better developed. I would advise everyone who uses it to log results, just in case any of these plots happen to "conveniently" show up on FOX.

Enjoy!


#!/usr/bin/perl -w

# bp.pl
# Boston Public Plotline Generator
# Distributed under the GPL
# Created by magicmanzach@yahoo.com

print "Content-type:text/html\n\n";

@characters =	("Steven", "Guber", "Lauren", "Harry", "Marilyn", "Marla",
		 "Cheryl Holt", "Kevin", "a sexy student", "Danny", "Milton",
		 "Ronnie", "Louisa", "the Superintendent", "an angry parent",
		 "a gang member", "a police officer", "the valedictorian");

@transitive_actions =
		("sleeps with", "talks about", "punches", "fires", "shoots",
		 "is offended by", "expels", "transfers", "suspends",
		 "breaks up with", "sexually harasses", "assaults",
		 "turns in", "reports");

@intransitive_actions =
		("overdoses", "streaks", "dies", "is expelled", "quits",
		 "foolishly drives out to Northampton, only to be disappointed",
		 "sings", "uses the N-word", "gets pregnant", "comes out",
		 "generates controversy", "passes out", "gives birth",
		 "leads a protest", "does something touching");

@places =	("the office", "the student lounge", "the bathroom",
		 "the basement", "the hallway", "outside", "urban Boston",
		 "the stairwell", "the stairwell", "the stairwell",
			# a lot of stuff happens on the stairwell
		 "the girls' locker room", "the boys' locker room",
		 "the dungeon", "Steven's office", "Scott's office",
		 "an apartment", "a hotel room");

# We can also use $character . "'s classroom"

@ordinals = ('one', 'two', 'three', 'four', 'five', 'six', 'seven',
	     'eight', 'nine', 'ten', 'eleven', 'twelve', 'thirteen',
	     'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen',
	     'nineteen', 'twenty');

$num_episodes = 5;	# Set this for the number of episodes you want.
			# If it's more than twenty, add some values to
			# @ordinals; a general engine would be possible
			# to churn out numbers above twenty.

for ($i = 0; $i < $num_episodes; $i++) {
	print 'Chapter ' . ucfirst($ordinals[$i]) . ' - ';
	print ucfirst(&character) . " " . &intransitive . ". ";
	$c2 = $c1 = &character;
	$c2 = &character until ($c1 ne $c2);
	print ucfirst($c1) . " " . &transitive . " " . $c2 .
		((rand(4) == 2) ? "." : " in " . &place . ". ");
	$c3 = &character;
	print ucfirst($c3) . " " . &intransitive . ". ";
	print ((rand(1) == 1) ?
		"Because of this, " . &character .
		&transitive . " " . &character . " to get back at " .
		$c3 . ". " :
		"Also, " . &character . " " . &intransitive . ". ");
	print "Steven yells at " . &character . ". ";
	$c5 = $c4 = &character;
	$c5 = &character until ($c4 ne $c5);
	print ((rand(1) == 1) ? ucfirst($c4) . " " . &intransitive . ".":
		ucfirst($c5) . " " . &transitive . " "
		. $c4 . " near " . &place . ".");
	print "<p>\n\n";
};

sub character {
	return $characters[rand(scalar @characters)];
};

sub transitive {
	return $transitive_actions[rand(scalar @transitive_actions)];
};

sub intransitive {
	return $intransitive_actions[rand(scalar @intransitive_actions)];
};

sub place {
	return $places[rand(scalar @places)];
};