program portal; uses crt; var portal1 :string; portal2 :string; human :string; humanx :integer; humany :integer; portal1x :integer; portal2x :integer; portal1y :integer; portal2y :integer; facing :integer; portalgun :string; portalgunx :integer; portalguny :integer; key :char; level :integer; wallxmax :integer; wallymax :integer; wallxmin :integer; wallymin :integer; levelloaded :boolean; procedure set_variables; begin level:=1; portal1:='@'; portal2:='@'; human:='Å'; portalgun:='ᵒ'; humanx:=wallxmin+1; humany:=wallymin+1; end; procedure map1; begin wallxmax:=21; wallxmin:=1; wallymax:=11; wallymin:=1; levelloaded:=true; end; procedure draw_world; var drawwallx: integer; drawwally: integer; begin gotoXY(1,1); writeln(humanx,' ',humany); gotoXY(humanx,humany); writeln(human); gotoXY(portalgunx,portalguny); writeln(portalgun); if (level=1) and (levelloaded=false) then map1; drawwallx:=wallxmax; drawwally:=wallymax; repeat gotoxy(drawwallx,drawwally); writeln('#'); drawwallx:=drawwallx-1; until(drawwallx=wallxmin); repeat gotoxy(drawwallx,drawwally); writeln('#'); drawwally:=drawwally-1; until(drawwally=wallymin); repeat gotoxy(drawwallx,drawwally); writeln('#'); drawwallx:=drawwallx+1; until(drawwallx=wallxmax); repeat gotoxy(drawwallx,drawwally); writeln('#'); drawwally:=drawwally+1; until(drawwally=wallymax); gotoXY(portal1x,portal1y); TextColor(red); writeln(portal1); gotoXY(portal2x,portal2y); TextColor(blue); writeln(portal2); TextColor(white); delay(10); end; procedure portal1move; begin if (facing=1) then begin portal1x:=wallxmin; portal1y:=humany; end; if (facing=2) then begin portal1x:=humanx; portal1y:=wallymax; end; if (facing=3) then begin portal1x:=wallxmax; portal1y:=humany; end; if (facing=4) then begin portal1x:=humanx; portal1y:=wallymin; end; end; procedure portal2move; begin if (facing=1) then begin portal2x:=wallxmin; portal2y:=humany; end; if (facing=2) then begin portal2x:=humanx; portal2y:=wallymax; end; if (facing=3) then begin portal2x:=wallxmax; portal2y:=humany; end; if (facing=4) then begin portal2x:=humanx; portal2y:=wallymin; end; end; procedure movement; begin if (keypressed) then begin key:=Readkey; if (key='a') then if (humanx>wallxmin+1) then begin humanx:=humanx-1; facing:=1; end else if (humanx-1=portal1x) and (humany=portal1y) or (humanx-1=portal2x) and (humany=portal2y) then begin humanx:=humanx-1; facing:=1; end; if (key='s') then if (humany<wallymax-1) then begin humany:=humany+1; facing:=2; end else if (humany+1=portal1y) and (humanx=portal1x) or (humany+1=portal2y) and (humanx=portal2x) then begin humany:=humany+1; facing:=2; end; if (key='d') then if (humanx<wallxmax-1) then begin humanx:=humanx+1; facing:=3; end else if (humanx+1=portal1x) and (humany=portal1y) or (humanx+1=portal2x) and (humany=portal2y) then begin humanx:=humanx+1; facing:=3; end; if (key='w') then if (humany>wallymin+1) then begin humany:=humany-1; facing:=4; end else if (humany-1=portal1y) and (humanx=portal1x) or (humany-1=portal2y) and (humany=portal1y) then begin humany:=humany-1; facing:=4; end; if (key='p') then begin portal1move; end; if (key='o') then begin portal2move end; if (key='1') then begin wallxmax:=wallxmax+1; end; if (key='2') then begin wallymax:=wallymax+1; end; if (key='3') then begin wallxmax:=wallxmax-1; end; if (key='4') then begin wallymax:=wallymax-1; end; end; end; procedure portal_check; begin if (humanx=portal1x) and (humany=portal1y) then begin if (portal2x=wallxmin) then begin humanx:=portal2x+1; humany:=portal2y; end; if (portal2x=wallxmax) then begin humanx:=portal2x-1; humany:=portal2y; end; if (portal2y=wallymax) then begin humanx:=portal2x; humany:=portal2y-1; end; if (portal2y=wallymin) then begin humanx:=portal2x; humany:=portal2y+1; end; end; if (humanx=portal2x) and (humany=portal2y) then begin if (portal1x=wallxmin) then begin humanx:=portal1x+1; humany:=portal1y; end; if (portal1x=wallxmax) then begin humanx:=portal1x-1; humany:=portal1y; end; if (portal1y=wallymax) then begin humanx:=portal1x; humany:=portal1y-1; end; if (portal1y=wallymin) then begin humanx:=portal1x; humany:=portal1y+1; end; end; end; procedure portalgunmove; begin if (facing=1) then begin portalgunx:=humanx-1; portalguny:=humany; end; if (facing=2) then begin portalgunx:=humanx; portalguny:=humany+1; end; if (facing=3) then begin portalgunx:=humanx+1; portalguny:=humany; end; if (facing=4) then begin portalgunx:=humanx; portalguny:=humany-1; end; end; begin set_variables; repeat clrscr; movement; portalgunmove; portal_check; draw_world; until (humanx=40) and (humany=40); end.