#●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ##############============= セーブ Save:$( #savecrypt ghost.sav save ghost.sav SenarioG_Count SenarioH_Count SenarioI_Count SenarioJ_Count SenarioK_Count SenarioL_Count SenarioM_Count SenarioN_Count SenarioO_Count SenarioP_Count SenarioQ_Count SenarioR_Count SenarioS_Count SenarioG_Episode SenarioH_Episode SenarioI_Episode SenarioJ_Episode SenarioK_Episode SenarioL_Episode SenarioM_Episode SenarioN_Episode SenarioO_Episode SenarioP_Episode SenarioQ_Episode SenarioR_Episode SenarioS_Episode Tatal_Episode OpTkCount OpTkQixCount EdTkCount EdTkQixCount EndX ReTkCount シナリオフラグB.7 シナリオフラグD.2 ) #=============================================================================● ##############============= ロード Load : $(load ghost.sav) #=============================================================================● kp.callback.OnSave, kp.callback.OnBackup : ${Save} kp.callback.OnLoad : ${Load} #●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ##############============= 起動:初回起動 TalkFirstboot : \t\1\s[99]\0\s[99]( ${Initialize.Entry}${A01}\e ) Initialize.Entry : $( set SenarioG_Episode "0" ; set SenarioH_Episode "0" ; set SenarioI_Episode "0" ; set SenarioJ_Episode "0" ; set SenarioK_Episode "0" ; set SenarioL_Episode "0" ; set SenarioM_Episode "0" ; set SenarioN_Episode "0" ; set SenarioO_Episode "0" ; set SenarioP_Episode "0" ; set SenarioQ_Episode "0" ; set SenarioR_Episode "0" ; set SenarioS_Episode "0" ; set Tatal_Episode "0" ; set OpTkCount "0" ; set OpTkQixCount "0" ; set EdTkCount "0" ; set EdTkQixCount "0" ; set ReTkCount "0" ; set EndX "2"; # B08とD03に発話妨害フラグ(末尾の数字は0オリジン) set シナリオフラグB.7 "1"; set シナリオフラグD.2 "1"; # OpenKEEPSの自動発話を潰す setstr interval 999; RandomtalkOff; ) #●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ##############============= 起動:通常起動 # KEEPS封じ TalkBootup : ${Talk.ゴースト起動} TalkVanished : ${Talk.ゴースト起動} TalkGhostChanged : ${Talk.ゴースト起動} Talk.ゴースト起動 : "\t"$( set TalkCount "0" ; set SenarioG_Count "0" ; set SenarioH_Count "0" ; set SenarioI_Count "0" ; set SenarioJ_Count "0" ; set SenarioK_Count "0" ; set SenarioL_Count "0" ; set SenarioM_Count "0" ; set SenarioN_Count "0" ; set SenarioO_Count "0" ; set SenarioP_Count "0" ; set SenarioQ_Count "0" ; set SenarioR_Count "0" ; set SenarioS_Count "0" ; if $[ ${EndX} == 1 && ${OpTkCount} <= 9 && $(length ${シナリオフラグB.${OpTkCount}}) == 0] ${BXX} else ${CXX}; ) #=============================================================================● # 通常起動 BXX : $( get OpeningTalk[${OpTkCount}] ; inc OpTkCount 1; # 簡易起動トーク初期化 set OpTkQixCount "0" ) #=============================================================================● # 簡易起動 CXX : $( get OpeningTalk_Quick[${OpTkQixCount}] ; inc OpTkQixCount 1 10 ; ) #●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ##############============= 終了:終了メッセージ # OpenKEEPS封じ #TalkClose : ${Talk.ゴースト終了} TalkClose : ${EXX} # 切り替えトーク #TalkGhostChanging : ${Talk.ゴースト終了} TalkGhostChanging : ${EXX} # バルーンメニューから終了 Select.ゴースト終了 : ${Talk.ゴースト終了} Talk.ゴースト終了 : "\t"$( if $[ ${EndX} == 2 ] $( # 初回終了 get EndingTalk_First; set EndX "1" ) else $( if $[ (${Tatal_Episode} >= 87) || (${Tatal_Episode} < ((${EdTkCount} * 9) + 9)) || ${EdTkCount} > 9 || $(length ${シナリオフラグD.${EdTkCount}}) != 0] ${EXX} else $( # ここが普通の終了 get EndingTalk[${EdTkCount}] ; inc EdTkCount 1; set EndX "1" ) ) )"\-" # ここが簡易終了 EXX : "\t"$( get EndingTalk_Quick[${EdTkQixCount}] ; inc EdTkQixCount 1 10 ; set EndX "0" ) #●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ##############============= イベント:最小化から復帰 TalkRestore : "\t"$( get RestoreTalk[${ReTkCount}] ; inc ReTkCount 1; if $[ ${ReTkCount} == 5] $(set ReTkCount 3); ) #●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ##############============= メニュー周り C0Doubleclick,C1Doubleclick : ${Mainmenu} Mainmenu : ${SS}(\t $(if $[${TalkCount} < 11] " \q[◇話を聞く  ,Talk]\n") " \q[◇終了    ,ゴースト終了]\n" " \q[◇なにもしない,TheEnd]" \n" \q[◆初期化(デバッグ用),Debug]"\e ) Select.Debug : ${Initialize.Entry}\0初期化しました。\e #=============================================================================● ##############============= トーク Select.Talk : "\t"$( if $[ ( ${SenarioG_Episode} >= $(size SenarioG ) ) && ( ${SenarioH_Episode} >= $(size SenarioH ) ) && ( ${SenarioI_Episode} >= $(size SenarioI ) ) && ( ${SenarioJ_Episode} >= $(size SenarioJ ) ) && ( ${SenarioK_Episode} >= $(size SenarioK ) ) && ( ${SenarioL_Episode} >= $(size SenarioL ) ) && ( ${SenarioM_Episode} >= $(size SenarioM ) ) && ( ${SenarioN_Episode} >= $(size SenarioN ) ) && ( ${SenarioO_Episode} >= $(size SenarioO ) ) && ( ${SenarioP_Episode} >= $(size SenarioP ) ) && ( ${SenarioQ_Episode} >= $(size SenarioQ ) ) && ( ${SenarioR_Episode} >= $(size SenarioR ) ) ] $( get SenarioS[${SenarioS_Episode}] ; inc SenarioS_Episode ; if $[${SenarioS_Episode} >= $(size SenarioS) ] $(set TalkCount "11" ; set SenarioS_Episode "1") ) else $( set @Temp $( if $[ ( ${SenarioG_Episode} < $(size SenarioG) ) && ( ${SenarioG_Count} != "1" ) && ( $(length ${シナリオフラグG.${SenarioG_Episode}}) == 0) ] "G" ; if $[ ( ${SenarioH_Episode} < $(size SenarioH) ) && ( ${SenarioH_Count} != "1" ) && ( $(length ${シナリオフラグH.${SenarioH_Episode}}) == 0) ] "H" ; if $[ ( ${SenarioI_Episode} < $(size SenarioI) ) && ( ${SenarioI_Count} != "1" ) && ( $(length ${シナリオフラグI.${SenarioI_Episode}}) == 0) ] "I" ; if $[ ( ${SenarioJ_Episode} < $(size SenarioJ) ) && ( ${SenarioJ_Count} != "1" ) && ( $(length ${シナリオフラグJ.${SenarioJ_Episode}}) == 0) ] "J" ; if $[ ( ${SenarioK_Episode} < $(size SenarioK) ) && ( ${SenarioK_Count} != "1" ) && ( $(length ${シナリオフラグK.${SenarioK_Episode}}) == 0) ] "K" ; if $[ ( ${SenarioL_Episode} < $(size SenarioL) ) && ( ${SenarioL_Count} != "1" ) && ( $(length ${シナリオフラグL.${SenarioL_Episode}}) == 0) ] "L" ; if $[ ( ${SenarioM_Episode} < $(size SenarioM) ) && ( ${SenarioM_Count} != "1" ) && ( $(length ${シナリオフラグM.${SenarioM_Episode}}) == 0) ] "M" ; if $[ ( ${SenarioN_Episode} < $(size SenarioN) ) && ( ${SenarioN_Count} != "1" ) && ( $(length ${シナリオフラグN.${SenarioN_Episode}}) == 0) ] "N" ; if $[ ( ${SenarioO_Episode} < $(size SenarioO) ) && ( ${SenarioO_Count} != "1" ) && ( $(length ${シナリオフラグO.${SenarioO_Episode}}) == 0) ] "O" ; if $[ ( ${SenarioP_Episode} < $(size SenarioP) ) && ( ${SenarioP_Count} != "1" ) && ( $(length ${シナリオフラグP.${SenarioP_Episode}}) == 0) ] "P" ; if $[ ( ${SenarioQ_Episode} < $(size SenarioQ) ) && ( ${SenarioQ_Count} != "1" ) && ( $(length ${シナリオフラグQ.${SenarioQ_Episode}}) == 0) ] "Q" ; if $[ ( ${SenarioR_Episode} < $(size SenarioR) ) && ( ${SenarioR_Count} != "1" ) && ( $(length ${シナリオフラグR.${SenarioR_Episode}}) == 0) ] "R" ; ) ; if $[ $(length ${@Temp}) = 1 ] $(set TalkCount "11") ; set SenarioType $(substr ${@Temp} $(rand $(length ${@Temp})) "1") ; get Senario${SenarioType}[${Senario${SenarioType}_Episode}] ; set Senario${SenarioType}_Count "1" ; inc Senario${SenarioType}_Episode ; inc TalkCount ) ; inc Tatal_Episode ) #●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ##_シナリオG:闇と月神楽_## SenarioG : ${G01} SenarioG : ${G02} SenarioG : ${G03} SenarioG : ${G04} SenarioG : ${G05} SenarioG : ${G06} SenarioG : ${G07} #=============================================================================● ##_シナリオH:紅い衝動_## SenarioH : ${H01} SenarioH : ${H02} SenarioH : ${H03} SenarioH : ${H04} SenarioH : ${H05} SenarioH : ${H06} SenarioH : ${H07} #=============================================================================● ##_シナリオI:蒼い欲求_## SenarioI : ${I01} SenarioI : ${I02} SenarioI : ${I03} SenarioI : ${I04} SenarioI : ${I05} SenarioI : ${I06} SenarioI : ${I07} #=============================================================================● ##_シナリオJ:賢者の理論_## SenarioJ : ${J01} SenarioJ : ${J02} SenarioJ : ${J03} SenarioJ : ${J04} SenarioJ : ${J05} SenarioJ : ${J07} SenarioJ : ${J08} #=============================================================================● ##_シナリオK:少女の秘密_## SenarioK : ${K01} SenarioK : ${K02} SenarioK : ${K03} SenarioK : ${K04} SenarioK : ${K05} SenarioK : ${K06} SenarioK : ${K07} #=============================================================================● ##_シナリオL:識閾の術式_## SenarioL : ${L01} SenarioL : ${L02} SenarioL : ${L03} SenarioL : ${L04} SenarioL : ${L05} SenarioL : ${L06} SenarioL : ${L07} #=============================================================================● ##_シナリオM:異邦人_## SenarioM : ${M01} SenarioM : ${M02} SenarioM : ${M03}$(.setstr SenarioflagB.8 ""); SenarioM : ${M04} SenarioM : ${M05} SenarioM : ${M06} SenarioM : ${M07} #=============================================================================● ##_シナリオN:魔女の娘_## SenarioN : ${N01} SenarioN : ${N02} SenarioN : ${N03} SenarioN : ${N04} SenarioN : ${N05} SenarioN : ${N06} SenarioN : ${N07} #=============================================================================● ##_シナリオO:聖都の魔人_## SenarioO : ${O01} SenarioO : ${O02}$(.setstr SenarioflagD.3 ""); SenarioO : ${O03} SenarioO : ${O04} SenarioO : ${O05} SenarioO : ${O06} SenarioO : ${O07} #=============================================================================● ##_シナリオP:廃頽の深淵_## SenarioP : ${P01} SenarioP : ${P02} SenarioP : ${P03} SenarioP : ${P04} SenarioP : ${P05} #=============================================================================● ##_シナリオQ:偽り黒き神_## SenarioQ : ${Q01} SenarioQ : ${Q02} SenarioQ : ${Q03} SenarioQ : ${Q04} SenarioQ : ${Q05} SenarioQ : ${Q06} SenarioQ : ${Q07} #=============================================================================● ##_シナリオR:魔導文書_## SenarioR : ${R01} SenarioR : ${R02} SenarioR : ${R03} SenarioR : ${R04} SenarioR : ${R05} #=============================================================================● ##_シナリオS:言霊遊戯_## SenarioS : ${S01} SenarioS : ${S02} SenarioS : ${S03} SenarioS : ${S04} SenarioS : ${S05} SenarioS : ${S06} SenarioS : ${S07} SenarioS : ${S08} SenarioS : ${S09} SenarioS : ${S10} #=============================================================================● ##_オープニングトーク_## OpeningTalk : ${B01} OpeningTalk : ${B02} OpeningTalk : ${B03} OpeningTalk : ${B04} OpeningTalk : ${B05} OpeningTalk : ${B06} OpeningTalk : ${B07} OpeningTalk : ${B08} OpeningTalk : ${B09} OpeningTalk : ${B10} #=============================================================================● ##_簡易オープニングトーク_## OpeningTalk_Quick : ${C01} OpeningTalk_Quick : ${C02} OpeningTalk_Quick : ${C03} OpeningTalk_Quick : ${C04} OpeningTalk_Quick : ${C05} #=============================================================================● ##_エンディングトーク_## EndingTalk : ${D01} EndingTalk : ${D02} EndingTalk : ${D03} EndingTalk : ${D04} EndingTalk : ${D05} EndingTalk : ${D06} EndingTalk : ${D07} EndingTalk : ${D08} EndingTalk : ${D09} EndingTalk : ${D10} #=============================================================================● ##_簡易エンディングトーク_## EndingTalk_Quick : ${E01} EndingTalk_Quick : ${E02} EndingTalk_Quick : ${E03} EndingTalk_Quick : ${E04} EndingTalk_Quick : ${E05} EndingTalk_Quick : ${E06} EndingTalk_Quick : ${E07} EndingTalk_Quick : ${E08} EndingTalk_Quick : ${E09} #=============================================================================● ##_初回エンディングトーク_## EndingTalk_First : ${A02} #=============================================================================● ##_最小化より復帰したときのトーク_## RestoreTalk : ${F01} RestoreTalk : ${F02} RestoreTalk : ${F03} RestoreTalk : ${F04} RestoreTalk : ${F05} #●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ##############============= イベント:選択肢タイムアウト TalkTimeout : $( if ${Out1} $( if ${Out2} $( if ${Out3} $( if ${Out3} $() else $(set Out1 0)$(set Out2 0)$(set Out3 0)${Select.M03c}) else $(set Out1 0)$(set Out2 0)${Select.C01b}) else $(set Out1 0)${Select.B06b}) else \b[-1]\e ) #●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ##############============= イベント:シェル切り替え時 TalkShellChanging : \e TalkShellChanged : ${SS}\e #=============================================================================● ##############============= イベント:バルーンが切り替わった TalkBalloonChange : \e #=============================================================================● ##############============= イベント:消滅指示時 TalkVanishSelecting : \e TalkVanishSelected : \e TalkVanishCancel : \e TalkVanishButtonHold : \e #=============================================================================● ##############============= 前回起動時に異常終了した TalkCrashed : ${TalkBootup} #=============================================================================● ##############============= イベント:SSTP受信中断 TalkSSTPbreak : \e #=============================================================================● ##############============= イベント:画面解像度、色数変更 TalkDisplayChange : \e #=============================================================================● ##############============= 反応:見切れ TalkMikire : \e TalkMikirez : \e #=============================================================================● ##############============= 反応:重なり TalkKasanari : \e #●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ##############============= ネットワーク:時間あわせ TalkNTPstart : \e TalkNTPfail : \t${VX05}時刻設定に失敗しました。\e TalkNTPcompare : \t${VX04}正しい時刻に修正しました。\6\e #=============================================================================● ##############============= ネットワーク:ネットワーク更新 TalkUpdateBegin : \t${SS}\e TalkUpdateReady : \t\0\b[5]\_q闇姫更新:${UpdateFileTotal}個\_q${w20} TalkUpdatecomplete.changed : \t\0\b[5]${VX04}最新の情報に更新しました。\e TalkUpdatecomplete.none : \t\0\b[5]${VX05}闇姫の更新はありませんでした。\e TalkUpdatefail.timeout : \t\0\b[5]${VX05}タイムアウトしました。\e TalkUpdatefail.md5miss : \t\0\b[5]${VX05}MD5:更新を中断します。\e TalkUpdatefail.404 : \t\0\b[5]${VX05}404:更新を中断します。\e TalkUpdatefail.403 : \t\0\b[5]${VX05}403:更新を中断します。\e TalkUpdatefail.fileio : \t\0\b[5]${VX05}容量不足:更新を中断します。\e TalkUpdatefail.readonly : \t\0\b[5]${VX05}読取専用:更新を中断します。\e TalkUpdatefail.etc : \t\0\b[5]${VX05}『$(SReference 0)』エラーにより、ネットワーク更新に失敗しました。\e TalkDownloadBegin : \e TalkMD5Begin : \e TalkMD5Complete : \e TalkMD5Fail : \e SystemupdateBegin : \t${SS}\e SystemupdateReady : \t\0\b[5]\_q本体更新:${UpdateFileTotal}個\_q${w20} SystemupdateCompleted : \t\0\b[5]${VX04}最新の情報に更新しました。\e SystemupdateNoupdate : \t\0\b[5]${VX05}本体の更新はありませんでした。\e SystemupdateFailed.etc : \t\0\b[5]${VX05}『$(SReference 0)』エラーにより、ネットワーク更新に失敗しました。\e #=============================================================================● ##############============= ファイル:各種インストール TalkInstallBegin : \t\0\b[5]インストールをスタートします。${w15}\e TalkInstall : \t\0\b[5]${VX04}${EAI} TalkInstallshell : \t\0\b[5]${VX04}シェル${EAI} TalkInstallghost : \t\0\b[5]${VX04}ゴースト${EAI} TalkInstallplugin : \t\0\b[5]${VX04}プラグイン${EAI} TalkInstallballoon : \t\0\b[5]${VX04}バルーン${EAI} TalkInstallheadline : \t\0\b[5]${VX04}ヘッドラインセンサ${EAI} TalkInstallshellballoon : \t\0\b[5]${VX04}バルーン&シェル『${InstallName}』と${EAI} TalkInstallghostballoon : \t\0\b[5]${VX04}バルーン&ゴースト『${InstallName}』と${EAI} TalkInstallcalendarskin : \t\0\b[5]${VX04}カレンダースキン${EAI} TalkInstallcalendarplugin: \t\0\b[5]${VX04}スケジュールセンサ${EAI} TalkInstallfail : \t\0\b[5]${VX05}インストールに失敗しました。\e TalkInstallfail.unlha32 : \t\0\b[5]${VX05}『unlha32.dll』 Not Found.\e TalkInstallfail.unzip32 : \t\0\b[5]${VX05}『unzip32.dll』 Not Found.\e TalkInstallfail.invalidtype: \t\0\b[5]${VX05}『install.txt』が不正です。インストールに失敗しました。\e TalkInstallrefuse : \t\0\b[5]${VX05}これは『$(SReference 0)』用のデータなので、インストールしませんでした。\e EAI :『${InstallName}』インストールが終了しました。\e #=============================================================================● ##############============= ファイル:updates2.dauファイル作成 TalkUpdateCreating : \t\0\b[5]『updates2.dau』を作成します。\e TalkUpdateCreated : \t\0\b[5]${VX04}『updates2.dau』が完成しました。\e #=============================================================================● ##############============= ファイル:アーカイブ(nar)ファイル作成 TalkNarCreating : \t\0\b[5]『nar』ファイルを作成します。\e TalkNarCreated : \t\0\b[5]${VX04}『nar』ファイルが完成しました。\e #●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ##############============= リソース:「お勧め」サイトリストボタン名 Sakura.URLCaption : "スタッフサイト(&R)" Portal.URLCaption : "ポートアルサイト(&P)" Kero.URLCaption : "ミドルウェアサイト(&R)" #=============================================================================● ##############============= リソース:ネットワーク更新ボタン名 UpdateCaption : "ソフトウェア更新(&U)" #=============================================================================● ##############============= リソース:時計合わせボタン名 SntpCaption : "時計合わせ(&T)" #=============================================================================● ##############============= 壁紙変更 TalkWallpaper : \e #=============================================================================● ##############============= ファイル:ファイルドロップ TalkFileDrop.bmp :\e TalkFileDrop.jpg :\e TalkFileDrop.png :\e #●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ##############============= 表情変化 S_00:\0\s[0] S_01:\0\s[1] S_02:\0\s[2] S_03:\0\s[3] S_04:\0\s[4] S_05:\0\s[5] S_06:\0\s[6] S_07:\0\s[7] S_08:\0\s[8] S_09:\0\s[9] S_10:\0\s[10] S_11:\0\s[11] S_12:\0\s[12] S_13:\0\s[13] S_14:\0\s[14] S_15:\0\s[15] S_z:\0 #=============================================================================● K_00:\1\s[20] K_01:\1\s[21] K_02:\1\s[22] K_03:\1\s[23] K_04:\1\s[24] K_05:\1\s[25] K_06:\1\s[26] K_07:\1\s[27] K_08:\1\s[28] K_09:\1\s[29] K_10:\1\s[30] K_11:\1\s[31] K_12:\1\s[32] K_13:\1\s[33] K_14:\1\s[34] K_15:\1\s[35] K_z:\1 #●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ##############============= イベント:各表情からの復帰 TalkReturn.1 : ${S_00}\b[-1]\e TalkReturn.2 : ${S_00}\b[-1]\e TalkReturn.3 : ${S_00}\b[-1]\e TalkReturn.4 : ${S_00}\b[-1]\e TalkReturn.5 : ${S_00}\b[-1]\e TalkReturn.6 : ${S_00}\b[-1]\e TalkReturn.7 : ${S_00}\b[-1]\e TalkReturn.8 : ${S_00}\b[-1]\e TalkReturn.9 : ${S_00}\b[-1]\e TalkReturn.10 : ${S_00}\b[-1]\e TalkReturn.11 : ${S_00}\b[-1]\e TalkReturn.12 : ${S_00}\b[-1]\e TalkReturn.13 : ${S_00}\b[-1]\e TalkReturn.14 : ${S_00}\b[-1]\e TalkReturn.15 : ${S_00}\b[-1]\e TalkReturn.21 : ${K_00}\b[-1]\e TalkReturn.22 : ${K_00}\b[-1]\e TalkReturn.23 : ${K_00}\b[-1]\e TalkReturn.24 : ${K_00}\b[-1]\e TalkReturn.25 : ${K_00}\b[-1]\e TalkReturn.26 : ${K_00}\b[-1]\e TalkReturn.27 : ${K_00}\b[-1]\e TalkReturn.28 : ${K_00}\b[-1]\e TalkReturn.29 : ${K_00}\b[-1]\e TalkReturn.30 : ${K_00}\b[-1]\e TalkReturn.31 : ${K_00}\b[-1]\e TalkReturn.32 : ${K_00}\b[-1]\e TalkReturn.33 : ${K_00}\b[-1]\e TalkReturn.34 : ${K_00}\b[-1]\e TalkReturn.35 : ${K_00}\b[-1]\e