====== Bash functions for moving ====== This function library contains bash shell functions to move \\ a player. \\ Though it had been tested with the busybox ash shell, some functions might only work correctly in bash ( or the other way around ). Most noticeable function should be **_check_for_space()** that attempts to probe, \\ if a tile a character is about to step on, is actually not some kind of wall. The code had changed between v.1.10.0 and 1.12.0 of the client, \\ so older clients would likely need to use the **_check_for_space_old_client()** function. The functions use code from - [[cf_funcs_common_sh]] 650 lines of code: #!/bin/ash [ "$HAVE_FUNCS_MOVE" ] && return 0 # depends : [ "$HAVE_FUNCS_COMMON" ] || . cf_funcs_common.sh ___direction_to_number(){ # cf_funcs_common.sh local lDIRECTION=${1:-$DIRECTION} test "$lDIRECTION" || return 0 lDIRECTION=`echo "$lDIRECTION" | tr '[A-Z]' '[a-z]'` case $lDIRECTION in 0|center|centre|c) DIRECTION=0; DIRB=; DIRF=;; 1|north|n) DIRECTION=1; DIRB=south; DIRF=north;; 2|northeast|ne) DIRECTION=2; DIRB=southwest; DIRF=northeast;; 3|east|e) DIRECTION=3; DIRB=west; DIRF=east;; 4|southeast|se) DIRECTION=4; DIRB=northwest; DIRF=southeast;; 5|south|s) DIRECTION=5; DIRB=north; DIRF=south;; 6|southwest|sw) DIRECTION=6; DIRB=northeast; DIRF=southwest;; 7|west|w) DIRECTION=7; DIRB=east; DIRF=west;; 8|northwest|nw) DIRECTION=8; DIRB=southeast; DIRF=northwest;; *) ERROR=1 _error "Not recognized: '$lDIRECTION'";; esac DIRECTION_NUMBER=$DIRECTION DIRN=$DIRECTION } ___number_to_direction(){ # cf_funcs_common.sh local lDIRECTION=${1:-$DIRECTION} test "$lDIRECTION" || return 0 lDIRECTION=`echo "$lDIRECTION" | tr '[A-Z]' '[a-z]'` case $lDIRECTION in 0|center|centre|c) DIRECTION=center; DIRN=0; DIRB=; DIRF=;; 1|north|n) DIRECTION=north; DIRN=1; DIRB=south; DIRF=north;; 2|northeast|ne) DIRECTION=northeast; DIRN=2; DIRB=southwest; DIRF=northeast;; 3|east|e) DIRECTION=east; DIRN=3; DIRB=west; DIRF=east;; 4|southeast|se) DIRECTION=southeast; DIRN=4; DIRB=northwest; DIRF=southeast;; 5|south|s) DIRECTION=south; DIRN=5; DIRB=north; DIRF=south;; 6|southwest|sw) DIRECTION=southwest; DIRN=6; DIRB=northeast; DIRF=southwest;; 7|west|w) DIRECTION=west; DIRN=7; DIRB=east; DIRF=west;; 8|northwest|nw) DIRECTION=northwest; DIRN=8; DIRB=southeast; DIRF=northwest;; *) ERROR=1 _error "Not recognized: '$lDIRECTION'";; esac DIRECTION_NUMBER=$DIRN } ___set_next_direction(){ # clockwise _debug "___set_next_direction:$*:$DIRN" _log "___set_next_direction:$*:$DIRN" DIRN=$((DIRN-1)) test "$DIRN" -le 0 && DIRN=8 _number_to_direction $DIRN _draw 2 "Will turn to direction $DIRECTION .." } __set_next_direction(){ # anti-clockwise _debug "__set_next_direction:$*:$DIRN" _log "__set_next_direction:$*:$DIRN" DIRN=$((DIRN+1)) test "$DIRN" -ge 9 && DIRN=1 _number_to_direction $DIRN _draw 2 "Will turn to direction $DIRECTION .." } _set_next_direction(){ _debug "_set_next_direction:$*:$DIRN" _log "_set_next_direction:$*:$DIRN" if test "$DO_CLOCKWISE"; then DIRN=$((DIRN-1)) test "$DIRN" -le 0 && DIRN=8 else DIRN=$((DIRN+1)) test "$DIRN" -ge 9 && DIRN=1 fi _number_to_direction $DIRN _draw 2 "Will turn to direction $DIRECTION .." } _turn_direction(){ test "$3" && { DIRECTION=${1:-DIRECTION}; shift; } test "$DIRECTION" || return 0 _direction_to_number $DIRECTION _is 0 0 ${1:-ready_skill} ${2:-lockpicking} _is 0 0 fire ${DIRN:-$DIRECTION} _is 0 0 fire_stop } _open_door_with_standard_key(){ #DEBUG=1 _debug "_open_door_with_standard_key:$*" local lDIRECTION=${1:-$DIRECTION} #DEBUG=1 _debug "DIRECTION=$DIRECTION" test "$lDIRECTION" || return 0 _number_to_direction "$lDIRECTION" #DEBUG=1 _debug "DIRECTION=$DIRECTION" _is 0 0 $DIRECTION } _move_back(){ ##+++2018-01-08 _debug "_move_back:$*" test "$DIRB" || return 0 for i in `seq 1 1 ${1:-1}` do _is 1 1 $DIRB _sleep done } _move_forth(){ ##+++2018-01-08 _debug "_move_forth:$*" test "$DIRF" || return 0 for i in `seq 1 1 ${1:-1}` do _is 1 1 $DIRF _sleep done } _move_back_and_forth(){ ##+++2018-01-08 _debug "_move_back_and_forth:$*" STEPS=${1:-1} #test "$DIRB" -a "$DIRF" || return 0 test "$DIRB" || return 0 for i in `seq 1 1 $STEPS` do _is 1 1 $DIRB _sleep done if test "$2"; then shift while test "$1"; do #oIFS=$IFS #IFS=';' COMMANDS=`echo "$1" | tr ';' '\n'` test "$COMMANDS" || break 1 echo "$COMMANDS" | while read line do $line sleep 0.1 done #IFS=$oIFS shift sleep 0.1 done fi test "$DIRF" || return 0 for i in `seq 1 1 $STEPS` do _is 1 1 $DIRF _sleep done } _check_for_space(){ # *** Check for [4] empty space to DIRB *** # _debug "_check_for_space:$*" local REPLY_MAP OLD_REPLY NUMBERT test "$1" && NUMBERT="$1" NUMBERT=${NUMBERT:-4} test "${NUMBERT//[[:digit:]]/}" && _exit 2 "_check_for_space: Need a digit. Invalid parameter passed:$*" _draw 5 "Checking for space to move..." # if ( strncmp(c,"pos",3)==0 ) { // v.1.10.0 # char buf[1024]; # # sprintf(buf,"request map pos %d %d\n",pl_pos.x,pl_pos.y); # write(scripts[i].out_fd,buf,strlen(buf)); # } # if ( strncmp(c,"pos",3)==0 ) { // v.1.12.0 # char buf[1024]; # # snprintf(buf, sizeof(buf), "request map pos %d %d\n",pl_pos.x,pl_pos.y); # write(scripts[i].out_fd,buf,strlen(buf)); # } # if (strncmp(c, "pos", 3) == 0) { // v.1.70.0 # char buf[1024]; # # snprintf(buf, sizeof(buf), "request map pos %d %d\n", pl_pos.x+use_config[CONFIG_MAPWIDTH]/2, pl_pos.y+use_config[CONFIG_MAPHEIGHT]/2); # write(scripts[i].out_fd, buf, strlen(buf)); # if ( strncmp(c,"near",4)==0 ) { // v.1.10.0 # for(y=0;y<3;++y) # for(x=0;x<3;++x) # send_map(i, # x+pl_pos.x+use_config[CONFIG_MAPWIDTH]/2-1, # y+pl_pos.y+use_config[CONFIG_MAPHEIGHT]/2-1 # ); # } # if ( strncmp(c,"near",4)==0 ) { // v.1.12.0 # for(y=0;y<3;++y) # for(x=0;x<3;++x) # send_map(i, # x+pl_pos.x+use_config[CONFIG_MAPWIDTH]/2-1, # y+pl_pos.y+use_config[CONFIG_MAPHEIGHT]/2-1 # ); # } # if (strncmp(c, "near", 4) == 0) { // v.1.70.0 # for (y = 0; y < 3; ++y) # for (x = 0; x < 3; ++x) # send_map(i, # x+pl_pos.x+use_config[CONFIG_MAPWIDTH]/2-1, # y+pl_pos.y+use_config[CONFIG_MAPHEIGHT]/2-1 # ); # } _empty_message_stream echo request map pos # client v.1.70.0 request map pos:request map pos 280 231 ##cauldron adventurers guild stoneville # client v.1.10.0 request map pos 272 225 ##cauldron adventurers guild stoneville while :; do read -t $TMOUT REPLY_MAP #echo "request map pos:$REPLY_MAP" >>"$REPLY_LOG" _log "$REPLY_LOG" "_check_for_space:request map pos:$REPLY_MAP" _debug "$REPLY_MAP" test "$REPLY_MAP" || break test "$REPLY_MAP" = "$OLD_REPLY" && break OLD_REPLY="$REPLY_MAP" sleep 0.1s done PL_POS_X=`echo "$REPLY_MAP" | awk '{print $4}'` #request map pos:request map pos 280 231 PL_POS_Y=`echo "$REPLY_MAP" | awk '{print $5}'` if test "$PL_POS_X" -a "$PL_POS_Y"; then if test ! "${PL_POS_X//[[:digit:]]/}" -a ! "${PL_POS_Y//[[:digit:]]/}"; then for nr in `seq 1 1 $NUMBERT`; do case $DIRB in west) R_X=$((PL_POS_X-nr)) R_Y=$PL_POS_Y ;; northwest) R_X=$((PL_POS_X-nr)) R_Y=$((PL_POS_Y-nr)) ;; east) R_X=$((PL_POS_X+nr)) R_Y=$PL_POS_Y ;; northeast) R_X=$((PL_POS_X+nr)) R_Y=$((PL_POS_Y-nr)) ;; north) R_X=$PL_POS_X R_Y=$((PL_POS_Y-nr)) ;; south) R_X=$PL_POS_X R_Y=$((PL_POS_Y+nr)) ;; southwest) R_X=$((PL_POS_X-nr)) R_Y=$((PL_POS_Y+nr)) ;; southeast) R_X=$((PL_POS_X+nr)) R_Y=$((PL_POS_Y+nr)) ;; esac _say_map_pos_1_10_0(){ cat >&2 <&2 <&2 <&2 <&2 <&2 <