############################################################################### # # 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. # ############################################################################### # Environment settings MAKEDLF="$CAFE_ROOT/system/bin/tool/mastering/cafemakedlf.exe" MAKEMASTER="$CAFE_ROOT/system/bin/tool/mastering/makemaster.exe" MAKEDISCIMAGE="$CAFE_ROOT/system/bin/tool/mastering/makediscimage.exe" MAKEDOWNLOADIMAGE="$CAFE_ROOT/system/bin/tool/makecfdownloadimage.sh" MAKEIDBE="$CAFE_ROOT/system/bin/tool/mastering/makeidbe.exe" MAKEAOC="$CAFE_ROOT/system/bin/tool/makeaoc.sh" MAKEPATCH="$CAFE_ROOT/system/bin/tool/mastering/makepatch.exe" EXTRACTFILE="$CAFE_ROOT/system/bin/tool/mastering/extractfile.exe" G_INFOMSG="" G_WARNMSG="" G_ERRMSG="" G_IGNORE_ERROR=0 G_APP_BUILD_TYPE="" G_OS_VERSION="" ############################################################################### # arg num check ############################################################################### arg_num_check() { if [ $# -ne 2 ] then echo "Internal Error: number of argument: $#" exit 2 fi if [ $1 -ne $2 ] then echo "Internal Error: number of argument: $1 (expected: $2)" exit 2 fi } ############################################################################### # dir check ############################################################################### dir_check () { arg_num_check $# 2 local DIR="$1" local CLEAN_UP="$2" if [ -e "$DIR" ] then if [ ! -d "$DIR" ] then echo "$(basename "$0") failed: $DIR is not a directory." return 1 fi if [ "$CLEAN_UP" -eq 1 ] then rm -Rf "$DIR" mkdir "$DIR" fi else mkdir "$DIR" fi return 0 } ############################################################################### # add_msg ############################################################################### add_msg() { arg_num_check $# 1 local MSG="$1" set $MSG local MSGTYPE="$1" echo "$MSG" MSG=${MSG//\\/\\\\} if [ "$MSGTYPE" == "Warning:" ]; then G_WARNMSG="$G_WARNMSG$MSG\n" elif [ "$MSGTYPE" == "Error:" ]; then if [ "$G_IGNORE_ERROR" -eq 1 ]; then G_ERRMSG="$G_ERRMSG$MSG\n" else echo "Use -i option to ignore errors." exit 14 fi else G_INFOMSG="$G_INFOMSG$MSG\n" fi } ############################################################################### # add_msg_if_match ############################################################################### add_msg_if_match() { arg_num_check $# 3 local TARGET_FILE="$1" local TARGET_HASH="$2" local MSG="$3" echo "$TARGET_HASH *$TARGET_FILE" | md5sum -c --status local RESULT=$? if [ "$RESULT" -eq 0 ]; then add_msg "$MSG" fi } ############################################################################### # add_msg_if_not_match ############################################################################### add_msg_if_not_match() { arg_num_check $# 3 local TARGET_FILE="$1" local TARGET_HASH="$2" local MSG="$3" echo "$TARGET_HASH *$TARGET_FILE" | md5sum -c --status local RESULT=$? if [ "$RESULT" -ne 0 ]; then add_msg "$MSG" fi } ############################################################################### # Show messages ############################################################################### show_msg() { if [ -n "$G_INFOMSG" ]; then echo "***************************************************" echo -e "$G_INFOMSG" fi if [ -n "$G_WARNMSG" ]; then echo "*******************************************************" echo "The following warnings should be removed before wumad submission." echo -e "$G_WARNMSG" fi if [ -n "$G_ERRMSG" ]; then echo "*********************************************************" echo "The following errors occured while generating wumad." echo "The output wumad may be invalid." echo -e "$G_ERRMSG" fi } ############################################################################### # Check the Unique ID in the app.xml file ############################################################################### check_unique_id () { arg_num_check $# 1 local badRangeMaxA=0x000FF local badRangeMinB=0xF7000 local badRangeMaxB=0xF7BFF local warnRangeMinC=0xF7C00 local warnRangeMaxC=0xF7FFF local APP_XML_FILE="$1" local uniqueId=0x$(sed -n 's|.*.........\(.*\)..|\1|p' "$APP_XML_FILE") ## Check the Unique ID for the specified ranges. if [[ $uniqueId -le $badRangeMaxA || $uniqueId -ge $badRangeMinB && $uniqueId -le $badRangeMaxB ]]; then cat < tags. 000500001XXXXX00 The five "X" hex values represent the Unique Id. 0x00000 Through $badRangeMaxA $badRangeMinB Through $badRangeMaxB $warnRangeMinC Through $warnRangeMaxC EOF add_msg "Error: Reserved Unique ID is used." elif [[ $uniqueId -ge $warnRangeMinC && $uniqueId -le $warnRangeMaxC ]]; then add_msg "Warning: Unique ID for development is used." else echo "Unique ID OK!" fi } ############################################################################### # check embedded appconfig version ############################################################################### check_appconf_version() { arg_num_check $# 1 local XML_FILE=$1 local APPCONF_VER=`sed -n 's|.*\([^<]*\).*|\1|p' "$XML_FILE"` if [ -z $APPCONF_VER ] then add_msg "Warning: old xml file '$XML_FILE' detected: exported with an old appconfig tool" else echo "Appconfig tool version: $APPCONF_VER" fi } ############################################################################### # check_xml_version # # copy default xml if destination xml doesn't exist # otherwise, compare version. exit or copy default if mismatch ############################################################################### check_xml_version() { arg_num_check $# 3 local FILE_DEST="$1" local FILE_DEFAULT="$2" local FILE_OPTION="$3" if [ ! -f "$FILE_DEST" ] then echo "$(basename "$0"): Copying default config file to $FILE_DEST" if [ ! -f "$FILE_DEFAULT" ] then echo "$(basename "$0") failed: Cannot find default config file $FILE_DEFAULT" exit 12 fi install -Dp "$FILE_DEFAULT" "$FILE_DEST" else # extract version number of xml element in file of the form: local VER_DEFAULT=`sed -n 's|.*|\1|p' "$FILE_DEFAULT"` local VER_DEST=`sed -n 's|.*|\1|p' "$FILE_DEST"` if [ -z "$VER_DEST" -o -z "$VER_DEFAULT" ] then echo "$(basename "$0") failed: Cannot get xml version numbers" exit 12 fi if [ ! "$VER_DEST" = "$VER_DEFAULT" ] then if [ "$FILE_OPTION" = "copy_default_if_mismatch" ] then echo "$(basename "$0"): Config file version mismatch detected: $VER_DEST vs. required $VER_DEFAULT" echo " Copying default config file to $FILE_DEST" if [ ! -f "$FILE_DEFAULT" ] then echo "$(basename "$0") failed: Cannot find default config file $FILE_DEFAULT" exit 12 fi install -Dp "$FILE_DEFAULT" "$FILE_DEST" else echo "$(basename "$0") failed: Please update or delete config file: $FILE_DEST" echo " Version number mismatch: $VER_DEST vs. required $VER_DEFAULT" exit 10 fi fi fi } ############################################################################### # extract_info_from_app_rpx # $1 - Path to app.rpx # $2 - Path to app.xml ############################################################################### extract_info_from_app_rpx() { arg_num_check $# 2 local APP_RPX_FILE_DOS=`cygpath -m "$1"` local APP_XML="$2" # get title id G_APP_BUILD_TYPE=`dumprpl -fileinfo "$APP_RPX_FILE_DOS" | sed -n 's|.*BUILD_TYPE.\+\"\([A-Z]\+\)\"|\1|p'` if [ -z "$G_APP_BUILD_TYPE" ] then add_msg "Warning: G_APP_BUILD_TYPE is NULL" # Not error if G_APP_BUILD_TYPE is NULL elif [ "$G_APP_BUILD_TYPE" == "DEBUG" ] then echo "DEBUG modify" G_OS_VERSION=`sed -n 's|.*\(.*\)|\1|p' "$APP_XML"` G_OS_VERSION=`echo "$G_OS_VERSION" | sed -n 's|\(........\)\(.\).....\(..\)|\1\200080\3|p'` elif [ "$G_APP_BUILD_TYPE" == "NDEBUG" ] then echo "NDEBUG modify" G_OS_VERSION=`sed -n 's|.*\(.*\)|\1|p' "$APP_XML"` G_OS_VERSION=`echo "$G_OS_VERSION" | sed -n 's|\(........\)\(.\).....\(..\)|\1\200040\3|p'` fi echo "APP Build Type : $G_APP_BUILD_TYPE" echo "OS_VERSION : $G_OS_VERSION" } ############################################################################### # update_app_xml ############################################################################### update_app_xml() { arg_num_check $# 1 local APP_XML="$1" if [ ! -f "$APP_XML" ] then add_msg "Warning: Cannot find default file $APP_XML" # Not error if app xml is not found else if [ -n "$G_OS_VERSION" ] then # insert os version sed -i -e "s|\(\).*\(<.*>\)|\1$G_OS_VERSION\2|" "$APP_XML" echo update app.xml $G_OS_VERSION $APP_XML fi fi } ############################################################################### # update meta.xml ############################################################################### update_meta_xml () { arg_num_check $# 1 local META_XML="$1" if [ ! -f "$META_XML" ] then add_msg "Warning: Cannot find default file $META_XML" # Not error if meta xml is not found else if [ -n "$G_OS_VERSION" ] then # insert os version sed -i -e "s|\(\).*\(<.*>\)|\1$G_OS_VERSION\2|" "$META_XML" echo update meta.xml $G_OS_VERSION $META_XML fi local RESERVED6=$(sed -n 's|.*\([0-9a-fA-F]*\)|\1|p' "$META_XML") # lowering 'mastering DLL' bit (lower 1 bit) and 'rating image' bits (upper 19 bits). RESERVED6=$(printf "%d" $((0x00001FFE & 0x$RESERVED6))) # update rating image bits local RESERVED6_RATING=0 if [ "$G_METARATING_DISABLED" -eq 0 ]; then local SHIFT_VAL=31 for IMG_NAME in ${G_RATING_IMG_NAME_LIST[@]} do if [ -f "$CAFE_META_DIR/$IMG_NAME.jpg" ]; then is_dummy_rating_file "$CAFE_META_DIR/$IMG_NAME.jpg" if [ $? -eq 0 ]; then RESERVED6_RATING=$(( RESERVED6_RATING + (1 << SHIFT_VAL) )) fi fi SHIFT_VAL=$((SHIFT_VAL - 1)) done fi RESERVED6=$(printf "%08X" $(( RESERVED6_RATING + RESERVED6 ))) sed -i -e "s|\(\)\(.*\)\(\)|\1$RESERVED6\3|" "$META_XML" fi } ############################################################################### # update_cos_xml ############################################################################### update_cos_xml() { arg_num_check $# 1 local COS_XML="$1" local CMD_FLAGS=0 # insert OSFlags between and xml tags sed -i -e "s|\(\).*\(<.*>\)|\1$CMD_FLAGS\2|" "$COS_XML" } ############################################################################### # embed_sdk_version_to_masterinfo # $1 - Path to masterinfo.xml ############################################################################### embed_sdk_version_to_masterinfo() { arg_num_check $# 1 local DEST_MASTERINFO_XML="$1" local RPL_FILE local RPL_FILE_DOS local RPL_FILE_BASENAME local RPL_BUILD_TYPE local RPL_SDK_VERSION local RPL_SDK_REVISION local BUILD_INFO_STRING=" \n" for RPL_FILE in "$CAFE_CODE_DIR"/*.rp[xl] do RPL_FILE_DOS=`cygpath -w -a $RPL_FILE` RPL_FILE_BASENAME=`basename $RPL_FILE` RPL_BUILD_TYPE=`dumprpl -fileinfo "$RPL_FILE_DOS" | sed -n 's|.*BUILD_TYPE.\+\"\([A-Z]\+\)\"|\1|p'` RPL_SDK_VERSION=`dumprpl -fileinfo "$RPL_FILE_DOS" | sed -n 's|.*CAFE_OS_SDK_VERSION.\+\"\([0-9A-Fa-f]\+\)\"|\1|p'` RPL_SDK_REVISION=`dumprpl -fileinfo "$RPL_FILE_DOS" | sed -n 's|.*CAFE_OS_SDK_REVISION.\+\"\([0-9A-Fa-f]\+\)\"|\1|p'` echo "build-info of $RPL_FILE_BASENAME:" echo " build: $RPL_BUILD_TYPE" echo " version: $RPL_SDK_VERSION" echo " revision: $RPL_SDK_REVISION" if [ -z "$RPL_BUILD_TYPE" ]; then add_msg "Info: $RPL_FILE_BASENAME: BUILD_TYPE is NULL" fi if [ -z "$RPL_SDK_VERSION" ]; then add_msg "Info: $RPL_FILE_BASENAME: SDK_VERSION is NULL" fi if [ -z "$RPL_SDK_REVISION" ]; then add_msg "Info: $RPL_FILE_BASENAME: SDK_REVISION is NULL" fi BUILD_INFO_STRING="$BUILD_INFO_STRING \n" BUILD_INFO_STRING="$BUILD_INFO_STRING $RPL_FILE_BASENAME\n" BUILD_INFO_STRING="$BUILD_INFO_STRING $RPL_BUILD_TYPE\n" BUILD_INFO_STRING="$BUILD_INFO_STRING $RPL_SDK_VERSION\n" BUILD_INFO_STRING="$BUILD_INFO_STRING $RPL_SDK_REVISION\n" BUILD_INFO_STRING="$BUILD_INFO_STRING \n" done BUILD_INFO_STRING="$BUILD_INFO_STRING " local CURRENT_BUILD_INFO_LIST=`sed -n "/.*/{; :loop; N; /.*<\/build-info-list>/! b loop; p; d}" "$DEST_MASTERINFO_XML"` if [ -z "$CURRENT_BUILD_INFO_LIST" ] then # add in the tail of sed -i -e "s|\(.*\)|$BUILD_INFO_STRING\n\1|" "$DEST_MASTERINFO_XML" else # replace current sed -i -e "/.*/{; :loop; N; /.*<\/build-info-list>/! b loop; s|.*.*|$BUILD_INFO_STRING|}" "$DEST_MASTERINFO_XML" fi } ############################################################################### # embed_tool_version_to_masterinfo # $1 - Path to masterinfo.xml ############################################################################### embed_tool_version_to_masterinfo() { arg_num_check $# 1 local DEST_MASTERINFO_XML="$1" local MAKEDLF_USAGE=`"$MAKEDLF" -h` local MAKEDLF_VERSION=`echo "$MAKEDLF_USAGE" | sed -n 's|.*ver\.\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\).*|\1|p'` echo "makedlf-version:$MAKEDLF_VERSION" local CURRENT_MAKEDLF_VERSION=`sed -n 's|.*\(.*\)|\1|p' "$DEST_MASTERINFO_XML"` if [ -z "$CURRENT_MAKEDLF_VERSION" ] then # add sed -i -e "s|\(.*\)| $MAKEDLF_VERSION\n\1|" "$DEST_MASTERINFO_XML" else # replace current sed -i -e "s|\(\)\(.*\)\(\)|\1$MAKEDLF_VERSION\3|" "$DEST_MASTERINFO_XML" fi local MAKEMASTER_USAGE=`"$MAKEMASTER" -h` local MAKEMASTER_VERSION=`echo "$MAKEMASTER_USAGE" | sed -n 's|.*ver\.\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\).*|\1|p'` echo "makemaster-version:$MAKEMASTER_VERSION" local CURRENT_MAKEMASTER_VERSION=`sed -n 's|.*\(.*\)|\1|p' "$DEST_MASTERINFO_XML"` if [ -z "$CURRENT_MAKEMASTER_VERSION" ] then # add sed -i -e "s|\(.*\)| $MAKEMASTER_VERSION\n\1|" "$DEST_MASTERINFO_XML" else # replace current sed -i -e "s|\(\)\(.*\)\(\)|\1$MAKEMASTER_VERSION\3|" "$DEST_MASTERINFO_XML" fi } ############################################################################### # embed_os_version_to_masterinfo # $1 - Path to masterinfo.xml ############################################################################### embed_os_version_to_masterinfo() { arg_num_check $# 1 local DEST_MASTERINFO_XML="$1" if [ ! -f "$DEST_MASTERINFO_XML" ] then add_msg "Warning: Cannot find $DEST_MASTERINFO_XML" else if [ -n "$G_OS_VERSION" ] then # insert os version local RESULT=$(printf "0x%s" $G_OS_VERSION) sed -i -e "s|\(\)\(.*\)\(\)|\1$RESULT\3|" "$DEST_MASTERINFO_XML" echo update $G_OS_VERSION $DEST_MASTERINFO_XML fi fi } ############################################################################### # embed_ddf_info_to_masterinfo # $1 - Path to individual ddf file # $2 - Path to masterinfo.xml ############################################################################### embed_ddf_info_to_masterinfo() { arg_num_check $# 2 local DDF_FILE="$1" local DEST_MASTERINFO_XML="$2" if [ ! -f "$DEST_MASTERINFO_XML" ] then add_msg "Warning: Cannot find $DEST_MASTERINFO_XML" elif [ ! -f "$DDF_FILE" ] then add_msg "Warning: Cannot find $DDF_FILE" else local VOLUME_ADDR=$(sed -n 's| *VolumeAddress *= *\([0-9a-fA-F]\+.*\)|\1|p' "$DDF_FILE") local VOLUME_SIZE=$(sed -n 's| *VolumeSize *= *\([0-9a-fA-F]\+.*\)|\1|p' "$DDF_FILE") if [ -n "$VOLUME_SIZE" ] && [ -n "$VOLUME_ADDR" ] then # insert os version sed -i -e "s|\(\)\(.*\)\(\)|\1$VOLUME_SIZE\3|" "$DEST_MASTERINFO_XML" sed -i -e "s|\(\)\(.*\)\(\)|\1$VOLUME_ADDR\3|" "$DEST_MASTERINFO_XML" echo "update ddf information" $VOLUME_ADDR $VOLUME_SIZE "$DEST_MASTERINFO_XML" else add_msg "Warning: failed to update ddf information" fi fi } ############################################################################### # embed_mastering_sdk_version # $1 - Path to masterinfo.xml ############################################################################### embed_mastering_sdk_version() { arg_num_check $# 1 local DEST_MASTERINFO_XML="$1" if [ ! -f "$DEST_MASTERINFO_XML" ] then add_msg "Warning: Cannot find $DEST_MASTERINFO_XML" else local SDK_VER_H="$CAFE_ROOT/system/include/sdk_ver.h" local SDK_VER=$(sed -n 's|[ \t]*#define[ \t]\+CAFE_OS_SDK_VERSION[ \t]*\([0-9a-fA-F]\+\).*|\1|p' "$SDK_VER_H") local SDK_REV=$(sed -n 's|[ \t]*#define[ \t]\+CAFE_OS_SDK_BUILD_VERSION[ \t]*\"\([0-9a-fA-F]\+\).*|\1|p' "$SDK_VER_H") if [ -n "$SDK_VER" ] then echo "mastering SDK version: $SDK_VER" local CURRENT_MASTERING_SDK_VERSION_TAGS=$(sed -n 's|.*\(.*\)|\1|p' "$DEST_MASTERINFO_XML") if [ -z "$CURRENT_MASTERING_SDK_VERSION_TAGS" ] then # add sed -i -e "s|\(.*\)| $SDK_VER\n\1|" "$DEST_MASTERINFO_XML" else # replace current sed -i -e "s|\(\)\(.*\)\(\)|\1$SDK_VER\3|" "$DEST_MASTERINFO_XML" fi local CURRENT_MASTERING_SDK_REVISION_TAGS=$(sed -n 's|.*\(.*\)|\1|p' "$DEST_MASTERINFO_XML") if [ -z "$CURRENT_MASTERING_SDK_REVISION_TAGS" ] then sed -i -e "s|\(.*\)| $SDK_REV\n\1|" "$DEST_MASTERINFO_XML" else sed -i -e "s|\(\)\(.*\)\(\)|\1$SDK_REV\3|" "$DEST_MASTERINFO_XML" fi else add_msg "Warning: failed to get sdk version" fi fi } ############################################################################### # reset_mastering_flag # $1 - Path to masterinfo.xml # $2 - Path to meta.xml ############################################################################### reset_mastering_flag() { arg_num_check $# 2 local DEST_MASTERINFO_XML="$1" local DEST_META_XML="$2" if [ ! -f "$DEST_MASTERINFO_XML" ] then add_msg "Warning: Cannot find $DEST_MASTERINFO_XML" elif [ ! -f "$DEST_META_XML" ] then add_msg "Warning: Cannot find $DDF_FILE" else local RESERVED6=$(sed -n 's|.*\([0-9a-fA-F]*\)|\1|p' "$DEST_META_XML") RESERVED6=$(printf "%08X" $((0xFFFFFFFE & 0x$RESERVED6))) RESERVED6_MASTERINFO="0x$RESERVED6" sed -i -e "s|\(\)\(.*\)\(\)|\1$RESERVED6_MASTERINFO\3|" "$DEST_MASTERINFO_XML" echo "Initialized mastering flag" fi } ############################################################################### # check_patch_save_datasize (DRAFT : CURRENTLY NOT USED) # $1 - Path to meta.xml # $2 - Path to masterinfo.xml of previous wumad. ############################################################################### check_patch_save_size() { arg_num_check $# 1 local META_XML="$1" local PAST_MASTERINFO="$2" if [ ! -f "$META_XML" -o ! -f "$PAST_MASTERINFO" ]; then add_msg "Error: unexpected error in check_patch_save_size. meta.xml or masterinfo.xml not found." else local PAST_COMMON_SAVE_SIZE=$(sed -n 's|.*0x\(.*\)|\1|p' "$PAST_MASTERINFO") local PAST_ACCOUNT_SAVE_SIZE=$(sed -n 's|.*0x\(.*\)|\1|p' "$PAST_MASTERINFO") local PATCH_COMMON_SAVE_SIZE=$(sed -n 's|.*\(.*\)|\1|p' "$META_XML") local PATCH_ACCOUNT_SAVE_SIZE=$(sed -n 's|.*\(.*\)|\1|p' "$META_XML") if [ \( $PAST_COMMON_SAVE_SIZE != "0000000000000000" -a $PAST_COMMON_SAVE_SIZE != $PATCH_COMMON_SAVE_SIZE \) -o \( $PAST_ACCOUNT_SAVE_SIZE != "0000000000000000" -a $PAST_ACCOUNT_SAVE_SIZE != $PATCH_ACCOUNT_SAVE_SIZE \) ]; then echo " : $PAST_COMMON_SAVE_SIZE -> $PATCH_COMMON_SAVE_SIZE" echo " : $PAST_ACCOUNT_SAVE_SIZE -> $PATCH_ACCOUNT_SAVE_SIZE" add_msg "Error: Save data size changed from other than 0." fi fi } # METARATING related variables/functions G_METARATING_DISABLED=0 G_RATING_IMG_DUMMY_FILE="$CAFE_ROOT/system/bin/tool/mastering/resources/rating_img_dummy" G_RATING_IMG_NAME_LIST=("CERO_ja" "CGSRR_zh" "COB_en" "ESRB_fr" "ESRB_en" "GRB_ko" "OFLC_en" \ "PEGI_ru" "PEGI_BBFC_en" "PEGI_Portugal_pt" "PEGI_it" "PEGI_nl" \ "PEGI_es" "PEGI_de" "PEGI_fr" "PEGI_pt" "PEGI_en" "RAR_ru" "USK_de") readonly G_READONLY_DDF_METARATING_OFF=0 readonly G_READONLY_DDF_METARATING_ON=1 readonly G_READONLY_MASTERINFO_METARATING_OFF=0 readonly G_READONLY_MASTERINFO_METARATING_ON=1 readonly G_READONLY_FILE_NOT_FOUND=100 readonly G_READONLY_TAG_NOT_FOUND=101 readonly G_READONLY_TAG_INVALID_VALUE=102 ############################################################################### # ddf_has_metarating # $1 Path to ddf file (usualy individual ddf) # return G_READONLY_DDF_METARATING_ON if METARATING section exists, return G_READONLY_DDF_METARATING_OFF if not, # return G_READONLY_FILE_NOT_FOUND if ddf is not found. # (cafedevrun.sh also has this function) ############################################################################### ddf_has_metarating() { arg_num_check $# 1 local DDF_FILE="$1" if [ ! -e $DDF_FILE ]; then return $G_READONLY_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 $G_READONLY_DDF_METARATING_OFF fi echo "METARATING section exists in $DDF_FILE" return $G_READONLY_DDF_METARATING_ON } ############################################################################### # masterinfo_get_metarating_flag # $1 Path to masterinfo.xml # return the value of tag if the tag exists and it is 0 or 1. # ($G_READONLY_MASTERINFO_METARATING_ON(OFF)) # if masterinfo.xml is not found, return G_READONLY_FILE_NOT_FOUND # if tag is not found, return $G_READONLY_TAG_NOT_FOUND ############################################################################### masterinfo_get_metarating_flag() { arg_num_check $# 1 local MASTER_INFO="$1" if [ ! -e "$MASTER_INFO" ]; then echo "$1 not found." return $G_READONLY_FILE_NOT_FOUND fi grep -q "^[[:space:]]*.*[[:space:]]*$" "$MASTER_INFO" if [ $? -ne 0 ]; then return $G_READONLY_TAG_NOT_FOUND # tag not found. the value itself is not used. fi local FLAG_VALUE=$(sed -n 's|.*\(.*\)|\1|p' "$MASTER_INFO") if [ "$FLAG_VALUE" == "0" ]; then return $G_READONLY_MASTERINFO_METARATING_OFF elif [ "$FLAG_VALUE" == "1" ]; then return $G_READONLY_MASTERINFO_METARATING_ON else return $G_READONLY_TAG_INVALID_VALUE fi } ############################################################################### # masterinfo_set_metarating_flag # if does not exist, add and set. # $1 Path to masterinfo.xml # $2 Value. Must be 0 (no METARATING section) or 1 (METARATING section) ############################################################################### masterinfo_set_metarating_flag() { arg_num_check $# 2 local MASTER_INFO="$1" local VALUE="$2" if [ ! -e "$MASTER_INFO" ]; then echo "$1 not found." return fi if [ "$VALUE" -ne 0 -a "$VALUE" -ne 1 ]; then add_msg "Error: must be 0 or 1." fi grep -q "^[[:space:]]*.*[[:space:]]*$" "$MASTER_INFO" if [ $? -ne 0 ]; then # tag not found. sed -i -e "/<\/sdk-info>/a\\ $VALUE<\/metarating-flag>" "$MASTER_INFO" else sed -i -e "s|\(\).*\(<.*>\)|\1$VALUE\2|" "$MASTER_INFO" fi } ############################################################################### # masterinfo_get_metarating_use # $1 Path to masterinfo.xml # return the value of tag if the tag exists and it is 0 or 1. # ($G_READONLY_MASTERINFO_METARATING_ON(OFF)) # if masterinfo.xml is not found, return G_READONLY_FILE_NOT_FOUND # if tag is not found, return $G_READONLY_TAG_NOT_FOUND ############################################################################### masterinfo_get_metarating_use() { arg_num_check $# 1 local MASTER_INFO="$1" if [ ! -e "$MASTER_INFO" ]; then echo "$1 not found." return $G_READONLY_FILE_NOT_FOUND fi grep -q "^[[:space:]]*.*[[:space:]]*$" "$MASTER_INFO" if [ $? -ne 0 ]; then return $G_READONLY_TAG_NOT_FOUND # tag not found. the value itself is not used. fi local FLAG_VALUE=$(sed -n 's|.*\(.*\)|\1|p' "$MASTER_INFO") if [ "$FLAG_VALUE" == "0" ]; then return $G_READONLY_MASTERINFO_METARATING_OFF elif [ "$FLAG_VALUE" == "1" ]; then return $G_READONLY_MASTERINFO_METARATING_ON else return $G_READONLY_TAG_INVALID_VALUE fi } ############################################################################### # Copy dummy rating image files into $CAFE_META_DIR ############################################################################### copy_dummy_rating_files() { local IMG_NAME for IMG_NAME in ${G_RATING_IMG_NAME_LIST[@]} do if [ ! -f "$CAFE_META_DIR/$IMG_NAME.jpg" ]; then cp -p $G_RATING_IMG_DUMMY_FILE "$CAFE_META_DIR/$IMG_NAME.jpg" if [ $? -ne 0 ]; then add_msg "Error: Failed to copy dummy rating image." fi echo "A dummy rating image is copied into meta/$IMG_NAME.jpg" fi done } ############################################################################### # Copy rating image files from past wumad # $1 Path to past wumad (windows) # $2 Path to temp dir (windows) ############################################################################### copy_past_rating_image_files() { arg_num_check $# 2 local PAST_WUMAD_WIN="$1" local TEMP_OUT_DIR_WIN="$2" local IMG_NAME for IMG_NAME in ${G_RATING_IMG_NAME_LIST[@]} do if [ ! -f "$CAFE_META_DIR/$IMG_NAME.jpg" ]; then $EXTRACTFILE -v -nc "-od=$EXTRACTFILE_OUT_DIR" "$PAST_WUMAD_WIN" "p01.res.METARATING.${IMG_NAME}.jpg" if [ $? -eq 0 ]; then mv "$EXTRACTFILE_OUT_DIR\p01.res.METARATING.${IMG_NAME}.jpg" "$CAFE_META_DIR/${IMG_NAME}.jpg" echo "${IMG_NAME}.jpg is extracted from the past wumad and copied into the meta directory." else add_msg "Warning: Failed to extract %IMG_NAME from the past wumad. The past wumad could be invalid." cp -p $G_RATING_IMG_DUMMY_FILE "$CAFE_META_DIR/$IMG_NAME.jpg" echo "A dummy rating image is copied into meta/$IMG_NAME.jpg" fi else echo "$IMG_NAME.jpg exists in the meta directory. Not copied from the past wumad." fi done } ############################################################################### # is_dummy_rating_file # $1 Path to the individual ddf file # return 1 if $1 is dummy. return 0 otherwise. ############################################################################### is_dummy_rating_file() { arg_num_check $# 1 local IMAGE_FILE=`cygpath -u -a $1` local FILE_SIZE=`wc -c < "$IMAGE_FILE"` if [ $FILE_SIZE == 1 ]; then # dummy rating file is 1byte(00). local md5=`md5sum "$IMAGE_FILE"` if [ ${md5%[[:space:]]*} == "93b885adfe0da089cdf634904fd59f71" ]; then return 1 fi fi return 0 } ############################################################################### # make_metarating_rl_args_for_mastering # make argments for makemaster(makepatch) to put raw image files in wumad. # usage : ARGS=`make_metarating_rl_args_for_mastering` ############################################################################### make_metarating_rl_args_for_mastering() { local META_RLS="" if [ "$G_METARATING_DISABLED" -eq 0 ]; then local IMG_NAME for IMG_NAME in ${G_RATING_IMG_NAME_LIST[@]} do if [ -f "${CAFE_META_DIR}/${IMG_NAME}.jpg" ]; then local IMG_FULL_PATH=`cygpath -w -a "${CAFE_META_DIR}/${IMG_NAME}.jpg"` META_RLS="${META_RLS}-rl=${IMG_FULL_PATH}:METARATING.${IMG_NAME}.jpg " else echo "${IMG_NAME}.jpg not found." add_msg "Error: There is(are) missing rating image(s) in meta directory." fi done fi echo $META_RLS } ############################################################################### # remove_dummy_rating_files (CURRENTLKY NOT USED) ############################################################################### remove_dummy_rating_files() { echo "remove dummy rating image files in $CAFE_META_DIR" local IMG_NAME for IMG_NAME in ${G_RATING_IMG_NAME_LIST[@]} do if [ -f "$CAFE_META_DIR/$IMG_NAME.jpg" ]; then is_dummy_rating_file "$CAFE_META_DIR/$IMG_NAME.jpg" if [ $? -eq 1 ]; then rm "$CAFE_META_DIR/$IMG_NAME.jpg" fi fi done } ############################################################################### # check_section_entry_hash() ############################################################################### check_section_entry_hash() { local MAKEMASTER_USAGE=`"$MAKEMASTER" -h` local MAKEMASTER_VERSION=`echo "$MAKEMASTER_USAGE" | sed -n 's|.*ver\.\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\).*|\1|p'` local MAKEMASTER_VER_FOR_COMPARE=`echo "$MAKEMASTER_VERSION" | sed "s:\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\):\1\2:p" -n` # if "tool ver" > "1.5.x then Enable Section Entry Hash if [ $MAKEMASTER_VER_FOR_COMPARE -lt 15 ]; then SECTION_ENTRY_HASH_OPTION="" add_msg "Section Entry Hash Disable. makemaster.exe version $MAKEMASTER_VERSION" fi } ############################################################################### # update_xml_flag_section_entry_hash() # $1 masterinfo.xml path # $2 meta.xml path ############################################################################### update_xml_flag_section_entry_hash() { arg_num_check $# 2 local DEST_MASTERINFO_XML="$1" local DEST_META_XML="$2" local META_XML_RESERVED_FLAG_6=`sed -e "s:[ \t]\+\(.*\):\1:p" -n $DEST_META_XML` local MASTERINFO_XML_RESERVED_FLAG_6=`sed -e "s:[ \t]\+0x\(.*\):\1:p" -n $DEST_MASTERINFO_XML` local SECTION_ENTRY_HASH_RESERVED_FLAG6="0x00000002" # if Section Entry Hash Disable. Unset bit1 in reserved-flag6 if [ -z "$SECTION_ENTRY_HASH_OPTION" ]; then RESERVED6=$(printf "%08X" $((~$SECTION_ENTRY_HASH_RESERVED_FLAG6 & 0x$META_XML_RESERVED_FLAG_6))) META_XML_RESERVED_FLAG_6="$RESERVED6" sed -i -e "s|\(\)\(.*\)\(\)|\1$META_XML_RESERVED_FLAG_6\3|" "$DEST_META_XML" sed -i -e "s|\(\)\(.*\)\(\)|\10x$META_XML_RESERVED_FLAG_6\3|" "$DEST_MASTERINFO_XML" # else if Section Entry Hash Enable. Set bit1 in reserved-flag6 else RESERVED6=$(printf "%08X" $(($SECTION_ENTRY_HASH_RESERVED_FLAG6 | 0x$META_XML_RESERVED_FLAG_6))) META_XML_RESERVED_FLAG_6="$RESERVED6" sed -i -e "s|\(\)\(.*\)\(\)|\1$META_XML_RESERVED_FLAG_6\3|" "$DEST_META_XML" sed -i -e "s|\(\)\(.*\)\(\)|\10x$META_XML_RESERVED_FLAG_6\3|" "$DEST_MASTERINFO_XML" fi }