Escolar Documentos
Profissional Documentos
Cultura Documentos
/bin/bash -i
################################################################################
##
#
#
#
Copyright (C) 2012 Doriedson Alves Galdino de Oliveira
#
#
Thiago Andre Silva
#
#
Vitor Augusto Andrioli
#
#
#
#
This program is free software: you can redistribute it and/or modify
#
#
it under the terms of the GNU General Public License as published by
#
#
the Free Software Foundation, either version 3 of the License, or
#
#
(at your option) any later version.
#
#
#
#
This program is distributed in the hope that it will be useful,
#
#
but WITHOUT ANY WARRANTY; without even the implied warranty of
#
#
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
#
#
GNU General Public License for more details.
#
#
#
#
You should have received a copy of the GNU General Public License
#
#
along with this program. If not, see <http://www.gnu.org/licenses/>.
#
#
#
################################################################################
##
#
#
#
#
#
Autores:
Doriedson RA 1430431213050
Thiago Andre RA 1430431213077
Vitor Augusto RA 1430431213047
Data: 24/04/2012
# DESCRICAO:
# Jogo do Mario Bros estilo nintendo 8 bits.
# CHANGELOG:
# 2012/05/09 (Doriedson, Vitor, Thiago)
# Eliminada a funcao LoadGame que carregava o mapa da primeira fase em caracters
e criada a LoadFase1 para gerar a primeira fase
# a partir de mapa de caracters menores.
# Criada funcao MontaCanvas para pegar o tamanho da tela em um mapa de caracters
e jogar no buffer
#
#
a
#
#
#
2012/05/15
Adicionada
de tela
Adicionada
Adicionada
Adicionada
_height=$_tmph
_width=$_tmpw
ResizeScreen
fi
}
# Funcao para redimensionamento do terminal
function ResizeScreen {
# Inicializa variavel para definir o meio da tela em largura para econom
izar recalculo no jogo
_widthMid=$((_width / 2))
# Cria variavel para determinar onde comeara o desenho da tela subtraindo
a altura de desenho do jogo (36 linhas)
_initY=$((_height - _heightScreen))
#Cria variaveis para verificar se o terminal eh maior que 80 colunas e c
entraliza a tela do menu no meio com espaos em volta
_spaceIni=""
_spaceFim=""
if [ $_width -gt 80 ]; then
fi
_i=$(( (( _width - 80 )) / 2 ))
_f=$(( (( _width - 80 )) - _i ))
_spaceIni=`printf "%${_i}s"`
_spaceFim=`printf "%${_f}s"`
((_s= _width*_height))
_clearScreen=`printf "%${_s}s"`
# Cria uma variavel com espaos da largura da tela
_spaceScreen=`printf "%${_width}s"`
# limpa o topo da tela onde no ser usado na screen do jogo
_screen=""
for (( _k=0; _k<(_height-_heightScreen); _k++ )); do
_screen+="$_spaceScreen"
done
#
#
#
tput reset
tput civis
# Configura a cor do fundo da tela
#tput setab 7
# Configura a cor da fonte
#tput setaf 0
ClearScreen
_scoreX=$((((_width-80))/2)) # Guarda a Posio do Score na tela de acordo o
tamanho do terminal aberto
}
# Funo para limpar a tela
function ClearScreen {
tput cup 0 0
if [ $_color = "on" ]; then
echo -ne "${_cor[1]}$_clearScreen"
else
echo -ne "\E[00;30;47m$_clearScreen"
fi
tput cup $_initY 0 # Seta o ponteiro para a linha em que o jogo ser desen
hado (renderizado)
}
# Funo para montar a primeira fase do jogo
function LoadFase1 {
_sizeFase=3000 # Tamanho da fase (largura)
_btela=`printf "%${_sizeFase}s"` # Variavel com caracter espao do tamanho
da fase para montar o buffer da tela
_tamQuad=100
_flagDraw[4]="
"
_flagX=2883
_flagY=6
# Vetor de localizao dos inimigos definindo sua area de movimento
_enemyX=(0 200 350 500 650 900 1490 1750 2030 2450 2780)
_enemyPathIni=(0 150 320 460 610 880 1480 1710 2000 2330 2700)
_enemyPathFim=(0 250 420 560 710 980 1580 1810 2100 2480 2800)
# Posicao das moedas no
_coin=(0 80 190 210 330
0 1150 1240 1260 1280 1370 1390
0 1850 1870 1890 2260 2290 2320
cenario
350 370 390 410 430 660 800 830 860 890 1010 108
1410 1480 1500 1520 1540 1590 1650 1720 1810 183
2350 2410 2540 2570 2600 2630)
_buraco[0]=${#_buraco[*]}
_buracoWidth=25
#buffer da tela
for (( _k=0; _k<=36; _k++ )); do
_fasel[$_k]="$_btela"
done
#monta o piso da fase no buffer
_tmp=$((_sizeFase / 10))
_fasel[37]=""
_fasel[38]=""
_fasel[39]=""
#Coloca o piso na fase
for (( _k=0; _k<_tmp; _k++ )); do
_fasel[37]+="${_piso1}"
_fasel[38]+="${_piso2}"
_fasel[39]+="${_piso1}"
done
#desenha as nuvens no cenario
for (( _k=1; _k<_nuvem[0]; _k++ )); do
_tmpPos=${_nuvem[$_k]}
_ind=${_nuvemY[$_k]}
for (( _l=_ind; _l<(_ind + _nuvemDraw[0]); _l++ )); do
_tmp0=$(( _l - _ind + 1))
_tmp1=${#_nuvemDraw[$_tmp0]}
_f=$(( _tmpPos + _tmp1 ))
0]}${_fasel[$_l]:$_f}"
done
done
#
#
#
#
#
#
#
_f}"
#
_f}"
#
_f}"
#
_fasel[$_l]="${_fasel[$_l]:0:$_tmpPos}${_nuvemDraw[$_tmp
#
_coinX=${_coin[$_k]}
#
_tmp2=$(( _coinX + _coinWidth ))
#
for (( _l=1; _l<=5; _l++ )); do
#
_tmp=$((_l+8))
#
_fasel[$_tmp]="${_fasel[$_tmp]:0:$_coinX}${_coinDraw[$_l
]}${_fasel[$_tmp]:$_tmp2}"
#
done
#
done
#desenha o castelo na fase
for (( _k=1; _k<=_castle[0]; _k++ )); do
((_tmp = _k + 5))
_tmpL=${#_castle[$_k]}
_tmpI=$((_sizeFase-120))
_tmpF=$((_tmpI + _tmpL))
$_tmp]:$_tmpF}"
done
_fasel[$_tmp]="${_fasel[$_tmp]:0:$_tmpI}${_castle[$_k]}${_fasel[
}
# funcao para desenhar os buracos na fase
function DrawBuraco {
_ubound=${_buraco[0]}
for (( _k=1; _k < _ubound; _k++ )); do #laco para verificar cada inimigo
#verifica se o buraco esta visivel na camera
if [ $((_buraco[_k] + _buracoWidth)) -ge $_cameraX ] && [ ${_bur
aco[$_k]} -le $((_cameraX + _width)) ]; then
_buracoX=$(( _buraco[_k] + _edgeWidth - _cameraX ))
_buracoL=$(( _buracoX + _buracoWidth ))
_tmp=${_canvasC[0]}
for (( _l=37; _l<40; _l++ )); do
_canvas[$_l]="${_canvas[$_l]:0:$((_buracoX-2))}$
{_buracoDraw}${_canvas[$_l]:$((_buracoL+2))}"
if [ $_color = "on" ]; then
_tmp=${_canvasC[0]}
((_tmp++))
_canvasC[$_tmp]=${_cor[2]}
if [ $((_buracoX - _edgeWidth)) -lt 0 ];
then
else
) + _buracoX - _edgeWidth ))
_canvasP[$_tmp]=$((_width * _l))
_canvasP[$_tmp]=$(( (_width * _l
fi
((_tmp++))
_canvasC[$_tmp]=${_cor[3]}
if [ $((_buracoL - _edgeWidth)) -gt $_wi
dth ]; then
_canvasP[$_tmp]=$(( _width * (_l
+1) ))
else
) + _buracoL - _edgeWidth ))
_canvasP[$_tmp]=$(( (_width * _l
fi
_canvasC[0]=$_tmp
fi
done
done
fi
}
# Funcao para montar o buffer de fundo da tela a partir da cordenada do jogador
function MontaCanvas {
#Limpa o buffer para posicionar a camera na tela da primeira fase
#_canvas=""
#verifica se a posicao do jogador menor do que o meio do terminal
_canvas[$_k]="${_edgeScreen}${_fasel[$_k]:$_cameraX:$_width}${_e
done
}
#Sair do jogo para o terminal
function Sair {
#Restaura configuraes do terminal
stty $_terminal
#Retorna o ponteiro que pisca na tela
tput cnorm
#Volta as cores ao normal
tput sgr0
#Limpa a tela
tput reset
#Restaura o terminal ao seu padrao
#stty sane
# Verifica se ocorreu algum erro e imprime na tela do terminal
if [ "$_erro" != "" ]; then
echo -e $_erro
fi
# termina o programa
exit
#inicializa as variaveis para comecar o jogo
function InitGame {
}
# funcao para somar score e salvar top score
function Score {
((_score+=$1))
if [ $_score -ge $_topScore ]; then
_topScore=$_score
SaveSettings
fi
}
#funo para salvar configuraes quando ocorrer mudanas
function SaveSettings {
echo "_topScore=$_topScore">.settings
echo "_sound=$_sound">>.settings
echo "_color=$_color">>.settings
}
#Funo para exibir as vidas do jogador
function Splash {
#Seta o nome da tela atual(estado do jogo)
_screenGame="SPLASH"
LoadColors
#Registra Coordenadas iniciais do jogador
_jogX=0
_jogY=0
_velocY=0
_velocX=0
_jogDead=false #Controla se o jogador morreu
andar
done
_canvas[12]="${_edgeScreen}${_spaceIni}
${_spaceFim}${_edgeScreen}"
_canvas[13]="${_edgeScreen}${_spaceIni}
M
${_spaceFim}${_edgeScreen}"
_canvas[14]="${_edgeScreen}${_spaceIni}
${_spaceFim}${_edgeScreen}"
_canvas[15]="${_edgeScreen}${_spaceIni}
${_spaceFim}${_edgeScreen}"
_canvas[16]="${_edgeScreen}${_spaceIni}
0${_jogLife}
${_spaceFim}${_edgeScreen}"
_canvas[17]="${_edgeScreen}${_spaceIni}
${_spaceFim}${_edgeScreen}"
_canvas[18]="${_edgeScreen}${_spaceIni}
${_spaceFim}${_edgeScreen}"
_canvas[19]="${_edgeScreen}${_spaceIni}
${_spaceFim}${_edgeScreen}"
_canvas[20]="${_edgeScreen}${_spaceIni}
${_spaceFim}${_edgeScreen}"
for (( _y=21; _y<_heightScreen; _y++ )); do
_canvas[$_y]="${_edgeScreen}${_spaceScreen}${_edgeScreen}"
done
Render #chama funo Render
LoadFase1 #Carrega a tela da primeira fase para o buffer
sleep 1 #adormece o script por 1 segundos
#Toca som de fundo tema
Play "background"
#Seta o nome da tela atual(posicao no jogo)
_screenGame="GAME"
_canvas[13]="${_edgeScreen}$_spaceIni
_canvas[14]="${_edgeScreen}$_spaceIni
geScreen}"
_canvas[15]="${_edgeScreen}$_spaceIni
_canvas[16]="${_edgeScreen}$_spaceIni
{_edgeScreen}"
_canvas[17]="${_edgeScreen}$_spaceIni
LoadMenu
# funo para desenhar a tela de GameWin
function GameWin {
# seta que o jogo na tela de game over
_screenGame="GAMEWIN"
LoadColors
#Preenche o buffer com a tela do Splash
for (( _y=0; _y<10; _y++ )); do
_canvas[$_y]="${_edgeScreen}${_spaceScreen}${_edgeScreen}"
done
#desenho do fim do jogo WIN
_canvas[10]="${_edgeScreen}${_spaceIni}
_canvas[11]="${_edgeScreen}${_spaceIni}
en}"
_canvas[12]="${_edgeScreen}${_spaceIni}
_canvas[13]="${_edgeScreen}${_spaceIni}
{_edgeScreen}"
_canvas[14]="${_edgeScreen}${_spaceIni}
_canvas[15]="${_edgeScreen}${_spaceScreen}${_edgeScreen}"
_canvas[16]="${_edgeScreen}${_spaceScreen}${_edgeScreen}"
_canvas[17]="${_edgeScreen}${_spaceScreen}${_edgeScreen}"
_canvas[18]="${_edgeScreen}${_spaceIni} TRABALHO EM SHELL SCRIPT
${_spaceFim}${_edgeScreen}"
_canvas[19]="${_edgeScreen}${_spaceScreen}${_edgeScreen}"
_canvas[20]="${_edgeScreen}${_spaceIni} FATEC CARAPICUIBA
${_spaceFim}${_edgeScreen}"
_canvas[21]="${_edgeScreen}${_spaceScreen}${_edgeScreen}"
_canvas[22]="${_edgeScreen}${_spaceIni} DISCIPLINA LSO (LABORATORIO
OPERACIONAIS)
${_spaceFim}${_edgeScreen}"
_canvas[23]="${_edgeScreen}${_spaceScreen}${_edgeScreen}"
_canvas[24]="${_edgeScreen}${_spaceIni} PROF. RUBENS
${_spaceFim}${_edgeScreen}"
DE SISTEMAS
_canvas[25]="${_edgeScreen}${_spaceScreen}${_edgeScreen}"
_canvas[26]="${_edgeScreen}${_spaceIni} ALUNO DORIEDSON ALVES GALDINO DE OLIVEIR
A
${_spaceFim}${_edgeScreen}"
_canvas[27]="${_edgeScreen}${_spaceScreen}${_edgeScreen}"
_canvas[28]="${_edgeScreen}${_spaceIni} ALUNO VITOR AUGUSTO ANDRIOLI
${_spaceFim}${_edgeScreen}"
_canvas[29]="${_edgeScreen}${_spaceScreen}${_edgeScreen}"
_canvas[30]="${_edgeScreen}${_spaceIni} ALUNO THIAGO ANDRE SILVA
${_spaceFim}${_edgeScreen}"
_canvas[31]="${_edgeScreen}${_spaceScreen}${_edgeScreen}"
for (( _y=32; _y<_heightScreen; _y++ )); do
_canvas[$_y]="${_edgeScreen}${_spaceScreen}${_edgeScreen}"
done
Render #chama funo Render
sleep 4 #adormece o script por segundos
read -n1
}
LoadMenu
#Carrega a tela do menu para o buffer
function LoadMenu {
if [ $_musicId ]; then
Stop $_musicId #Mata o processo da musica de fundo
fi
#Seta o nome da tela atual(posicao no jogo)
_screenGame="MENU"
}
#monta tela do menu no canvas
function MontaMenu {
#Limpa o buffer para preencher com a tela do menu
#_canvas=""
#Preenche o buffer com a tela menu
for (( _y=0; _y<26; _y++ )); do
_canvas[$_y]="${_edgeScreen}${_spaceIni}${_menu[$_y]}${_spaceFim
}${_edgeScreen}"
done
_tmpi=$((36+12-${#_topScore}))
_canvas[26]="${_edgeScreen}${_spaceIni}${_menu[26]:0:$_tmpi}${_topScore}
${_menu[26]:60}${_spaceFim}${_edgeScreen}"
for (( _y=27; _y<_heightScreen; _y++ )); do
_canvas[$_y]="${_edgeScreen}${_spaceIni}${_menu[$_y]}${_spaceFim
}${_edgeScreen}"
done
}
function LoadColors {
if [ $_color = "off" ]; then
return
fi
# vetor para guardar as cores do cenario
_canvasC=(0) #guarda a cor
_canvasP=(0) #guarda a posicao da cor
_tmp=0
((_tmp++))
_canvasC[$_tmp]=${_cor[1]}
_canvasP[$_tmp]=0
((_tmp++))
_canvasC[$_tmp]=${_cor[2]}
_canvasP[$_tmp]=$((_width * 2))
case $_screenGame in
"MENU")
_tmp2=${#_spaceIni}
for ((_k=5; _k<18; _k++)); do
((_tmp++))
_canvasC[$_tmp]=${_cor[0]}
_canvasP[$_tmp]=$(((_width * _k) + _tmp2 + 15))
((_tmp++))
_canvasC[$_tmp]=${_cor[2]}
_canvasP[$_tmp]=$(((_width * _k) + _tmp2 + 65))
done
((_tmp++))
_canvasC[$_tmp]=${_cor[3]}
_canvasP[$_tmp]=$((_width * 37))
;;
"GAME"|"DEAD"|"WIN"|"WINPOINT")
((_tmp++))
_canvasC[$_tmp]=${_cor[3]}
_canvasP[$_tmp]=$((_width * 37))
;;
esac
_canvasC[0]=$_tmp
}
#Desenha o Jogador no buffer da tela
function DrawJogador {
#Calcula a posio inicial do desenho do jogador no buffer da tela
done
#funo para desenhar o score no topo do buffer da tela
function DrawScore {
# Gera novo buffer para tela
#_screen="$_canvas"
#posicao das linhas temporariamente
_tmp=0
#posiciona e imprime o title score
#_screen="${_screen:0:$_tmp}${_spaceIni}${_scoreTitle0}${_spaceFim}${_sc
reen:$((_tmp + _width))}"
_canvas[0]="${_edgeScreen}${_spaceIni}${_scoreTitle0}${_spaceFim}${_edge
Screen}"
_tmpScore=${#_score}
_tmpScorei=$((11 - _tmpScore))
_tmpCoin=${#_coins}
_tmpCoini=$((21 - _tmpCoin))
_tmpTime=${#_time}
_tmpTimei=$(( 37 - _tmpTime ))
((_tmp+=_width))
_canvas[1]="${_edgeScreen}${_spaceIni}${_scoreTitle1:0:$_tmpScorei}${_sc
ore}${_scoreTitle1:11:${_tmpCoini}}${_coins}${_scoreTitle1:32:$_tmpTimei}${_time
}${_scoreTitle1:69}${_spaceFim}${_edgeScreen}"
# gera o texto que exibe o fps e posiciona na tela
_texto="[s]sound:$_sound [c]color:$_color LPS:$_lps"
#
_i=$((39 * _width))
_l=${#_texto}
QuickSort 1 ${_canvasC[0]}
#
#
fi
((_ini++))
((_fim--))
done
((_coinX-=(_cameraX-_edgeWidth)))
((_coinSprite[_tmpCoin]++))
if [ ${_coinSprite[$_tmpCoin]} -eq 6 ]; then
_coinSprite[$_tmpCoin]=0
fi
((_tmpSp=_coinSprite[_tmpCoin]/2))
#Lao para desenhar a moeda
for (( _l=1; _l<=_coinHeight; _l++ )); do
jogador
ariavel
la
$_width ]; then
th * (_tmpCoinY+1) ))
dth * _tmpCoinY) + _tmpf - _edgeWidth ))
if [ $((_coinX - _edgeWidth)) -l
_canvasP[$_tmp]=$((_widt
else
_canvasP[$_tmp]=$(( (_wi
fi
((_tmp++))
_canvasC[$_tmp]=${_cor[2]}
if [ $((_tmpf - _edgeWidth)) -gt
_canvasP[$_tmp]=$(( _wid
else
_canvasP[$_tmp]=$(( (_wi
fi
_canvasC[0]=$_tmp
fi
done
fi
fi
done
}
# funcao para desenhar a bandeira no mastro
function DrawFlag {
if [ $_flagX -lt $(( _cameraX + _width )) ]; then
for (( _k=1; _k<=_flagDraw[0]; _k++ )); do
#Calcula o tamanho restante da buffer da tela para recor
te
_tmpL=${#_flagDraw[$_k]}
_tmpY=$(( _flagY + _k -1 ))
_tmpX=$(( _flagX - _cameraX + _edgeWidth ))
_tmpF=$(( _tmpX + _tmpL ))
#Desenha a linha do inimigo no buffer da tela
_canvas[$_tmpY]="${_canvas[$_tmpY]:0:$_tmpX}${_flagDraw[
$_k]}${_canvas[$_tmpY]:$_tmpF}"
done
fi
}
#funo para desenhar o inimigo se existir
function DrawEnemy {
_ubound=${_enemyX[0]}
for (( _k=1; _k < _ubound; _k++ )); do #laco para verificar cada inimigo
#verifica se o path do inimigo esta visivel na camera
if [ $((_enemyX[_k] + _enemyWidth)) -ge $_cameraX ] && [ ${_enem
yX[$_k]} -le $((_cameraX + _width)) ] && [ ${_enemySprite[$_k]} -le 6 ]; then
inimigo
a tela
done
fi
done
((_tmpEnemyY++))
}
#Funo para ouvir o teclado
function ListenKey {
# ouve as teclas pressionadas pelo teclado
_key=$(dd bs=3 count=1 2>/dev/null)
#read -n1 -t 0.001 _key
# eliminar os caracters especias de quando as setas direcionais forem pr
essionadas
#
while [ "$_key" = "^" ] || [ "$_key" = "[" ]; do
#
#
done
esac
;;
$KEY_UP) #Seta para cima
case $_screenGame in
"GAME")
#_clearBuffer=true
#Verifica se velocidade de y = 0 e se o personagem esta
no piso entao libera para pulo
if [ $_velocY -eq 0 ] && [ $((_jogY+_jogHeight)) -eq $((
_piso)) ]; then
Play "jump" #Toca audio do pulo
#_jogSprite=2 #Sprite do jogador pulando
((_velocY=-6)) #Define velocidade do pulo
fi
;;
esac
;;
$KEY_RIGHT) # Pressionado a seta para direita
case $_screenGame in
"GAME")
esac
;;
#_clearBuffer=true
#_jogSide=d #lado do jogador a desenhar
((_velocX=4)) #Velocidade do jogador em X
;;
esac
;;
"s")
if [ $_sound = "off" ] ; then
_sound="on"
else
do
#_clearBuffer=true
#_jogSide=e #lado do jogador a desenhar
((_velocX=-4)) #velocidade do jogador em X
;;
"c")
if [ $_color = "on" ]; then
_color="off"
else
_color="on"
fi
SaveSettings
ClearScreen
;;
esac
#Se for capturado alguma tecla antes entao limpa o buffer para caso de s
egurar a tecla pressionada
#if [ $_clearBuffer = true ] ; then
#
read -n100 -t0.001 _discard
#
_clearBuffer=false
#fi
}
#Funo para verificar quantos loops por segundo o jogo est conseguindo rodar
function FPS {
# incrementa 1 na varivel quadros
((_quadros++))
# Guarda o nanosegundo atual do relgio do sistema
_tempo2N=$((10#`date +%N`))
# verifica se passou 1 segundo desde o incio da contagem e coloca os quad
ros contados na
# varivel _fps para exibio posteriormente
#
if [ $((SECONDS - _tempoS)) -gt 0 ] ; then
#Guarda o segundo atual desde quando o terminal foi aberto
_tempoS=$SECONDS
#
#
fi
#Calcula a diferenca entre agora e a ultima leitura em nanosegundo
_tmp=$((_tempo2N-_tempoN))
passa
fi
fi
#a cada 1 decimo de segundo libera para clculo de movimento do personagem
e cenario
if [ $_tmp -ge 100000000 ]; then
((_quadroRender++))
_tempoN=$_tempo2N
_next=true
TerminalSize
case $_screenGame in
"GAME") #opo para reduzir um segundo no relgio de tempo do jogo
_time=$(( _timeGame - (( SECONDS - _timeIni )) ))
if [ $_time -eq 30 ]; then
if [ $_quadroRender -eq 5 ]; then
Play "timewarning"
fi
elif [ $_time -eq 27 ]; then
if [ $_quadroRender -eq 5 ]; then
Play "background"
fi
elif [ $_time -eq 0 ]; then # se tempo acabou o personag
em morre
Dead "time"
_velocY=-5
_jogSprite=0
_jogSide="F"
esac
}
fi
;;
fi
fi
;;
"WIN")
o do cenario
else
fi
;;
o piso
$((_piso)) ]; then
#nao houve colisao
de y
return
_jogX=$((_sizeFase - _jogWidth))
#se personagem toca o piso a velocidade do perso
gem em x sofre alterao
if [ $_velocY -eq 0 ]; then
((_velocX--))
fi
fi
#Animacao do Personagem
((_jogAni++))
else
fi
o do cenario
fi
ColisaoBuraco # Verifica se houve colisao com buraco
fi
;;
esac
if [ $_screenGame = "GAME" ]; then
#verifica qual sentido o personagem est andando para dar priorida
de a colisao do bloco da esquerda ou direita quando colidir com dois
if [ $_jogSide = "D" ]; then
_tmp2=$(( _jogX / _blocoWidth ))
_tmp1=$(( ((_jogX+15)) / _blocoWidth ))
else
_tmp1=$(( _jogX / _blocoWidth ))
_tmp2=$(( ((_jogX+15)) / _blocoWidth ))
fi
adrante
undo quadrante
ColisaoMastro
fi
}
function ColisaoMastro {
if [ $((_jogX + _jogWidth)) -gt 2880 ]; then
_screenGame="WIN"
Play "flagpole"
_flagY=$_jogY
_velocY=0
_tmp=$(( ((21 - $_jogY) * 330) + 50 ))
_tmpL=${#_tmp}
((_tmpL+=2))
_flagDraw[4]="${_flagDraw[4]:0:2}$_tmp${_flagDraw[4]:$_tmpL}"
fi
Score $_tmp
_jogX=$(( 2883 - _jogWidth))
}
#funcao colisao inimigo
function ColisaoEnemy {
#_firstQ=$(( _cameraX / _tamQuad )) #pega o primeiro quadrante
_ubound=${_enemyX[0]}
for (( _k=1; _k<_ubound; _k++ )); do #laco para verificar cada inimigo
#verifica se o path do inimigo esta visivel na camera
if [ ${_enemyPathIni[$_k]} -lt $((_cameraX + _width)) ] && [ ${_
enemyPathFim[$_k]} -gt $_cameraX ] && [ ${_enemySprite[$_k]} -lt 3 ]; then
if [ $_jogX -gt $((_enemyX[_k] + _enemyWidth -1)) ]; the
n #personagem esta do lado direito do inimigo
_tmp=0
elif [ $_jogY -gt $((_enemyY[_k] + _enemyHeight[_k] -1))
]; then #personagem esta do lado de baixo do inimigo
_tmp=0
elif [ $((_jogX + _jogWidth -1)) -lt ${_enemyX[$_k]} ];
then #personagem esta do lado esquerdo do inimigo
_tmp=0
elif [ $((_jogY + _jogHeight -1)) -lt ${_enemyY[$_k]} ];
then #personagem esta do lado de cima do inimigo
_tmp=0
agem morre
Y[$_k]} ]; then
else
fi
Play "enemy"
Score 100
_jogY=$((_enemyY[_k] - _jogHeight))
_velocY=-3
_enemySprite[$_k]=2
_enemyDead[$_k]=1
return 1 #retorna que houve colisao
Dead "enemy"
_velocY=-5
_jogSprite=0
if [ $_jogSide = "D" ]; then
((_jogX=_enemyX[_k] - _jogWidth))
else
((_jogX=_enemyX[_k] + _enemyWidth))
fi
_jogSide="F"
return 1 #retorna que houve colisao
fi
done
}
#funcao para colisao com moedas
function ColisaoCoin {
_tmpQ=$1 #recebe o quadrante para teste
existir
fi
#
el[$_k]:$_tmp2}"
#
_fasel[$_k]="${_fasel[$_k]:0:$_coinX}${_coinClear}${_fas
done
fi
fi
l&
"worldcleared")
canberra-gtk-play --file="worldcleared.ogg" 1 2>/dev/nul
;;
"flagpole")
if [ $_musicId ]; then
do
fi
canberra-gtk-play --file="flagpole.ogg" 1 2>/dev/null&
;;
"timewarning")
if [ $_musicId ]; then
Stop $_musicId #Mata o processo da musica de fun
fi
canberra-gtk-play --file="timewarning.ogg" 1 2>/dev/null
&
;;
do
"gameover")
if [ $_musicId ]; then
Stop $_musicId #Mata o processo da musica de fun
fi
canberra-gtk-play --file="gameover.ogg" 1 2>/dev/null&
;;
"die")
do
do
if [ $_musicId ]; then
Stop $_musicId #Mata o processo da musica de fun
fi
canberra-gtk-play --file="die.ogg" 1 2>/dev/null&
;;
"background")
if [ $_musicId ]; then
Stop $_musicId #Mata o processo da musica de fun
fi
dev/null & _musicId="$!"
preciso
esac
}
function MoveEnemy {
case $_screenGame in
"GAME") # se jogo em fase processa movimento do inimigo
#_firstQ=$(( _cameraX / _tamQuad )) #pega o primeiro quadrante
_ubound=${_enemyX[0]}
nimigo
2)
3)
4)
5)
esac
;;
ChangeSpriteEnemy $_k
((_enemySprite[_k]+=_aniEnemy))
;;
if [ ${_enemyDead[$_k]} -eq 1 ]; then
_enemySprite[$_k]=3
else
ChangeSpriteEnemy $_k
_enemySprite[$_k]=1
_aniEnemy=-1
fi
;;
_enemySprite[$_k]=4;;
_enemySprite[$_k]=5;;
_enemySprite[$_k]=6;;
fi
_enemyHeight[$_k]="_gompa${_enemySprite[$_k]}[0]"
_enemyHeight[$_k]=${!_enemyHeight[$_k]}
_enemyY[$_k]=$((_piso - _enemyHeight[$_k]))
done
esac
function ChangeSpriteEnemy {
_k=$1
#
fi
_aniEnemy[$_k]=0
}
# [ INICIO SCRIPT ] --------------------------------------------------------------------------------------------------------# Carrega as configuraes salva
. .settings
# Mapa do score no topo da tela
_scoreTitle0="
MARIO
IME
"
_scoreTitle1="
000000
000
"
WORLD
@x00
1-1
"
_montDraw[2]="
"
_montDraw[3]="
"
_montDraw[4]="
"
_montDraw[5]="
"
_montDraw[6]="
"
_montDraw[7]="
"
# Mapa de caracters do Menu do jogo
_menu[0]="
"
_menu[1]="
"
_menu[2]="
"
_menu[3]="
"
_menu[4]="
"
_menu[5]="
@
"
_menu[6]="
_menu[7]="
_menu[8]="
_menu[9]="
_menu[10]="
_menu[11]="
_menu[12]="
_menu[13]="
_menu[14]="
_menu[15]="
_menu[16]="
_menu[17]="
"
"
_menu[18]="
"
"
"
"
"
"
"
"
"
"
_menu[19]="
"
_menu[20]="
"
_menu[21]="
"
_menu[22]="
"
_menu[23]="
"
P R E S S
E N T E R
T O
S T A R T
_menu[24]="
"
_menu[25]="
"
_menu[26]="
"
TOP - 0000000000
_menu[27]="
"
_menu[28]="
"
_menu[29]="
"
_menu[30]="
"
_menu[31]="
"
_menu[32]="
"
_menu[33]="
"
_menu[34]="
"
_menu[35]="
"
_menu[36]="
"
_menu[37]=""
_menu[38]=""
_menu[39]=""
_flagDraw[0]=7
_flagDraw[1]=""
_flagDraw[2]=" "
_flagDraw[3]="
"
_flagDraw[4]="
"
_flagDraw[5]="
"
_flagDraw[6]=" "
_flagDraw[7]=""
_castle[0]=31
_castle[1]=" @@@"
_castle[2]=" @@@@@
___
___"
_castle[3]=" @@@
_castle[4]=" | |
_castle[5]=" | |
_castle[6]=" | |
_castle[7]=" | |
_castle[8]=" | |
_castle[9]=" | |
_castle[10]=" | |
_castle[11]=" | |
_castle[12]=" | |
_castle[13]=" | |
_castle[14]=" | |
_castle[15]=" | |
_castle[16]=" | |
_castle[17]=" | |
_castle[18]=" | |
_castle[19]=" | |
_castle[20]=" | |
_castle[21]=" | |
_castle[22]=" | |
_castle[23]=" | |
_castle[24]=" | |
_castle[25]=" | |
_castle[26]=" | |
_castle[27]=" | |
_castle[28]=" | |
_castle[29]=" _| |_
_castle[30]="||
_castle[31]="||
_marioD0[0]=16
_marioD0[1]=""
_marioD0[2]=" "
_marioD0[3]=' M'
_marioD0[4]=' '
_marioD0[5]=' '
_marioD0[6]='
'
_marioD0[7]=' '
_marioD0[8]=' '
_marioD0[9]='
'
_marioD0[10]=' '
_marioD0[11]=''
_marioD0[12]=''
_marioD0[13]=' '
_marioD0[14]=' '
_marioD0[15]=' '
_marioD0[16]=' '
_marioE0[0]=16
_marioE0[1]=""
_marioE0[2]='
'
_marioE0[3]=' M'
_marioE0[4]=''
_marioE0[5]=' '
_marioE0[6]='
'
_marioE0[7]=' '
_marioE0[8]=' '
_marioE0[9]='
'
___
___
___
__
___
|| || || || || || |
|| || || || || || |
|||||||||||
||||||||||
||||||||
||||||||
||||||||
||||||||
||||||||
__
___|___|__________
|| ||||||||||||||
|| ||||||||||||||
||||||||||||
|||||||||||||
|||||||||||
||||||||||
||||||||||
||||||||||
|||||||||
||||||||
|||||||||
||||||||
|||||||||
||||||||
|||||||||
||||||||
|||||||||
||||||||
|||||||||
_marioE0[10]='
_marioE0[11]='
_marioE0[12]='
_marioE0[13]='
_marioE0[14]='
_marioE0[15]='
_marioE0[16]='
'
'
'
'
'
'
'
_marioD1[0]=16
_marioD1[1]='
'
_marioD1[2]='
M'
_marioD1[3]=' '
_marioD1[4]=' '
_marioD1[5]='
'
_marioD1[6]=' '
_marioD1[7]=' '
_marioD1[8]='
'
_marioD1[9]=' '
_marioD1[10]=' '
_marioD1[11]=' '
_marioD1[12]=' '
_marioD1[13]=' '
_marioD1[14]=' '
_marioD1[15]=' '
_marioD1[16]='
'
_marioE1[0]=16
_marioE1[1]='
'
_marioE1[2]=' M'
_marioE1[3]=' '
_marioE1[4]=' '
_marioE1[5]='
'
_marioE1[6]=' '
_marioE1[7]=' '
_marioE1[8]='
'
_marioE1[9]=' '
_marioE1[10]=' '
_marioE1[11]=' '
_marioE1[12]=' '
_marioE1[13]=' '
_marioE1[14]=' '
_marioE1[15]=' '
_marioE1[16]='
'
_marioF0[0]=16
_marioF0[1]='
'
_marioF0[2]=' M'
_marioF0[3]=' '
_marioF0[4]=' '
_marioF0[5]=' '
_marioF0[6]='
'
_marioF0[7]=' '
_marioF0[8]=' '
_marioF0[9]=' '
_marioF0[10]=' '
_marioF0[11]=' '
_marioF0[12]=' '
_marioF0[13]=''
_marioF0[14]=' '
_marioF0[15]='
'
_marioF0[16]='
'
_marioD2[0]=16
_marioD2[1]='
'
_marioD2[2]='
M '
_marioD2[3]=' '
_marioD2[4]=' '
_marioD2[5]='
'
_marioD2[6]=' '
_marioD2[7]=' '
_marioD2[8]='
'
_marioD2[9]=' '
_marioD2[10]=' '
_marioD2[11]=' '
_marioD2[12]=' '
_marioD2[13]=' '
_marioD2[14]=''
_marioD2[15]=' '
_marioD2[16]=' '
_marioE2[0]=16
_marioE2[1]=' '
_marioE2[2]=' M'
_marioE2[3]=' '
_marioE2[4]=' '
_marioE2[5]='
'
_marioE2[6]=' '
_marioE2[7]=' '
_marioE2[8]='
'
_marioE2[9]=' '
_marioE2[10]=' '
_marioE2[11]=' '
_marioE2[12]=' '
_marioE2[13]=' '
_marioE2[14]=' '
_marioE2[15]=' '
_marioE2[16]='
'
_marioD00=13
_marioD01="
_marioD02='
_marioD03='
_marioD04='
_marioD05='
_marioD06='
_marioD07='
_marioD08='
_marioD09='
_marioD010='
_marioD011='
_marioD012='
"
M'
'
'
'
'
'
'
'
'
'
'
_marioE00=13
_marioE01='
_marioE02='
_marioE03='
_marioE04='
_marioE05='
'
M'
'
'
'
_marioE06=' '
_marioE07=' '
_marioE08='
'
_marioE09=' '
_marioE010=' '
_marioE011='
'
_marioE012='
'
_marioD10=13
_marioD11='
_marioD12='
_marioD13='
_marioD14='
_marioD15='
_marioD16='
_marioD17='
_marioD18='
_marioD19='
_marioD110='
_marioD111='
_marioD112='
_marioD113='
'
M'
'
'
'
'
'
'
'
'
'
'
'
_marioE10=13
_marioE11='
_marioE12='
_marioE13='
_marioE14='
_marioE15='
_marioE16='
_marioE17='
_marioE18='
_marioE19='
_marioE110='
_marioE111='
_marioE112='
_marioE113='
'
M'
'
'
'
'
'
'
'
'
'
'
'
_marioD20=13
_marioD21='
'
_marioD22='
M '
_marioD23=' '
_marioD24=' '
_marioD25='
'
_marioD26=' '
_marioD27=' '
_marioD28='
'
_marioD29=' '
_marioD210=' '
_marioD211=' '
_marioD212=' '
_marioD213=' '
_marioE20=13
_marioE21=' '
_marioE22=' M'
_marioE23=' '
_marioE24=' '
_marioE25='
'
_marioE26=' '
_marioE27='
_marioE28='
_marioE29='
_marioE210='
_marioE211='
_marioE212='
_marioE213='
'
'
'
'
'
'
'
_gompa0[0]=10
_gompa0[1]="
"
_gompa0[2]=" "
_gompa0[3]=" >< "
_gompa0[4]=" "
_gompa0[5]=" "
_gompa0[6]=" "
_gompa0[7]=" "
_gompa0[8]=" "
_gompa0[9]=" "
_gompa0[10]=" "
_gompa1[0]=10
_gompa1[1]="
"
_gompa1[2]=" "
_gompa1[3]=" >< "
_gompa1[4]=" "
_gompa1[5]=" "
_gompa1[6]=" "
_gompa1[7]=" "
_gompa1[8]="
"
_gompa1[9]=" "
_gompa1[10]="
"
_gompa2[0]=10
_gompa2[1]="
"
_gompa2[2]=" "
_gompa2[3]=" >< "
_gompa2[4]=" "
_gompa2[5]=" "
_gompa2[6]=" "
_gompa2[7]=" "
_gompa2[8]="
"
_gompa2[9]="
"
_gompa2[10]="
"
_gompa3[0]=8
_gompa3[1]="
"
_gompa3[2]=" >< "
_gompa3[3]=" "
_gompa3[4]=" "
_gompa3[5]=" "
_gompa3[6]="
"
_gompa3[7]=" "
_gompa3[8]="
"
_gompa3[0]=5
_gompa3[1]=" "
_gompa3[2]=" >< "
_gompa3[3]=" "
_gompa3[4]=" "
_gompa3[5]="
"
_gompa4[0]=3
_gompa4[1]=" "
_gompa4[2]=" "
_gompa4[3]="
"
_nuvemDraw[0]=13
_nuvemDraw[1]="
"
_nuvemDraw[2]="
"
_nuvemDraw[3]="
"
_nuvemDraw[4]="
"
_nuvemDraw[5]="
"
_nuvemDraw[6]="
"
_nuvemDraw[7]="
"
_nuvemDraw[8]="
"
_nuvemDraw[9]="
"
_nuvemDraw[10]="
"
_nuvemDraw[11]="
"
_nuvemDraw[12]="
"
_nuvemDraw[13]="
"
_coinDraw0[0]=5
_coinDraw0[1]="
@@
"
_coinDraw0[2]=" @@ @@ "
_coinDraw0[3]=" @ @@ @ "
_coinDraw0[4]=" @@ @@ "
_coinDraw0[5]="
@@
"
_coinDrawC[1]=${_cor[4]}
_coinDrawC[2]=${_cor[4]}
_coinDrawC[3]=${_cor[4]}
_coinDrawC[4]=${_cor[4]}
_coinDrawC[5]=${_cor[4]}
_coinDraw1[0]=5
_coinDraw1[1]="
@@
_coinDraw1[2]=" @ @
_coinDraw1[3]=" @ @@ @
_coinDraw1[4]=" @ @
_coinDraw1[5]="
@@
"
"
"
"
"
_coinDraw2[0]=5
_coinDraw2[1]="
_coinDraw2[2]="
_coinDraw2[3]="
_coinDraw2[4]="
_coinDraw2[5]="
"
"
"
"
"
@@
@@
@@
@@
@@
#
#
#
#
#
#
logo
Title
ceu
piso
amarelo para coin
invisible
#
#
#
#
#
#
logo
Title
ceu
piso
amarelo para coin
invisible
#
#
#
#
#
#
#
1
2
3
4
5
6
7
vermelho
verde
amarelo
azul escuro
cinza
azul claro
branco
_edgeWidth=30
_edgeScreen=`printf "%${_edgeWidth}s"` # Variavel para permitir renderizar desen
hos que ficam com parte visivel na camera e parte nao visivel
_width=0
_height=0
TerminalSize
_score=0 #Variavel para guardar o score atual do jogo
_coins=0 #Variavel para as moedas capturadas no jogo
_world="1-1" #Nivel atual do jogo
_timeGame=300 #Define quanto tempo ter a fase
_timeIni=0 #Guarda o tempo em segundos do inicio do jogo
_time=0 #Tempo atual do jogo em segundos
#Carrega a tela do menu no buffer
LoadMenu
_jogAni=0 #Controla a animacao de sprite para dar sensacao mais real do andar
# guarda qual sprite do personagem sera exibido
_jogSprite=0
#qual lado do jogador (d=direito e=esquerdo) ser exibido
_jogSide="D"
_jogHeight=16
_jogWidth=16
# Coordenadas iniciais do jogador x,y e velocidade em x e y
_jogX=0
_jogY=0
_velocY=0
_velocX=0
# define se o jogado morreu
_jogDead=false
#Variavel que guarda as vidas do personagem
_jogLife=0
#Define a tela atual do Jogo se esta: no menu, no jogo ou em pausa no jogo
_screenGame="MENU"
# Fisica do Jogo
_gravidade=1
# Coordenada da posicao do piso no cenario para colisao do personagem
_piso=37
# Variaveis de controle de calculo e exibicao de quadros por segundo do jogo (ve
locidade do jogo)
_quadroRender=0
_quadros=0
_lps=0 #loops por segundo
_fps=0 #frames por segundo
#Variavel para controle de limpeza do buffer do teclado: ver Function ListenKey
_clearBuffer=false
# Verifica se h linhas suficientes para desenha o jogo no terminal
# caso contrrio gera um erro, termina o programa e exibe mensagem para o usuario
if [ $_height -lt $_heightScreen ] || [ $_width -lt $_widthScreen ]; then
_erro="Terminal deve ter no mnimo $_heightScreen linhas x $_widthScreen c
olunas!\nEncontrado $_height linhas x $_width colunas."
Sair
fi
ClearScreen
tput cup $(( _initY + 12 )) 0
echo "$_spaceIni
echo "$_spaceIni
echo "$_spaceIni
"
echo "
"
"
echo "$_spaceIni
r modify
"
echo "$_spaceIni
ished by
"
echo "$_spaceIni
e, or
"
echo "$_spaceIni
"
echo "$_spaceIni
"
echo "$_spaceIni
ul,
"
echo "$_spaceIni
of
"
echo "$_spaceIni
e
"
echo "$_spaceIni
"
echo "
"
echo "$_spaceIni
cense
"
echo "$_spaceIni
censes/>.
"
read -n1
ClearScreen
# guarda o nanosegundo atual do relgio do sistema, aqui foi usado 10# para conver
so de base
# pois quando o segundo chega a 08 d erro com clculos por que o bash entende que o
nmero
# octadecimal e como o sistema octadecimal vai at o 7, entao gera um erro, por is
so precisamos
# forar o entendimento para a base decimal com 10#
_tempoN=$((10#`date +%N`))
# [ TIME LINE ] ------------------------------------------------------------------------------------------------------------------# loop do jogo (Time Line)
while true; do
FPS #Atualiza a taxa de quadros por segundo
ListenKey #Houve o Teclado
if [ $_next = true ]; then
LoadColors #Carrega as cores de fundo
MoveEnemy #Calcula movimento do inimigo
Jogador #Calcula Coordenadas do Jogador
fi