/* This is a schema for a single entry in a shipdata.plist file (not the file as a whole). */ { type = "dictionary"; requiredKeys = ( "model", "name", "roles" ); schema = { like_ship = "$shipRole"; is_template = "boolean"; is_external_dependency = "boolean"; max_flight_speed = "positiveFloat"; max_flight_roll = "positiveFloat"; max_flight_pitch = "positiveFloat"; max_flight_yaw = "positiveFloat"; thrust = "positiveFloat"; accuracy = "float"; max_energy = "positiveFloat"; energy_recharge_rate = "positiveFloat"; forward_weapon_type = "$weaponType"; aft_weapon_type = "$weaponType"; weapon_energy = "positiveFloat"; scanner_range = "positiveFloat"; fuel_charge_rate = "positiveFloat"; missiles = "positiveInteger"; has_ecm = "fuzzyBoolean"; has_scoop = "fuzzyBoolean"; has_escape_pod = "positiveInteger"; has_energy_bomb = "fuzzyBoolean"; has_fuel_injection = "fuzzyBoolean"; has_cloaking_device = "fuzzyBoolean"; has_military_jammer = "fuzzyBoolean"; has_military_scanner_filter = "fuzzyBoolean"; fragment_chance = "fuzzyBoolean"; has_shield_booster = "fuzzyBoolean"; has_shield_enhancer = "fuzzyBoolean"; fuel = "positiveInteger"; bounty = "positiveInteger"; ai_type = "$aiFileName"; max_cargo = "positiveInteger"; likely_cargo = "positiveInteger"; extra_cargo = "positiveInteger"; cargo_carried = "$cargoCarried"; cargo_type = "$cargoType"; model = "$modelName"; materials = "$materialDict"; shaders = "$materialDict"; smooth = "boolean"; density = "positiveFloat"; name = "string"; display_name = "string"; roles = "$roles"; exhaust = { type = "array"; valueType = "$exhaustSpecifier"; }; is_hulk = "boolean"; subentities = { type = "array"; valueType = "$subEntitySpecifier"; }; frangible = "boolean"; scanner_display_color1 = "$colorSpecifier"; scanner_display_color2 = "$colorSpecifier"; laser_color = "$colorSpecifier"; scan_class = "$scanClass"; scanClass = "$scanClass"; launch_actions = "$scriptActions"; script_actions = "$scriptActions"; death_actions = "$scriptActions"; setup_actions = "$scriptActions"; escorts = "positiveInteger"; beacon = "string"; rotational_velocity = "quaternion"; track_contacts = "boolean"; weapon_position_forward = "vector"; weapon_position_aft = "vector"; weapon_position_port = "vector"; weapon_position_starboard = "vector"; weapon_offset_x = "float"; // NOTE: ignored after 1.65 scoop_position = "vector"; heat_insulation = "positiveFloat"; pilot = "$characterKey"; unpiloted = "fuzzyBoolean"; escort_role = "$shipRole"; escort-role = "$shipRole"; escort_ship = "$shipKey"; escort-ship = "$shipKey"; missile_launch_position = "vector"; missile_load_time = "positiveFloat"; missile_role = "$shipRole"; escape_pod_model = "$shipRole"; aft_eject_position = "vector"; auto_ai = "boolean"; script = "$scriptFileName"; conditions = "$scriptConditionList"; script_info = "dictionary"; is_submunition = "boolean"; is_carrier = "boolean"; isCarrier = "boolean"; no_boulders = "fuzzyBoolean"; hyperspace_motor_spin_time = "positiveFloat"; throw_sparks = "boolean"; max_missiles = "positiveInteger"; cloak_passive = "boolean"; debris_role = "$shipRole"; has_scoop_message = "boolean"; rotating = "boolean"; defense_ship = "$shipKey"; defense_ship_role = "$shipRole"; has_npc_traffic = "fuzzyBoolean"; has_shipyard = "$hasShipyard"; hasShipyard = "$hasShipyard"; port_radius = "positiveFloat"; port_dimensions = "$portDimensions"; equivalent_tech_level = "integer"; max_scavengers = "positiveInteger"; max_defense_ships = "positiveInteger"; max_police = "positiveInteger"; equipment_price_factor = "positiveFloat"; requires_docking_clearance = "boolean"; docking_pattern_model = "$modelName"; market = "string"; extra_equipment = "$extraEquipmentDictionary"; hud = "$hudFileName"; view_position_forward = "vector"; view_position_aft = "vector"; view_position_port = "vector"; view_position_starboard = "vector"; custom_views = { type = "array"; valueType = "$customViewSpec"; }; }; $definitions = { // "Special" types referred to above. $weaponType = { type = "enumeration"; values = ( "WEAPON_NONE", "WEAPON_PLASMA_CANNON", "WEAPON_PULSE_LASER", "WEAPON_BEAM_LASER", "WEAPON_MINING_LASER", "WEAPON_MILITARY_LASER", "WEAPON_THARGOID_LASER" ); }; $materialDict = { type = "dictionary"; schema = { ambient = "$colorSpecifier"; diffuse = "$colorSpecifier"; diffuse_map = "$textureSpecifier"; emission = "$colorSpecifier"; shininess = { type = "positiveInteger"; maximum = "128"; }; specular = "$colorSpecifier"; fragment_shader = "$shaderFileName"; textures = { type = "array"; valueType = "$textureSpecifier"; }; uniforms = { type = "dictionary"; valueType = { type = "oneOf"; options = ( "string", { type = "dictionary"; schema = { asMatrix = "boolean"; binding = "string"; clamped = "boolean"; normalized = "boolean"; type = { type = "enumeration"; values = ( "binding", "float", "real", "int", "integer", "texture" ); }; value = "float"; }; } ); }; }; vertex_shader = "$shaderFileName"; }; }; $textureSpecifier = { type = "oneOf"; options = ( "string", { type = "dictionary"; schema = { anisotropy = "positiveFloat"; mag_filter = { type = "enumeration"; values = ( "nearest", "linear" ); }; min_filter = { type = "enumeration"; values = ( "nearest", "linear", "mipmap", "default" ); }; name = "string"; no_shrink = "boolean"; repeat_s = "boolean"; repeat_t = "boolean"; texture_LOD_bias = "float"; }; } ); }; $scanClass = { type = "enumeration"; values = ( "CLASS_NOT_SET", "CLASS_BUOY", "CLASS_CARGO", "CLASS_MILITARY", "CLASS_MISSILE", "CLASS_POLICE", "CLASS_ROCK", "CLASS_STATION", "CLASS_THARGOID" ); }; $cargoType = { type = "enumeration"; values = ( "CARGO_NOT_CARGO", "CARGO_SLAVES", "CARGO_ALLOY", "CARGO_MINERALS", "CARGO_THARGOID", "CARGO_RANDOM", "CARGO_CARRIED", "CARGO_SCRIPTED_ITEM", "CARGO_CHARACTER" ); }; $customViewSpec = { type = "dictionary"; schema = { "view_description" = "string"; "view_position" = "vector"; "view_orientation" = "quaternion"; "weapon_facing" = { type = "enumeration"; filter = "lowerCase"; values = ( "forward", "aft", "port", "starboard" ); }; }; }; // Types handled in code. $modelName = { type = "delegatedType"; baseType = { type = "string"; filter = "lowerCase"; requiredSuffix = ".dat"; }; key = "modelName"; }; $colorSpecifier = { type = "delegatedType"; baseType = { type = "oneOf"; options = ( "array", "dictionary", "string" ); }; key = "colorSpecifier"; }; $textureFileName = { type = "delegatedType"; baseType = { type = "string"; filter = "lowerCase"; requiredSuffix = ".png"; }; key = "textureFileName"; }; $hasShipyard = { type = "oneOf"; options = ( "$scriptCondition", "boolean" ); }; $aiFileName = { type = "delegatedType"; baseType = { type = "string"; filter = "lowerCase"; requiredSuffix = ".plist"; }; key = "aiFileName"; }; $shaderFileName = { type = "delegatedType"; baseType = { type = "string"; filter = "lowerCase"; requiredSuffix = ( ".vertex", ".vert", ".fragment", ".frag" ); }; key = "shaderFileName"; }; $exhaustSpecifier = { type = "delegatedType"; baseType = "string"; key = "exhaustSpecifier"; }; $subEntitySpecifier = { type = "oneOf"; options = ( { type = "delegatedType"; baseType = "string"; key = "subEntitySpecifier"; }, { type = "dictionary"; requiredKeys = ( "type", "subentity_key" ); schema = { "type" = { type = "enumeration"; values = ( "standard", "ball_turret" ); }; subentity_key = "$shipKey"; position = "vector"; orientation = "quaternion"; is_dock = "boolean"; }; }, { type = "dictionary"; requiredKeys = ( "type" ); schema = { "type" = { type = "enumeration"; values = ( "flasher" ); }; color = "$colorSpecifier"; colors = { type = array; valueType = "$colorSpecifier"; }; position = "vector"; orientation = "quaternion"; size = "positiveFloat"; frequency = "float"; phase = "float"; initially_on = "boolean"; }; } ); }; $scriptActions = { type = "delegatedType"; baseType = "array"; key = "scriptActions"; }; $characterKey = { type = "delegatedType"; baseType = "string"; key = "characterKey"; }; $shipRole = { type = "delegatedType"; baseType = "string"; key = "shipRole"; }; $shipKey = { type = "delegatedType"; baseType = "string"; key = "shipKey"; }; $roles = { type = "delegatedType"; baseType = "string"; key = "roles"; }; $scriptCondition = { type = "delegatedType"; baseType = "string"; key = "scriptCondition"; }; $scriptConditionList = { type = "delegatedType"; baseType = "array"; key = "scriptConditions"; }; $portDimensions = { type = "delegatedType"; baseType = "string"; key = "portDimensions"; }; $extraEquipmentDictionary = { type = "delegatedType"; baseType = "dictionary"; key = "extraEquipmentDictionary"; }; $hudFileName = { type = "delegatedType"; baseType = "string"; key = "hudFileName"; }; $cargoCarried = { type = "delegatedType"; baseType = "string"; key = "cargoCarried"; }; $scriptFileName = { type = "delegatedType"; baseType = "string"; key = "$scriptFileName"; }; }; }