alien=('Z___ ' '( ) ' 'Z`¯´ ') alienH=${#alien[*]} alienW=${#alien[1]} CM1=$DIM$BLK CM2=$BLD$BLK alien_color=("$SKY $CM1 $CM2 $CM1 $SKY" "$CM1 $red $red $red $CM1 $SKY" "$SKY $CM1 $CM1 $CM1 $SKY") function sprite_alien { hight=$alienH width=$alienW color=("${alien_color[@]}") target=("$OX $[$OY+1]" "$[$OX+1] $[$OY+1]") CM1=$SKY$DIM$BLK CM2=$BLD$BLK sprite=("\e[$OY;$[$OX+1]H${CM1}_${CM2}_${CM1}_$SKY " "\e[$[$OY+1];${OX}H${CM1}(${red}${small[$L]}${CM1})${SKY} " "\e[$[$OY+2];$[$OX+1]H"${CM1}'`¯´ '${SKY}) sprite2=('Z___ ' "(${small[$L]}) " 'Z`¯´ ') }
# function cut_in () { for ((h=0; h<$hight; h++)); do spr= for ((c=0; c<$cuter; c++)); do color2=(${color[$h]}) symbol=${sprite2[$h]:$c:1} symbol=${symbol//'\'/'\\'} symbol=${symbol//'Z'/"\e[$[$OY+$h];$[$OX+$c+1]H"} spr+="${color2[$c]}$symbol" done sprite[$h]="$SKY\e[$[$OY+$h];${OX}H$spr" done } # function cut_out () { for ((h=0; h<$hight; h++)); do spr=; stp=1 for ((w=$[1-$OX]; w<$width; w++)); do ((stp++)) color2=(${color[$h]}) symbol="${sprite2[$h]:$w:1}" symbol=${symbol//'\'/'\\'} symbol=${symbol//'Z'/"\e[$[$OY+$h];${stp}H"} spr+="${color2[$w]}$symbol" done sprite[$h]="\e[$[$OY+$h];1H$spr" done }
function mover () { timer=$1 # case $type:"$HX $HY" in # 'alien':${target[0]}| 'alien':${target[1]}| 'alien':${target[2]}) erase_obj $i $hight ((life--)) ((frags++)) ((enumber--)) OBJ+=("$OX $OY 0 boom") return;; # 'gunup':${target[0]}| 'gunup':${target[1]}| 'gunup':${target[2]}) erase_obj $i $hight; [[ ${G} -lt 5 ]] && ((G++)) return;; # 'ammo':${target[0]}| 'ammo':${target[1]}| 'ammo':${target[2]}) erase_obj $i $hight; ((ammo+=100)) return;; # 'life':${target[0]}| 'life':${target[1]}| 'life':${target[2]}) erase_obj $i $hight; ((life++)) return;; # 'bfire':${target[0]}| 'bfire':${target[1]}| 'bfire':${target[2]}) erase_obj $i $hight; ((life--)) return;; # 'boss':${target[0]}| 'boss':${target[1]}| 'boss':${target[2]}) ((life--)); ((bhealth-=10)) return;; esac # ( ) case $type in 'alien' | 'boss') for (( t=0; t<$NP; t++ )); do PI=(${PIU[$t]}) PX=${PI[0]} PY=${PI[1]} # case "$PX $PY" in # hit by bullet # target ${target[0]}|${target[1]}|${target[2]}|${target[3]}|${target[4]}|${target[5]}) case $type in 'alien') case $[RANDOM % $rnd] in 0) OBJ+=("$OX $OY 0 ${bonuses[$[RANDOM % ${#bonuses[@]}]]}");; esac # get bonus ((enumber--)) erase_obj $i $hight remove_piu $t OBJ+=("$OX $OY 0 boom") return;; 'boss' ) remove_piu $t ((bhealth--)) continue;; esac esac done esac # print [[ $cuter -lt $width ]] && cut_in # , [[ $OX -le 1 ]] && cut_out # , [[ $OX -le -$width ]] && { # , remove_obj $i case $type in 'alien') ((enumber--));; esac; return } || printf "${sprite[*]}" # , # case $timer in 0) ((OX--)); ((cuter++)); OBJ[$i]="$OX $OY $cuter $type";; esac }
#-{ Move\check\print all flying to hero objects }----------- NO=${#OBJ[@]}; for (( i=0; i<$NO; i++ )); do OI=(${OBJ[$i]}) OX=${OI[0]} OY=${OI[1]} cuter=${OI[2]} type=${OI[3]} case $type in #----------+---------------+------------+-----+----------+ # OBJ type | sprite maker |sprite mover|timer| comment | #----------+---------------+------------+-----+----------+ 'tree1' ) sprite_tree1 ; mover $Q ;; # 'tree2' ) sprite_tree2 ; mover $W ;; # Trees 'tree3' ) sprite_tree3 ; mover $E ;; # 'cloud1') sprite_cloud1; mover $Q ;; # 'cloud2') sprite_cloud2; mover $W ;; # Clouds 'cloud3') sprite_cloud3; mover $E ;; # 'boss' ) sprite_boss ; mover 1 ;; # Boss 'alien' ) sprite_alien ; mover 0 ;; # Aliens 'bfire' ) sprite_bfire ; mover 0 ;; # Boss' plasma shot 'ammo' ) sprite_ammob ; mover 0 ;; # Ammo bonus 'life' ) sprite_lifep ; mover 0 ;; # Life bonus 'gunup' ) sprite_gunup ; mover 0 ;; # Gun powerup bonus # 'boom' ) sprite_boom;; esac; done
function fps_counter { cur_sec=$(date +'%s') [[ $cur_sec -gt $sec ]] && { FPS=$FPSC [[ $FPS -gt $FPSM ]] && FPSM=$FPS [[ $FPS -lt $FPSL ]] && FPSL=$FPS sec=$cur_sec FPSC=0 } || ((FPSC++)) }
function fps_counter { #Needs bash 4.2 printf -v cur_sec '%(%s)T\n' -1 [[ $cur_sec -gt $sec ]] && { FPS=$FPSC [[ $FPS -gt $FPSM ]] && FPSM=$FPS [[ $FPS -lt $FPSL ]] && FPSL=$FPS sec=$cur_sec FPSC=0 } || ((FPSC++)) }
printf "${sprite[*]}"
screen+=("${sprite[*]}")
printf "${screen[*]}"
"${caddr[0]} $cport $HS $SC $HC $X $Y $PIU"
Host gate # HostName 192.168.1.1 User user Host some_host # HostName 192.168.0.1 User user ProxyCommand ssh gate nc %h %p
alias cp="~/SCR/spiner cp"
while true; do PIU=; client_read until nc $saddr $sport 2> /dev/null <<< \ "${caddr[0]} $cport $HS $SC $HC $X $Y $PIU"; do client_read; done client_read screen="$(nc -l $cport)" case $screen in 'win'| 'lose') client=; game_type='single'; mess $screen;; esac printf "$screen" client_read done
function client_read { read -t$spd -n1 input &> /dev/null; input=${input:0:1}; case $input in 'w'|'W') [[ $Y -gt 1 ]] && ((Y--));; 'a'|'A') [[ $X -gt 1 ]] && ((X--));; 's'|'S') [[ $Y -lt $heroendy ]] && ((Y++));; 'd'|'D') [[ $X -lt $heroendx ]] && ((X++));; 'p'|'P') PIU="piu";; esac }
function client_read { read -t$spd -s -n1 input &> /dev/null } #----{ Initialisation }---- [[ $server ]] && { XY 2 1 $SKY$RED"${game_type^} mode. Waiting for client..." CLD=80 TRE=70 clnt=($(nc -l $sport)) caddr=${clnt[0]} cport=${clnt[1]} HC2=${clnt[2]} HS2=${clnt[3]} SC2=${clnt[4]} } [[ $client ]] && { sender $saddr $sport "${caddr[0]} $cport $HC $HS $SC" ':' XY 2 1 $SKY$RED"Waiting for server..." #===={ Main game loop client mode}==== while true; do client_read sender $saddr $sport $input client_read screen="$(nc -l $cport)" case $screen in 'win'| 'lose') client=; cors='single'; mess $screen;; esac printf "$screen" done
case $owner in 1) ((frags++));; 2) ((frags2++));; esac
function sprite_hero2 { case $(nc -l $sport) in 'w'|'W') [[ $Y2 -gt 1 ]] && ((Y2--));; 'a'|'A') [[ $X2 -gt 1 ]] && ((X2--));; 's'|'S') [[ $Y2 -lt $heroendy ]] && ((Y2++));; 'd'|'D') [[ $X2 -lt $heroendx ]] && ((X2++));; 'p'|'P') [[ $ammo2 -ge $G2 && $CD2 -eq 0 ]] && { CD2=7; case $G2 in 1) PIU+=("$HX2 $HY2 2");; 2) PIU+=("$HX2 $[$HY2+1] 2" "$HX2 $[$HY2-1] 2");; 3) PIU+=("$HX2 $[$HY2+1] 2" "$HX2 $[$HY2-1] 2" "$[$HX2+1] $HY2 2");; 4) PIU+=("$[$HX2+1] $[$HY2+1] 2" "$[$HX2+1] $[$HY2-1] 2" "$HX2 $[$HY2+2] 2" "$HX2 $[$HY2-2] 2");; 5) PIU+=("$[$HX2+1] $[$HY2+1] 2" "$[$HX2+1] $[$HY2-1] 2" "$HX2 $[$HY2+2] 2" "$HX2 $[$HY2-2] 2" "$[$HX2+2] $HY2 2");; esac; ((ammo2-=$G2)); };; esac CM4=$DIM$HC2; CM5=$SKY$HC2 CM6=$BLD$HC2; CM7=$SKY$SC2$HS2$HC2$BLD CM8=$DIM$UND; CM9=$SKY$HC2$BLD sprite=( "\e[$Y2;${X2}H"${SKY}' ' "\e[$[$Y2+1];${X2}H"${CM5}' __ '${SKY} "\e[$[$Y2+2];${X2}H"${CM4}" |${CM7}〵${CM5}____ "${SKY} "\e[$[$Y2+3];${X2}H"${CM4}" \_| ${CM6}/${CM8} °${CM9})${blk}${gun[$G2]}${SKY} " "\e[$[$Y2+4];${X2}H"${CM4}" |${BLD}/ "${SKY} "\e[$[$Y2+5];${X2}H"${SKY}' ') screen+=("${sprite[*]}") }
[[ $life -gt 0 ]] \ && printf "${screen[*]}" \ || { case $make_once in '') XY 1 1 "$DEF"; clear sprite_lose; printf "${sprite[*]}" OBJ+=(" $X $Y 0 boom" "$[$X+1] $[$Y+1] 0 boom" "$[$X+2] $[$Y+2] 0 boom") make_once=done;; esac } case $server in true) [[ $life2 -le 0 ]] && { sender $caddr $cport 'lose' server_read server=; Y2=; cors='single' OBJ+=(" $X2 $Y2 0 boom" "$[$X2+1] $[$Y2+1] 0 boom" "$[$X2+2] $[$Y2+2] 0 boom") } [[ $life2 -gt 0 && $bhealth -le 0 ]] && { sender $caddr $cport 'win' server_read cors='single' server= };; *) [[ $bhealth -le 0 ]] && mess win [[ $life -le 0 ]] && mess lose;; esac [[ $server ]] && sender $caddr $cport "${screen[*]}" server_read
[[ $life -gt 0 ]] && ...
Source: https://habr.com/ru/post/339268/
All Articles