Note : A probably more sophisticated script approach is found for Tcl: autopray
and several much simpler ones “spamming” the server with commands without any waiting in between :


Pray

Whenever the need arises, to pray multiple times on an altar
to gain back lost stats or upgrade weapons or to receive gifts of a god
a script would be handy to do all the key pressing for you.

This script is not very sophisticated, and should work also while not being on an altar.
It does not check for the correct god also, and does not handle messages printed in the info messages window of the client, that are praying related.

It does however check the nourishing and hp level of the character at COUNT_CHECK_FOOD times with the functions

This script needs functions found in the :user:karl:cauldron: namespace to work properly:

The script recognizes the –help option and should print to the client then:

_draw 5 "$MY_BASE"
_draw 5 "Script to pray given number times."
_draw 5  "To be used in the crossfire roleplaying game client."
_draw 2 "Syntax:"
_draw 2 "script $0 <number>"
_draw 5 "For example: 'script $0 50'"
_draw 5 "will issue 50 times the use_skill praying command."
_draw 2 "Without <number> will loop forever,"
_draw 2 "use scriptkill to terminate."

The script tries to adjust an USLEEP value to wait before issuing the next 'use_skill praying' command according to the player's speed.
Two approaches are available :

With the commented one disabled.


Code

#!/bin/bash
 
# 2018-01-10 : Code overhaul.
# No real changes,
# except to support infinite looping.
 
export LC_NUMERIC=de_DE
export LC_ALL=de_DE
 
VERSION=0.0 # initial version
VERSION=1.0 # set a sleep value between use_skill praying
# to sync the messages 5 times You pray in the msgpane
VERSION=2.0 # refine the setting of sleep values
VERSION=3.0 # add a check for food level and to eat
VERSION=3.1 # recognize -V and -d options
VERSION=3.2 # use cf_funcs_requests.sh
 
# Global variables
 
MY_SELF=`realpath "$0"`
MY_BASE=${MY_SELF##*/}
MY_DIR=${MY_SELF%/*}
 
#test -f "$MY_DIR"/cf_functions.sh   && . "$MY_DIR"/cf_functions.sh
#_set_global_variables $*
 
test -f "$MY_DIR"/cf_funcs_common.sh   && . "$MY_DIR"/cf_funcs_common.sh
_set_global_variables $*
 
test -f "$MY_DIR"/cf_funcs_food.sh     && . "$MY_DIR"/cf_funcs_food.sh
test -f "$MY_DIR"/cf_funcs_requests.sh && . "$MY_DIR"/cf_funcs_requests.sh
 
# *** Override any VARIABLES in cf_functions.sh *** #
test -f "$MY_DIR"/"${MY_BASE}".conf && . "$MY_DIR"/"${MY_BASE}".conf
 
unset DIRB DIRF
 
_usage(){
_draw 5 "$MY_BASE"
_draw 5 "Script to pray given number times."
_draw 5  "To be used in the crossfire roleplaying game client."
_draw 2 "Syntax:"
_draw 2 "script $0 <number>"
_draw 5 "For example: 'script $0 50'"
_draw 5 "will issue 50 times the use_skill praying command."
_draw 2 "Without <number> will loop forever,"
_draw 2 "use scriptkill to terminate."
 
        exit 0
}
 
# *** Here begins program *** #
_say_start_msg "$@"
 
# *** Check for parameters *** #
 
while [ "$1" ]
do
PARAM_1="$1"
 
# *** implementing 'help' option *** #
case "$PARAM_1" in
-h|*"help"*) _usage;;
-d) DEBUG=$((DEBUG+1));;
-L) LOGGING=$((LOGGING+1));;
-V) _say_version;;
*)
# *** testing parameters for validity *** #
PARAM_1test="${PARAM_1//[[:digit:]]/}"
test "$PARAM_1test" && {
_draw 3 "Only :digit: numbers as first option allowed."
        exit 1 #exit if other input than letters
        }
 
NUMBER=$PARAM_1;;
 
esac
 
shift
sleep 0.1
done
 
# *** functions *** #
_usleep(){
usleep ${USLEEP:-1000000}
}
 
_get_multiplicator(){
local lPL_SPEED=${1:-$PL_SPEED}
test "$lPL_SPEED" || { MUL=10; return 254; }
 
   case $lPL_SPEED in
   1[0-4]*) MUL=18;;
   1[5-9]*) MUL=17;;
   2[0-4]*) MUL=16;;
   2[5-9]*) MUL=15;;
   3[0-4]*) MUL=14;;
   3[5-9]*) MUL=13;;
   4[0-4]*) MUL=12;;
   4[5-9]*) MUL=11;;
   5[0-4]*) MUL=10;;
   5[5-9]*) MUL=9;;
   6[0-4]*) MUL=8;;
   6[5-9]*) MUL=7;;
   7[0-4]*) MUL=6;;
   7[5-9]*) MUL=5;;
   8[0-4]*) MUL=4;;
   8[5-9]*) MUL=3;;
   9[0-4]*) MUL=2;;
   9[5-9]*) MUL=1;;
   esac
}
 
__get_player_speed_and_set_usleep(){
 
_empty_message_stream
 
_request_stat_cmbt
 
case ${#PL_SPEED} in
1) MAL=1000000000;;
2) MAL=100000000;;
3) MAL=10000000;;
4) MAL=1000000;;
5) MAL=100000;;   #0.xx
6) MAL=10000;;    #1.xx
7) MAL=1000;;    #10.xx
8) MAL=100;;    #100.xx
*) :;;
esac
 
_get_multiplicator ${PL_SPEED:-50000}
USLEEP=$(( MAL * MUL ))
_msg 7 "USLEEP=$USLEEP:PL_SPEED=$PL_SPEED"
 
USLEEP=$(( USLEEP - ( (PL_SPEED/10000) * 1000 ) ))
_msg 6 "Sleeping $USLEEP usleep micro-seconds between praying"
}
 
_get_player_speed_and_set_usleep(){
 
_empty_message_stream
 
_request_stat_cmbt
 
VAL1=`dc 10000 ${PL_SPEED:-50000} \/ p`
_debug "VAL1=$VAL1"
VAL2=`dc $VAL1 $VAL1 \* 2 \* p`
_debug "VAL2=$VAL2"
 
SLEEP=`dc 50000 ${PL_SPEED:-50000} \/ p`
_debug "SLEEP=$SLEEP"
 VAL3=`dc $SLEEP $VAL2 \/ p`
_debug "VAL3=$VAL3"
SLEEP=`dc $SLEEP $VAL2 \* $VAL3 \* p`
 
_msg 7 "SLEEP=$SLEEP:PL_SPEED=$PL_SPEED"
 
USLEEP=`dc $SLEEP 1000000 \* p`
SLEEP=${SLEEP//,/.}  # _check_food_level uses _sleep and sleep does not like 1,2 but 1.2
USLEEP=${USLEEP%.*}  # usleep does not like floats
USLEEP=${USLEEP%,*}
_msg 6 "Sleeping $USLEEP usleep micro-sec. / $SLEEP sec. between praying."
}
 
_say_progress(){
case $NUMBER in
'') _draw 5 "$one praying attempt(s) done.";;
*)  _draw 5 "$((NUMBER-one)) praying(s) left.";;
esac
}
 
 
#   __get_player_speed_and_set_usleep
     _get_player_speed_and_set_usleep
 
# *** Actual script to pray multiple times *** #
 test "$NUMBER" && { test $NUMBER -ge 1 || NUMBER=1; } #paranoid precaution
 
c=0; one=0
while :
do
one=$((one+1))
 
_is 1 1 "use_skill" "praying"
_usleep
 
if _check_counter; then
 _check_food_level
 _check_hp_and_return_home $HP
 _say_progress
fi
 
 case $NUMBER in $one) break 1;; esac
done
 
# *** Here ends program *** #
_say_end_msg
###END###