#!/usr/bin/env bash ############################################################################### # # Copyright (C) 2009-2013 Nintendo. All rights reserved. # # These coded instructions, statements, and computer programs contain # proprietary information of Nintendo of America Inc. and/or Nintendo # Company Ltd., and are protected by Federal copyright law. They may # not be disclosed to third parties or copied or duplicated in any form, # in whole or in part, without the prior written consent of Nintendo. # ############################################################################### ############################################################################### # extract_info_from_app_xml # $1 - Path to app.xml ############################################################################### extract_info_from_app_xml() { local APP_XML_FILE="$1" # get title id APP_TITLE_ID=`sed -n 's|.*\(.*\)|\1|p' "$APP_XML_FILE"` APP_GROUP_ID=`sed -n 's|.*\(.*\)|\1|p' "$APP_XML_FILE"` APP_TITLE_VERSION=`sed -n 's|.*\(.*\)|\1|p' "$APP_XML_FILE"` echo "App Title ID : $APP_TITLE_ID" echo "App Group ID : $APP_GROUP_ID" echo "App Title Version : $APP_TITLE_VERSION" } ############################################################################### # checks if METARATING section exists int the individual ddf. # $1 Path to the ddf file (usualy individual ddf) # return 1 if METARATING exists, return 0 otherwise # (masteringfunctions.sh also has this function) ############################################################################### readonly DDF_FILE_NOT_FOUND=100 readonly DDF_METARATING_ON=1 readonly DDF_METARATING_OFF=0 ddf_has_metarating() { local DDF_FILE="$1" if [ ! -e $DDF_FILE ]; then return $DDF_FILE_NOT_FOUND fi # use SectionParam, as it is easy to use because its parameters are fixed. grep -q '^[[:space:]]*"METARATING"[[:space:]]*=[[:space:]]*0x0000000000000000,[[:space:]]*0x00000400,[[:space:]]*0x02[[:space:]]*$' "$DDF_FILE" if [ $? -ne 0 ]; then echo "METARATING setting in [SectionParam] does not exist." return $DDF_METARATING_OFF fi echo "METARATING section exists in $DDF_FILE" return $DDF_METARATING_ON } ############################################################################### # main ############################################################################### CAFEMAKEDLF="$CAFE_ROOT/system/bin/tool/mastering/cafemakedlf.exe" APP_TITLE_ID=0000000000000000 APP_GROUP_ID=00000000 APP_TITLE_VERSION=0000 if [[ -z "$1" ]]; then echo >&2 "cafedevrun.sh failed: image file required!" >&2 exit 50 fi MAKE_PATCH="$2" CAFEMAKEDLF_OPTION="$3" KIOSK_DEFAULT_DDF="$4" METARATING_DISABLED="$5" CAFEDEVRUN_FILE=${1/\/*\//} CAFEDEVRUN_EXT=${CAFEDEVRUN_FILE##*.} CAFEDEVRUN_NAME=${CAFEDEVRUN_FILE%.*} CAFEDEVRUN_FILENAME=${CAFEDEVRUN_NAME##*\\} CAFEDEVRUN_DIR=${CAFEDEVRUN_FILE%\\*} if [ "$MAKE_PATCH" == "1" ] then GAME_TYPE="GP" else GAME_TYPE="GM" fi # Check temporary directory CAFEDEVRUN_WORK_DIR=`cygpath -w "${CAFEDEVRUN_NAME}_tmp"` mkdir -p "$CAFEDEVRUN_WORK_DIR" if [ -z "$INCLUDE_SYSTEM_DIR" ] then INCLUDE_SYSTEM_DIR=0 fi CAFE_BASEFILE_PATH="`cygpath -w "$CAFE_ROOT"/system/bin/tool/mastering/resources`" # Set individiaul ddf file and default ddf file if [ -e "${1%.*}.ddf" ]; then INDIVIDUAL_DDF_FILE="${1%.*}.ddf" else INDIVIDUAL_DDF_FILE="" fi if [ -z "$KIOSK_DEFAULT_DDF" ]; then # makecfmaster.sh set $METARATING_DISABLED. if [ -n "$METARATING_DISABLED" ]; then if [ $METARATING_DISABLED -eq 1 ]; then DEFAULT_DDF="$CAFE_BASEFILE_PATH\\default_nometarating.ddf" else DEFAULT_DDF="$CAFE_BASEFILE_PATH\\default.ddf" fi else # code path for cafediscrun *.rpx. if [ -e "$INDIVIDUAL_DDF_FILE" ]; then SET_E=0 if [[ $- =~ e ]]; then SET_E=1 set +e fi ddf_has_metarating $INDIVIDUAL_DDF_FILE DDF_META=$? if [[ SET_E -eq 1 ]]; then set -e fi if [ $DDF_META -eq $DDF_METARATING_ON ]; then DEFAULT_DDF="$CAFE_BASEFILE_PATH\\default.ddf" METARATING_DISABLED=0 else DEFAULT_DDF="$CAFE_BASEFILE_PATH\\default_nometarating.ddf" METARATING_DISABLED=1 fi else DEFAULT_DDF="$CAFE_BASEFILE_PATH\\default_nometarating.ddf" METARATING_DISABLED=1 fi fi else echo "Change default.ddf -> $KIOSK_DEFAULT_DDF" DEFAULT_DDF=`cygpath -w -a "$KIOSK_DEFAULT_DDF"` METARATING_DISABLED=1 fi echo "Selected default ddf : $DEFAULT_DDF" COMMON_DDF_FILE="$CAFEDEVRUN_WORK_DIR\\common.ddf" # Use individual ddf file if exists if [ -e "$INDIVIDUAL_DDF_FILE" ] then echo "Info: Found ddf file: $INDIVIDUAL_DDF_FILE" echo "Change GameType to $GAME_TYPE" sed -i -e "s|^ *\(GameType *= *\).*|\1$GAME_TYPE|" "$INDIVIDUAL_DDF_FILE" # volume size, volume address check INDIVIDUAL_DDF_VOLUME_SIZE=`sed -n 's|^ *VolumeSize *= *\([0-9x]*\)|\1|p' "$INDIVIDUAL_DDF_FILE"` INDIVIDUAL_DDF_VOLUME_ADDR=`sed -n 's|^ *VolumeAddress *= *\([0-9x]*\)|\1|p' "$INDIVIDUAL_DDF_FILE"` DEFAULT_DDF_VOLUME_SIZE=`sed -n 's|^ *VolumeSize *= *\([0-9x]*\)|\1|p' "$DEFAULT_DDF"` DEFAULT_DDF_VOLUME_ADDR=`sed -n 's|^ *VolumeAddress *= *\([0-9x]*\)|\1|p' "$DEFAULT_DDF"` DDF_VOLUME_SIZE=$INDIVIDUAL_DDF_VOLUME_SIZE DDF_VOLUME_ADDR=$INDIVIDUAL_DDF_VOLUME_ADDR if [ -z "$DDF_VOLUME_SIZE" ]; then DDF_VOLUME_SIZE=$DEFAULT_DDF_VOLUME_SIZE fi if [ -z "$DDF_VOLUME_ADDR" ]; then DDF_VOLUME_ADDR=$DEFAULT_DDF_VOLUME_ADDR fi # dummy partition ((DUMMY_PARTITION_VOLUME_SIZE=0x40)) ((UPPERBOUND_VOLUME_ADDRESS=(0x00018000 + 0x000A2740 - DUMMY_PARTITION_VOLUME_SIZE))) if ((UPPERBOUND_VOLUME_ADDRESS < (DDF_VOLUME_ADDR + DDF_VOLUME_SIZE))) then ((DDF_VOLUME_SIZE=(UPPERBOUND_VOLUME_ADDRESS - DDF_VOLUME_ADDR))) DDF_VOLUME_SIZE=`printf "0x%08X" "${DDF_VOLUME_SIZE}"` if [ -n "$INDIVIDUAL_DDF_VOLUME_SIZE" ]; then sed -i -e "s|^ *VolumeSize *=.*$|VolumeSize = ${DDF_VOLUME_SIZE}|" "$INDIVIDUAL_DDF_FILE" echo "Warning: reduced volume size in order to add a partition - old: $INDIVIDUAL_DDF_VOLUME_SIZE new: $DDF_VOLUME_SIZE" else echo "$(basename $0) failed: value of VolumeAddress + VolumeSize is out of range" >&2 exit 52 fi fi fi # Extract Title ID, Group ID, Title Version from app.xml to put in common.ddf APP_XML_FILE="$CAFEDEVRUN_DIR/app.xml" if [ ! -f "$APP_XML_FILE" ] then echo "$(basename $0) failed: Cannot find $APP_XML_FILE" >&2 exit 53 fi extract_info_from_app_xml "$APP_XML_FILE" # Generate common.ddf echo "; ; $CAFEDEVRUN_NAME.$CAFEDEVRUN_EXT ; [Input] DiscHeaderBaseFileName=\"$CAFE_BASEFILE_PATH\\discheader_base.bin\" VolumeHeaderBaseFileName=\"$CAFE_BASEFILE_PATH\\volheader_base.bin\" [Output] LayoutFileName=\"$CAFEDEVRUN_NAME.dlf\" OutputDirectory=\"$CAFEDEVRUN_DIR\" AppName=\"$CAFEDEVRUN_FILENAME\" Mode=WU [DiscID] GameType=$GAME_TYPE TitleId=0x$APP_TITLE_ID GroupId=0x$APP_GROUP_ID DiskNumber=0 GameVersion=`expr $(printf %d 0x$APP_TITLE_VERSION) / 16` [SectionParam] \"CONTENT\"=0x$APP_TITLE_ID,0x$APP_GROUP_ID,0x02 [PathList] CODE_DIR_RPX=\"code\", \"\$(CAFE_CODE_DIR)\\$CAFEDEVRUN_FILENAME.rpx\" " > "$COMMON_DDF_FILE" if [ "$INCLUDE_SYSTEM_DIR" -eq 1 ] then echo " [PathList] SYSTEM_DIR=\"sys\", \"\$(CAFE_SYSTEM_DIR)\" [SectionAssign] 2147483647 = \"sys/*\", \"CONTENT\", 0x400 [FileLayout] -6=\"sys/*\", -2147483648 " >> "$COMMON_DDF_FILE" fi if [ $METARATING_DISABLED -eq 1 ]; then echo " [LayoutOff] \"\$(CAFE_META_DIR)\\CERO_ja.jpg\" \"\$(CAFE_META_DIR)\\CGSRR_zh.jpg\" \"\$(CAFE_META_DIR)\\COB_en.jpg\" \"\$(CAFE_META_DIR)\\ESRB_en.jpg\" \"\$(CAFE_META_DIR)\\ESRB_fr.jpg\" \"\$(CAFE_META_DIR)\\GRB_ko.jpg\" \"\$(CAFE_META_DIR)\\OFLC_en.jpg\" \"\$(CAFE_META_DIR)\\PEGI_BBFC_en.jpg\" \"\$(CAFE_META_DIR)\\PEGI_de.jpg\" \"\$(CAFE_META_DIR)\\PEGI_en.jpg\" \"\$(CAFE_META_DIR)\\PEGI_es.jpg\" \"\$(CAFE_META_DIR)\\PEGI_fr.jpg\" \"\$(CAFE_META_DIR)\\PEGI_it.jpg\" \"\$(CAFE_META_DIR)\\PEGI_nl.jpg\" \"\$(CAFE_META_DIR)\\PEGI_Portugal_pt.jpg\" \"\$(CAFE_META_DIR)\\PEGI_pt.jpg\" \"\$(CAFE_META_DIR)\\PEGI_ru.jpg\" \"\$(CAFE_META_DIR)\\RAR_ru.jpg\" \"\$(CAFE_META_DIR)\\USK_de.jpg\" " >> "$COMMON_DDF_FILE" fi # Temporarily convert to windows format path for CafeMakeDlf. CAFE_CODE_DIR="$(cygpath -w "$CAFE_CODE_DIR")" CAFE_META_DIR="$(cygpath -w "$CAFE_META_DIR")" CAFE_CONTENT_DIR="$(cygpath -w "$CAFE_CONTENT_DIR")" if [ "$INCLUDE_SYSTEM_DIR" -eq 1 ] then CAFE_SYSTEM_DIR="$(cygpath -w "$CAFE_SYSTEM_DIR")" fi "$CAFEMAKEDLF" -uf "$DEFAULT_DDF" "$COMMON_DDF_FILE" "$INDIVIDUAL_DDF_FILE" $CAFEMAKEDLF_OPTION rval=$? CAFE_CODE_DIR="$(cygpath -a "$CAFE_CODE_DIR")" CAFE_META_DIR="$(cygpath -a "$CAFE_META_DIR")" CAFE_CONTENT_DIR="$(cygpath -a "$CAFE_CONTENT_DIR")" if [ "$INCLUDE_SYSTEM_DIR" -eq 1 ] then CAFE_SYSTEM_DIR="$(cygpath -a "$CAFE_SYSTEM_DIR")" fi if [ $rval -ne 0 ] then exit 54 fi # WORKAROUND for makedlf 0.27.0.*: Need empty line in the end of dlf file for block emulation mode by FSEmul. echo "0x00000005D3A00000,\"\"" >> "$CAFEDEVRUN_NAME.dlf"