;3 tesoros encerrados
;1 psi
;examinar y se abre ventana
;encuentro y se abre ventana

extrn escribir:far
extrn esperar:far

datos segment
  frase db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  salir db 'fin$'
  norte db 'n$'
  sur db 's$'
  este db 'e$'
  oeste db 'o$'
  te_paras db 'Te paras a descansar un rato.','$'
  para db 'parar$'
  hablar db 'hablar$'
  nopuedes db 'No puedes hacer eso.',13,'$'
  nopuedescoger db 'No lo puedes coger.',13,'$'
  vas_sur db 'Vas al sur.$'
  vas_norte db 'Vas al norte.$'
  vas_este db 'Vas al este.$'
  vas_oeste db 'Vas al oeste.$'
  ves_psi db 'Te tropiezas con un viejo aventurero que te mira fijamente.','$'
  parlanchin db 'El aventurero te dice: "esta nano no tiene objetivo, no te','$'
  parlanchin2 db 'esfuerces..."','$'
  examinado db 'El aventurero te mira desinteresado.','$'
  noentendido db 'El aventurero no te entiende...','$'
  coger db 'coger$'
  examinar db 'ex$'
  modo_0 db 'serpiente$'
  modo_1 db 'dios$'
  modo_2 db 'normal$'
  posfrase dw ?
  pospantalla dw ?
  entrada db 0
  horiz db 1
  verti db 0
  contrh db 1
  contrv db 0
  boin db 0
  modo db 2   ;0 - modo serpiente, 1 - modo borrar, 2 - modo ciudadano
  char db ' '
  nuevo db ' '
  color db 11
  jug db 1
  con db 4
  cont1 db 0
  cont2 db 0
  frase_x db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  labi db 0
datos ends

espera_tecla macro
local lazo, tecla
  lazo:  mov ah, 01h
         int 16h
         jnz tecla
         jmp lazo
  tecla: mov ah, 00h
         int 16h
endm

espera macro centesimas
  mov ah, centesimas
  push ax
  add sp, +1
  call far ptr esperar
  add sp, +1
endm

escribe macro fila, colu, pagi, cara, atri
  mov ah, fila
  mov al, colu
  push ax
  mov ah, pagi
  mov al, cara
  push ax
  mov ah, atri
  push ax
  add sp, +1
  call far ptr escribir
  add sp, +5
endm

valores_espera macro c1, c2, jj, cc
local yaj, yac, sig, fig
  push ax
  mov ah, c1
  mov al, c2
;  espera 1
  inc ah
  inc al
  cmp ah, jj
  jg yaj
  jmp sig
  yaj: mov ah, 0
  sig:
  cmp al, cc
  jg yac
  jmp fig
  yac: mov al, 0
  fig:
  mov c1, ah
  mov c2, al
  pop ax
endm

limpiarlinea macro x, y, car, col
local buclelinea, finbl
  mov cl, x
  buclelinea:
    escribe y, cl, 0, car, col
    cmp cl, 78
    jg finbl
    add cl, 1
    jmp buclelinea
  finbl:
endm

limpiarpantalla macro
local lbucle, finl
  mov ax, 0b800h
  mov es, ax
  mov bx, 0
  lbucle:
    mov byte ptr es:[bx], ' '
    mov byte ptr es:[bx+1], 7h
    cmp bx, 4000
    jg finl
    add bx, 2
    jmp lbucle
  finl:
endm

recuadro macro x, xx, y, yy, jimipage
local bucle, finbucle, linea
  mov cl, y
  mov ch, x
  bucle: escribe cl, ch, jimipage, ' ', 18
         inc ch
         cmp ch, xx
         je linea
         jmp bucle
         linea: cmp cl, yy
                je finbucle
                mov ch, x
                inc cl
                jmp bucle
  finbucle:         
endm

pont macro
  escribe 0, 2, 0, '>', 13
  escribe 0, 3, 0, ' ', 13
endm

maki macro
  escribe 24, 2, 0, 'M', 13
  escribe 24, 3, 0, '>', 13
endm

pantallita macro
local b1, finb1, b2, finb2
  mov cl, 0
  b1: escribe 1, cl, 0, '°', 8
      escribe 23, cl, 0, '°', 8
      cmp cl, 79
      jge finb1
      inc cl
      jmp b1
  finb1:
  mov ch, 2
  b2: escribe ch, 0, 0, '°', 8
      escribe ch, 79, 0, '°', 8
      cmp ch, 22
      jge finb2
      inc ch
      jmp b2
  finb2:
endm

poncursor macro x, y, pagina
  mov dl, x
  mov dh, y
  mov bh, pagina
  mov ah, 2h
  int 10h
endm

escribetexto macro texto, x, y, atri, pagina
  poncursor x, y, pagina
  lea dx, texto
  mov bl, atri
  mov bh, pagina
  mov ah, 9h
  int 21h
endm

compara macro cadena1, cadena2
local cbucle, noesigual, esigual, yaesta
  mov bx, 0
  mov si, 520
  cbucle: mov al, cadena1[bx]
          mov cl, cadena2[bx]
          cmp al, cl
          jne noesigual
          cmp al, '$'   ;si las dos terminan, quiere decir que son iguales
          je esigual
          cmp al, ' '
          je esigual
          add bx, 1
          jmp cbucle
  noesigual: mov ah, 'N'
             jmp yaesta
  esigual: mov ah, 'S'
  yaesta:
endm

enrecu macro comando, x, pagina
local i1, i2, i3, i4, hablamos, examinamos, finenrecu, noentiendo
  compara comando, hablar
  cmp ah, 'S'
  jne i1
  jmp hablamos
  i1:
  compara comando, examinar
  cmp ah, 'S'
  jne i2
  jmp examinamos
  i2: jmp noentiendo
  hablamos: escribetexto parlanchin, x, 12, 8, pagina
            escribetexto parlanchin2, x, 13, 8, pagina
            jmp finenrecu
  examinamos: escribetexto examinado, x, 12, 8, pagina
              jmp finenrecu
  noentiendo: escribetexto noentendido, x, 12, 8, pagina
              jmp finenrecu
  finenrecu:
endm

computa macro comando, x, pagina
local quierecoger, fincomputa, nada, no, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, alnorte, alsur, aleste, aloeste, paramos
  cmp entrada, 1
  je i1
  jmp no
  i1:
  limpiarlinea 4, 24, ' ', 7
  compara comando, coger
  cmp ah, 'S'
  jne i2
  jmp quierecoger
  i2:
  compara comando, este
  cmp ah, 'S'
  jne i3
  jmp aleste
  i3:
  compara comando, oeste
  cmp ah, 'S'
  jne i4
  jmp aloeste
  i4:
  compara comando, sur
  cmp ah, 'S'
  jne i5
  jmp alsur
  i5:
  compara comando, norte
  cmp ah, 'S'
  jne i6
  jmp alnorte
  i6:
  compara comando, para
  cmp ah, 'S'
  jne i7
  jmp paramos
  i7:
  compara comando, modo_0
  cmp ah, 'S'
  jne i8
  mov modo, 0
  jmp fincomputa
  i8:  
  compara comando, modo_1
  cmp ah, 'S'
  jne i9
  mov modo, 1
  jmp fincomputa
  i9:
  compara comando, modo_2
  cmp ah, 'S'
  jne i10
  mov modo, 2
  jmp fincomputa
  i10:
  jmp nada
  quierecoger: escribetexto nopuedescoger, x, 24, 7, pagina
               jmp fincomputa
  aleste: mov horiz, 1
          mov verti, 0
          escribetexto vas_este, x, 24, 7, pagina
          jmp fincomputa
  aloeste: mov horiz, -1
           mov verti, 0
           escribetexto vas_oeste, x, 24, 7, pagina
           jmp fincomputa
  alsur: mov horiz, 0
         mov verti, 1
         escribetexto vas_sur, x, 24, 7, pagina
         jmp fincomputa
  alnorte: mov horiz, 0
           mov verti, -1
           escribetexto vas_norte, x, 24, 7, pagina
           jmp fincomputa
  paramos: mov horiz, 0
           mov verti, 0
           escribetexto te_paras, x, 24, 7, pagina
           jmp fincomputa
  nada:
  escribetexto nopuedes, x, 24, 7, pagina
  fincomputa: poncursor 5, 26, pagina
  no:
endm

aleatorio macro vi

endm

el_contri macro hh, vv
local sg1, sg2
;  aleatorio hh
;  aleatorio vv
   cmp horiz, 1
   jnl sg1
   dec hh
   sg1:
   mov al, verti
   mov hh, al
   cmp verti, 1
   jnl sg2
   dec vv
   sg2:
   mov al, horiz
   mov vv, al
endm

lee_teclado macro f, ini, y, ppantalla, pfrase
local btecla, tecla, finalt, finalt2, arriba, abajo, izq, dch, desp1, desp2, desp3, desp4
  mov bx, pospantalla
  add bx, ini
  mov si, posfrase
  btecla: mov ah, 01h
          int 16h
          jnz tecla
          jmp finalt2
  tecla: mov ah, 00h
         int 16h

         ;MODIFICACIONES PARA MANEJAR CON EL CURSOR
         cmp ah, 72
         je arriba
         jmp desp1
         arriba: mov frase[0], 'n'
                 mov frase[1], '$'
                 mov entrada, 1
                 jmp finalt2
         desp1:
         cmp ah, 80
         je abajo
         jmp desp2
         abajo: mov frase[0], 's'
                mov frase[1], '$'
                mov entrada, 1
                jmp finalt2
         desp2:
         cmp ah, 75
         je izq
         jmp desp3
         izq: mov frase[0], 'o'
              mov frase[1], '$'
              mov entrada, 1
              jmp finalt2
         desp3:
         cmp ah, 77
         je dch
         jmp desp4
         dch: mov frase[0], 'e'
              mov frase[1], '$'
              mov entrada, 1
              jmp finalt2
         desp4:
         cmp al, 13
         je finalt
         mov dx, 0b800h ;escribimos en pantalla
         mov es, dx
         push ax
         push bx
         mov al, 160
         mov bl, y
         mul bl    
         pop bx
         add bx, ax
         pop ax
         mov es:bx, al
         mov dl, 12
         mov es:bx+1, dl
         add bx, 2
         mov frase[si], al     ;escribimos en variable
         inc si
         mov posfrase, si
         mov ax, pospantalla
         add ax, 2
         mov pospantalla, ax
         jmp finalt2
  finalt: mov frase[si], '$'
          mov posfrase, 0
          limpiarlinea 0, 0, ' ', 8
          mov pospantalla, 0
          mov entrada, 1
  finalt2:
endm

lee_linea macro f, ini, y
local btecla, tecla, finalt, finalt2, princ
  princ:
  push bx
  push si
  mov bx, 2000h
  add bx, ini
  mov si, 0
  push bx
  mov al, 160
  mov bl, y
  mul bl    
  pop bx
  add bx, ax
  btecla: mov ah, 01h
          int 16h
          jnz tecla
          jmp btecla
  tecla: mov ah, 00h
         int 16h
         cmp al, 13
         je finalt
         cmp si, 40
         jge btecla
         mov dx, 0b800h ;escribimos en pantalla
         mov es, dx
         mov es:bx, al
         mov dl, 14
         mov es:bx+1, dl
         add bx, 2
         mov frase_x[si], al     ;escribimos en variable
         inc si
         jmp btecla
  finalt: mov frase_x[si], '$'
;          limpiarlinea 0, 0, ' ', 8
  finalt2:
  pop si
  pop bx
endm

obtenerpos macro x, y
  mov ax, 0b800h
  mov es, ax
  mov al, x
  mov dl, 80
  mul dl
  mov si, ax
  sal si, 1
  mov di, si
  mov ah, 0
  mov al, y
  mov si, ax
  sal si, 1
  add di, si
  mov ah, [es:di]
endm

cambia_pagina macro page
  mov al, page
  mov ah, 05h
  int 10h
endm

copia_pagina macro origen, destino
local bucle
  mov ax, 0b800h
  mov es, ax
  mov si, origen
  mov bx, destino
  mov cx, 1000h
  bucle: mov ax, es:[si]
         mov es:[bx], ax
         add si, 2
         add bx, 2
         loop bucle
endm

conversacion macro
  push cx
  push dx
  copia_pagina 0, 2000h
  cambia_pagina 2
  recuadro 7, 71, 8, 16, 2
  escribetexto ves_psi, 8, 9, 14, 2
  escribe 11, 8, 2, '>', 15
  escribe 11, 9, 2, ' ', 15
  lee_linea 0, 20, 11
  enrecu frase_x, 8, 2
  espera_tecla
  cambia_pagina 0
  inc verti
  pop dx
  pop cx
endm

mueve macro h, v, posx, posy, cont, tope, modus
local seguimos, finalizamos, s2, s3, s4, ss1, ss2, ss3, ss4, conv
;  espera 1
;  inc boin
;  cmp boin, 5
;  je s2
;  jmp finalizamos
  mov nuevo, '˛'
  mov color, 11
  push bx
  mov bl, cont
  cmp bl, tope
  pop bx
  jge s2
  jmp finalizamos
  s2:
  el_contri contrh, contrv
  mov bh, ch
  mov bl, cl
  add bh, h
  add bl, v
  obtenerpos bl, bh
  mov al, modus
  cmp al, 0  ;modo DIOS
  jne ss1
  mov byte ptr char, 'ą'
  ss1:
  cmp al, 2  ;modo ciudadano
  jne ss2
  mov byte ptr char, ' '
  ss2:
  cmp al, 1  ;modo borrar
  jne ss3
  mov byte ptr char, ' '
  jmp s3
  ss3:
  cmp al, 4  ;modo ordenador
  jne ss4
  mov byte ptr char, ' '
  mov byte ptr nuevo, '.'
  mov byte ptr color, 7
  jmp s4

  ss4:
  cmp ah, 'ą'  ;SI SE CHOCA CON ELLA
  jne s3
  jmp finalizamos
  s3:
  cmp ah, '.'  ;si se choca con el contri
  je conv
  jmp s4
  conv:
   conversacion
   jmp finalizamos
  s4:
  cmp ah, '°'
  jne seguimos
  jmp finalizamos

  seguimos:
  escribe cl, ch, 0, char, color ;movimiento
  add ch, h
  add cl, v
  mov posx, ch
  mov posy, cl
  escribe cl, ch, 0, nuevo, color ;movimiento
  mov boin, 0
  finalizamos:
endm

muevepenha macro
local bucl, finbucl
  mov di, 0
  bucl: mov cl, pospy[di]
        mov ch, pospx[di]
        mueve hp[di], vp[di], pospx[di], pospy[di]
        inc di
        cmp di, 1
        jge finbucl
        jmp bucl
  finbucl:
endm

codigo segment
  assume cs:codigo, ds:datos
  inicio:
    mov ax, seg datos
    mov ds, ax

    mov ah, 0fh
    int 10h
    mov bl, bh
    mov bh, 0
    cmp bx, 0
    jne sigg1
    copia_pagina bx, 1000h
    jmp sgir
    sigg1:
    cmp bx, 2
    jne sigg2
    copia_pagina 2000h, 1000h
    jmp sgir
    sigg2: mov labi, 1
    sgir:    
;    escribe pospy[0], pospx[0], 0, 'k', 12
;    itecla: mov ah, 01h
;            int 16h
;            jnz teclai
;            jmp itecla
;    teclai:

    limpiarpantalla
    pantallita
    poncursor 5, 26, 0

    mov cl, 3
    mov ch, 4
    mov dl, 15
    mov dh, 8
    mov posfrase, 0
    mov pospantalla, 0

    push cx
    push dx
    buclep:
            mov entrada, 0
            pop dx
            pop cx
            push dx
            mueve horiz, verti, ch, cl, cont1, jug, modo
            pop dx
            push cx
            mov cx, dx
            mueve contrh, contrv, dh, dl, cont2, con, 4
            mov dx, cx
            push dx
            espera 1
            valores_espera cont1, cont2, jug, con
            pont
            maki
            lee_teclado frase, 8, 0, 0, pospantalla, posfrase
            maki
            computa frase, 5, 0, 0
            continua:
            compara frase, salir
            cmp ah, 'S'
            je finbuclep
            jmp buclep
    finbuclep:
  fin:
    copia_pagina 1000h, 0
    cambia_pagina 0
    mov ax, 4c00h
    int 21h
codigo ends

end inicio
