Files
lyuma/ghost/master/yaya_base/shiori3.dic

2097 lines
54 KiB
Plaintext

//******************************************************************************
/*
SHIORI/3.0制御スクリプト for YAYA
使用可能な変数
SHIORI3FW.Status
 初期起動ステータス Runで初期化済み
SHIORI3FW.Eventid
 イベントID
SHIORI3FW.LastTalk
 直前のトーク(すべて)
SHIORI3FW.LastAITalk
 直前のランダムトーク
SHIORI3FW.LastSurface
 直前に表示していたサーフィス SHIORI3FW.LastSurface[0] がさくら側
SHIORI3FW.IsVisible
 現在サーフィスが表示されているかどうか(1/0) SHIORI3FW.IsVisible[0] がさくら側
SHIORI3FW.HWnd
SHIORI3FW.BalloonHWnd
 キャラウインドウ・バルーンのHWND。 SHIORI3FW.HWnd[0] がさくら側
SHIORI3FW.UniqueID
 Auth.SSTPに使用するID
SHIORI3FW.Capability
 ID: capabilityで来たベースウェアのヘッダ処理能力:汎用配列
SHIORI3FW.GhostName
 ゴースト名★
SHIORI3FW.ShellName
SHIORI3FW.ShellPath
 シェル名とパス★
SHIORI3FW.BalloonName
SHIORI3FW.BalloonPath
 バルーン名とパス★
使用可能な疑似イベント
OnSHIORI3FW.SurfaceRestore
 OnSurfaceRestoreの本体非依存版
OnSHIORI3FW.ChangeSelfInfo
 上記★マークがついた変数が更新されたときに呼び出される
*/
//******************************************************************************
//------------------------------------------------------------------------------
//以下のdefineは基本的に弄らないで下さい
//------------------------------------------------------------------------------
// チェイン
#globaldefine CHAIN{{ {{CHAIN /* どうも誤記される場合があるようなので */
#globaldefine CHAIN}} }}CHAIN /* 同上 */
#globaldefine {{CHAIN { switch CHAIN.Index {
#globaldefine }}CHAIN } CHAIN.Index++ }
#define CHAIN_DELIM ':chain='
#define EVAL_DELIM ':eval='
//******************************************************************************
// load
//******************************************************************************
//------------------------------------------------------------------------------
//関数名:load
//機能 :ロード時の処理
//------------------------------------------------------------------------------
load
{
// 文字/文字列定数
C_CRLF2 = CHR(0xd,0xa,0xd,0xa)
C_CRLF = CHR(0xd,0xa)
C_BYTE1 = CHR(0x1)
REQ.COMMAND = 'LOAD'
REQ.PROTOCOL = 'AYA/5.0'
var.req.key = (IARRAY, 'Path')
var.req.value = (IARRAY, _argv[0])
var.req.rawvalue = (IARRAY,_argv[0])
SHIORI3FW.Path = _argv[0]
var.lib.key = IARRAY
var.lib.value = IARRAY
var.lib.result = ''
if (FSIZE(GETSETTING('coreinfo.savefile')) <= 0) && (FSIZE(GETSETTING('coreinfo.savefile') + '.ays') <= 0) {
if FSIZE('aya5_variable.cfg') > 0 {
RESTOREVAR('aya5_variable.cfg')
FDEL('aya5_variable.cfg')
}
elseif FSIZE('aya_variable.cfg') > 0 {
RESTOREVAR('aya_variable.cfg')
FDEL('aya_variable.cfg')
}
SAVEVAR
}
// 初回起動時の初期化
if ISVAR('aitalkinterval') == 0 {
aitalkinterval = TALK_INTERVAL
}
if ISVAR('communicateratio') == 0 {
communicateratio = COM_RATIO
}
if ISVAR('ghostupmin_last') == 0 {
ghostupmin_last = 0
}
if ISVAR('ghostuptimes') == 0 {
ghostuptimes = 0
}
ghostuptimes += 1
// 毎回起動時の初期化
SHIORI3FW.ResetAITalkInterval(-1)
_sec = GETSECCOUNT
SHIORI3FW.SaveVarCount = 0
SHIORI3FW.LastTalk = ''
SHIORI3FW.LastTalkTime = _sec
SHIORI3FW.LastAITalk = ''
SHIORI3FW.LastAITalkTime = _sec
SHIORI3FW.TalkEndTime = _sec
if GETTYPE(SHIORI3FW.LastSurface) != 4 {
SHIORI3FW.LastSurface = (0,10)
SHIORI3FW.IsVisible = (1,1)
}
SHIORI3FW.HWnd = (0,0)
SHIORI3FW.HWndOld = (0,0)
SHIORI3FW.BalloonHWnd = (0,0)
SHIORI3FW.UniqueID = ''
SHIORI3FW.DebugMode = 0
SHIORI3FW.CanTalkFlag = 1
SHIORI3FW.Eventid = ''
SHIORI3FW.EventidOld = ''
SHIORI3FW.EventidTranslate = ''
SHIORI3FW.EventidTranslateOld = ''
SHIORI3FW.SecurityLevel = ''
SHIORI3FW.ErrorDescription = ''
SHIORI3FW.ErrorLevel = ''
SHIORI3FW.LastErrorDescription = ''
SAORI.DllList = IARRAY
basewarename = ''
basewarenameex = ''
sender = ''
ghostbootmin = GETSECCOUNT / 60
S_CHARSET = GETSETTING('charset.output')
status = ''
SHIORI3FW.tempvarname = IARRAY
array_eventtranslate = ASORT('string,ascending',GETFUNCLIST('OnGhostEventTranslate'))
array_translateinternal = ASORT('string,ascending',GETFUNCLIST('OnTranslateInternal'))
installedghostlist = IARRAY
installedsakuralist = IARRAY
installedkerolist = IARRAY
SHIORI3FW.BasewareNotifysInstalledSakuraName = 0
SHIORI3FW.BasewareNotifysInstalledKeroName = 0
SHIORI3FW.InitChain
SHIORI3FW.InitAdditionalReturn
SHIORI3FW.SetDelayEvent('',0)
//過去互換用(ascii変数)
if ISFUNC('restore_old_variables') {
EVAL('restore_old_variables')
}
AyaLoad.FuncEnumExec('OnSystemLoad','ascending')
AyaLoad.FuncEnumExec('OnGhostLoad','ascending')
_ft = <<'
On_version
On_craftman
On_craftmanw
'>>
_fa = SPLIT(_ft,C_CRLF)
foreach _fa;_f {
if ISFUNC(_f) {
LOGGING("警告:関数/イベント %(_f) はシステム辞書で上書きされます")
}
}
}
//******************************************************************************
//unload
//******************************************************************************
//------------------------------------------------------------------------------
//関数名:unload
//機能 :終了処理
//------------------------------------------------------------------------------
unload
{
REQ.COMMAND = 'UNLOAD'
REQ.PROTOCOL = 'AYA/5.0'
var.req.key = IARRAY
var.req.value = IARRAY
var.req.rawvalue = IARRAY
ghostupmin_last = ghostupmin_total
AyaLoad.FuncEnumExec('OnGhostUnload','descending')
AyaLoad.FuncEnumExec('OnSystemUnload','descending')
// 保存する必要のない変数を削除
_var = <<'
array_eventtranslate
array_translateinternal
REQ.COMMAND
REQ.PROTOCOL
var.req.key
var.req.value
var.req.rawvalue
LIB.PROTOCOL
LIB.STATUSCODE
var.lib.key
var.lib.value
var.lib.result
SAORI.DllList
selfname
sakuraname
keroname
basewarename
basewarenameex
sender
S_CHARSET
installedghostlist
installedsakuralist
installedkerolist
ascii
uniqueid
ghostbootmin
status
res_securitylevel
res_reference
res_marker
marker
res_valuenotify
SHIORI3FW.Path
SHIORI3FW.LastAITalk
SHIORI3FW.LastAITalkTime
SHIORI3FW.LastTalk
SHIORI3FW.LastTalkTime
SHIORI3FW.TalkEndTime
SHIORI3FW.CanTalkFlag
SHIORI3FW.IsSurfaceRestoreComplete
SHIORI3FW.IsAITalkComplete
SHIORI3FW.SaveVarCount
SHIORI3FW.HWnd
SHIORI3FW.HWndOld
SHIORI3FW.BalloonHWnd
SHIORI3FW.UniqueID
SHIORI3FW.Eventid
SHIORI3FW.EventidOld
SHIORI3FW.EventidTranslate
SHIORI3FW.EventidTranslateOld
SHIORI3FW.SecurityLevel
SHIORI3FW.DelayEventTime
SHIORI3FW.DelayEvent
SHIORI3FW.DelayEventReference
SHIORI3FW.GhostName
SHIORI3FW.ErrorDescription
SHIORI3FW.ErrorLevel
SHIORI3FW.LastErrorDescription
SHIORI3FW.Capability
SHIORI3FW.DebugMode
SHIORI3FW.Status
SHIORI3FW.UserName
SHIORI3FW.UserNameFull
SHIORI3FW.UserBirthday
SHIORI3FW.UserSex
SHIORI3FW.BasewareNotifysInstalledSakuraName
SHIORI3FW.BasewareNotifysInstalledKeroName
C_CRLF2
C_CRLF
C_BYTE1
'>>
//以下は保存
//SHIORI3FW.ShellName
//SHIORI3FW.ShellNameOld
//SHIORI3FW.ShellPath
//SHIORI3FW.BalloonName
//SHIORI3FW.BalloonNameOld
//SHIORI3FW.BalloonPath
//SHIORI3FW.LastSurface
//SHIORI3FW.IsVisible
ERASEVAR(SPLIT(_var,C_CRLF))
if ARRAYSIZE(SHIORI3FW.tempvarname) {
ERASEVAR(SHIORI3FW.tempvarname)
}
ERASEVAR('SHIORI3FW.tempvarname')
SHIORI3FW.ClearChainVariable
SHIORI3FW.ClearReferenceAndPassThruInsVariable
SHIORI3FW.ClearValueexVariable
SHIORI3FW.ClearAdditionalReturnVariable
}
//------------------------------------------------------------------------------
//関数名:AyaTest.Eval
//機能 :受け取った文字列をEVALして返す
//------------------------------------------------------------------------------
AyaTest.Eval
{
_array = SPLIT(_argv[0],C_CRLF)
_result = ''
_n = ARRAYSIZE(_array)
for _i = 0 ; _i < _n ; _i++ {
if _array[_i] {
_result += EVAL(_array[_i])
}
}
_result
}
//------------------------------------------------------------------------------
//関数名:AyaLoad.FuncEnumExec
//機能 :関数リストを作成しソートして実行
//引数 :0=イベント 1=ソート順(ascending,descending)
//------------------------------------------------------------------------------
AyaLoad.FuncEnumExec : void
{
_a = GETFUNCLIST(_argv[0])
_a = ASORT('string,' + _argv[1],_a)
_n = ARRAYSIZE(_a)
for _i = 0 ; _i < _n ; _i++ {
EVAL(_a[_i])
}
}
//******************************************************************************
//request
//******************************************************************************
//------------------------------------------------------------------------------
//関数名:request
//機能 :受け取った文字列をSHIORIリクエストヘッダとして解析した後、
// OnRequestを活性化します
//------------------------------------------------------------------------------
request
{
//For TEST
//test(_argv[0])
//return
if SUBSTR(_argv[0],0,3) == '?? ' {//玉でのテスト用
'!! ' + JOIN(AyaTest.Eval(ERASE(_argv[0],0,3)),',')
return
}
_reqdata = _argv[0]
_linestart = 0
_lineend = STRSTR(_reqdata, C_CRLF, _linestart)
if _lineend <= 0 {
//1行目すらない!
"SHIORI/3.0 400 Bad Request%(C_CRLF)Charset: %(S_CHARSET)%(C_CRLF2)"
return
}
_lin = SUBSTR(_reqdata,_linestart,(_lineend - _linestart))
// リクエスト種別とプロトコル名の取得 エラーなら400
REQ.COMMAND = _lin[0,' SHIORI']
REQ.PROTOCOL = 'SHIORI' + _lin[1,' SHIORI']
// リクエストヘッダの取得
var.req.key = IARRAY
var.req.value = IARRAY
var.req.rawvalue = IARRAY
status = ''
SHIORI3FW.Eventid=''
SHIORI3FW.SecurityLevel='local'//互換性のためデフォルトはlocal
while _lineend > _linestart {
//行分割
_linestart = _lineend + 2
_lineend = STRSTR(_reqdata, C_CRLF, _linestart)
//空行もしくはみつからなかった
if _lineend <= _linestart {
break
}
_lin = SUBSTR(_reqdata,_linestart,(_lineend - _linestart))
// キーと値を取得
_len = STRLEN(_lin)
_pos = STRSTR(_lin,': ',0)
var.req.key ,= (_key = SUBSTR(_lin,0,_pos))
_value = SUBSTR(_lin,(_pos + 2),(_len - _pos - 2))
if var.req.key == '' {
break
}
// イベントID名称を取得
if _key == 'Charset' {
if S_CHARSET != _value {
void SETSETTING('charset.output',_value)
S_CHARSET = _value
}
}
elseif _key == 'ID' {
// 取得 名前先頭が'On'でないなら付加
SHIORI3FW.Eventid = _value
if SUBSTR(SHIORI3FW.Eventid, 0, 2) != 'On' {
SHIORI3FW.Eventid = 'On_' + SHIORI3FW.Eventid
}
}
// セキュリティレベル
elseif _key == 'SecurityLevel' {
SHIORI3FW.SecurityLevel = _value
}
// ベースウェア名取得
elseif _key == 'Sender' {
if basewarenameex == '' {
basewarenameex = _value
}
basewarename = _value
sender = _value
}
//Status
elseif _key == 'Status' {
status = _value
}
// キーと値を記憶
var.req.rawvalue ,= _value
if SHIORI3FW.AUTO_DATA_CONVERT {
if ISINTSTR(_value) {
var.req.value ,= TOINT(_value)
}
elseif ISREALSTR(_value) {
var.req.value ,= TOREAL(_value)
}
else {
var.req.value ,= REPLACE(_value, C_BYTE1, ',')// バイト値1はカンマ化してしまう
}
}
else {
var.req.value ,= TOAUTOEX(_value)
}
}
if SHIORI3FW.Eventid == 'OnAiTalk' || SHIORI3FW.Eventid == 'OnAITalk' {
SHIORI3FW.Eventid = 'OnAITalkNewEvent'
}
if TOLOWER(SHIORI3FW.SecurityLevel) == 'external' {
SHIORI3FW.Eventid = 'ExternalEvent.' + SHIORI3FW.Eventid
}
SHIORI3FW.EventidTranslate = SHIORI3FW.TranslateEvent(SHIORI3FW.Eventid)
// ハンドラが無い場合は即返る
if !ISFUNC(SHIORI3FW.EventidTranslate) && !SHIORI3FW.IsImportantEvent {
SHIORI3FW.MakeEmptyResponse(SHIORI3FW.Eventid)
--
C_CRLF
return
}
OnRequest
}
SHIORI3FW.TranslateEvent
{
_result = _argv[0]
_as = ARRAYSIZE(array_eventtranslate)
if _as > 0 {
_ev = ''
for _i = 0 ; _i < _as ; _i++ {
void EVAL("_ev = %(array_eventtranslate[_i])(_result)")
if STRLEN(_ev) > 0 {
_result = _ev
}
}
}
_result
}
//------------------------------------------------------------------------------
//関数名:OnRequest
//機能 :受け取ったリクエストに応じた処理を行います
//------------------------------------------------------------------------------
OnRequest
{
// コマンド別に処理分岐
case REQ.COMMAND {
when 'NOTIFY' {
// NOTIFYリクエスト
void SHIORI3FW.RaiseIDEvent
"SHIORI/3.0 204 No Content%(C_CRLF)Charset: %(S_CHARSET)%(C_CRLF)"
--
SHIORI3FW.AssembleReferenceHeader(1)
}
when 'GET' {
// GETリクエスト
if (_result = SHIORI3FW.RaiseIDEvent) == '' {
SHIORI3FW.MakeEmptyResponse(SHIORI3FW.Eventid)
}
else {
"SHIORI/3.0 200 OK%(C_CRLF)Sender: AYA%(C_CRLF)Charset: %(S_CHARSET)%(C_CRLF)/
Value: %(_result)%(C_CRLF)"
--
SHIORI3FW.AssembleReferenceHeader(0)
if SHIORI3FW.Eventid != 'OnTranslate' {
SHIORI3FW.EventidOld = SHIORI3FW.Eventid
SHIORI3FW.EventidTranslateOld = SHIORI3FW.EventidTranslate
}
}
SHIORI3FW.GetLastErrorLog
if SHIORI3FW.LastErrorDescription != SHIORI3FW.ErrorDescription {
SHIORI3FW.LastErrorDescription = SHIORI3FW.ErrorDescription
SHIORI3FW.PushErrorAlart(SHIORI3FW.ErrorLevel,SHIORI3FW.ErrorDescription)
}
}
others
// 未知のリクエスト
"SHIORI/3.0 400 Bad Request%(C_CRLF)"
}
--
SHIORI3FW.GetAdditionalReturns
--
C_CRLF
}
//------------------------------------------------------------------------------
//関数名:SHIORI3FW.PushErrorAlart
//機能 :Push Error Alart
//------------------------------------------------------------------------------
SHIORI3FW.PushErrorAlart{
SHIORI3FW.PushAdditionalReturn('ErrorLevel',_argv[0])
SHIORI3FW.PushAdditionalReturn('ErrorDescription',_argv[1])
}
//------------------------------------------------------------------------------
//関数名:SHIORI3FW.GetLastErrorLog
//機能 :エラーログに表示すべき文字列を作成します
//------------------------------------------------------------------------------
SHIORI3FW.GetLastErrorLog
{
_errors = GETERRORLOG
_errorlevel_text = 'SHIORI3FW.ERRORLOGLEVEL'
_errorlevel = 2
if _errorlevel_text == 'note' {
_errorlevel = 0
}
elseif _errorlevel_text == 'warning' {
_errorlevel = 1
}
SHIORI3FW.ErrorDescription = ''
SHIORI3FW.ErrorLevel = ''
foreach _errors; _error {
_el = 0
if ( STRSTR(_error,'error',0) >= 0 ) {
_el = 2
}
elseif ( STRSTR(_error,'warning',0) >= 0 ) {
_el = 1
}
if _el < _errorlevel {
continue
}
if STRLEN(SHIORI3FW.ErrorDescription) > 0 {
SHIORI3FW.ErrorDescription += CHR(1)
SHIORI3FW.ErrorLevel += CHR(1)
}
SHIORI3FW.ErrorDescription += _error
if _el == 0 {
SHIORI3FW.ErrorLevel += 'info'
}
elseif _el == 1 {
SHIORI3FW.ErrorLevel += 'warning'
}
else {
SHIORI3FW.ErrorLevel += 'critical'
}
}
}
//------------------------------------------------------------------------------
//関数名:SHIORI3FW.InitAdditionalReturn
//機能 :追加ヘッダ用変数を初期化します
//------------------------------------------------------------------------------
SHIORI3FW.InitAdditionalReturn : void
{
SHIORI3FW.AdditionalReturn.String = ''
}
//------------------------------------------------------------------------------
//関数名:SHIORI3FW.PushAdditionalReturn
//機能 :ヘッダを追加します (設定はリクエストごとにリセットされます)
//引数 :_argv[0] ヘッダ名 _argv[1] 値
//------------------------------------------------------------------------------
SHIORI3FW.PushAdditionalReturn : void
{
_key="%(_argv[0]): "
_argv[0]=IARRAY
SHIORI3FW.AdditionalReturn.String += _key+TOSTR(_argv)+C_CRLF
}
//------------------------------------------------------------------------------
//関数名:SHIORI3FW.Push_X_SSTP_PassThru
//機能 :X-SSTP-PassThruヘッダを追加します (設定はリクエストごとにリセットされます)
//引数 :_argv[0] ヘッダ名 _argv[1] 値
//------------------------------------------------------------------------------
SHIORI3FW.Push_X_SSTP_PassThru : void
{
_h = 'X-SSTP-PassThru-' + TOSTR(_argv[0])
_argv[0] = IARRAY
SHIORI3FW.PushAdditionalReturn(_h,_argv)
}
//------------------------------------------------------------------------------
//関数名:SHIORI3FW.ClearAdditionalReturnVariable
//機能 :追加ヘッダ用変数を削除します
//------------------------------------------------------------------------------
SHIORI3FW.ClearAdditionalReturnVariable : void
{
ERASEVAR('SHIORI3FW.AdditionalReturn.String')
}
//------------------------------------------------------------------------------
//関数名:SHIORI3FW.GetAdditionalReturns
//機能 :追加ヘッダを展開します
//返値 :追加すべきヘッダ文字列 最後は必ず改行で終わる
//------------------------------------------------------------------------------
SHIORI3FW.GetAdditionalReturns
{
_t=SHIORI3FW.AdditionalReturn.String
SHIORI3FW.AdditionalReturn.String = ''
_t
}
//------------------------------------------------------------------------------
//関数名:SHIORI3FW.AssembleReferenceHeader
//機能 :res_reference*変数を順次検査して返送用のReference文字列を作成します
//------------------------------------------------------------------------------
SHIORI3FW.AssembleReferenceHeader
{
_is_notify = TOINT(_argv[0])
_result = ''
_before = ''
_value = ''
if _is_notify == 0 {
_r = GETTYPEEX('res_reference')
if _r != 0 {
if _r == 4 {
_n = ARRAYSIZE(res_reference)
for _i = 0 ; _i < _n ; _i++ {
_result += "Reference%(_i): %(res_reference[_i])%(C_CRLF)"
}
}
else {
_result += "Reference0: %(res_reference)%(C_CRLF)"
}
ERASEVAR('res_reference')
}
else {
for _i = 0; _i < SHIORI3FW.RES_REF_MAX; _i++ {
_before = _value
_varname = 'res_reference' + _i
_value = EVAL(_varname)
if _value != '' {
_result += "Reference%(_i): %(_value)%(C_CRLF)"
ERASEVAR(_varname)
}
else {
if _before == ''; break
}
}
}
if (marker != '') || (res_marker != '') {
if marker != '' {
_result += "Marker: %(marker)%(C_CRLF)"
ERASEVAR('marker')
}
else {
_result += "Marker: %(res_marker)%(C_CRLF)"
ERASEVAR('res_marker')
}
}
if res_securitylevel != '' {
_result += "SecurityLevel: %(res_securitylevel)%(C_CRLF)"
ERASEVAR('res_securitylevel')
}
}
if res_valuenotify != '' {
_result += "ValueNotify: %(res_valuenotify)"
ERASEVAR('res_valuenotify')
}
_result
}
//------------------------------------------------------------------------------
//関数名:SHIORI3FW.IsImportantEvent
//機能 :絶対に通知すべきイベントを識別します
//引数 :_argv[0] (本当の)イベント名
//------------------------------------------------------------------------------
SHIORI3FW.IsImportantEvent
{
if SHIORI3FW.Eventid == 'OnSecondChange' {
1
return
}
elseif ISFUNC('SHIORI3EV.' + SHIORI3FW.Eventid) {
1
return
}
0
}
//------------------------------------------------------------------------------
//関数名:SHIORI3FW.RaiseIDEvent
//機能 :指定された名前の関数を実行して結果を取得します
//------------------------------------------------------------------------------
SHIORI3FW.RaiseIDEvent
{
//reference&PassThru_Ins 変数を作成
SHIORI3FW.MakeReferenceAndPassThruInsVariable
_event = SHIORI3FW.EventidTranslate
_event_fallback = _event
_result_internal = ''
if SHIORI3FW.Eventid == 'OnSecondChange' {
// OnSecondChangeならランダムトーク関連処理
_event = SHIORI3FW.ControlAITalk(_event)
_event = SHIORI3FW.TranslateEvent(_event)
}
if _event != 'OnSecondChange' {
if ISFUNC('SHIORI3EV.' + _event) {
_result_internal = TOSTR(EVAL('SHIORI3EV.' + _event))
}
}
_can_talk = SHIORI3FW.CanTalk
if _can_talk != SHIORI3FW.CanTalkFlag {
if _can_talk {
SHIORI3FW.TalkEndTime = GETSECCOUNT
}
SHIORI3FW.CanTalkFlag = _can_talk
}
// イベント活性化
_result = ''
if ISFUNC(_event) {
_result = TOSTR(EVAL(_event))
}
if _result == '' {
if _event != _event_fallback {
if ISFUNC(_event_fallback) {
_result = TOSTR(EVAL(_event_fallback))
}
}
}
if _result == '' {
_result = _result_internal
}
if _result != '' { //トークあり
// 遅延EVAL
_talk=IARRAY
if SHIORI3FW.ENABLE_DELAYED_EVAL
_talk = RE_SPLIT(_result,'(' + EVAL_DELIM + '|' + CHAIN_DELIM + ')')
else
_talk = RE_SPLIT(_result,'(' + CHAIN_DELIM + ')')
_delim = RE_GETSTR
_n = ARRAYSIZE(_delim)
//先に内部トランスレート
if SHIORI3FW.Eventid != 'OnTranslate' {
_as = ARRAYSIZE(array_translateinternal)
if _as >= 1 {
_tk = ''
for _i = 0 ; _i < _as ; _i++ {
void EVAL("_tk = %(array_translateinternal[_i])(_talk[0])")
if STRLEN(_tk) > 0 {
_talk[0] = _tk
}
}
}
}
//後から遅延設定
for _i = 0 ; _i < _n ; _i += 1 {
if SHIORI3FW.ENABLE_DELAYED_EVAL && _delim[_i] == EVAL_DELIM {
// 遅延EVAL
void EVAL(_talk[_i + 1])
}
elseif _delim[_i] == CHAIN_DELIM {
// チェイン処理
SHIORI3FW.StartChainTalk(_talk[_i + 1])
}
}
if _talk[0] != '' {
if SHIORI3FW.Status != 'Run' {
SHIORI3FW.Status = 'Run'
}
SHIORI3FW.LastTalk = _talk[0]
if _event == 'OnAITalkNewEvent' {
SHIORI3FW.LastAITalk = _talk[0]
SHIORI3FW.ResetAITalkInterval(STRLEN(_talk[0]))
}
if 'Surface' !_in_ _event {
if SHIORI3FW.RemoveAllTags(_talk[0]) != '' {
SHIORI3FW.LastTalkTime = GETSECCOUNT
}
}
_talk[0]
}
}
else { //トークなし
if _event == 'OnAITalkNewEvent' {
SHIORI3FW.LastAITalk = ''
SHIORI3FW.ResetAITalkInterval(0)
}
}
// reference&PassThru_Ins 変数をクリア
SHIORI3FW.ClearReferenceAndPassThruInsVariable
}
//------------------------------------------------------------------------------
//関数名:SHIORI3FW.MakeEmptyResponse
//機能 :204を返してはいけないリクエストを判定して、
// 適正な応答文字列を作成します
//引数 :_argv[0] イベント名
//------------------------------------------------------------------------------
SHIORI3FW.MakeEmptyResponse
{
case _argv[0] {
when 'OnFirstBoot', 'OnGhostChanged' {
_evt = SHIORI3FW.TranslateEvent('OnBoot')
if ISFUNC(_evt) {
//SSP側でフォールバックするのでここでは204を返す
"SHIORI/3.0 204 No Content%(C_CRLF)Charset: %(S_CHARSET)%(C_CRLF)"
}
else {
// OnBootハンドラもない時に、スコープ0/1の基本サーフィスを出す必要があるイベント
"SHIORI/3.0 200 OK%(C_CRLF)Sender: AYA%(C_CRLF)Charset: %(S_CHARSET)%(C_CRLF)/
Value: \0\s[0]\1\s[10]\e%(C_CRLF)"
}
}
when 'OnBoot', 'OnWindowStateRestore' {
// スコープ0/1の基本サーフィスを出す必要があるイベント
"SHIORI/3.0 200 OK%(C_CRLF)Sender: AYA%(C_CRLF)Charset: %(S_CHARSET)%(C_CRLF)/
Value: \0\s[0]\1\s[10]\e%(C_CRLF)"
}
when 'OnClose' {
// 終了指示を出す必要があるイベント
"SHIORI/3.0 200 OK%(C_CRLF)Sender: AYA%(C_CRLF)Charset: %(S_CHARSET)%(C_CRLF)/
Value: \0\-\e%(C_CRLF)"
}
others {
// 上記以外では204を返送して良い
"SHIORI/3.0 204 No Content%(C_CRLF)Charset: %(S_CHARSET)%(C_CRLF)"
}
}
}
//------------------------------------------------------------------------------
//関数名:SHIORI3FW.ResetAITalkInterval
//機能 :AIトーク発動処理カウンタのリセット
//引数 :_argv[0] スクリプトの長さ もしくは初期化時-1
//------------------------------------------------------------------------------
SHIORI3FW.ResetAITalkInterval
{
SHIORI3FW.LastAITalkTime = GETSECCOUNT
if _argv[0] != 0 {
SHIORI3FW.IsSurfaceRestoreComplete = 0
}
SHIORI3FW.IsAITalkComplete = 0
}
//------------------------------------------------------------------------------
//関数名:SHIORI3FW.ControlAITalk
//機能 :AIトーク発動処理、変数データの自動保存処理
//引数 :_argv[0] イベント名
//------------------------------------------------------------------------------
SHIORI3FW.ControlAITalk
{
_return_value = _argv[0]
if TOINT(reference[3]) {//喋れる
if SHIORI3FW.DelayEventTime {
SHIORI3FW.DelayEventTime--
if SHIORI3FW.DelayEventTime <= 0 {
_return_value = SHIORI3FW.DelayEvent
if ARRAYSIZE(SHIORI3FW.DelayEventReference) {
reference = SHIORI3FW.DelayEventReference
}
}
}
if aitalkinterval > 0 {// トーク間隔が非0
_sec = GETSECCOUNT
_diff = _sec - SHIORI3FW.LastAITalkTime
if _diff >= aitalkinterval {// トーク間隔の設定時間を越えた
if SHIORI3FW.CanTalk {
if (_sec - SHIORI3FW.LastTalkTime) >= 6 {
if (_sec - SHIORI3FW.TalkEndTime) >= 6 {
if SHIORI3FW.IsAITalkComplete == 0 {
_return_value = 'OnAITalkNewEvent'
SHIORI3FW.IsAITalkComplete = 1
}
}
}
}
}
elseif _diff == (aitalkinterval*2/3) {//2/3でSurfaceRestore
if SHIORI3FW.CanTalk {
if (_sec - SHIORI3FW.LastTalkTime) >= 4 {
if (_sec - SHIORI3FW.TalkEndTime) >= 2 {
if SHIORI3FW.IsSurfaceRestoreComplete == 0 {
_return_value = 'OnSHIORI3FW.SurfaceRestore'
SHIORI3FW.IsSurfaceRestoreComplete = 1
}
}
}
}
}
}
}
SHIORI3FW.SaveVarCount++
if SHIORI3FW.SaveVarCount > 1800 {
SHIORI3FW.SaveVarCount = 0
SAVEVAR
}
_return_value
}
//------------------------------------------------------------------------------
//関数名:SHIORI3FW.SetDelayEvent/GetDelayEvent
//機能 :「遅れて喋る」イベントの登録/取得
//引数 :_argv[0] イベント _argv[1] 遅れsec.
//------------------------------------------------------------------------------
SHIORI3FW.SetDelayEvent : void
{
if STRLEN(_argv[0]) != 0 && _argv[1] {
SHIORI3FW.DelayEventTime = TOINT(_argv[1])
SHIORI3FW.DelayEvent = _argv[0]
SHIORI3FW.DelayEventReference = _argv[2,100]//範囲外は削られるのでこれでOK
}
else {
SHIORI3FW.DelayEventTime = 0
SHIORI3FW.DelayEvent = ''
SHIORI3FW.DelayEventReference = IARRAY
}
}
SHIORI3FW.GetDelayEvent
{
(SHIORI3FW.DelayEvent,SHIORI3FW.DelayEventTime,SHIORI3FW.DelayEventReference)
}
//------------------------------------------------------------------------------
//関数名:SHIORI3FW.MakeReferenceAndPassThruInsVariable
//機能 :Reference*ヘッダからreference*変数/PassThru_Ins.*変数を作成します
//------------------------------------------------------------------------------
SHIORI3FW.MakeReferenceAndPassThruInsVariable : void {
SHIORI3FW.ReferenceList = IARRAY
SHIORI3FW.PassThru_Ins_List = IARRAY
reference = IARRAY
reference.raw = IARRAY
_sz = ARRAYSIZE(var.req.key)
for _i = 0; _i < _sz; _i++ {
if SUBSTR(_keyname = var.req.key[_i], 0, 9) == 'Reference' {
_refnum = TOINT(SUBSTR(_keyname, 9, 3))
_value = var.req.value[_i]
reference[_refnum] = _value
reference.raw[_refnum] = var.req.rawvalue[_i]
if SHIORI3FW.REF_ACCEL==0 {//1にすると高速化
_varname = 'reference'+_refnum
LETTONAME(_varname, _value)
SHIORI3FW.ReferenceList ,= _varname
}
}
elseif SUBSTR(_keyname = var.req.key[_i], 0, 16) == 'X-SSTP-PassThru-' {
_PassThru_Ins_Name = SUBSTR(_keyname, 9, STRLEN(_keyname))
_value = var.req.value[_i]
_varname = 'PassThru_Ins.'+_PassThru_Ins_Name
LETTONAME(_varname, _value)
SHIORI3FW.PassThru_Ins_List ,= _varname
}
}
}
//------------------------------------------------------------------------------
//関数名:SHIORI3FW.ClearReferenceAndPassThruInsVariable
//機能 :reference*&PassThru_Ins.*変数を削除します
//------------------------------------------------------------------------------
SHIORI3FW.ClearReferenceAndPassThruInsVariable : void {
foreach SHIORI3FW.ReferenceList; _refname { ERASEVAR(_refname) }
ERASEVAR('SHIORI3FW.ReferenceList')
ERASEVAR('reference','reference.raw')
foreach SHIORI3FW.PassThru_Ins_List; _refname { ERASEVAR(_refname) }
ERASEVAR('SHIORI3FW.PassThru_Ins_List')
}
//******************************************************************************
//チェイン制御
//******************************************************************************
//------------------------------------------------------------------------------
//関数名:SHIORI3FW.InitChain
//機能 :初期化
//------------------------------------------------------------------------------
SHIORI3FW.InitChain
{
CHAIN.IDName = ''
CHAIN.Script = ''
CHAIN.Index = 0
}
//------------------------------------------------------------------------------
//関数名:SHIORI3FW.StartChainTalk
//機能 :チェイン情報を解析してチェイン処理を開始します
//引数 :_argv[0] イベントID
//------------------------------------------------------------------------------
SHIORI3FW.StartChainTalk
{
// チェイン名が無いなら何もしない
if _argv[0] == ''; return
// チェイン強制終了処理
if _argv[0] == 'end' {
SHIORI3FW.EndChainTalk
}
// 新たにチェイン開始
else {
CHAIN.IDName = _argv[0]
CHAIN.Script = ''
CHAIN.Index = 0
CHAIN.StartTime = GETSECCOUNT
}
}
//------------------------------------------------------------------------------
//関数名:SHIORI3FW.StartChainTalkScriptDirect
//機能 :直接次のチェインのスクリプトを指定します
//引数 :_argv[0] スクリプト
//------------------------------------------------------------------------------
SHIORI3FW.StartChainTalkScriptDirect
{
// チェイン強制終了処理
if _argv[0] == '' {
SHIORI3FW.EndChainTalk
}
// 新たにチェイン開始
else {
CHAIN.IDName = ''
CHAIN.Script = _argv[0]
CHAIN.Index = 0
CHAIN.StartTime = GETSECCOUNT
}
}
//------------------------------------------------------------------------------
//関数名:SHIORI3FW.IsChain
//機能 :チェイン中かどうかを返します
//------------------------------------------------------------------------------
SHIORI3FW.IsChain
{
if CHAIN.Script != '' {
1
return
}
if CHAIN.IDName != '' {
1
return
}
0
return
}
//------------------------------------------------------------------------------
//関数名:ChainTalk
//機能 :チェイン処理 SHIORI3EV.OnAITalkNewEventから実行されます
//------------------------------------------------------------------------------
ChainTalk
{
if CHAIN.IDName != '' {
_res = EVAL(CHAIN.IDName)
if _res != '' {
_res
return
}
}
if CHAIN.Script != '' {
_res = CHAIN.Script
CHAIN.Script = ''
_res
return
}
SHIORI3FW.EndChainTalk
RandomTalk
}
//------------------------------------------------------------------------------
//関数名:SHIORI3FW.EndChainTalk
//機能 :チェインを終了します
//------------------------------------------------------------------------------
SHIORI3FW.EndChainTalk
{
CHAIN.IDName = ''
CHAIN.Script = ''
CHAIN.StartTime = 0
}
//------------------------------------------------------------------------------
//関数名:SHIORI3FW.ChainTime
//機能 :チェイン中の時間を取得します
//------------------------------------------------------------------------------
SHIORI3FW.ChainTime
{
if CHAIN.StartTime {
GETSECCOUNT - TOINT(CHAIN.StartTime)
}
else {
0
}
}
//------------------------------------------------------------------------------
//関数名:SHIORI3FW.ClearChainVariable
//機能 :チェイン制御用の変数を消去します
//------------------------------------------------------------------------------
SHIORI3FW.ClearChainVariable
{
ERASEVAR('CHAIN.IDName')
ERASEVAR('CHAIN.Index' )
ERASEVAR('CHAIN.Script' )
ERASEVAR('CHAIN.StartTime' )
}
//******************************************************************************
//ネットワーク更新後にできた dl2 ファイルに関する処置
//******************************************************************************
//------------------------------------------------------------------------------
//関数名:SHIORI3FW.Dl2ToDll
//機能 :処理の開始
//------------------------------------------------------------------------------
SHIORI3FW.Dl2ToDll
{
SHIORI3FW.ExecuteDl2ToDll('')
}
//------------------------------------------------------------------------------
//関数名:SHIORI3FW.ExecuteDl2ToDll
//機能 :指定したディレクトリに存在するdl2を処理
//引数 :_argv[0] 処理対象パス(AYA dllからの相対パス指定)
//------------------------------------------------------------------------------
SHIORI3FW.ExecuteDl2ToDll
{
// 指定ディレクトリ内のファイルを列挙
_files = TOLOWER(FENUM(_argv[0]))
// 拡張子dl2のファイルをリストに蓄積する 子ディレクトリ内も再帰的に処理する
_targets = IARRAY
foreach _files; _file {
if SUBSTR(_file, 0, 1) == '\'
SHIORI3FW.ExecuteDl2ToDll(_argv[0] + _file)
else {
_s_path = SPLITPATH(_file)
if _s_path[3] == '.dl2'
_targets ,= _s_path[2]
}
}
// 拡張子dl2をdllへ名前変更する 旧dllは消去する
foreach _targets; _target {
_path = _argv[0] + '\' + _target
void FDEL(_path + '.dll')
void FRENAME(_path + '.dl2', _path + '.dll')
}
}
//******************************************************************************
//インストール済ゴーストリストの構築
//******************************************************************************
//------------------------------------------------------------------------------
//関数名:On_installedghostname/sakuraname/keroname
//機能 :インストール済ゴースト名通知イベント
//------------------------------------------------------------------------------
On_installedsakuraname {
SHIORI3FW.BasewareNotifysInstalledSakuraName=1
installedsakuralist = reference.raw
}
On_installedkeroname {
SHIORI3FW.BasewareNotifysInstalledKeroName=1
installedkerolist = reference.raw
}
On_installedghostname {
//Referenceから取得
installedghostlist = reference.raw
if SHIORI3FW.BasewareNotifysInstalledSakuraName && SHIORI3FW.BasewareNotifysInstalledKeroName {
return
}
// materia、もしくはイベントからの取得が指示されていなければファイル走査で取得する処理を実行
if basewarename == 'embryo' || !SHIORI3FW.IGLIST_ACCEL {
installedsakuralist = IARRAY
installedkerolist = IARRAY
installedghostlist = IARRAY
SHIORI3FW.StructInstalledGhostList
}
}
//------------------------------------------------------------------------------
//関数名:SHIORI3FW.StructInstalledGhostList
//機能 :構築
//------------------------------------------------------------------------------
SHIORI3FW.StructInstalledGhostList
{
if !SHIORI3FW.IGLIST_MAX; return
// ghostディレクトリ配下のディレクトリを抽出
_filelist = FENUM('..\..\..')
_dirlist = IARRAY
foreach _filelist; _file {
if '\' _in_ _file; _dirlist ,= _file
}
_dirnum = ARRAYSIZE(_dirlist)
// 取得開始位置と取得数を求める
_num = 0
if SHIORI3FW.IGLIST_MAX == -1 {
StructGhostList.Index = 0
_num = _dirnum
}
else {
if GETTYPE(StructGhostList.Index) != 1 || StructGhostList.Index >= _dirnum
StructGhostList.Index = 0
_num = SHIORI3FW.IGLIST_MAX
if _num > _dirnum; _num = _dirnum
}
// リスト作成主処理
for _i = 0; _i < _num; _i++ {
// 取得位置の更新
StructGhostList.Index++
if StructGhostList.Index >= _dirnum; StructGhostList.Index = 0
// descript.txtから情報取得
_ghostname = SHIORI3FW.GetGhostNameFromDescriptTxt(/
'..\..\..' + _dirlist[StructGhostList.Index])
// リストへ追加
if ARRAYSIZE(_ghostname) {
installedghostlist ,= _ghostname[0]
installedsakuralist ,= _ghostname[1]
installedkerolist ,= _ghostname[2]
}
}
}
//------------------------------------------------------------------------------
//関数名:SHIORI3FW.GetGhostNameFromDescriptTxt
//機能 :descript.txtからname/sakura.name/kero.nameを取得します
//引数 :_argv[0] 取得対象のゴーストディレクトリ
//------------------------------------------------------------------------------
SHIORI3FW.GetGhostNameFromDescriptTxt
{
_charset = SHIORI3FW.GetCharsetFromDescriptTxt(_argv[0])
if _charset == ''
_charset = 'Shift_JIS'
FCHARSET(_charset)
if !FOPEN(_filename = "%(_argv[0])\ghost\master\descript.txt", 'r')
return
_ghostname = IARRAY
_flag = 0
while _flag != 7 {
if (_line = FREAD(_filename)) == -1; break
case CUTSPACE(_line[0]) {
when 'name' {
_ghostname[0] = CUTSPACE(_line[1])
_flag++
}
when 'sakura.name' {
_ghostname[1] = CUTSPACE(_line[1])
_flag += 2
}
when 'kero.name' {
_ghostname[2] = CUTSPACE(_line[1])
_flag += 4
}
}
}
FCLOSE(_filename)
_ghostname
}
//------------------------------------------------------------------------------
//関数名:SHIORI3FW.GetCharsetFromDescriptTxt
//機能 :descript.txtからcharsetを取得します
//引数 :_argv[0] 取得対象のゴーストディレクトリ
//------------------------------------------------------------------------------
SHIORI3FW.GetCharsetFromDescriptTxt
{
if !FOPEN(_filename = "%(_argv[0])\ghost\master\descript.txt", 'r')
return
_charset = ''
_flag = 0
while _flag != 1 {
if (_line = FREAD(_filename)) == -1; break
case TOLOWER(CUTSPACE(_line[0])) {
when 'charset' {
_charset = CUTSPACE(_line[1])
_flag++
}
}
}
FCLOSE(_filename)
_charset
}
//******************************************************************************
//文 version 3 システム関数 / システム変数の補完
//FUNCTIONEX / SAORI
//******************************************************************************
//------------------------------------------------------------------------------
//関数名:FUNCTIONLOAD
//機能 :SAORIを読み込みます
//引数 :_argv[0]  対象DLL名
//------------------------------------------------------------------------------
FUNCTIONLOAD
{
// load エラーなら抜ける 初回のloadならGET Versionを送出する
_r_load = LOADLIB(_argv[0])
if !_r_load {
0
return
}
if _r_load == 1 {
if SUBSTR(SHIORI3FW.SendGETVersion(_argv[0]), 0, 1) != '2' {
UNLOADLIB(_argv[0])
0
return
}
SAORI.DllList ,= _argv[0]
}
1
}
//------------------------------------------------------------------------------
//関数名:FUNCTIONEX
//機能 :SAORIを実行します
//引数 :_argv[0]  対象DLL名
//    _argv[1]~ Argument0~
//------------------------------------------------------------------------------
FUNCTIONEX
{
if FUNCTIONLOAD(_argv[0]) == 0 {
0
return
}
// リクエスト文字列を作成
_reqheader = /
"EXECUTE SAORI/1.0%(C_CRLF)Charset: %(CHARSETLIBEX(_argv[0]))%(C_CRLF)Sender: AYA%(C_CRLF)SecurityLevel: local%(C_CRLF)"
for _i = 1; _i < _argc; _i++ {
_reqheader += "Argument%(_i - 1): %(_argv[_i])%(C_CRLF)"
}
_reqheader += C_CRLF
// 実行
SHIORI3FW.RequestLib(_argv[0], _reqheader)
if var.lib.result != ''
var.lib.result
SHIORI3FW.MakeValueexVariable
}
//------------------------------------------------------------------------------
//関数名:SAORI
//機能 :SAORIを実行します
// FUNCTIONEXのシノニム。一段下駄が入る分FUNCTIONEXより低速になりますが、
// 気にするほどではありません。
//------------------------------------------------------------------------------
SAORI { FUNCTIONEX(_argv) }
//------------------------------------------------------------------------------
//関数名:SHIORI3FW.SendGETVersion
//機能 :SAORIへGET Versionを送出します
//引数 :_argv[0] SAORIファイル名
//------------------------------------------------------------------------------
SHIORI3FW.SendGETVersion
{
SHIORI3FW.RequestLib(_argv[0], "GET Version SAORI/1.0%(C_CRLF)Charset: %(CHARSETLIBEX(_argv[0]))%(C_CRLF)Sender: AYA%(C_CRLF2)")
LIB.STATUSCODE
}
//------------------------------------------------------------------------------
//関数名:SHIORI3FW.RequestLib
//機能 :SAORIへリクエストを送出し、結果を得ます
//引数 :_argv[0] SAORIファイル名
//    _argv[1] リクエスト文字列
//------------------------------------------------------------------------------
SHIORI3FW.RequestLib
{
LIB.PROTOCOL = ''
LIB.STATUSCODE = ''
// リクエスト送出
_result = REQUESTLIB(_argv[0], _argv[1])
// 結果の解析
// 改行で分割
_lines = RE_SPLIT(_result, C_CRLF)
// プロトコル名と結果の取得
_seppos = STRSTR(_lines[0], ' ', 0)
if _seppos == -1; return
LIB.PROTOCOL = SUBSTR(_lines[0], 0, _seppos)
LIB.STATUSCODE = SUBSTR(_lines[0], _seppos + 1, STRLEN(_lines[0]) - _seppos - 1)
// レスポンスヘッダの取得
var.lib.key = IARRAY
var.lib.value = IARRAY
var.lib.result = ''
_skip = 1
foreach _lines; _lin {
// 1行目は飛ばす
if _skip {
_skip = 0
continue
}
// キーと値を取得
_len = STRLEN(_lin)
_pos = STRSTR(_lin, ': ', 0)
var.lib.key ,= (_key = SUBSTR(_lin, 0, _pos))
_value = SUBSTR(_lin, _pos + 2, _len - _pos - 2)
_valuecv = ''
if var.lib.key == '' {
break
}
if SHIORI3FW.AUTO_DATA_CONVERT {
if ISINTSTR(_value)
_valuecv = TOINT(_value)
elseif ISREALSTR(_value)
_valuecv = TOREAL(_value)
else
_valuecv = REPLACE(_value, C_BYTE1, ',')
}
else {
_valuecv = TOAUTOEX(_value)
}
var.lib.value ,= _valuecv
if _key == 'Result' {
var.lib.result = _valuecv
}
}
}
//------------------------------------------------------------------------------
//関数名:SHIORI3FW.MakeValueexVariable
//機能 :リクエストヘッダからvalueex*変数を作成します
//------------------------------------------------------------------------------
SHIORI3FW.MakeValueexVariable
{
SHIORI3FW.ClearValueexVariable
valueex = IARRAY
_sz = ARRAYSIZE(var.lib.key)
for _i = 0; _i < _sz; _i++ {
if SUBSTR(_keyname = var.lib.key[_i], 0, 5) == 'Value' {
_varname = "valueex%(SUBSTR(_keyname, 5, 3))"
LETTONAME(_varname, var.lib.value[_i])
valueex[TOINT(SUBSTR(_keyname, 5, 3))] = var.lib.value[_i]
}
}
}
//------------------------------------------------------------------------------
//関数名:SHIORI3FW.ClearValueexVariable
//機能 :valueex*変数を削除します
//------------------------------------------------------------------------------
SHIORI3FW.ClearValueexVariable
{
_valueexList = GETVARLIST('valueex')
foreach _valueexList; _exname {
if RE_MATCH(_exname, 'valueex[0-9]+') {
ERASEVAR(_exname)
}
}
ERASEVAR('valueex')
}
//------------------------------------------------------------------------------
//関数名:SHIORI3FW.SaoriUnloadAll
//機能 :ロードされているSAORIをすべてunloadします
//------------------------------------------------------------------------------
SHIORI3FW.SaoriUnloadAll
{
foreach SAORI.DllList; _saori { UNLOADLIB(_saori) }
SAORI.DllList = IARRAY
}
//------------------------------------------------------------------------------
//関数名:SHIORI3FW.RegisterTempVar
//機能 :終了時に削除するグローバル変数を登録します。
//------------------------------------------------------------------------------
SHIORI3FW.RegisterTempVar
{
for _i = 0 ; _i < _argc ; _i++ {
if ASEARCH(_argv[_i],SHIORI3FW.tempvarname) < 0 {
SHIORI3FW.tempvarname ,= _argv[_i]
}
}
}
//------------------------------------------------------------------------------
// 関数名:SHIORI3FW.RemoveAllTags
// 機能 :全てのさくらスクリプトタグを消去する。
// 引数 :argv0=テキスト
//------------------------------------------------------------------------------
SHIORI3FW.RemoveAllTags
{
_text = RE_REPLACE(_argv[0],'\\_{0,2}[a-zA-Z0-9*!&\-+](\d|\[("([^"]|\\")+?"|([^\]]|\\\])+?)+?\])?','')
_text = REPLACE(_text,'\\','\')
_text
}
//------------------------------------------------------------------------------
// 関数名:SHIORI3FW.CanTalk
// 機能 :Statusヘッダからしゃべれるかどうかを判定する
//------------------------------------------------------------------------------
SHIORI3FW.CanTalk
{
if 'talking' _in_ status {
0
return
}
if 'choosing' _in_ status {
0
return
}
if 'minimizing' _in_ status {
0
return
}
if 'timecritical' _in_ status {
0
return
}
1
return
}
//******************************************************************************
//配列操作
//******************************************************************************
JOIN
{
if _argc <= 2 {
_argv[0]
return
}
_delim = _argv[_argc - 1]
_argc--
_text = _argv[0]
for _i = 1 ; _i < _argc ; _i++ {
_text += _delim
_text += _argv[_i]
}
_text
}
REVERSE
{
_a = IARRAY
for _i = 0 ; _i < _argc ; _i++ {
_a ,= _argv[_argc-_i-1]
}
_a
}
UNIQUE
{
ARRAYDEDUP(_argv)
}
SPLITEX
{
_a = SPLIT(_argv)
_n = ARRAYSIZE(_a)
for _i = _n-1 ; _i >= 0 ; _i-- {
if _a[_i] == '' {
_a[_i] = IARRAY
}
}
_a
}
MAX
{
_v = _argv[0]
for _i = 1 ; _i < _argc ; _i++ {
if _v < _argv[_i] {
_v = _argv[_i]
}
}
_v
}
MIN
{
_v = _argv[0]
for _i = 1 ; _i < _argc ; _i++ {
if _v > _argv[_i] {
_v = _argv[_i]
}
}
_v
}
AVERAGE
{
_v = 0
for _i = 0 ; _i < _argc ; _i++ {
_v += _argv[_i]
}
_v / _argc
}
//******************************************************************************
// システムで処理するイベント群
//******************************************************************************
SHIORI3EV.OnUpdateComplete : void
{
// OnUpdateCompleteならdl2を探す。存在したら同名のdllを削除、dl2はdllにリネームする
// もっともAYA自身が対象だった場合はどうしようもないが。
SHIORI3FW.Dl2ToDll
}
SHIORI3EV.OnSurfaceChange : void
{
if reference[2] != '' {
_r2 = SPLIT(reference[2],',')
_s = TOINT(_r2[1])
_c = TOINT(_r2[0])
if _s >= 0 {
SHIORI3FW.LastSurface[_c] = _s
SHIORI3FW.IsVisible[_c] = 1
}
else {
SHIORI3FW.IsVisible[_c] = 0
}
}
else {
_s0 = TOINT(reference[0])
_s1 = TOINT(reference[1])
if _s0 >= 0 {
SHIORI3FW.LastSurface[0] = _s0
SHIORI3FW.IsVisible[0] = 1
}
else {
SHIORI3FW.IsVisible[0] = 0
}
if _s1 >= 0 {
SHIORI3FW.LastSurface[1] = _s1
SHIORI3FW.IsVisible[1] = 1
}
else {
SHIORI3FW.IsVisible[1] = 0
}
}
}
SHIORI3EV.On_hwnd : void
{
SHIORI3FW.HWnd = RE_SPLIT(reference[0],'[\x1,]')
SHIORI3FW.BalloonHWnd = RE_SPLIT(reference[1],'[\x1,]')
_m = ARRAYSIZE(SHIORI3FW.HWndOld)
_n = ARRAYSIZE(SHIORI3FW.HWnd)
if _n < _m {
_n = _m
}
for _i = 0 ; _i < _n ; _i++ {
SHIORI3FW.HWnd[_i] = TOINT(SHIORI3FW.HWnd[_i])
SHIORI3FW.HWndOld[_i] = TOINT(SHIORI3FW.HWndOld[_i])
}
_refold = reference
_refold0 = reference0
for _i = 0 ; _i < _n ; _i++ {
if SHIORI3FW.HWndOld[_i] != SHIORI3FW.HWnd[_i] {
reference[0] = _i
reference0 = _i
if SHIORI3FW.HWndOld[_i] == 0 {
void EVAL('OnSHIORI3FW.WindowCreate')
}
elseif SHIORI3FW.HWnd[_i] == 0 {
void EVAL('OnSHIORI3FW.WindowDestroy')
}
SHIORI3FW.HWndOld[_i] = SHIORI3FW.HWnd[_i]
}
}
reference = _refold
reference0 = _refold0
}
SHIORI3EV.On_uniqueid : void
{
SHIORI3FW.UniqueID = reference[0]
}
SHIORI3EV.On_capability : void
{
SHIORI3FW.Capability = reference
}
SHIORI3EV.OnNotifySelfInfo : void
{
SHIORI3FW.GhostName = reference[0]
SHIORI3FW.ShellNameOld = SHIORI3FW.ShellName
SHIORI3FW.ShellName = reference[3]
SHIORI3FW.ShellPath = reference[4]
SHIORI3FW.BalloonNameOld = SHIORI3FW.BalloonName
SHIORI3FW.BalloonName = reference[5]
SHIORI3FW.BalloonPath = reference[6]
selfname = reference[1]
sakuraname = reference[1]
keroname = reference[2]
EVAL('OnSHIORI3FW.ChangeSelfInfo')
}
SHIORI3EV.OnNotifyUserInfo : void
{
SHIORI3FW.UserName = reference[0]
SHIORI3FW.UserNameFull = reference[1]
SHIORI3FW.UserBirthday = SPLIT(reference[2],',',3)
for _i = 0 ; _i < 3 ; _i++ {
SHIORI3FW.UserBirthday[_i] = TOINT(SHIORI3FW.UserBirthday[_i])
}
SHIORI3FW.UserSex = reference[3]
}
SHIORI3EV.OnShellChanged : void
{
SHIORI3FW.ShellName = reference[0]
SHIORI3FW.ShellPath = reference[2]
EVAL('OnSHIORI3FW.ChangeSelfInfo')
}
SHIORI3EV.OnBalloonChange : void
{
SHIORI3FW.BalloonName = reference[0]
SHIORI3FW.BalloonPath = reference[1]
EVAL('OnSHIORI3FW.ChangeSelfInfo')
}
//------------------------------------------------------------------------------
//OnAITalkNewEvent
//------------------------------------------------------------------------------
SHIORI3EV.OnAITalkNewEvent
{
if RAND(100) < communicateratio
{
//---- communicateratio % の率で他ゴーストへ話しかけ
if ISFUNC('StartCommunicate') {
StartCommunicate
return
}
//else: ?
}
//互換用処理
_old_name = SHIORI3FW.TranslateEvent('OnAiTalk')
if ISFUNC(_old_name) {
EVAL(_old_name)
return
}
_old_name = SHIORI3FW.TranslateEvent('OnAITalk')
if ISFUNC(_old_name) {
EVAL(_old_name)
return
}
//---- 通常のランダムトーク、ただしチェイン中はチェイントーク
if SHIORI3FW.IsChain {
ChainTalk
}
else {
RandomTalk
}
}
//---- SHIORI 関連情報 ------------------------------------------------------------------
SHIORI3EV.On_version
{
GETSETTING('coreinfo.version')
}
SHIORI3EV.On_craftman
{
GETSETTING('coreinfo.author')
}
SHIORI3EV.On_craftmanw
{
GETSETTING('coreinfo.author')
}
SHIORI3EV.On_name
{
GETSETTING('coreinfo.name')
}
//---- tama対応 ------------------------------------------------------------------
SHIORI3EV.On_tamaOpen
{
SHIORI3FW.TamaHwnd = reference[0]
SETTAMAHWND(SHIORI3FW.TamaHwnd)
}
SHIORI3EV.On_tamaExit
{
ERASEVAR('SHIORI3FW.TamaHwnd')
SETTAMAHWND(0)
}
SHIORI3EV.OnInitialize
{
if reference[0] == 'reload' {
SETTAMAHWND(SHIORI3FW.TamaHwnd)
}
}
//******************************************************************************
// デバッグ
//******************************************************************************
SHIORI3EV.On_enable_log : void
{
if TOINT(reference[0]) {
SETSETTING('log','yaya_ssp_debug.log')
}
else {
SETSETTING('log','')
}
}
SHIORI3EV.On_log_path
{
SHIORI3FW.Path + 'yaya_ssp_debug.log'
}
SHIORI3EV.On_enable_debug : void
{
SHIORI3FW.DebugMode = TOINT(reference[0])
}
SHIORI3EV.On_ShioriEcho
{
if ISFUNC('On_ShioriEcho') {//User costom ShioriEcho
EVAL('On_ShioriEcho')
}
elseif SHIORI3FW.DebugMode {
_result=EVAL(reference[0])
'\0Eval Result = ' + JOIN(_result,',')
SHIORI3FW.Push_X_SSTP_PassThru('Result',_result)
SHIORI3FW.Push_X_SSTP_PassThru('Type','id: '+GETTYPEEX('_result'))
}
else {
'\0Need DebugMode'
SHIORI3FW.Push_X_SSTP_PassThru('Special','Need DebugMode')
}
}
SHIORI3EV.On_Has_Event : void {
_event_name=reference.raw[0]
_SecurityLevel=reference.raw[1]
if !_SecurityLevel
_SecurityLevel=SHIORI3FW.SecurityLevel
if SUBSTR(_event_name,0,2) != 'On'
_event_name='On_'+_event_name
_result=0
if TOLOWER(_SecurityLevel) == 'external'
_event_name='ExternalEvent.'+_event_name
_result=ISFUNC(_event_name)
if !_result
_result=ISFUNC('SHIORI3EV.'+_event_name)
SHIORI3FW.Push_X_SSTP_PassThru('Result',_result)
}
SHIORI3EV.ExternalEvent.On_Has_Event{
SHIORI3EV.On_Has_Event
}
SHIORI3EV.On_Get_Supported_Events: void {
_L=GETFUNCLIST('On')
_base_local_event_funcs=IARRAY
foreach _L;_func{
if SUBSTR(_func,2,1) == '_'
_func=SUBSTR(_func,3,STRLEN(_func))
_base_local_event_funcs,=_func
}
_L=GETFUNCLIST('SHIORI3EV.On')
foreach _L;_func{
_func=SUBSTR(_func,10,STRLEN(_func))
if SUBSTR(_func,2,1) == '_'
_func=SUBSTR(_func,3,STRLEN(_func))
_base_local_event_funcs,=_func
}
SHIORI3FW.Push_X_SSTP_PassThru('local',ARRAYDEDUP(_base_local_event_funcs))
_L=GETFUNCLIST('ExternalEvent.On')
_base_external_event_funcs=IARRAY
foreach _L;_func{
_func=SUBSTR(_func,14,STRLEN(_func))
if SUBSTR(_func,2,1) == '_'
_func=SUBSTR(_func,3,STRLEN(_func))
_base_external_event_funcs,=_func
}
_L=GETFUNCLIST('SHIORI3EV.ExternalEvent.On')
foreach _L;_func{
_func=SUBSTR(_func,24,STRLEN(_func))
if SUBSTR(_func,2,1) == '_'
_func=SUBSTR(_func,3,STRLEN(_func))
_base_external_event_funcs,=_func
}
SHIORI3FW.Push_X_SSTP_PassThru('external',ARRAYDEDUP(_base_external_event_funcs))
}
SHIORI3EV.ExternalEvent.On_Get_Supported_Events{
SHIORI3EV.On_Get_Supported_Events
}
DUMP : void
{
void FOPEN('dump.txt','ab')
void FWRITE('dump.txt',JOIN(_argv,',') + C_CRLF)
void FCLOSE('dump.txt')
}
//******************************************************************************
// 時刻系変数
//******************************************************************************
year { GETTIME[0] }
month { GETTIME[1] }
day { GETTIME[2] }
weekday { GETTIME[3] }
hour { GETTIME[4] }
ampm { hour / 12 }
hour12 { hour % 12 }
hour12ex{ if hour12 == 0; 12 ; else ; hour12 }
minute { GETTIME[5] }
second { GETTIME[6] }
systemuptickcount { GETTICKCOUNT }
systemuptime
{
_highcount = GETTICKCOUNT(1)
if _highcount > 1
GETTICKCOUNT/1000
else
(_highcount*0x40000000 + (GETTICKCOUNT/2))/500
}
systemupsecond { SHIORI3FW.GetTickInfo[3] }
systemupminute { SHIORI3FW.GetTickInfo[1] }
systemuphour { SHIORI3FW.GetTickInfo[2] }
SHIORI3FW.GetTickInfo
{
_result = (IARRAY, systemuptime)
_result ,= _result[0]/60
_result ,= _result[1]/60
_result ,= _result[0] - _result[1]*60
_result[1] -= _result[2]*60
_result
}
ghostupmin
{
if ISVAR('ghostbootmin') {
(GETSECCOUNT / 60) - ghostbootmin
}
else {
0
}
}
ghostupmin_total
{
ghostupmin_last + ghostupmin
}
//******************************************************************************
// メモリ系変数
//******************************************************************************
memoryload { GETMEMINFO[0] }
memorytotalphys { GETMEMINFO[1] }
memoryavailphys { GETMEMINFO[2] }
memorytotalvirtual { GETMEMINFO[3] }
memoryavailvirtual { GETMEMINFO[4] }