• Welcome to the new COTI server. We've moved the Citizens to a new server. Please let us know in the COTI Website issue forum if you find any problems.
  • We, the systems administration staff, apologize for this unexpected outage of the boards. We have resolved the root cause of the problem and there should be no further disruptions.

collaborating on new programs?

Python

Shonner has done Traveller-related Python. Simonh has expressed interest.

I wasn't saying anything previously, but I started working on some T5 related python libraries (https://github.com/makhidkarun/t5) for generating and managing world and system details to build up a web app for generating cargoes/freight/passengers and making that available as a webapp that anyone could host their own in Heroku or the like (very straightforward, etc).

I wasn't sure about FFE's policies and license for putting the specific rules into code and making those generally available, so I have an email out to Marc asking for clarification and what he'd be comfortable with.

I really like what thalassogen has done with his webapps (http://heldenhaufen.de/T5/), wanted to make more like that and generally available as reference tools for games.
 
Note that the Traveller SRD has little to do with Marc specificially... the rules for non MGT software is "Free only, and include the boilerplate."

The problem being that Mongoose is a fully separate company, Marc doesn't own their ruleset, just the trademark (until such point as they revert the license, at least). Marc can't license their rules, and they do so restrictively. (Note that the SRD includes 90% of the core rules, or so, and 95% of HG and Merc, but pretty much nothing else. It lacks the trade goods, careers, and attribute modifiers.)

Marc himself allows pretty much anything to be automated, but unless you secure a specific license with royalties, you have to release for free, but that only covers CT, MT, TNE, T4, and T5; Hunter allowed the same for T20.

HT wasn't in print long enough to develop a following, and GT has the normal SJG restrictions.
 
The problem being that Mongoose is a fully separate company, Marc doesn't own their ruleset, just the trademark (until such point as they revert the license, at least). Marc can't license their rules, and they do so restrictively. (Note that the SRD includes 90% of the core rules, or so, and 95% of HG and Merc, but pretty much nothing else. It lacks the trade goods, careers, and attribute modifiers.)

Marc himself allows pretty much anything to be automated, but unless you secure a specific license with royalties, you have to release for free, but that only covers CT, MT, TNE, T4, and T5; Hunter allowed the same for T20.

I was aiming for just T5, since it's my current obsession, so maybe that'll work out fine. In the meantime, I tried to hunt down the SRD y'all have been describing, but can't find a functional link to it currently. Anyone have such a link?
 
My understanding of this is that game mechanics cannot be copyrighted, only their expression in written form. This is why the Old School Renaisance D&D clones are fine - they express their rules using new original texts and it doesn't matter how close those are to the rules of any given version of the orriginal game as long as the text is orriginal. So there is nothing to stop you writing software that implements say the world gen rules, but you must avoid re-using too much descriptive text. You can use generic terms though.

What the OGL does is it lets you re-use the copyrighted text, but within certain restrictions. It's possible for a company to impose those restrictions because you are using their text, if you wrote your own text you could do what you like.

Hence I have used the OGL material released by Mongoose in the dev pack as the basis for the OGL world gen rules in StarBase, because I wanted to use the descriptive text that goes with various world attribute values. I cannot use the name of the game or claim any compatibility with it though. I also have to provide a copy of the OGL license with the scripts. At some point in the future I intend to develop a much more detailed world gen system with orriginal descriptive text and user selectable options to tweak the world gen process, but maintaining a fair degree of backwards compatibility.

The licensing situation is a tradeoff.

Simon Hibbs
 
My understanding of this is that game mechanics cannot be copyrighted, only their expression in written form.

That's only true in the US.

In France and Germany, mechanics are covered under creators rights, and they can and do get protected by copyright... see the case about "Jungle Speed" in the last few years.

OSR games fly under the radar, apparently because WOTC doesn't bother enforcing their rights within the EU laws... At least one OSR cloner has noted that he's screwed if WOTC decides to sue him in his country of residence, because it's a creators rights country, not a copyright country. (Noting that Copyright is still used in those countries - certain additional rights accrue in those countries.)

The US and UK, as well as Canada and Australia operate on the copyright model, but the US is the outlier in that group (tho' I don't know which end).
 
Updated the C function library and added two small programs.

die_roller
- Takes some options and rolls dice for you. Some options, like -e (explode), don't work yet.

trav_chargen
- Generates a UPP, It can make a regular character (default), an average (2-5 per die) or a strong (3-6 per die, +2 total) character.

Comments are welcome, especially if there are other functions to make.

Leitz
 
The US and UK, as well as Canada and Australia operate on the copyright model, but the US is the outlier in that group (tho' I don't know which end).

I wasn't aware the situation was different in some European countries. My understanding is based on what I know of UK and US law (I'm a Brit).

Simon Hibbs
 
Perl Excerpts & Working (Alpha state) C# CharGen

I came to the forums tonight to share a new project I've been developing, and noted this very active thread. In scanning the many responses, I saw a couple references to Perl development.

Last fall I created a Classic Traveller Character Generator (Book 1) using Perl. A couple code excerpts are pasted below. Once I clean it up, I'll make the entire project available somewhere.

Over the last week I decided to learn C#, so I started over from scratch and built another version. That program, TravCharGen Ver 0.7, is available at DropBox for downloading as a ZIP archive. (Both links are the same, one is redirected via TinyURL shortcut)

I FIRST tried to write a Traveller RPG character generator in 1981, using regular Basic. Needless to say, without the benefits of hashes, dictionaries, and so on, it never really did what I wanted. Now, 32 years later, I'm finally getting it to work! :)

Regarding my Perl version, the complex routines were made simpler through hashes & hashes of hashes.

Character Class
Code:
sub new
{
	my $class = shift;
	my $gender;
	my $fname;
	my $lname;
	my $gender_mode;
	my $name_mode;
	
	if (@_ == 0)
	{ # Generate random gender & random name
		$gender = RandomGender();
		$fname = RandomFirstName($gender);
		$lname = RandomLastName($gender);
		$name_mode = 1;
		$gender_mode = 1;
	}
	elsif (@_ == 1 && ( uc($_[0]) eq "MALE" || uc($_[0]) eq "FEMALE" ) )
	{ # Generate random name for specified gender
		($gender) = @_;
		$fname = RandomFirstName($gender);
		$lname = RandomLastName($gender);
		$name_mode = 1;
		$gender_mode = 0;
	}
	elsif (@_ == 2)
	{ # Use specified names, generate random gender
		$gender = RandomGender();
		($fname,$lname) = @_;
		$name_mode = 0;
		$gender_mode = 1;
	}
	elsif (@_ == 3)
	{ # Use specified gender and names
		($gender,$fname,$lname) = @_;
		$name_mode = 0;
		$gender_mode = 0;
	}
	else
	{
		die "Invalid arguments to new Character in Traveller::Character\n";
	}
		
	chomp(my $_DC = `date /T`);

	my $_DateID = substr ($_DC,4,2) . substr ($_DC,7,2) . substr ($_DC,10,4);
	
	chomp(my $_TC = `time /T`);
	
	my $_TimeID = substr($_TC,0,2).substr($_TC,3,2);	
	
	my $_RandomID = int(rand(10000));

	my $_CharID = $_DateID.$_TimeID.$_RandomID;

	my $self =	{
				CharID		=> $_CharID,
				DateCreated => $_DC,
				TimeCreated => $_TC,
				Name =>	{
						Title =>	"",
						First =>	$fname,
						Last  =>	$lname
						},
				RandomName		=> $name_mode,
				Gender			=> $gender,
				RandomGender	=> $gender_mode,
				Service			=> "",
				Age				=> 18,
				Commissioned	=> 0,
				Drafted			=> 0,		# 1 = Drafted
				Died			=> 0,		# 1 = Died during character generation
				Retired			=> 0,		# 1 = Retired from service
				Terms			=> 0,		# Number of terms served
				Rank			=> 0,		# Rank (1-6, Book 1 Rank)
				KickedOut		=> 0,		# 1 = Forced out (failed to reenlist)
				TotalSkills		=> 0,		# Total Skill Rolls
				ForcedService	=> 0,		# Mandatory reenlistment (Rolled a 12)			
				Cash			=> 0		# Cash on hand
				};
			
	return $self;
}

Excerpts of a Few Key Tables

Muster Table
Code:
my %MusterTable = (
          'Table 1' => {
                         'Other' => {
                                      '6' => '- -',
                                      '4' => 'Gun',
                                      '1' => 'Low Psg',
                                      '3' => '+1 EDU',
                                      '7' => '- -',
                                      '2' => '+1 INT',
                                      '5' => 'High Psg'
                                    },
                         'Merchants' => {
                                          '6' => 'Low Psg',
                                          '4' => 'Gun',
                                          '1' => 'Low Psg',
                                          '3' => '+1 EDU',
                                          '7' => 'Merchant',
                                          '2' => '+1 INT',
                                          '5' => 'Blade'
                                        },

Ranks

Code:
my %Ranks = (
			Navy => 	{
						0 => "",
						1 => "Ensign",
						2 => "Lieutenant",
						3 => "Lt Cmdr",
						4 => "Commander",
						5 => "Captain",
						6 => "Admiral"
						},
			Marines =>	{
						0 => "",
						1 => "Lieutenant",
						2 => "Captain",
						3 => "Force Cmdr",
						4 => "Lt Colonel",
						5 => "Colonel",
						6 => "Brigadier"
						},

Cascade Skill Lists


Code:
our @Vehicle = ("Aircraft","Watercraft","Groundcraft","Space Vehicle");

our @BladeCombat = ("Dagger","Blade","Foil","Cutlass","Sword","Broadsword","Spear",
					"Halberd","Pike","Cudgel","Bayonet");

our @SpaceVehicle = ("Ship's Boat","Vacc Suit");

our @Groundcraft = ("Wheeled","Tracked","Grav");

our @Watercraft = ("Large Watercraft","Hovercraft","Small Watercraft","Submersible");

our @Aircraft = ("Propeller Aircraft","Jet Aircraft","Helicopter","Lighter-than-Air Craft");

our @SkillGroupLists = (\@GunCombat,\@Vehicle,\@BladeCombat,\@Watercraft,\@Aircraft,\@Groundcraft,\@SpaceVehicle,\@Space);

Skill Tables
Code:
my %AcquiredSkillTables = (
		PDT => {
			Navy => {
				"1" => "+1 STR",
				"2" => "+1 DEX",
				"3" => "+1 END",
				"4" => "+1 INT",
				"5" => "+1 EDU",
				"6" => "+1 SOC"
				},
			Marines => {
				"1" => "+1 STR",
				"2" => "+1 DEX",
				"3" => "+1 END",
				"4" => "Gambling",
				"5" => "Brawling",
				"6" => "Blade Combat"
				},
 
I FIRST tried to write a Traveller RPG character generator in 1981, using regular Basic. Needless to say, without the benefits of hashes, dictionaries, and so on, it never really did what I wanted.

Why didn't it work? By the way, can you post a sample output character from the Perl program?
 
Example Characters from Perl Version

Why didn't it work?

The Basic version in the early 80's? It worked somewhat, I just never finished setting up all of the arrays. I've learned a LOT more since those first attempts.

By the way, can you post a sample output character from the Perl program?

Sure, see two examples below.

Code:
	Captain Janett Adams (Female) 22 years old

	Created Tue 10/23/2012 at 12:13 PM

	Enlisted in the Army

	STR: 8  ->  9
	DEX: 9  ->  A
	END: 6  ->  6
	INT: A  ->  A
	EDU: 8  ->  9
	SOC: 8  ->  8

	Served 1 terms in the Army, Rank: Captain (2)

	Status: Forced Out

	Skills

	Brawling: 1
	Rifle: 1
	Submachinegun: 1

	Cash: $10000

	History

	Term 0 Events
		ServiceSkills: Gained service skill: Rifle

	Term 1 Events
		Commissioned
		Promoted to Rank 1 (Lieutenant)
		RankSkills: Gained service rank skill: Submachinegun
		Promoted to Rank 2 (Captain)
		Stat Mod: +1 EDU
		Stat Mod: +1 DEX
		Stat Mod: +1 STR
		Brawling
		Failed to reenlist
		Mustered Out
		  10000
		  Low Psg

Code:
	Major Jolanda Ochenfeld (Female) 30 years old

	Created Mon 07/29/2013 at 06:50 AM

	Enlisted in the Army

	STR: 5  ->  5
	DEX: 8  ->  8
	END: 8  ->  8
	INT: 7  ->  8
	EDU: 2  ->  4
	SOC: 6  ->  6

	Served 3 terms in the Army, Rank: Major (3)

	Status: Forced Out

	Skills

	Air/Raft: 1
	Automatic Rifle: 1
	Halberd: 1
	Laser Rifle: 1
	Rifle: 1
	Space Vehicle: 1
	Submachinegun: 1
	Tactics: 2

	Cash: $2000

	Equipment

		Revolver: 1


	History

	Term 0 Events
		ServiceSkills: Gained service skill: Rifle

	Term 1 Events
		Commissioned
		Promoted to Rank 1 (Lieutenant)
		RankSkills: Gained service rank skill: Submachinegun
		Halberd
		Space Vehicle
		Automatic Rifle
		Successfully reenlisted

	Term 2 Events
		Promoted to Rank 2 (Captain)
		Tactics
		Laser Rifle
		Successfully reenlisted

	Term 3 Events
		Promoted to Rank 3 (Major)
		Tactics
		Air/Raft
		Failed to reenlist
		Mustered Out
		  2000
		  +1 INT
		  Gun: Revolver
		  Mid Psg
		  +2 EDU
 
Another Example - Auto Generated w/Filter

I wrote the Perl version with some integrated filter options.

This character was generated with the following command line:

perl TravMain.pl RANK=4 SERVICE=Navy TERMS=5

The program then creates only Navy characters iteratively, discarding any that fail to reach minimum of 5 Terms, or that do not achieve Rank 4.

Code:
	Admiral Buster Tursdale (Male) 46 years old

	Created Mon 07/29/2013 at 07:25 AM

	Enlisted in the Navy

	STR: 7  ->  7
	DEX: 6  ->  4
	END: 7  ->  6
	INT: 8  ->  9
	EDU: 2  ->  6
	SOC: C  ->  F

	Served 7 terms in the Navy, Rank: Admiral (6)

	Status: Retired ($8000 annually)

	Skills

	Bayonet: 2
	Engineering: 1
	Fwd Obs: 1
	Gunnery: 5
	Halberd: 1
	Jack-o-T: 1
	Vacc Suit: 2

	Cash: $41000

	Equipment

		Bayonet: 1

	History

	Term 0 Events

	Term 1 Events
		Commissioned
		Promoted to Rank 1 (Ensign)
		Promoted to Rank 2 (Lieutenant)
		Stat Mod: +1 SOC
		Vacc Suit
		Gunnery
		Stat Mod: +1 EDU
		Successfully reenlisted

	Term 2 Events
		Promoted to Rank 3 (Lt Cmdr)
		Jack-o-T
		Stat Mod: +1 EDU
		Successfully reenlisted

	Term 3 Events
		Promoted to Rank 4 (Commander)
		Engineering
		Gunnery
		Successfully reenlisted

	Term 4 Events
		Fwd Obs
		-1 DEX due to aging
		Successfully reenlisted

	Term 5 Events
		Promoted to Rank 5 (Captain)
		Gained service rank bonus: +1 SOC
		Gunnery
		Gunnery
		Successfully reenlisted

	Term 6 Events
		Vacc Suit
		-1 DEX due to aging
		Successfully reenlisted

	Term 7 Events
		Promoted to Rank 6 (Admiral)
		Gained service rank bonus: +1 SOC
		Halberd
		Gunnery
		-1 END due to aging
		Retired at end of term
		Retired
		Earned 8000 annual retirement pay
		Mustered Out
		  20000
		  +2 SOC
		  1000
		  +1 INT
		  Blade: Bayonet
		  High Psg
		  20000
		  +2 EDU
		  Blade: +1 Bayonet
		  High Psg
		  Blade: +1 Bayonet
 
Perl Source Published to GitHub

This morning I uploaded the Perl source to GitHub.

It's available at a new repository PerlTravCharGen.

There are some comments, but it's not fully documented for use by others.

I tend to use very descriptive identifiers (subroutine names, function names, & variable names), so it should be easy to follow in areas without comments.

This was my first large Perl program, and I had just learned about hashes of hashes. If you are unsure of why "I did it that way" anywhere in the code, feel free to ask.

I'm always open to suggestions for improvement.
 
Let's talk. I recently started writing chargen routines in Perl -- also using hashrefs of course.

My source is at home. Send me an email, to remind me about it. Robert dot eaglestone at gmail dot com.
 
UML Diagram for my C# TravCharGen Program

I used the Altova UModel utility to reverse engineer my C# program into UML diagram, showing the objects & relationships.

The full image linked below (PNG format) is 4538 x 3270. I constrained it to width of 1200 for this forum post.

Anyone interested in this should be able to download it and zoom all the way in for more details.

Direct link: UML Diagram on Dropbox

 
Back
Top