* added core funcs "bigger_eq/greater_eq, smaller_eq" in addition to "bigger/greater, smaller & equal" * added scripted func "lfind" - return position of element in a list.
190 lines
6.4 KiB
Modula-2
190 lines
6.4 KiB
Modula-2
// -------------------------------------------
|
||
#script=_onchatmessage
|
||
// purpose: do something if specific chat messages are recieved.
|
||
// args:
|
||
// @def: chat message text
|
||
// @0: message type id (check ChatMsg enum in src/Client/SharedDefines.h)
|
||
// @1: language id (also defined in SharedDefines.h), alternatively look up bin/data/scp/language.scp
|
||
// @2: GUID of the player or creature this msg came from
|
||
// @3: channel name. empty string if the chat message was not sent in a channel (for example say, yell or whisper)
|
||
//--------------------------------------------
|
||
|
||
processchatai,{${@0}},{${@1}},{${@2}},{${@3}} ${@def}
|
||
|
||
|
||
|
||
|
||
// -----------------------------------
|
||
#script=FlushChatAI
|
||
#permission=255
|
||
// -----------------------------------
|
||
// purpose: remove all registered chat AI scripts. usable as command.
|
||
logdebug flushing chat AI scripts.
|
||
lclean #processchatai::pattern_list
|
||
lclean #processchatai::script_list
|
||
lclean #processchatai::cond_list
|
||
lclean #processchatai::register_list
|
||
|
||
// ----------------------------------
|
||
#script=DropChatAIScript
|
||
// ----------------------------------
|
||
// purpose: drop all entries registered to call the script specified in @def
|
||
set,amount 0
|
||
loop
|
||
set,pos ?{lfind,#processchatai::script_list,true ${@def}}
|
||
if ?{not ?{strlen ${pos}}}
|
||
exitloop
|
||
endif
|
||
set,what_sc ?{lerase,#processchatai::script_list ${pos}}
|
||
set,what_cond ?{lerase,#processchatai::cond_list ${pos}}
|
||
set,what_ptn ?{lerase,#processchatai::pattern_list ${pos}}
|
||
lerase,#processchatai::register_list ${pos}
|
||
logdetail Dropped ChatAI for script '${what_sc}', cond [${what_cond}], pattern [${what_ptn}]
|
||
add,amount 1
|
||
endloop
|
||
unset what_sc
|
||
unset what_cond
|
||
unset what_ptn
|
||
unset pos
|
||
return ${amount}
|
||
|
||
|
||
// ----------------------------------
|
||
#script=processchatai
|
||
// ----------------------------------
|
||
// purpose: iterate over registered AI scripts, test if the chat message matches a given condition,
|
||
// and execute appropriate script with predefined arguments.
|
||
// returns: false if the incoming chatmessage was invalid, else true
|
||
// TODO: get object name (player or creature) and pass it to the called scripts
|
||
|
||
// filter out chat messages that came from us
|
||
if ?{equal,${@myguid} ${@2}}
|
||
return false
|
||
endif
|
||
|
||
// filter out CHAT_MSG_WHISPER_INFORM ("whisper to ... : blah blah")
|
||
if ?{equal,${@0} 7}
|
||
return false
|
||
endif
|
||
|
||
set,msg ?{lowercase ${@def}}
|
||
|
||
default,filter { !?,;.:-_\\/<>()[]"$=+&#'*~`<60>^<5E>}
|
||
|
||
// split the msg into a list containing only words. remove special characters also.
|
||
lcsplit,wlist,{${filter}} ${msg}
|
||
|
||
// remove empty entries
|
||
lclean,wlist
|
||
|
||
|
||
// obtain name of the language that was used
|
||
set,langname ?{GetSCPValue,language,${@1} name}
|
||
default,langname UNKNOWN
|
||
|
||
|
||
set,i 0
|
||
set,len ?{llen pattern_list}
|
||
|
||
loop
|
||
if ?{equal,${i} ${len}}
|
||
exitloop
|
||
endif
|
||
|
||
set,script ?{lindex,script_list ${i}}
|
||
set,cond ?{lindex,cond_list ${i}}
|
||
set,pattern ?{lindex,pattern_list ${i}}
|
||
|
||
set,call false
|
||
|
||
if ?{equal,NONE ${cond}}
|
||
set,call true
|
||
else
|
||
if ?{equal,ANY ${cond}}
|
||
set,call ?{lcontains_ext,wlist,{ } ${pattern}}
|
||
else
|
||
if ?{equal,EXACT ${cond}}
|
||
set,call ?{equal,{${pattern}} ${msg}}
|
||
else
|
||
if ?{equal,EXACT_PARTIAL ${cond}}
|
||
set,call ?{strlen ?{strfind,{${pattern}} ${msg}}}
|
||
else
|
||
if ?{equal,ALL ${cond}}
|
||
// split the pattern into a list, then get its size. the amount of words matching the pattern list must be
|
||
// equal or greater then the amount of words in the pattern list
|
||
lcsplit,tmpl,{${filter}} ${pattern}
|
||
lclean,tmpl
|
||
set,pattln ?{llen tmpl}
|
||
set,matched ?{lcontains_ext,wlist,{ } ${pattern}}
|
||
set,call ?{greater_eq,${matched} ${pattln}}
|
||
unset pattln
|
||
unset matched
|
||
ldelete tmpl
|
||
endif
|
||
endif
|
||
endif
|
||
endif
|
||
endif
|
||
|
||
logdebug AI call: ${call}
|
||
|
||
if ${call}
|
||
// logdebug DEBUG: ChatAI: calling script ${script}, condition ${cond} matched.
|
||
${script},{${@0}},{${@1}},{${@2}},{${@3}},{${langname}} ${@def}
|
||
//else
|
||
// logdebug DEBUG: ChatAI: NOT called script ${script}, condition ${cond} not matched.
|
||
endif
|
||
|
||
add,i 1
|
||
endloop
|
||
|
||
|
||
|
||
// cleanup
|
||
ldelete wlist
|
||
|
||
return true
|
||
|
||
|
||
// ----------------------------------
|
||
#script=RegisterChatAIScript
|
||
// ----------------------------------
|
||
// purpose: registers a custom script to handle an incoming chat message if a condition is matched.
|
||
// args:
|
||
// @def: word pattern (words are delimited with spaces)
|
||
// @0: script name that has to be called if the condition is matched
|
||
// @1: condition. allowed values are:
|
||
// ALL - the chat message must contain all words provided
|
||
// ANY - the chat message must contain any word provided
|
||
// ALL_ORDER - same like all, but in the order provided -- NOT YET IMPLEMENTED
|
||
// ALL_CONSECUTIVE - same like ALL_ORDER, but the words must follow exactly one after another -- NOT YET IMPLEMENTED
|
||
// EXACT - the chat message must be exactly equal to the string supplied.
|
||
// EXACT_PARTIAL - the chat message must contain the string supplied.
|
||
// NONE - the script will be always called; no testing is done. its up to the user how to deal with it. (default)
|
||
// note that @def is not case sensitive!
|
||
|
||
if ?{not ?{strlen ${@0}}}
|
||
logerror Script error: RegisterChatAIScript: no function defined (called by '${@caller}')
|
||
return false
|
||
endif
|
||
|
||
set,pattern ?{lowercase ${@def}}
|
||
|
||
set,cond ?{uppercase ${@1}}
|
||
default,cond NONE
|
||
|
||
|
||
if ?{lcontains,#processchatai::register_list {[${@0};${pattern};${cond}]}}
|
||
logdebug Chat AI script already registered. script: '${@0}', condition: ${cond}, pattern: '${@def}'
|
||
return false
|
||
endif
|
||
|
||
lpushback,#processchatai::pattern_list ${pattern}
|
||
lpushback,#processchatai::script_list ${@0}
|
||
lpushback,#processchatai::cond_list ${cond}
|
||
lpushback,#processchatai::register_list {[${@0};${pattern};${cond}]}
|
||
|
||
logdetail Chat AI script registered. script: '${@0}', condition: ${cond}, pattern: '${pattern}' [now ?{llen #processchatai::pattern_list} registered]
|
||
|
||
return true
|