Update, 20101231..
R11 has been added to the shiplist and looks good. I've decided to play with it, and loaded up one of my own custom campaigns.
Basically.. I loaded up EAW's Lyran campaign vs ISC (recompiled for OP) with EvilDave missions, in LATE era. I want to start in Late and see the X1-R refits happen.
..
.. the enemy ships. They are hard. wow.
.. and then came the first campaign mission: Peace in Our Times.. .. and I wasn't happy. Everything was screwed up!
1-
The game really doesn't provide any information whatsoever about what year it is, or what ships are sane, to its missions. I spend days looking at the code and confirm, it's just not available.
![Sad :(](http://www.dynaverse.net/forum/Smileys/NewSmilies/sad.gif)
So.. ok. While it's impossible to get the year of availability, there are certain things that can be done for that.. an estimate. Fine I can work with that.
2- What are all those messed up specialized ships doing showing up in a campaign mission..! Now THAT I can do something about. This is something I added in OP+ 4.0 and am preserving in 4.1: fine control.
Check this out.. This one's for mission scripters. This is what fine shiplist and ship selection control is for.
if (global_sl.mIsEnhancedShiplist()) {
// filter based on Class type
// We don't want DNs and BBs, bases, etc.
std::list< eEnhancedClassTypes > enhancedClassTypeList;
enhancedClassTypeList.push_back(kEClassFrigate);
enhancedClassTypeList.push_back(kEClassDestroyer);
enhancedClassTypeList.push_back(kEClassWarDestroyer);
enhancedClassTypeList.push_back(kEClassLightCruiser);
enhancedClassTypeList.push_back(kEClassWarCruiser);
enhancedClassTypeList.push_back(kEClassHeavyWarDestroyer);
enhancedClassTypeList.push_back(kEClassMediumCruiser);
enhancedClassTypeList.push_back(kEClassHeavyCruiser);
enhancedClassTypeList.push_back(kEClassNewHeavyCruiser);
enhancedClassTypeList.push_back(kEClassHeavyBattlecruiser);
global_sl.Subset(enhancedClassTypeList);
// filter based on wanted roles
// Skip Cargo ships, Bases, Repair ships, hospital ships, etc.
std::list< eEnhancedRoles > rolesList;
rolesList.push_back(kLineShip);
rolesList.push_back(kWarShip);
rolesList.push_back(kLeader);
rolesList.push_back(kDroneBombardmentShip);
rolesList.push_back(kEscort);
rolesList.push_back(kCarrier);
rolesList.push_back(kPFTender);
rolesList.push_back(kFastCruiser);
rolesList.push_back(kMauler);
rolesList.push_back(kPolice);
global_sl.Subset(rolesList);
// filter based on availability
// Skip kConjectural, kUnique
std::list< eEnhancedProductionAvailability > enhancedAvailabilityList;
enhancedAvailabilityList.push_back(kRare);
enhancedAvailabilityList.push_back(kCommon);
enhancedAvailabilityList.push_back(kMany);
global_sl.Subset(enhancedAvailabilityList);
} else {
std::list< eHullType > hullTypeList;
hullTypeList.push_back(kFF);
hullTypeList.push_back(kDD);
hullTypeList.push_back(kCL);
hullTypeList.push_back(kCA);
global_sl.Subset(hullTypeList);
}