home *** CD-ROM | disk | FTP | other *** search
/ Prima Shareware 3 / DuCom_Prima-Shareware-3_cd1.bin / PROGRAMO / PASCAL / HEJB / GRAPH / UNHEJB.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1994-04-15  |  34.1 KB  |  1,189 lines

  1. { toto je pro tiskárnu, men¿í ⌐ádkování (30)}
  2. unit unhejb;
  3.  
  4. interface uses crt, dos, obraz3d;
  5. const
  6.   l     = $10; { instrukce }
  7.   r     = $20;
  8.   u     = $4;
  9.   d     = $8;
  10.   f     = $2;
  11.   b     = $1;
  12.   _f    = f+d+l;{ pro kompatibilitu s p⌐edchozími verzemi }
  13.   _b    = b+u+r;
  14.  
  15.   lu    = l+u;
  16.   ld    = l+d;
  17.   ru    = r+u;
  18.   rd    = r+d;
  19.  
  20.   __vm      = $80+$10;
  21.   __skoky   = $80+$20;
  22.   __end     = $80+$30;
  23.   __presuny = $80+$40;
  24.   __rizeni  = $80+$50;
  25.  
  26.   jmpa0 = __skoky;     { skok v programu }
  27.   jmpr  = __skoky+1;     { skok v programu }
  28.   jmpa  = __skoky+2;
  29.  
  30.   spor  = __rizeni;    { ⌐ízení pomalosti }
  31.   spoa  = __rizeni+1;
  32.   sprr  = __rizeni+2;
  33.   spra  = __rizeni+3;
  34.   scor  = __rizeni+4;
  35.   scoa  = __rizeni+5;
  36.   rep   = __rizeni+6;
  37.   scob  = __rizeni+7;
  38.   endc  = __end;       { konec pohybu a vyçi¿tení cesty }
  39.   endp  = __end+1;     { konec }
  40.   xyzr  = __presuny;   { p⌐esun o sou⌐adnice }
  41.   xyz   = __presuny+1; { p⌐esun na sou⌐adnice }
  42.  
  43.   vm0   = __vm+0;
  44.   vm1   = __vm+1;
  45.   vm2   = __vm+2;
  46.   vm3   = __vm+3;
  47.   vm4   = __vm+4;
  48.   vm5   = __vm+5;
  49.   vm6   = __vm+6;
  50.   vm7   = __vm+7;
  51.   vm8   = __vm+8;
  52.   vm9   = __vm+9;
  53.   vm10  = __vm+10;
  54.   vm11  = __vm+11;
  55.   vm12  = __vm+12;
  56.   vm13  = __vm+13;
  57.   vm14  = __vm+14;
  58.   vm15  = __vm+15;
  59.                           { pro kontrolu stavu objektu }
  60.   __videt         = $01;  { objekt je zobrazen }
  61.   __pohyb         = $02;  { objekt má p⌐i⌐azenu cestu }
  62.   __zpracovava_se = $04;  { objekt se na své cestê právê zpracovává }
  63.   __zobrazuje_se  = $08;  { objekt se právê zobrazuje }
  64.   __existuje_tvar = $20;  { existuje tvar objektu }
  65.  
  66.  
  67. type
  68.   typ_instrukce     = byte;
  69.   typ_instrukci  = array[0..65530] of typ_instrukce;
  70.   typ_programu = record
  71.                    kolik : word;     { kolik pokynû obsahuje cesta }
  72.                    cesta : typ_instrukci { samotné instrukce }
  73.                  end;
  74.  
  75.   typ_tvar      = record
  76.                     pamet : word;    { kolik bodû obsahuje obraz objektu }
  77.                     tvar  : typ_obrazu_3d; { ukazatel na pole bodû objektu }
  78.                   end;
  79.  
  80.   ptr_typ_instrukci  = ^typ_instrukci;
  81.   ptr_to_program  = ^typ_programu;
  82.   ptr_typ_vproc   = ^typ_vproc;
  83.   ptr_typ_hejbaci = ^typ_hejbaci;
  84.  
  85.   typ_vproc   = record
  86.                 gde : word;          { instrukçní ukazatel }
  87.                 kam : ptr_to_program;{ seznam pohybû objektu }
  88.               end;
  89.  
  90.  typ_hejbaci_zaklad = object
  91.                  poloha         : tsou_3d;
  92.                  prodleva       : byte;
  93.    { udava, kolikrat bude objekt jeste odstaven }
  94.                  pomalost       : byte;
  95.    { udava prodlevu, ktera se nastavi pri prodleve = 0 }
  96.    { pokud pomalost = 0, neni prodleva }
  97.    { viz krok }
  98.                  barva          : byte;
  99.                  stav           : byte;
  100.  
  101.    {        x x x x x x x x                                                }
  102.    {        ^ ^ ^ ^ ^ ^ ^ ^                                                }
  103.    {        │ │ │ │ │ │ │ │                                                }
  104.    {        │ │ │ │ │ │ │ └─> 1 .. objekt je zobrazen na obrazovce         }
  105.    {        │ │ │ │ │ │ └───> 1 .. objekt je v seznamu a má se hÿbat       }
  106.    {        │ │ │ │ │ └─────> 1 .. právê se pracuje s objektem             }
  107.    {        │ │ │ │ └───────> 1 .. právê se pracuje se zobrazením objektu  }
  108.    {        │ │ │ └─────────> 1 ..                                         }
  109.    {        │ │ └───────────> 1 .. uæ existuje tvar objektu                }
  110.    {        │ └─────────────> nejsou pouæity                               }
  111.    {        └───────────────>                                              }
  112.                  co_delat     : typ_vproc;
  113.  
  114.                   { procedury pro pohyb objektu }
  115.                  procedure u;
  116.                  procedure d;
  117.                  procedure l;
  118.                  procedure r;
  119.                  procedure ru;
  120.                  procedure rd;
  121.                  procedure lu;
  122.                  procedure ld;
  123.                  procedure f;
  124.                  procedure b;
  125.                   { pohyb v danÿch smêrech }
  126.                  procedure presun(x, y, z : typ_souradnic);
  127.                   { p⌐esun na absolutní sou⌐adnice }
  128.                  procedure presun_bod(_bod : tsou_3d);
  129.                   { p⌐esun na absolutní sou⌐adnice }
  130.                  procedure presun_rel(x, y, z : typ_souradnic);virtual;
  131.                   { p⌐esun na relativní sou⌐adnice }
  132.                  procedure _presun_rel(x, y, z : typ_souradnic);virtual;
  133.                   { p⌐esun na relativní sou⌐adnice }
  134.  
  135.                  procedure zobraz;
  136.                   { pokud objekt neni v obrazovce, zavola _zobraz }
  137.                  procedure _zobraz; virtual;
  138.                   { zobrazí objekt do obrazovky }
  139.                  procedure zhasni;
  140.                   { zhasne objekt na obrazovce }
  141.                  procedure _zhasni; virtual;
  142.                   { pokud je objekt na obrazovce, zavola _zhasni }
  143.                  procedure obnov;
  144.  
  145.                  procedure _obnov;virtual;
  146.                   { obnoví vzhled objektu na obrazovce }
  147.  
  148.                  procedure set_pomalost(_pomalost : byte);
  149.                   { nastaví prodlevu, se kterou se bude provadet krok }
  150.                  procedure set_prodleva(_prodleva : byte );
  151.                   { nastaví prodlevu, po kterou se objekt nebude hybat }
  152.                  procedure set_barva(_c : byte); virtual;
  153.                  procedure set_barvar(_rc : shortint); virtual;
  154.  
  155.                   { procedury pro inicialisaci a ru¿ení objektu }
  156.                  constructor init;
  157.                   { nastaví základní vztahy objektu nutnÅ !!!! }
  158. {                 constructor init_poloha(kam : tsou_3d);}
  159.                   { a navíc polohu objektu }
  160.                  destructor zrus;
  161.                   { uvolní ve¿kerou pamꃠzabíranou objektem }
  162.                  procedure standard_atrib;
  163.                   { nastaví základní atributy objektu }
  164.  
  165.                  procedure hejbej(var cesta);
  166.                   { zaçne hÿbat objektem po dané cestê }
  167.                  function hejbe_se : boolean;
  168.                   { pokud se objekt hÿbe (má p⌐i⌐azenu cestu), má hodnotu true }
  169.                  procedure konec_pohybu;
  170.                   { zru¿í zbytek pohybu objektu }
  171.                  procedure anim_posun_xyz(x, y, z : typ_souradnic);
  172.                   { vytvori a priradi cestu do [x, y, z] }
  173.                  procedure anim_posun_bod(_bod : tsou_3d);
  174.                   { vytvori a priradi cestu do [x, y, z] }
  175.                  procedure dodel_anim_posun_bod(_bod : tsou_3d);
  176.                   { vytvori a priradi cestu do [x, y, z] }
  177.  
  178.                  procedure anim_prohod(var s_kym : typ_hejbaci_zaklad);
  179.                   { vytvo⌐í cestu mezi dvêma objekty }
  180.                  procedure dodel_anim_prohod(var s_kym : typ_hejbaci_zaklad);
  181.                   { vytvo⌐í cestu mezi dvêma objekty }
  182.                   { a vymêní je }
  183.                  procedure prirad_program(_program : ptr_to_program);
  184.                   { danému objektu p⌐i⌐adí program }
  185.  
  186.                  procedure rozbeh;
  187.                   { objekt se rozbêhne po své cêstê }
  188.                   { ( s danÿm programem )            }
  189.                  procedure stop;
  190.                   { objekt se na své cestê zastaví  }
  191.                  procedure dodelej_pohyb;
  192.  
  193.  
  194.                  function krok : byte;
  195.                   { objekt udêlá 1 krok na dané cestê }
  196.                  procedure _cisti_program;
  197.                   { uvolní pamꃠp⌐i⌐azenou cestê }
  198.                  procedure vm0; virtual;
  199.                  procedure vm1; virtual;
  200.                  procedure vm2; virtual;
  201.                  procedure vm3; virtual;
  202.                  procedure vm4; virtual;
  203.                  procedure vm5; virtual;
  204.                  procedure vm6; virtual;
  205.                  procedure vm7; virtual;
  206.                  procedure vm8; virtual;
  207.                  procedure vm9; virtual;
  208.                  procedure vm10; virtual;
  209.                  procedure vm11; virtual;
  210.                  procedure vm12; virtual;
  211.                  procedure vm13; virtual;
  212.                  procedure vm14; virtual;
  213.                  procedure vm15; virtual;
  214.                end;
  215.  
  216.  
  217.   typ_hejbaci = object(typ_hejbaci_zaklad)
  218.                  tvar           : ^typ_tvar;
  219.                   { procedury pro práci se vzhledem objektu }
  220.  
  221.                  procedure _zobraz; virtual;
  222.                   { zobrazí objekt do obrazovky }
  223.                  procedure _zhasni; virtual;
  224.                   { pokud je objekt na obrazovce, zavola _zhasni }
  225.  
  226.                  procedure prirad(var prvek : typ_hejbaci);
  227.                  procedure set_barva(_c : byte);virtual;
  228.                  procedure _cisti_tvar;
  229.                   { uvolní pamꃠp⌐i⌐azenou tvaru }
  230.                  procedure _get_mem_tvar(__kolik : word);
  231.  
  232.                  function dej_bod(kterej : word) : typ_bod_3d;
  233.                  procedure set_bod(kterej : word; co : bod_fyz_obrazu);
  234.                  procedure set_bod_znak(kterej : word; znak : char);
  235.                  procedure set_bod_barva(kterej : word; barvan : byte);
  236.                  procedure set_bod_z(kterej : word; z : typ_souradnic);
  237.  
  238.                  function obsazeno : word;
  239.                  function je_tvar : boolean;
  240.  
  241.                  procedure prirad_tvar(var _tvar : typ_tvar);
  242.  
  243.                   { procedury pro inicialisaci a ru¿ení objektu }
  244.                  constructor init;
  245.                   { nastaví základní vztahy objektu nutnÅ !!!! }
  246.                  destructor zrus;
  247.                   { uvolní ve¿kerou pamꃠzabíranou objektem }
  248.                end;
  249.  
  250. function  vytvor_program(var cesta) : ptr_to_program;
  251.  { vytvo⌐í z dané cesty program, tj p⌐idá délku a ukazatel na }
  252.  { zaçátek }
  253.  
  254. procedure konec;
  255.  { uvolní ve¿kerou dynamickou pamꃠzabranou jednotkou }
  256.  { a obnoví pûvodní obsah obrazovky }
  257.  
  258. function posun_absol(var o1, o2 : typ_hejbaci_zaklad) : ptr_to_program;
  259.  { vytvo⌐í cesty pro posun mezi vêma objekty }
  260. function posun_absol_xyz(var o : typ_hejbaci_zaklad; x, y, z : typ_souradnic) : ptr_to_program;
  261.  { vytvo⌐í cesty pro posun objektu na dané sou⌐adnice }
  262. function posun_rel_xyz(x, y, z : typ_souradnic) : ptr_to_program;
  263.  { vytvo⌐í cesty pro posun objektu o dané sou⌐adnice }
  264. function hezky_rozmistit(k : integer) : ptr_tsou_3d;
  265.  
  266. var
  267.   obrazovka    : typ_obrazovka_3d;
  268.  
  269. implementation
  270. uses
  271.   unfront;
  272.  
  273. constructor typ_hejbaci_zaklad.init;
  274. begin
  275.   standard_atrib;
  276.   co_delat.kam := nil;
  277.   co_delat.gde := 0;
  278.   poloha         := __nula_3d;
  279. end;
  280.  
  281. {constructor typ_hejbaci_zaklad.init_poloha;
  282. begin
  283.   init;
  284.   presun_bod(kam);
  285. end;
  286. }
  287. destructor typ_hejbaci_zaklad.zrus;
  288. begin
  289.   zhasni;
  290.   konec_pohybu;
  291. end;
  292.  
  293. procedure typ_hejbaci_zaklad.standard_atrib;
  294. { nastaví bity v poli stav na nulovou hodnotu, tj. klidovÿ stav }
  295. begin
  296.   asm
  297.     les di, self
  298.     mov byte ptr es:[di].stav, 0
  299.     mov byte ptr es:[di].pomalost, 0
  300.     mov byte ptr es:[di].prodleva, 0
  301.     mov byte ptr es:[di].barva, 0
  302.   end;
  303. end;
  304.  
  305. procedure typ_hejbaci_zaklad.u; {bez komentare}
  306. begin
  307.   presun_rel(0,-1,0)
  308. end;
  309.  
  310. procedure typ_hejbaci_zaklad.d;
  311. begin
  312.   presun_rel(0,1,0)
  313. end;
  314.  
  315. procedure typ_hejbaci_zaklad.l;
  316. begin
  317.   presun_rel(-1,0,0)
  318. end;
  319.  
  320. procedure typ_hejbaci_zaklad.r;
  321. begin
  322.   presun_rel(1,0,0)
  323. end;
  324.  
  325. procedure typ_hejbaci_zaklad.f;
  326. begin
  327.   presun_rel(0,0,1)
  328. end;
  329.  
  330. procedure typ_hejbaci_zaklad.b;
  331. begin
  332.   presun_rel(0,0,-1)
  333. end;
  334.  
  335. procedure typ_hejbaci_zaklad.ru;
  336. begin
  337.   presun_rel(1,-1,0)
  338. end;
  339.  
  340. procedure typ_hejbaci_zaklad.lu;
  341. begin
  342.   presun_rel(-1,-1,0)
  343. end;
  344.  
  345. procedure typ_hejbaci_zaklad.rd;
  346. begin
  347.   presun_rel(1,1,0)
  348. end;
  349.  
  350. procedure typ_hejbaci_zaklad.ld;
  351. begin
  352.   presun_rel(-1,1,0)
  353. end;
  354.  
  355. procedure typ_hejbaci_zaklad.zobraz;
  356. label konec;
  357. begin
  358.   asm          les di, self
  359.                test es:[di].stav, __videt
  360.                jnz konec { objekt uz je na obrazovce, deje se nic }
  361.  
  362.                test es:[di].stav, __existuje_tvar
  363.                jz konec { objekt nema tvar, deje se nic }
  364.  
  365.                les di, self
  366.                or  es:[di].stav, __zobrazuje_se { objekt se bude zobrazovat }
  367.   end;
  368.                _zobraz;
  369.   asm
  370.                les di, self                     { nastaveni atributû }
  371.                or  es:[di].stav, __videt        { objekt je videt }
  372.                and es:[di].stav, __zobrazuje_se xor 0ffh { a uz se nezobrazuje }
  373.     konec:
  374.   end;
  375. end;
  376.  
  377. procedure typ_hejbaci_zaklad.zhasni;
  378. label konec;
  379. begin
  380.   asm          les di, self
  381.                test es:[di].stav, __videt or __existuje_tvar
  382.                jz konec { objekt neni na obrazovce,
  383.                           nebo nema tvar - deje se nic }
  384.                les di, self
  385.                or  es:[di].stav, __zobrazuje_se { objekt se bude zobrazovat }
  386.   end;
  387.                _zhasni;
  388.   asm
  389.                les di, self                     { nastaveni atributû }
  390.                and es:[di].stav, (__videt or __zobrazuje_se) xor 0ffh
  391.                  { objekt se nezobrazuje a nejni videt }
  392. konec:
  393.   end;
  394. end;
  395.  
  396. procedure typ_hejbaci_zaklad.obnov;
  397. label konec;
  398. begin
  399.   asm          les di, self
  400.                test es:[di].stav, __videt
  401.                jz konec { objekt neni na obrazovce, deje se nic }
  402.  
  403.                test es:[di].stav, __existuje_tvar
  404.                jz konec { objekt nema tvar, deje se nic }
  405.  
  406.                les di, self
  407.                or  es:[di].stav, __zobrazuje_se { objekt se bude zobrazovat }
  408.   end;
  409.                _obnov;
  410.   asm
  411.                les di, self                     { nastaveni atributû }
  412.                and es:[di].stav, __zobrazuje_se xor 0ffh { a uz se nezobrazuje }
  413.     konec:
  414.   end;
  415. end;
  416.  
  417. procedure typ_hejbaci_zaklad._zobraz; {zobrazi natvrdo objekt na jeho misto }
  418. begin
  419. end;
  420.  
  421. procedure typ_hejbaci_zaklad._zhasni;
  422. begin
  423. end;
  424.  
  425. procedure typ_hejbaci_zaklad._obnov;
  426. begin
  427.   zhasni;
  428.   zobraz;
  429. end;
  430.  
  431. procedure typ_hejbaci_zaklad.presun_bod(_bod : tsou_3d);
  432. begin
  433.   presun_rel(_bod.x - poloha.x, _bod.y - poloha.y, _bod.z - poloha.z);
  434. end;
  435.  
  436. procedure typ_hejbaci_zaklad.presun(x, y, z : typ_souradnic);
  437. begin
  438.   presun_rel(x-poloha.x,y-poloha.y, z-poloha.z)
  439. end;
  440.  
  441. procedure typ_hejbaci_zaklad.presun_rel(x, y, z : typ_souradnic);
  442. label konec, obyc_presun;
  443. begin
  444.   asm
  445.                les di, self
  446.                test es:[di].stav, __videt
  447.                jz obyc_presun { objekt neni zobrazen, pouze zmena souradnic }
  448.  
  449.                les di, self
  450.                or  es:[di].stav, __zobrazuje_se { objekt se bude zobrazovat }
  451.   end;
  452.                _presun_rel(x, y, z);
  453.   asm
  454.                les di, self                     { nastaveni atributû }
  455.                and es:[di].stav, __zobrazuje_se xor 0ffh { a uz se nezobrazuje }
  456.                jmp konec
  457.   end;
  458.   obyc_presun: inc(poloha.x, x);
  459.                inc(poloha.y, y);
  460.                inc(poloha.z, z);
  461.   konec:
  462. end;
  463.  
  464. procedure typ_hejbaci_zaklad._presun_rel(x, y, z : typ_souradnic);
  465. begin
  466.   asm          les di, self
  467.                and es:[di].stav, __zobrazuje_se xor 0ffh
  468.   end;
  469.     begin
  470.       zhasni;
  471.       inc(poloha.x, x);
  472.       inc(poloha.y, y);
  473.       inc(poloha.z, z);
  474.       zobraz
  475.     end;
  476. end;
  477. procedure typ_hejbaci_zaklad.set_barva(_c : byte);
  478. begin
  479.   barva := _c;
  480. end;
  481.  
  482. procedure typ_hejbaci_zaklad.set_barvar(_rc : shortint);
  483. begin
  484.   set_barva(byte(barva+_rc));
  485. end;
  486.  
  487. procedure typ_hejbaci_zaklad.set_pomalost(_pomalost : byte);
  488. begin
  489.   pomalost := _pomalost;
  490. end;
  491.  
  492. procedure typ_hejbaci_zaklad.set_prodleva(_prodleva : byte );
  493. begin
  494.   prodleva := prodleva;
  495. end;
  496.  
  497. procedure typ_hejbaci_zaklad.rozbeh;
  498. begin
  499.   stav := __pohyb or stav;
  500. end;
  501.  
  502. procedure typ_hejbaci_zaklad.stop;
  503. begin
  504.   stav := (not __pohyb) and stav;
  505. end;
  506.  
  507. procedure typ_hejbaci_zaklad.dodelej_pohyb;
  508. begin
  509.   repeat
  510.   {!!  fronta.makej;}
  511.   until (stav and __pohyb) = 0;
  512. end;
  513.  
  514. procedure typ_hejbaci_zaklad.dodel_anim_posun_bod(_bod : tsou_3d);
  515. var c : byte;
  516. begin
  517.   anim_posun_bod(_bod);
  518.   repeat
  519.     c:=krok;
  520.     delay(_stand_pomalost);
  521.   until not hejbe_se;
  522. end;
  523.  
  524. procedure typ_hejbaci_zaklad.anim_posun_bod(_bod : tsou_3d);
  525. begin
  526.   prirad_program(posun_absol_xyz(self, _bod.x,_bod.y,_bod.z));
  527. end;
  528.  
  529. procedure typ_hejbaci_zaklad.anim_posun_xyz(x, y, z : typ_souradnic);
  530. begin
  531.   prirad_program(posun_absol_xyz(self, x,y,z));
  532. end;
  533.  
  534. procedure typ_hejbaci_zaklad.dodel_anim_prohod(var s_kym : typ_hejbaci_zaklad);
  535. var c : byte;
  536. begin
  537.   anim_prohod(s_kym);
  538.   repeat
  539.     c:=krok;
  540.     c:=s_kym.krok;
  541.     delay(_stand_pomalost);
  542.   until (not s_kym.hejbe_se and not hejbe_se);
  543. end;
  544.  
  545. procedure typ_hejbaci_zaklad.anim_prohod(var s_kym : typ_hejbaci_zaklad);
  546. begin
  547.   if addr(self) <> addr(s_kym) then
  548.     begin
  549.       prirad_program(posun_absol(self, s_kym));
  550.       s_kym.prirad_program(posun_absol(s_kym, self));
  551.     end;
  552. end;
  553.  
  554. procedure typ_hejbaci_zaklad.hejbej(var cesta);
  555. begin
  556.   repeat until (stav and __pohyb) = 0; {pokud se objekt hejbe, nelze dale}
  557.     begin
  558.       _cisti_program;
  559.       prirad_program(vytvor_program(cesta));
  560.     end;
  561. end;
  562.  
  563. function typ_hejbaci_zaklad.hejbe_se : boolean;
  564. begin
  565.   hejbe_se := (stav and __pohyb) <> 0;
  566. end;
  567.  
  568.  
  569. procedure typ_hejbaci_zaklad.prirad_program(_program : ptr_to_program);
  570. begin
  571.   stop;
  572.   if co_delat.kam = nil then
  573.     begin
  574.       co_delat.gde   := 0;
  575.       co_delat.kam   := _program;
  576.     end;
  577.   rozbeh;
  578. end;
  579.  
  580. procedure typ_hejbaci_zaklad.vm0;  begin end;
  581. procedure typ_hejbaci_zaklad.vm1;  begin end;
  582. procedure typ_hejbaci_zaklad.vm2;  begin end;
  583. procedure typ_hejbaci_zaklad.vm3;  begin end;
  584. procedure typ_hejbaci_zaklad.vm4;  begin end;
  585. procedure typ_hejbaci_zaklad.vm5;  begin end;
  586. procedure typ_hejbaci_zaklad.vm6;  begin end;
  587. procedure typ_hejbaci_zaklad.vm7;  begin end;
  588. procedure typ_hejbaci_zaklad.vm8;  begin end;
  589. procedure typ_hejbaci_zaklad.vm9;  begin end;
  590. procedure typ_hejbaci_zaklad.vm10; begin end;
  591. procedure typ_hejbaci_zaklad.vm11; begin end;
  592. procedure typ_hejbaci_zaklad.vm12; begin end;
  593. procedure typ_hejbaci_zaklad.vm13; begin end;
  594. procedure typ_hejbaci_zaklad.vm14; begin end;
  595. procedure typ_hejbaci_zaklad.vm15; begin end;
  596.  
  597. function typ_hejbaci_zaklad.krok : byte;
  598. label konec, nespro, hejbat, neni_pohyb, na_until;
  599. const pomtab : array[0..3]of typ_souradnic = (0, -1, 1, 0);
  600. var pom : ptr_typ_instrukci;
  601.     rozh, _pom : byte;
  602.     opakovat : byte;
  603.     __x, __y, __z : typ_souradnic;
  604. begin
  605.   krok     := 0;
  606.   opakovat := 1;
  607.   asm
  608.                   les di, self
  609.                   test es:[di].stav, __pohyb
  610.                   jz konec                 { objekt stoji natvrdo }
  611.  
  612.                   cmp es:[di].prodleva, 0
  613.                   jz hejbat
  614.                   dec es:[di].prodleva     { objekt jeste ceka na dalsi krok }
  615.                   jmp konec
  616.  
  617.           hejbat: cmp es:[di].pomalost, 0
  618.                   jz nespro
  619.                   mov al, es:[di].pomalost { je nastavena pomalost }
  620.                   mov es:[di].prodleva, al
  621.   end;
  622.   repeat
  623.   asm
  624.                   les di, self
  625.           nespro: mov bx, es:[di].co_delat.gde
  626.                   les di, es:[di].co_delat.kam
  627.                   lea di, typ_programu([di]).cesta[bx]
  628.                   inc di
  629.                   mov word ptr pom, di
  630.                   dec di
  631.                   mov word ptr pom+2, es
  632.                   mov al, es:[di]
  633.                   mov rozh, al
  634.  
  635.                   dec opakovat
  636.  
  637.                   test al, 0c0h
  638.                   jnz neni_pohyb
  639.                     { tady jsou instrukce, tj _l, _r, _u, _d, .... }
  640.   end;            inc(co_delat.gde);
  641.  
  642.                   __x := pomtab[(rozh and (unhejb.l or unhejb.r)) shr 4];
  643.                   __y := pomtab[(rozh and (unhejb.u or unhejb.d)) shr 2];
  644.                   __z := pomtab[rozh and (unhejb.f or unhejb.b)];
  645. {                  if (rozh and (unhejb.l or unhejb.r)) <> 0 then
  646.                     __x := ((rozh and (unhejb.l or unhejb.r)) shr 3 - 3);
  647.                   if (rozh and (unhejb.u or unhejb.d)) <> 0 then
  648.                     __y := ((rozh and (unhejb.u or unhejb.d)) shr 1 - 3);
  649.                   if (rozh and (unhejb.f or unhejb.b)) <> 0 then
  650.                     __z := ((rozh and (unhejb.f or unhejb.b)) shl 1 - 3);
  651.  }
  652.                   presun_rel(__x, __y, __z);
  653.  
  654.  
  655.   asm             jmp na_until;
  656.   end;
  657.    neni_pohyb :
  658.   _pom := rozh and $f0;
  659.   rozh := rozh and $0f;
  660.   case _pom of
  661.     __skoky  : begin
  662.                  inc(opakovat);
  663.                  case rozh of
  664.                    jmpa0 and $0f : co_delat.gde := 0;
  665.                    jmpa  and $0f : co_delat.gde := pom^[0];
  666.                    jmpr  and $0f : co_delat.gde := co_delat.gde+
  667.                                          shortint(pom^[0]);
  668.  
  669.                  end;
  670.                end;
  671.     __end    : begin
  672.                  krok := 255;
  673.                  case rozh of
  674.                    endc and $0f : begin _cisti_program end;
  675.                    endp and $0f : konec_pohybu
  676.                  end;
  677.                end;
  678.     __presuny: case rozh of
  679.                  xyz  and $0f: begin
  680.                           presun(byte(pom^[0]),
  681.                                  byte(pom^[1]),
  682.                                  byte(pom^[2]));
  683.                           inc(co_delat.gde,3);
  684.                       end;
  685.                  xyzr and $0f: begin
  686.                           presun_rel(shortint(pom^[0]),
  687.                                      shortint(pom^[1]),
  688.                                      shortint(pom^[2]));
  689.                           inc(co_delat.gde,4);
  690.                         end;
  691.                end;
  692.     __vm    : begin
  693.                 inc(co_delat.gde);
  694.                 case rozh of
  695.                   unhejb.vm0  and $0f : vm0;
  696.                   unhejb.vm1  and $0f : vm1;
  697.                   unhejb.vm2  and $0f : vm2;
  698.                   unhejb.vm3  and $0f : vm3;
  699.                   unhejb.vm4  and $0f : vm4;
  700.                   unhejb.vm5  and $0f : vm5;
  701.                   unhejb.vm6  and $0f : vm6;
  702.                   unhejb.vm7  and $0f : vm7;
  703.                   unhejb.vm8  and $0f : vm8;
  704.                   unhejb.vm9  and $0f : vm9;
  705.                   unhejb.vm10 and $0f : vm10;
  706.                   unhejb.vm11 and $0f : vm11;
  707.                   unhejb.vm12 and $0f : vm12;
  708.                   unhejb.vm13 and $0f : vm13;
  709.                   unhejb.vm14 and $0f : vm14;
  710.                   unhejb.vm15 and $0f : vm15;
  711.                end;
  712.              end;
  713.     __rizeni : begin
  714. {                 inc(opakovat);}
  715.                  inc(co_delat.gde, 2);   { instrukce + parametr }
  716.                  case rozh of
  717.                    spor and $0f: begin _pom := byte(shortint(pom^[0])+pomalost);
  718.                                  if _pom < 0 then _pom := 0;
  719.                                  pomalost := _pom end;
  720.                    spoa and $0f: pomalost := pom^[0];
  721.                    sprr and $0f: begin _pom := byte(shortint(pom^[0])+prodleva);
  722.                                  if _pom < 0 then _pom := 0;
  723.                                  prodleva := _pom end;
  724.                    spra and $0f: prodleva := pom^[0];
  725.                    scor and $0f: set_barva(byte(shortint(pom^[0])+barva));
  726.                    scoa and $0f: set_barva(pom^[0]);
  727.                    rep and $0f :
  728.                                   inc(opakovat, byte(pom^[0]));
  729.                    scob and $0f: set_barva(byte(shortint(pom^[0])+barva) mod 15);
  730.                  end;
  731.                end;
  732.    end;
  733.    na_until:
  734.    until opakovat = 0;
  735.    konec:
  736. end;
  737.  
  738. procedure typ_hejbaci_zaklad.konec_pohybu;
  739. begin        {!!!!}
  740.   stav := stav and (not __pohyb);
  741. end;
  742.  
  743. procedure typ_hejbaci_zaklad._cisti_program;
  744. begin
  745.   if co_delat.kam <> nil then
  746.     begin
  747.       freemem(co_delat.kam, co_delat.kam^.kolik+4);
  748.     end;
  749.   stav := (not __pohyb) and stav;
  750.   co_delat.gde := 0;
  751.   co_delat.kam := nil
  752. end;
  753.  
  754.  
  755.  
  756.  
  757. { ************************************************************************* }
  758. { ************************************************************************* }
  759.  
  760. constructor typ_hejbaci.init;
  761. begin
  762.   typ_hejbaci_zaklad.init;
  763.   tvar := nil;
  764. end;
  765.  
  766. destructor typ_hejbaci.zrus;
  767. begin
  768.   typ_hejbaci_zaklad.zrus;
  769.   _cisti_tvar;
  770. end;
  771.  
  772. procedure typ_hejbaci.prirad(var prvek : typ_hejbaci);
  773. begin
  774.   konec_pohybu;
  775.   _cisti_tvar;
  776.   self := prvek;
  777.   stav := 0;
  778.   co_delat.kam := nil;
  779.  
  780.   getmem(tvar, prvek.tvar^.pamet*sizeof(typ_ob_bodu)+2);
  781.   move(prvek.tvar^,tvar^,prvek.tvar^.pamet*sizeof(typ_ob_bodu)+2);
  782.   stav := stav or __existuje_tvar;
  783. end;
  784.  
  785. procedure typ_hejbaci.set_barva(_c : byte);
  786. var i : integer;
  787. begin
  788.   if tvar <> nil then
  789.     begin
  790.       for i := 0 to tvar^.pamet -1 do tvar^.tvar[i].obsah := _c;
  791.       barva := _c;
  792.       obnov;
  793.     end;
  794. end;
  795.  
  796. procedure typ_hejbaci._get_mem_tvar(__kolik : word);
  797. var i : word;
  798. begin
  799.   _cisti_tvar;
  800.   getmem(tvar, __kolik*sizeof(typ_ob_bodu)+2);
  801.   tvar^.pamet := __kolik;
  802.   __nula3d.z  := poloha.z;
  803.   __nula3d.obsah := barva;
  804.   for i := 0 to __kolik - 1 do tvar^.tvar[i] := __nula3d;
  805.   stav := stav or __existuje_tvar;
  806. end;
  807.  
  808. procedure typ_hejbaci.prirad_tvar(var _tvar : typ_tvar);
  809. begin
  810.   _cisti_tvar;
  811.   getmem(tvar, _tvar.pamet*sizeof(typ_ob_bodu)+2);
  812.   move(_tvar,tvar^,_tvar.pamet*sizeof(typ_ob_bodu)+2);
  813.   stav := stav or __existuje_tvar;
  814. end;
  815.  
  816. procedure typ_hejbaci._cisti_tvar;
  817. begin
  818.   stav := stav and (not __existuje_tvar);
  819.   if tvar <> nil then
  820.     begin
  821.       zhasni;
  822.       freemem(tvar, tvar^.pamet*sizeof(typ_ob_bodu)+2);
  823.     end;
  824.   tvar := nil;
  825. end;
  826.  
  827. function typ_hejbaci.dej_bod(kterej : word) : typ_bod_3d;
  828. begin
  829.   if kterej < tvar^.pamet
  830.     then dej_bod := @tvar^.tvar[kterej]
  831.     else dej_bod := nil;
  832. end;
  833.  
  834. procedure typ_hejbaci.set_bod(kterej : word; co : bod_fyz_obrazu);
  835. begin
  836.   if kterej < tvar^.pamet
  837.     then tvar^.tvar[kterej].obsah := co;;
  838. end;
  839.  
  840. procedure typ_hejbaci.set_bod_znak(kterej : word; znak : char);
  841. begin
  842.   if kterej < tvar^.pamet
  843.     then tvar^.tvar[kterej].obsah := byte(znak);;
  844. end;
  845.  
  846. procedure typ_hejbaci.set_bod_barva(kterej : word; barvan : byte);
  847. begin
  848.   if kterej < tvar^.pamet
  849.     then tvar^.tvar[kterej].obsah := barvan;;
  850. end;
  851.  
  852. procedure typ_hejbaci.set_bod_z(kterej : word; z : typ_souradnic);
  853. begin
  854.   if kterej < tvar^.pamet
  855.     then tvar^.tvar[kterej].z := z;;
  856. end;
  857.  
  858. function typ_hejbaci.obsazeno : word;
  859. begin
  860.   obsazeno := tvar^.pamet
  861. end;
  862.  
  863. function typ_hejbaci.je_tvar : boolean;
  864. begin
  865.   je_tvar := tvar <> nil;
  866. end;
  867.  
  868. procedure typ_hejbaci._zhasni; {vyrusi objekt z jeho mista }
  869. label dalsi_bod;
  870. var pom     : typ_bod_3d;
  871.     x, y, k : typ_souradnic;
  872. begin
  873.   asm          les di, self
  874.                les di, es:[di].tvar
  875.                mov ax, es:typ_tvar([di]).pamet
  876.                and ax, $7f
  877.  
  878.                lea di, es:typ_tvar([di]).tvar
  879.                mov word ptr pom,   di
  880.                mov word ptr pom+2, es
  881.  
  882.                les di, self
  883.                mov ah, es:[di].poloha.x
  884.                mov x,  ah
  885.  
  886.                add al, ah
  887.                mov k,  al
  888.  
  889.                mov al, es:[di].poloha.y
  890.                mov y,  al
  891.  
  892.   dalsi_bod:   les di, self
  893.                mov al, es:[di].poloha.z
  894.                les di, pom
  895.                mov es:typ_ob_bodu([di]).z, al
  896.  
  897.   end;
  898.                obrazovka.zhasni_bod_xy(x, y, pom);
  899.   asm
  900.                inc x
  901.                add word ptr pom, pamet_bod_3d
  902.  
  903.                mov al, x
  904.                cmp al, k
  905.                jl dalsi_bod
  906.   end;
  907. end;
  908.  
  909. procedure typ_hejbaci._zobraz; {zobrazi natvrdo objekt na jeho misto }
  910. label dalsi_bod;
  911. var pom     : typ_bod_3d;
  912.     x, y, k : typ_souradnic;
  913. begin
  914.   asm          les di, self
  915.                les di, es:[di].tvar
  916.                mov ax, es:typ_tvar([di]).pamet
  917.                and ax, $7f
  918.  
  919.                lea di, es:typ_tvar([di]).tvar
  920.                mov word ptr pom,   di
  921.                mov word ptr pom+2, es
  922.  
  923.                les di, self
  924.                mov ah, es:[di].poloha.x
  925.                mov x,  ah
  926.  
  927.                add al, ah
  928.                mov k,  al
  929.  
  930.                mov al, es:[di].poloha.y
  931.                mov y,  al
  932.  
  933.   dalsi_bod:   les di, self
  934.                mov al, es:[di].poloha.z
  935.                les di, pom
  936.                mov es:typ_ob_bodu([di]).z, al
  937.  
  938.   end;
  939.                obrazovka.zobraz_bod_xy(x, y, pom);
  940.   asm
  941.                inc x
  942.                add word ptr pom, pamet_bod_3d
  943.  
  944.                mov al, x
  945.                cmp al, k
  946.                jl dalsi_bod
  947.   end;
  948. end;
  949. { ************************************************************************* }
  950. { ************************************************************************* }
  951.  
  952. function posun_absol(var o1, o2 : typ_hejbaci_zaklad) : ptr_to_program;
  953. begin
  954.   posun_absol := posun_rel_xyz( o2.poloha.x - o1.poloha.x,
  955.                                 o2.poloha.y - o1.poloha.y,
  956.                                 o2.poloha.z - o1.poloha.z);
  957. end;
  958.  
  959. function posun_absol_xyz(var o : typ_hejbaci_zaklad; x, y, z : typ_souradnic) : ptr_to_program;
  960.  { vytvo⌐í cesty pro posun objektu na dané sou⌐adnice }
  961. var x1, y1, z1, i : integer;
  962. begin
  963.   posun_absol_xyz := posun_rel_xyz(x - o.poloha.x, y - o.poloha.y, z - o.poloha.z);
  964. end;
  965.  
  966. function posun_rel_xyz(x, y, z : typ_souradnic) : ptr_to_program;
  967.  { vytvo⌐í cesty pro posun objektu o dané sou⌐adnice }
  968. var i, pamet : integer;
  969.     pomprog  : ptr_to_program;
  970.     sigx, sigy, sigz : byte;
  971.     _min, _min1 : typ_souradnic;
  972.  
  973.   function sig(hodnota : typ_souradnic) : byte;
  974.   begin
  975.     if hodnota > 0 then sig := 2 else sig := 1;
  976.     if hodnota = 0 then sig := 0;
  977.   end;
  978.  
  979.  
  980.   function fmin(j, d : typ_souradnic) : typ_souradnic;
  981.   begin
  982.     if j < d then fmin := j else fmin := d;
  983.   end;
  984.  
  985. begin
  986.   pamet := abs(x)+abs(y)+abs(z)+5;
  987.   getmem(pomprog, pamet);
  988.   pomprog^.kolik := pamet-4;
  989.  
  990.   sigx := sig(x) shl 4;
  991.   sigy := sig(y) shl 2;
  992.   sigz := sig(z);
  993.   x := abs(x);
  994.   y := abs(y);
  995.   z := abs(z);
  996.   i := 0;
  997.  
  998.   _min := fmin(fmin(x, y), fmin(y, z));
  999.   for i := 0 to _min-1 do pomprog^.cesta[i] := sigx+sigy+sigz;
  1000.   dec(x, _min);
  1001.   dec(y, _min);
  1002.   dec(z, _min);
  1003.   if x = 0 then
  1004.     begin
  1005.       _min1 := fmin(y, z);
  1006.       for i := _min to _min+_min1-1 do pomprog^.cesta[i] := sigy+sigz;
  1007.       dec(y, _min1);
  1008.       dec(z, _min1)
  1009.     end
  1010.   else
  1011.   if y = 0 then
  1012.     begin
  1013.       _min1 := fmin(x, z);
  1014.       for i := _min to _min+_min1-1 do pomprog^.cesta[i] := sigx+sigz;
  1015.       dec(x, _min1);
  1016.       dec(z, _min1)
  1017.     end
  1018.   else
  1019.   if z = 0 then
  1020.     begin
  1021.       _min1 := fmin(x, y);
  1022.       for i := _min to _min+_min1-1 do pomprog^.cesta[i] := sigx+sigy;
  1023.       dec(x, _min1);
  1024.       dec(y, _min1)
  1025.     end;
  1026.  
  1027.   if x <> 0 then for i := _min+_min1 to _min+_min1+x-1 do pomprog^.cesta[i] := sigx;
  1028.   if y <> 0 then for i := _min+_min1 to _min+_min1+y-1 do pomprog^.cesta[i] := sigy;
  1029.   if z <> 0 then for i := _min+_min1 to _min+_min1+z-1 do pomprog^.cesta[i] := sigz;
  1030.   if i <> 0 then inc(i);
  1031.  
  1032.   pomprog^.cesta[i] := endc;
  1033.   posun_rel_xyz := pomprog;
  1034. end;
  1035.  
  1036. function vytvor_program(var cesta) : ptr_to_program;
  1037. var a : ptr_to_program;
  1038.     i : byte;
  1039. begin
  1040.   i := 0;
  1041.   if typ_instrukci(cesta)[i] <> endc
  1042.     then repeat inc(i) until typ_instrukci(cesta)[i] = endc;
  1043.   getmem(a, i+4);
  1044.   a^.kolik := i;
  1045.  
  1046.   for i := 0 to a^.kolik do {prepis instrukce do dyn. pameti       }
  1047.     a^.cesta[i] := typ_instrukci(cesta)[i];
  1048.   vytvor_program := a;
  1049. end;
  1050.  
  1051.  
  1052. function hezky_rozmistit(k : integer):ptr_tsou_3d;
  1053. begin
  1054.   hezky_rozmistit := @___bod;
  1055.   ___bod.z := (k-1) div 10 * 2;
  1056.   ___bod.x := 20+((k-1) mod 10 * 6)-___bod.z;
  1057.   ___bod.y := 1+___bod.z;
  1058. end;
  1059.  
  1060. procedure konec;
  1061. var i : integer;
  1062.   obj : typ_co_se_hejbe;
  1063.  
  1064. begin
  1065.   obrazovka.skoncuj;
  1066.   (*stop_intr;
  1067.   obrazovka.skoncuj;
  1068.   while (hejbobj <> nil) do
  1069.     begin
  1070.       obj := hejbobj^.dalsi;
  1071. {      hejbobj^.pohyb^.stav := hejbobj^.pohyb^.stav
  1072.                          and ($ff xor __je_v_seznamu);}
  1073.       hejbobj^.pohyb^._cisti_program;
  1074.       dispose(hejbobj);
  1075.       hejbobj := obj
  1076.     end;
  1077.   *)
  1078. end;
  1079.  
  1080. begin
  1081. end.
  1082.  
  1083.  
  1084. (*procedure zapni_timer;
  1085. label makejint, _stavhejbcs, pryc, nemakat, stara_rutina;
  1086. const __pro_pre = $01;
  1087. begin
  1088.  
  1089.   asm
  1090.                  mov di, seg __timer
  1091.                  mov es, di
  1092.                  lea di, __timer
  1093.  
  1094.                  or typ_hejb_fronta_intr(es:[di]).__stav, __na_int { zapnuto }
  1095.  
  1096.                  lea ax, makejint
  1097.                  mov word ptr typ_hejb_fronta_intr(es:[di]).nove_intr, ax
  1098.                  mov ax, seg makejint     { addrmakejint }
  1099.                  mov word ptr typ_hejb_fronta_intr(es:[di]).nove_intr+2, ax
  1100.  
  1101.                   { tohle je pitomÿ, ale v tp 7.0 to nejde jinak }
  1102.                   { adresa rutiny se zapisuje p⌐ímo do instrukce }
  1103.                  mov ax, word ptr typ_hejb_fronta_intr(es:[di]).stare_intr
  1104.                  mov word ptr makejint+2, ax
  1105.                  mov ax, word ptr typ_hejb_fronta_intr(es:[di]).stare_intr+2
  1106.                  mov word ptr makejint+4, ax
  1107.  
  1108.                  mov byte ptr _stavhejbcs, 0
  1109.  
  1110.                  jmp pryc
  1111.  
  1112.  
  1113.  
  1114.  
  1115.  
  1116.        makejint:{ pushf
  1117.                  call cs: far [stara_rutina]
  1118.                  }
  1119.                  cli
  1120.                 test byte ptr _stavhejbcs, __pro_pre
  1121.                  jnz  nemakat
  1122.                  or   byte ptr _stavhejbcs, __pro_pre
  1123.  
  1124.                  push ax
  1125.                  push bx
  1126.                  push cx
  1127.                  push dx
  1128.  
  1129.                  push si
  1130.                  push di
  1131.  
  1132.                  push ds
  1133.                  push es
  1134.  
  1135.                  push bp
  1136.  
  1137.                  mov ax, seg @data
  1138.                  mov ds, ax
  1139.  
  1140.        end;      __timer._makej;
  1141.        asm
  1142.  
  1143.                  pop bp
  1144.  
  1145.                  pop es
  1146.                  pop ds
  1147.  
  1148.                  pop di
  1149.                  pop si
  1150.  
  1151.                  pop dx
  1152.                  pop cx
  1153.                  pop bx
  1154.                  pop ax
  1155.  
  1156.              and byte ptr _stavhejbcs, 0ffh xor __pro_pre
  1157.  
  1158. {                 jmp stara_rutina}
  1159.  
  1160.  
  1161.         nemakat: sti
  1162.          iret
  1163.  
  1164.     _stavhejbcs:  db 0
  1165.     stara_rutina: dd 0
  1166.  
  1167.  
  1168.        end;
  1169.   pryc :
  1170. end;
  1171. *)
  1172. {procedure makejint; interrupt;
  1173. label nemakat;
  1174. begin
  1175.   asm
  1176.     test _stavhejb, __pro_pre_timer
  1177.     jnz  nemakat
  1178.     or   _stavhejb, __pro_pre_timer
  1179.   end;
  1180.     __timer._makej;
  1181.   asm
  1182.     mov al, __pro_pre_timer
  1183.     xor al, 0ffh
  1184.     and _stavhejb, al
  1185.   end;
  1186. nemakat:
  1187. end;
  1188. }
  1189.