program kraluk – královský úkol 0 obsah a · 2010. 6. 26. · 0 obsah program kraluk...

256
Program kraluk – Královský úkol 0.8.2 Miroslav Olšák www.olsak.net/kraluk.html 0 Obsah 1 Rozdělení zdrojových textů ....................................................... 6 A Knihovna pomocných funkcí ...................................................... 7 2 Modul types ...................................................................... 7 3 Modul warning ................................................................... 8 warning ... 8, error ... 8, gargc ... 8, gargv ... 8, mymalloc ... 8 4 Modul defaults ................................................................... 9 NAHORU ... 9, DOLU ... 9, VLEVO ... 9, VPRAVO ... 9, LENA ... 9, PRANA ... 9, PRADO ... 9, LEDO ... 9, KEY_ESC ... 9, KEY_TAB ... 9, KEY_ENTER ... 9, KEY_SPACE ... 9, KEY_UP ... 9, KEY_LEFT ... 9, KEY_RIGHT ... 9, KEY_DOWN ... 9, KEY_BACKSPACE ... 9, KEY_DELETE ... 9, KEY_HOME ... 9, KEY_END ... 9, kql_defaults ... 9, DATADIR_LOCAL ... 9, DATADIR ... 9, IDIR ... 9, IMGDIR ... 9, MAPDIR ... 9, BGDIR ... 9, ANIPDIR ... 10, INHOMEDIR ... 10, IMGSUFFIX ... 10, MAPSUFFIX ... 10, SAVESUFFIX ... 10, SAVELAST ... 10, SAVECONF ... 10, UPSTR ... 10, DOWNSTR ... 10, LEFTSTR ... 10, RIGHTSTR ... 10, ANIPSTR ... 10, LANGCAT ... 10, LANGDIR ... 10, LANGFILE ... 10, INPUTSUFFIX ... 10, OUTPUTSUFFIX ... 10, WINDOW_NAME ... 10, ICON_NAME ... 10, DEF_POP_SIRKA ... 10, DEF_POP_VYSKA ... 10, DEF_POP_X ... 10, DEF_POP_Y ... 10, MINRATIO ... 10, MAXRATIO ... 10 5 Modul pin ....................................................................... 11 kq_pin ... 11, PINPOINTER ... 11, PININT ... 11, PINNULL ... 11, pinpointer ... 11, pinint ... 11, pinnull ... 12, spustsparem ... 12 6 Modul mystring ................................................................. 12 6.1 Nekonečný string ............................................................ 12 kq_string ... 12, STRDELKA ... 12, initstr ... 12, zapisznak ... 12, zestringuj ... 13, smazstr ... 13 6.2 Další operace se stringy ....................................................... 13 dupnstr ... 13, dupstr ... 14, joinstrings ... 14, zmensipism ... 14, upravstring ... 14 7 Modul list ....................................................................... 15 kq_list ... 15, delkaL ... 15, addPdoL ... 15, addIdoL ... 15, LdoPA ... 16, LdoIA ... 16, smazlist ... 16 8 Modul hash ...................................................................... 16 WORD ... 17, WORDPART ... 17, WORDCAT ... 17, BINDTEXT ... 17, BINDWIN ... 17, OUTPUT ... 17, OTHERHASH ... 17, hashtable ... 17, HASHSIZE ... 17, inithash ... 17, hashfunc ... 18, hash_add ... 18, uklid ... 18, hash_find ... 19 9 Modul bindings .................................................................. 19 keybind ... 19, dobind ... 19, addbind ... 19, addgbind ... 20, initbindings ... 20, grestart ... 21, popup_help ... 21, zmensmer ... 21, ovlpost ... 21 10 Modul X ........................................................................ 22 display ... 22, screen ... 22, display_sirka ... 22, display_vyska ... 22, depth ... 22, text_gc ... 22, ggc ... 22, root ... 22, initX ... 22, kreslianim ... 22, mengraf ... 22 11 Modul keyboard ................................................................. 22 initklav ... 22, xic ... 22, xkeyznak ... 23 12 Modul loop ...................................................................... 24 loop ... 24, cekalose ... 25, udalosti ... 25, vter ... 25, uvter ... 25, setdelay ... 25, setFPSs ... 26, FPSs ... 26, aktuFPS ... 26, maxFPS ... 26, zmenFPS ... 26 13 Modul timer ..................................................................... 27 kq_timer ... 27, aktutimer ... 28, zjistitimer ... 28, zaradtimer ... 29, vyradtimer ... 29, dotimers ... 30, zmentimer ... 30, pausetimer ... 31, unpausetimer ... 31, 1

Upload: others

Post on 09-Feb-2021

2 views

Category:

Documents


0 download

TRANSCRIPT

  • Program kraluk – Královský úkol

    0.8.2

    Miroslav Olšák

    www.olsak.net/kraluk.html

    0 Obsah

    1 Rozdělení zdrojových textů . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

    A Knihovna pomocných funkcí . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 Modul types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 Modul warning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

    warning . . . 8, error . . . 8, gargc . . . 8, gargv . . . 8, mymalloc . . . 84 Modul defaults . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

    NAHORU . . . 9, DOLU . . . 9, VLEVO . . . 9, VPRAVO . . . 9, LENA . . . 9, PRANA . . . 9, PRADO . . . 9,LEDO . . . 9, KEY_ESC . . . 9, KEY_TAB . . . 9, KEY_ENTER . . . 9, KEY_SPACE . . . 9, KEY_UP . . . 9,KEY_LEFT . . . 9, KEY_RIGHT . . . 9, KEY_DOWN . . . 9, KEY_BACKSPACE . . . 9, KEY_DELETE . . . 9,KEY_HOME . . . 9, KEY_END . . . 9, kql_defaults . . . 9, DATADIR_LOCAL . . . 9, DATADIR . . . 9,IDIR . . . 9, IMGDIR . . . 9, MAPDIR . . . 9, BGDIR . . . 9, ANIPDIR . . . 10, INHOMEDIR . . . 10,IMGSUFFIX . . . 10, MAPSUFFIX . . . 10, SAVESUFFIX . . . 10, SAVELAST . . . 10, SAVECONF . . . 10,UPSTR . . . 10, DOWNSTR . . . 10, LEFTSTR . . . 10, RIGHTSTR . . . 10, ANIPSTR . . . 10,LANGCAT . . . 10, LANGDIR . . . 10, LANGFILE . . . 10, INPUTSUFFIX . . . 10, OUTPUTSUFFIX . . . 10,WINDOW_NAME . . . 10, ICON_NAME . . . 10, DEF_POP_SIRKA . . . 10, DEF_POP_VYSKA . . . 10,DEF_POP_X . . . 10, DEF_POP_Y . . . 10, MINRATIO . . .10, MAXRATIO . . . 10

    5 Modul pin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11kq_pin . . . 11, PINPOINTER . . . 11, PININT . . . 11, PINNULL . . . 11, pinpointer . . . 11,pinint . . . 11, pinnull . . .12, spustsparem . . . 12

    6 Modul mystring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126.1 Nekonečný string . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12kq_string . . . 12, STRDELKA . . . 12, initstr . . . 12, zapisznak . . . 12, zestringuj . . . 13,smazstr . . . 136.2 Další operace se stringy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13dupnstr . . . 13, dupstr . . .14, joinstrings . . . 14, zmensipism . . . 14, upravstring . . . 14

    7 Modul list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15kq_list . . . 15, delkaL . . . 15, addPdoL . . .15, addIdoL . . . 15, LdoPA . . . 16, LdoIA . . . 16,smazlist . . . 16

    8 Modul hash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16WORD . . . 17, WORDPART . . . 17, WORDCAT . . . 17, BINDTEXT . . . 17, BINDWIN . . . 17,OUTPUT . . . 17, OTHERHASH . . . 17, hashtable . . . 17, HASHSIZE . . . 17, inithash . . . 17,hashfunc . . . 18, hash_add . . . 18, uklid . . . 18, hash_find . . . 19

    9 Modul bindings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19keybind . . . 19, dobind . . . 19, addbind . . . 19, addgbind . . . 20, initbindings . . . 20,grestart . . . 21, popup_help . . . 21, zmensmer . . .21, ovlpost . . . 21

    10 Modul X . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22display . . . 22, screen . . . 22, display_sirka . . . 22, display_vyska . . . 22, depth . . . 22,text_gc . . . 22, ggc . . . 22, root . . . 22, initX . . . 22, kreslianim . . . 22, mengraf . . . 22

    11 Modul keyboard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22initklav . . . 22, xic . . . 22, xkeyznak . . . 23

    12 Modul loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24loop . . . 24, cekalose . . . 25, udalosti . . .25, vter . . . 25, uvter . . . 25, setdelay . . . 25,setFPSs . . . 26, FPSs . . . 26, aktuFPS . . . 26, maxFPS . . . 26, zmenFPS . . . 26

    13 Modul timer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27kq_timer . . . 27, aktutimer . . . 28, zjistitimer . . . 28, zaradtimer . . . 29, vyradtimer . . . 29,dotimers . . . 30, zmentimer . . . 30, pausetimer . . . 31, unpausetimer . . . 31,

    1

    http://www.olsak.net/kraluk.html

  • 0 Obsah Program kraluk

    deleteltimers . . . 31, deleteAtimers . . . 32, vytvortimer . . . 33, znictimer . . . 33,vypistimer . . . 33, vypistimery . . . 33

    14 Modul pixmap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33nactiXPM . . . 33, ratio . . .33, rescalePixmap . . .34, IMAGRAT . . . 3414.1 kq pixmap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35kq_pixmap . . . 35, prvpix . . . 36, PIX_VYS . . . 36, PIX_SIR . . . 36, nactikqXPM . . . 36,freekqPixmap . . . 36, deletelpixmaps . . . 36, deleteApixmaps . . . 37, fix_pix . . . 37,pocet_fixpix . . . 37, fixed_pixmaps . . . 37

    15 Modul window . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37fullscreened . . . 38, OKRAJ . . . 38, win . . . 38, textwin . . . 38, real_win . . . 39,okrajwin . . . 39, real_win_vyska . . . 39, real_win_sirka . . . 39, win_x . . . 39, win_y . . . 39,win_vyska . . . 39, win_sirka . . . 39, text_sirka . . . 39, text_vyska . . . 39, pozadi . . . 39,vytvorokno . . . 39, nastavicon . . . 41, fixujokno . . . 41, okraj_to_win . . . 41,okraj_to_text . . . 41, okrajtext . . . 41, zmenokno . . . 42, velikokno . . . 42, spoctifr . . . 43,fullscreen . . . 43, unfullratio . . . 44

    16 Modul widget . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44kq_widget . . . 44, prvwidget . . . 44, poshidwid . . . 44, hidewidget . . . 44,unhidewidget . . . 45, ukazwidgety . . . 45, vytvorwidget . . . 45, zobrazwidget . . . 46,prestackujd . . . 47, prestackujn . . . 47, prohodwid . . . 47, posunzwidghet . . . 48,posunwidget . . . 48, prebarviwidget . . . 48, znicwidget . . . 49, deletelwidgets . . . 49,deleteAwidgets . . . 50, vypiswidget . . . 50, vypiswidgety . . . 50

    17 Modul filer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51mf_otevri . . . 51, kq_filer . . . 51, mf_znak . . . 51, mf_najdi . . . 52, mf_musibyt . . . 52,mf_cislo . . . 52, mf_error . . . 53, mf_zavri . . . 53

    18 Modul color . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53kq_color . . . 53, spustfb . . . 53, prvbarva . . . 54, pridejbarvu . . . 54

    19 Modul map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54kq_map . . . 54, mappixel . . . 54, nactimapu . . . 5419.1 submap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56mapa . . . 56, kq_submap . . . 56, mapa_z . . . 56, bg_map . . . 56, zmenbgmap . . . 56,vytvorsubmap . . . 57, znicsubmap . . . 57, freesm . . . 57, prvsubmap . . . 58, zaradsubmap . . . 58,vyradsubmap . . . 58, autoreloadmap . . . 58, reloadmap . . . 58, pouzijmapu . . . 59,zrussubmap . . . 59, nejvyssipix . . . 60, smpixel . . . 60, najdibarvu . . . 60, prvhidsm . . . 61,hidesubmap . . . 61, unhidesubmap . . . 61, deletelsubmaps . . . 61, deleteAsubmaps . . . 62,map_xa . . . 62, map_xb . . . 62, map_ya . . . 62, map_yb . . . 62

    20 Modul post . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63kq_postava . . . 63, prvpost . . . 63, post_submap . . . 63, AUTOU_SOUR . . . 64,AUTOU_POST . . . 64, setchytsour . . . 64, setchytpost . . . 64, getchytsour . . . 64,zkuschytit . . . 64, autopost . . . 65, AUTOPRIOR . . . 65, spocti_z . . . 65, post_z . . . 65,hidepost . . . 65, unhidepost . . . 65, deletelposts . . . 66, menpost . . . 66, zmenapost . . . 66,updateposts . . . 66, znicpost . . . 68, deleteAposts . . . 68, posunpost . . . 68, jdipost . . . 69,kq_animpost . . . 70, ANIMPRIOR . . . 71, anip_step . . . 71, nactianip . . . 71, zmenanip . . . 73,freeanip . . . 73, deletelanips . . . 73, deleteAanips . . . 74, fix_anips . . . 74,fixed_anips . . . 74, pocet_fixanips . . . 74

    21 Modul autopost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74randomsmer . . . 74, auto_random . . . 75, primosmer . . . 75, vzdalenost . . . 75,post_vzdal . . . 76, uvnitrmapy . . . 76, jezed . . . 76, obejdized . . . 77, auto_clever . . . 79

    22 Modul input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8022.1 Dešifrování inputu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80provedstr . . . 80, slovo . . . 80, rozeberstr . . . 81, expandvetu . . . 82, provedvetu . . . 82,veta . . . 82, vetnyclen . . .82, jenkat . . . 8322.2 Syntaxe jazyka inputu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84kq_word . . . 86, STDWORD . . . 87, LANGWORD . . . 87, OBJWORD . . . 8722.3 Interpretace načítání inputu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87add_word . . . 87, add_sent . . . 87, prvulslovo . . . 88, aktulslovo . . . 88, pocet_word . . . 88,finishws . . . 88, dfv . . . 88, nactiinput . . . 88, pps . . . 88, pfv . . . 88, startword . . . 88,

    2

  • 0 Obsah Program kraluk

    startsent . . . 88, ctiradky . . . 89, ctiznak . . . 90, ulozslova . . . 90, tus . . . 92,nactikat . . . 92, poslkat . . . 92, katnumber . . . 92, seznamslov . . . 93, wordtohash . . . 94,ulozvetu . . . 95

    23 Modul output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98kq_output . . . 98, outputstring . . . 9823.1 Vyskakovací output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99popupoutput . . . 99, popup_info . . . 99, popupwarning . . . 9923.2 Načítání outputu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100nactioutput . . . 101

    24 Modul languages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103prvlang . . . 103, aktulang . . . 103, jazslova . . . 105, startlang . . . 105, zmenlang . . . 105,zrusjazyk . . . 106, freeoutputs . . . 106, freeword . . . 106, freesents . . . 107,prepnilang . . . 107, zobrazjazyky . . . 108

    25 Modul edit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108editpole . . . 108, text_pole . . . 108, delka . . . 108, loadfont . . . 109, FONTNAME . . . 109,font_info . . . 109, kursor_vyska . . . 109, HOT . . . 109, DOT . . . 109, font_y . . . 109,gelka . . . 109, gursor . . . 109, redrawtext . . . 109, cleartext . . . 109, KURSIR . . . 110,ukazkursor . . . 110, smazkursor . . . 110, pripisznak . . . 110, delete . . . 111,posunkursor . . . 111, text_enter . . . 112, prepniokraj . . . 113, posunuti . . . 113,posuntext . . . 113, LOT . . . 113, POT . . . 113, STRKAL . . . 113, STRKAP . . . 11325.1 historie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114history . . . 114, MAXHISTORY . . . 114, poslhist . . . 114, cyklhist . . . 114, aktuhist . . . 114,ulozhist . . . 114, zkoumejhist . . . 115, zalohujtext . . . 115, ocursor . . . 115,odelka . . . 115, ogursor . . . 115, ogelka . . . 115, oposunuti . . . 115, odzaltext . . . 116,dohistory . . . 116, edithist . . . 11625.2 Funkce pro ostatní . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117zmentext . . . 117, textcstr . . . 117, save_hist . . . 117, apply_loaded_hist . . . 118

    26 Modul popup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119loadpopupfont . . . 119, popup_small_font . . . 119, POPUPSMALLFONT . . . 119,popup_big_font . . . 119, POPUPBIGFONT . . . 119, pfont . . . 119, vyberpfont . . . 119,POPUPBIGWIDTH . . . 119, popupstring . . . 119, zalomstring . . . 120, sirka . . . 121,vyska . . . 121, createpwin . . . 121, POPRAMOKR . . . 121, POPRAMSIR . . . 121, POPLOT . . . 121,POPPOT . . . 121, POPHOT . . . 121, POPDOT . . . 121, pwin . . . 121, pgc . . . 121,drawpopup . . . 122, popup_select . . . 122, vytvorpsel . . . 123, zruspsel . . . 123,pstr . . . 123, popvyber . . . 123, aktuselect . . . 123, posunuti . . . 124, spoctivyber . . . 124,selpocet . . . 124, sloupec . . . 124, selsirka . . . 124, selvyska . . . 124,INTERLINESKIP . . . 124, INTERCOLUMNSKIP . . . 124, SELECTOKR . . . 125, oznacsel . . . 125,odoznacsel . . . 125, drawselect . . . 125, clearselect . . . 126, posunselect . . . 126,popup_selpocet . . . 126

    27 Modul home . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127inithome . . . 127, homedir . . . 127, homefopen . . . 127

    28 Moduly save a load . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12728.1 Základní načítací a ukládací funkce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127soubor . . . 127, save_start . . . 127, chyba . . . 127, save_bit . . . 128, byte . . . 128,bpos . . . 128, JEDNA . . . 128, save_end . . . 128, load_start . . . 128, soubor . . . 128,chyba . . . 128, load_bit . . . 129, byte . . . 129, bpos . . . 129, load_end . . . 129,zapiscs . . . 130, cs1 . . . 130, cs1 . . . 130, cs1pos . . . 130, cs1pos . . . 130, cs2 . . . 130,cs2 . . . 130, cs2pos . . . 130, cs2pos . . . 130, check_cs . . . 130, CSL . . . 130,save_cs . . . 131, save_trit . . . 131, load_trit . . . 131, save_unsint . . . 132,load_unsint . . . 132, save_int . . . 133, load_int . . . 133, save_intoddo . . . 133,load_intoddo . . . 134, save_char . . . 134, load_char . . . 134, check_idstr . . . 134,ident_str . . . 135, save_idstr . . . 135, save_string . . . 135, load_string . . . 135,save_float . . . 136, load_float . . . 13628.2 Ukládání vnitřních struktur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136Cislo . . . 136, save_color . . . 137, save_awid . . . 137, save_word . . . 137,save_pixmap . . . 137, save_widget . . . 137, save_submap . . . 137, save_anip . . . 138,

    3

  • 0 Obsah Program kraluk

    save_post . . . 138, save_predmet . . . 138, save_timer . . . 138, save_pol . . . 138,save_pocty . . . 138, pocet_pix . . . 138, pocet_wid . . . 138, pocet_hwid . . . 138,pocet_sm . . . 138, pocet_hsm . . . 138, pocet_anip . . . 138, pocet_post . . . 138,pocet_tim . . . 138, pocet_ptim . . . 138, save_kontexts . . . 139, save_winfo . . . 139,save_widgets . . . 140, save_sminfo . . . 140, save_submaps . . . 140, save_tinfo . . . 140,save_timers . . . 140, save_pixmaps . . . 141, save_anips . . . 141, save_posts . . . 141,save_predmets . . . 142, save_awids . . . 14328.3 Načítání vnitřních struktur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143pocet_pix . . . 143, pocet_wid . . . 143, pocet_hwid . . . 143, pocet_sm . . . 143,pocet_hsm . . . 143, pocet_anip . . . 143, pocet_post . . . 143, pocet_tim . . . 143,pocet_ptim . . . 143, loaded_pixmaps . . . 143, loaded_widgets . . . 143, loaded_hidwids . . . 143,loaded_submaps . . . 143, loaded_bgmap . . . 143, loaded_hidmap . . . 143, loaded_anips . . . 143,loaded_posts . . . 143, loaded_timers . . . 143, loaded_pautims . . . 143,loaded_predmets . . . 143, loaded_pol . . . 143, loaded_apole . . . 143, load_pocty . . . 143,apply_load . . . 146, free_loaded . . . 148, load_kontexts . . . 149, load_word . . . 149,load_pixmaps . . . 150, load_pixmap . . . 150, load_winfo . . . 150, load_widgets . . . 150,load_widget . . . 150, load_sminfo . . . 151, load_submaps . . . 151, load_submap . . . 151,load_anips . . . 151, load_anip . . . 152, load_posts . . . 152, load_post . . . 153,load_predmets . . . 153, load_predmet . . . 154, load_tinfo . . . 154, load_timers . . . 154,load_timer . . . 154, load_pol . . . 154, load_awid . . . 155, load_awids . . . 15528.4 Registrované funkce a proměnné . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155SL_NULL . . . 155, SL_BOOL . . . 155, SL_TRIT . . . 155, SL_CHAR . . . 155, SL_INT . . . 155,SL_FLOAT . . . 155, SL_COLOR . . . 155, SL_PIXMAP . . . 155, SL_WIDGET . . . 155,SL_SUBMAP . . . 155, SL_ANIP . . . 155, SL_POST . . . 155, SL_TIMER . . . 155, SL_POL . . . 155,SL_PREDM . . . 155, SL_WORD . . . 155, SL_AWID . . . 155, SL_FUNC . . . 156, sl_var . . . 156,add_sl_var . . . 156, save_vars . . . 156, load_vars . . . 156, save_pointer . . . 157,load_pointer . . . 157, add_sl_func . . . 157, sl_func . . . 158, save_func . . . 158,load_func . . . 159, init_sl . . . 15928.5 Všechno dohromady . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160save_all . . . 160, load_all . . . 160, save_conf . . . 161, load_conf . . . 161

    29 Modul gsl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162popup_sl . . . 163, gsave . . . 165, gload . . . 165, adresar . . . 165, prectidir . . . 165,fileinfo . . . 166, porovnej . . . 166, filtruj . . . 167, filtrovano . . . 167

    30 Modul animwid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167kq_anim . . . 167, startanimwid . . . 167, animuj . . . 167

    31 Modul pol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168kq_policko . . . 168, globbarva . . . 168, spojpol . . . 168, pol_odchfunc . . . 169,pol_prichfunc . . . 169, pridej_ps . . . 170, prvpol . . . 170, pocet_pol . . . 170,aktupol . . . 170, newpol . . . 170, set_pol . . . 171, vykreslipol . . . 171, prvnipol . . . 172,polvedle . . . 172, kql_square . . . 173, pol_submap . . . 174, pridej_psm . . . 175,pol_submapy . . . 175, pol_postava . . . 175, pridej_pp . . . 175, pol_postavy . . . 176,pol_widget . . . 176, pospw . . . 177, pw_alloc . . . 177, pw_pix . . . 177, pw_wid . . . 177,pw_xy . . . 178, rozdilz . . . 178, pridej_pw . . . 178, PW_ANIM . . . 178, pw_anim . . . 178,pol_widgety . . . 179, animpole . . . 179, vylovpix . . . 180, free_animpole . . . 181

    32 Modul predmet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181kq_predmet . . . 181, prvpredmet . . . 181, inventar . . . 181, zaradpredmet . . . 181,vyradpredmet . . . 181, zmenprnazev . . . 182, vytvorpredmet . . . 182, predmetinv . . . 183,predmetpol . . . 183, predmetnull . . . 183, zobrazpredmet . . . 183, zobrazpredmety . . . 184,zmizpredmet . . . 184, zmizpredmety . . . 184, uzmaspredmet . . . 184, sebralspredmet . . . 184,seberpredmet . . . 184, dosahpredmet . . .185, seberslovo . . . 185, ukazinv . . . 185,koukniinv . . . 186, UINVPOMER . . . 186, UINVSIRKA . . . 186, deleteApredmets . . . 186

    33 Modul misc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187kql_init . . . 187, kql_start . . . 187, restart_func . . . 188, kql_restart . . . 188,kql_exit . . . 188

    34 Modul kql . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189

    B Implementace příběhu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189

    4

  • 0 Obsah Program kraluk

    35 Modul version . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189VERSION . . . 189

    36 Modul kraluk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190main . . . 190, restart . . . 190, panacek . . . 190

    37 Modul kra polic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190pol . . . 190, vzamku1 . . . 191, vzamku2 . . . 191, vdrevchal . . . 191, skala1 . . . 191,skala3 . . . 191, skala2 . . . 191, skal_zebr1 . . . 191, skal_zebr2 . . . 191, peklbrana . . . 191,peklo . . . 191, schody1 . . . 191, schody2 . . . 191, lvi . . . 191, nastavpolicka . . . 191,nullujznak . . . 200, opravvodu . . . 200, opravschody . . . 203, prichpeklo . . . 203,peklohen . . . 203, vytvorcerta . . . 203, chyt_cert . . . 204, odch_hrad . . . 204,odchzebr . . . 204, prichzebr . . . 205

    38 Modul kra input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205vetyslova . . . 205, zemisto . . . 206, prozkoumej . . . 206, okoli . . . 206, znak . . . 206,dvere . . . 206, otevri . . . 207, dvere_tim . . . 207, men_dvere . . . 207, dvere_post . . . 207,zavri . . . 208, strom . . . 208, vylez . . . 208, nastrome . . . 208, slez . . . 209, snez . . . 210,tresne . . . 210, oblec . . . 210, svlec . . . 211, nalej . . . 211, voda . . . 211, vylej . . . 212,mluv . . . 212, smolicek . . . 212, jelen . . . 212, kral . . . 212, bohdanka . . . 212,maruska . . . 212, lada . . . 212, krasomila . . . 212, lotrando . . . 212, bobes . . . 212,krkavci . . . 212, jezislovo . . . 212, jezinky . . . 212, certi . . . 212, lev . . . 212,osoba . . . 212, muz . . . 212, divka . . . 212, zkusmluvit . . . 214, daruj . . . 214,spustzebr . . . 215, seber . . . 215, zapalsvicku . . . 216, domu . . . 216, ukazjaz . . . 217,konec . . . 217

    39 Modul kra barvy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217nactigbarvy . . . 217, zem . . . 218, zed . . . 218, normal_z . . . 218, nuluj_z . . . 218,brodi1 . . . 218, brodi2 . . . 218, brodi3 . . . 218, plave . . . 218, dovody . . . 218,nebvoda1 . . . 219, nebvoda2 . . . 219, nebvoda3 . . . 219, nebvoda4 . . . 219, topise . . . 219,sucho . . . 219, breh . . . 219, paddovody . . . 219, bachakytky . . . 220, most_sm . . . 220,prich_most . . . 220, odch_most . . . 220, teletim . . . 221, teleportuj . . . 221,telepost . . . 221, padejkokos . . . 222, kokpadstep . . . 222, skalopada . . . 222,skalopad1 . . . 223, skalopad2 . . . 223, skalopad3 . . . 223, ohen . . . 223, shor . . . 223,levchyt . . . 224, barvapolic . . . 224, predTV . . . 225

    40 Modul kra jp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225jinapost . . . 225, start_jp . . . 225, dostalkyt . . . 226, dostalsvic . . . 226,makozisek . . . 226, objev_jp . . . 226, chyt_jp . . . 226, continue_jp . . . 226,pysna_random . . . 227, null_jp . . . 227

    41 Modul kra jezin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227prich_jezin . . . 227, auto_jezin . . . 228, jezinsmer . . . 228, jezin_chyt . . . 228,nullosobu . . . 229, prich_jelen . . . 229, jelen_step . . . 229

    42 Modul kra jezibaba . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229startjezi . . . 229, jezibaba . . . 229, JEZI_START_X . . . 229, JEZI_START_Y . . . 229,jezitimer . . . 230, continuejezi . . . 230, jeziprichpol . . . 230, jezilastpol . . . 230,otevridvere . . . 232, jezichyt . . . 232, jezil_x . . . 232, jezil_y . . . 232,JEZI_DOLET_X . . . 232, JEZI_DOLET_Y . . .232, jezinull . . . 233, jezicekej . . . 233,jezichytej . . . 234, houpejzebr . . . 234, houp_step . . . 234, jezishor . . . 234,jezivzdej . . . 234

    43 Modul kra krk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235krkstav . . . 235, prich_krk . . . 235, krksedi . . . 235, krkleti . . . 235, vytvor_krk . . . 235,plasptaky . . . 236, promenujkrk . . . 236, odkrk . . . 236, krk_chyt . . . 236, null_krk . . . 236,prich_bohd . . . 237, odch_bohd . . . 237, zdrchal . . .237

    44 Modul kra provaz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237lvistav . . . 237, provazstep . . . 237, wprovaz . . . 239, prycodzdi . . . 239, privaz . . . 240,kamen . . . 241, posun . . . 241

    45 Modul kra predm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242vytvorpredmety . . . 242, kybl . . . 242, pernicek . . . 242, brneni . . . 242, kokos . . . 242,mkozisek . . . 242, hvezdicka . . . 242, odsmolicka . . . 242, kaminek . . . 242,

    5

  • 1 Rozdělení zdrojových textů Program kraluk

    truhlicka . . . 242, slanka . . . 242, kytka . . . 242, svicka . . . 242, sluchatko . . . 242,princezna . . . 242, zebrik . . . 242

    46 Modul kra animpost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243nactianipy . . . 243, chozeni . . . 243, brnanip . . . 243, vevode1 . . . 243, vevode2 . . . 243,vevode3 . . . 243, plavani . . . 243, topeni . . . 243, padani . . . 243, lezeni . . . 243,privazan . . . 243, teleanip . . . 243, teleanip2 . . . 243, jezianip . . . 243, jezileti . . . 243

    47 Modul kra prom . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243initprom . . . 243

    48 Modul kra save . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244registrujpf . . . 244

    C Rejstříky . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24549 Restřík modulů . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24550 Rejstřík funkcí, struktur a proměnných . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24651 Literatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256

    1 Rozdělení zdrojových textůZdrojové texty jsou rozděleny do modulů. Každý modul řeší pokud možno jednu uzavřenou myš-

    lenku z pohledu programátora. Zdrojové texty každého modulu jsou ve dvou souborech: *.h a *.c.Například zdrojáky modulu hash jsou v souborech hash.h a hash.c. Moduly se kompilují zvlášť dovýsledného *.o (např. hash.o). V závěru se slinkují všechny moduly *.o do výsledného programu.

    Soubory *.c obsahují „soukroméÿ zdrojové texty modulu, zatímco *.h obsahují deklarace pamě-ťových struktur, globálních proměnných a prototypů funkcí, které jsou nejvíce spojeny s daným modulem,ale jsou sdíleny i některými dalšími moduly.

    Dokumentace ke zdrojákům je členěna do kapitol přesně podle jednotlivých modulů, tj. každákapitola popisuje jeden modul. Dokumentace je zapsána v souborech *.d (například hash.d). Tytosoubory jsou (společně s *.h a *.c) čteny TEXem a je z nich vytvořen PDF soubor, který právě čtete.

    Moduly programu jsou rozděleny do dvou skupin: A. knihovna pomocných funkcí a B. implemen-tace příběhu. Pokud chce někdo vdechnout hře jiný příběh, použije funkce a datové struktury z prvnískupiny a inspiruje se, jak jsou tyto funkce zde použity ve skupině druhé.

    Moduly jsou zde seřazeny od základních či pomocných funkcí k funkcím složitějším, které používajípředchozí funkce. Dokumentace se ale dá číst i od konce, protože jednotlivé výskyty funkcí, proměnnýcha struktur jsou prolinkovány (v PDF souboru je to klikací).

    A. knihovna pomocných funkcí2. types . . . . . . . . . . . . typedef některých struktur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73. warning . . . . . . . . . . funkce pro varující a chybové hlášky . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84. defaults . . . . . . . . .výchozí hodnoty programu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95. pin . . . . . . . . . . . . . .deklarace typu kq_pin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116. mystring . . . . . . . . . stringy neomezené délky a operace se stringy . . . . . . . . . . . . . . . . . . . . . . . 127. list . . . . . . . . . . . . . jednoduchý zásobník . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158. hash . . . . . . . . . . . . .vyhledávání ve slovníku . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169. bindings . . . . . . . . .klávesové zkratky . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1910. X . . . . . . . . . . . . . . . .nízkoúrovňové funkce spolupracující s X . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2211. keyboard . . . . . . . . .vstup z klávesnice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2212. loop . . . . . . . . . . . . .hlavní smyčka programu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2413. timer . . . . . . . . . . . . časovač programu (Xlib neimplementuje svůj časovač) . . . . . . . . . . . . . . . 2714. pixmap . . . . . . . . . . . čtení obrázků z XPM souborů, škálování . . . . . . . . . . . . . . . . . . . . . . . . . . . 3315. window . . . . . . . . . . . členění okna programu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3716. widget . . . . . . . . . . .datová struktura elementu obrázku . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4417. filer . . . . . . . . . . . . čtení mapy z XPM souboru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5118. color . . . . . . . . . . . . co dělá která barva mapy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5319. map . . . . . . . . . . . . . .pole barev pro různé aktivity ve scéně . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5420. post . . . . . . . . . . . . . struktura kq_postava (widget+submap+timer) . . . . . . . . . . . . . . . . . . . . . 6321. autopost . . . . . . . . .algoritmy pro automatické ovládání postavy . . . . . . . . . . . . . . . . . . . . . . . . 7422. input . . . . . . . . . . . . interpretace vstupních příkazů . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8023. output . . . . . . . . . . .konverze z labeblíku na nápis pro výstup . . . . . . . . . . . . . . . . . . . . . . . . . . . 98

    6

  • 2 Modul types Program kraluk

    24. languages . . . . . . . .přepínání jazyků . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10325. edit . . . . . . . . . . . . . spodní editační řádek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10826. popup . . . . . . . . . . . .okno s výstupním textem nebo výběrem . . . . . . . . . . . . . . . . . . . . . . . . . . . 11927. home . . . . . . . . . . . . .práce se soubory v domovském adresáři . . . . . . . . . . . . . . . . . . . . . . . . . . . 12728. save . . . . . . . . . . . . .uložení stavu programu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12728. load . . . . . . . . . . . . . restaurování stavu programu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12729. gsl . . . . . . . . . . . . . .grafický save a load . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16230. animwid . . . . . . . . . .automaticky animovaný obrázek na políčku . . . . . . . . . . . . . . . . . . . . . . . . 16731. pol . . . . . . . . . . . . . .políčko neboli jedna scéna hry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16832. predmet . . . . . . . . . .předměty, inventář . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18133. misc . . . . . . . . . . . . . init, start, restart, exit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18734. kql . . . . . . . . . . . . . .načtení všech hlavičkových souborů . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189

    B. implementace příběhu35. version . . . . . . . . . .definice aktuální verze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18936. kraluk . . . . . . . . . . . funkce main() a restart() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19037. kra_polic . . . . . . . . inicializace políček (scén hry), funkce přechodů . . . . . . . . . . . . . . . . . . . . . 19038. kra_input . . . . . . . . funkce reagující na příkazy uživatele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20539. kra_barvy . . . . . . . . funkce reagující na barevnou mapu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21740. kra_jp . . . . . . . . . . .všelijaké postavy hry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22541. kra_jezin . . . . . . . . smolíček, jelen, jezinky . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22742. kra_jezibaba . . . . .aktivity ježibaby . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22943. kra_krk . . . . . . . . . .krkavci, Bohdanka . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23544. kra_provaz . . . . . . .animace spouštění a vytahování po provazu . . . . . . . . . . . . . . . . . . . . . . . . 23745. kra_predm . . . . . . . .načtení předmětů . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24246. kra_animpost . . . . .animace postavy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24347. kra_prom . . . . . . . . . inicializace proměnných . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24348. kra_save . . . . . . . . . registrace funkcí a proměnných pro ukládání pozic . . . . . . . . . . . . . . . . . . 244

    A Knihovna pomocných funkcí2 Modul types

    Tento modul obsahuje pouze háčkový soubor, který pomocí typedef umožní u některých strukturnepoužívat před názvem struct.

    types.h1: typedef struct kq_pin kq_pin;

    2: typedef struct kq_list kq_list;

    3: typedef struct kq_string kq_string;

    4: typedef struct kq_word kq_word;

    5: typedef struct kq_filer kq_filer;

    6: typedef struct kq_timer kq_timer;

    7: typedef struct kq_color kq_color;

    8: typedef struct kq_map kq_map;

    9: typedef struct kq_submap kq_submap;

    10: typedef struct kq_pixmap kq_pixmap;

    11: typedef struct kq_widget kq_widget;

    12: typedef struct kq_anim kq_anim;

    13: typedef struct kq_animpost kq_animpost;

    14: typedef struct kq_postava kq_postava;

    15: typedef struct kq_policko kq_policko;

    16: typedef struct kq_predmet kq_predmet;

    17: typedef struct kq_output kq_output;

    18: typedef struct sl_func sl_func;

    19: typedef struct sl_var sl_var;

    7

  • 3 Modul warning Program kraluk

    20:

    21: typedef struct pol_widget pol_widget;

    22: typedef struct pol_submap pol_submap;

    23: typedef struct pol_postava pol_postava;

    3 Modul warningTento modul vypisuje chybové hlášky. Funkce warning vypíše varování. Má však počet parametrů

    stejným způsobem roztahovací jako printf. Narozdíl od funkce printf ovšem není třeba na konec psát\n, jde to do standardního erroru a navíc něco připíše na začátek.

    warning.c6: void warning (char *s, ...)

    7: {

    8: va_list vl;

    9:

    10: fprintf(stderr, "%s warning: ", gargv[0]);

    11: va_start(vl, s);

    12: vfprintf(stderr, s, vl);

    13: va_end(vl);

    14: fprintf(stderr, "\n");

    15: }

    Funkce error funguje skoro stejně jako warning, až na dvě drobné odlišnosti:

    • Funkce warning napíše warning, Funkce error napíše error.• Funkce error narozdíl od funkce warning ukončí program.

    warning.c17: void error (char *s, ...)

    18: {

    19: va_list vl;

    20:

    21: fprintf(stderr, "%s error: ", gargv[0]);

    22: va_start(vl, s);

    23: vfprintf(stderr, s, vl);

    24: va_end(vl);

    25: fprintf(stderr, "\n");

    26:

    27: exit(-1);

    28: }

    Při výpisu chybových hlášek tyto funkce vypíší i název programu. Kvůli tomu v tomto modulumám ještě proměnné gargc a gargv, což jsou kopie parametrů funkce main. Do těchto proměnných jeuloži funkce kql_init.

    warning.h1: int gargc;

    2: char **gargv;

    Funkce mymalloc naalokuje paměť (voláním knihovní funkce malloc) a v případě neúspěchuzkolabuje pomocí funkce error.

    warning.c30: void *mymalloc (unsigned int size)

    31: {

    32: void *vysledek;

    33:

    34: if(!(vysledek = malloc(size))) error("Allocation of size %d failed", size);

    35: return vysledek;

    36: }

    void warning(): 8, 19, 23, 26–28, 30–31, 36–37, 52, 55, 57–58, 61, 64, 68, 72–74, 81, 83, 87, 89–94, 96–97,99, 101–104, 107–108, 117–120, 122–123, 127–131, 133–135, 137, 141, 144–146, 152, 154, 156–162, 166,168, 179–180, 182–185, 187, 211–213, 217, 220–221 void error(): 8, 14, 22, 34, 51, 53, 109, 119int gargc: 8, 40, 187 char gargv: 8, 40–41, 187 void *mymalloc(): 8, 13–16, 18–19, 33, 35–36, 45,51, 54, 56–57, 59, 67, 72, 82–83, 88, 91, 94, 96–97, 100, 102–105, 108, 115, 156, 158, 163, 166, 169–171,175–177, 179–180, 182, 185

    8

  • 4 Modul defaults Program kraluk

    4 Modul defaultsImplictiní hodnoty proměnných jsou nastaveny v tomto modulu. Pomocí #define jsou nastaveny

    konstanty, které určují směr.defaults.h

    80: #define NAHORU 0

    81: #define DOLU 1

    82: #define VLEVO 2

    83: #define VPRAVO 3

    84: #define LENA 4 // vlevo nahoru

    85: #define PRANA 5 // vpravo nahoru

    86: #define PRADO 6 // vpravo dolu

    87: #define LEDO 7 // vlevo dolu

    Dále jsem v modulu gsl použil kódy (keycodes) některých kláves:defaults.h

    91: #define KEY_ESC 9

    92: #define KEY_TAB 23

    93: #define KEY_ENTER 36

    94: #define KEY_SPACE 65

    95: #define KEY_UP 98

    96: #define KEY_LEFT 100

    97: #define KEY_RIGHT 102

    98: #define KEY_DOWN 104

    99: #define KEY_BACKSPACE 22

    100: #define KEY_DELETE 107

    101: #define KEY_HOME 97

    102: #define KEY_END 103

    Některé proměnné s konstantní hodnotou (deklarované v defaults.h) jsou inicializovány ve funkcikql_defaults při startu programu. Sice by mohly být vymezeny pomocí #define, ale pak by je nešlozměnit například po přečtení parametrů příkazové řádky. Původní záměr totiž byl, že tyto hodnoty budemožné v parametrech příkazové řádky měnit, i když to zatím není naprogramováno.

    Ve funkci kql_defaults jsou nejprve nastaveny hodnoty pro názvy adresářů a částí názvů sou-borů. Proměnná DATADIR_LOCAL obsahuje název adresáře, kde hledá program data jako první a DATADIRje název adresáře, kde hledá program data, pokud je nenašel v DATADIR_LOCAL. Měl by to být nějakýsystémový adresář. Pokud správce systému před kompilací v Makefile nastaví IDIR, je použita tatohodnota, jinak se použije implicitní hodnota.

    defaults.c8: void kql_defaults()

    9: {

    10: // Soubory a adresare:

    11:

    12: DATADIR_LOCAL = "./kraluk-data"; // tam hledam jako prvni

    13: #ifdef IDIR

    14: DATADIR = IDIR; // systemovy adresar z Makefile

    15: #else

    16: DATADIR = "/usr/local/share/kraluk-data"; // kdyz v DATADIR_LOCAL nic neni

    17: #endif

    18: IMGDIR = "/images/"; // obrazky jsou v DATADIR+IMGDIR

    19: MAPDIR = "/images/maps/"; // barevne mapy jsou v DATADIR+MAPDIR

    20: BGDIR = "backgrounds/"; // zakladni obrazky scen v DATADIR+IMGDIR+BGDIR

    NAHORU: 20–21, 69–72, 169, 172, 199–202, 204, 207–208, 219–221, 224, 228–229, 231–232, 240–241DOLU: 20–21, 69–72, 169, 172, 190, 199–204, 209, 216, 220–221, 228–229, 231–232, 235, 240–241VLEVO: 20–21, 69–72, 169, 172, 199–200, 220, 228, 230, 232, 240–241 VPRAVO: 20–21, 69–72, 168–169,172, 199–200, 220, 225, 228, 232, 238, 240–241 LENA: 20–21 PRANA: 20–21 PRADO: 20–21LEDO: 20–21 KEY_ESC: 119–120, 123, 163 KEY_TAB: 164 KEY_ENTER: 119–120, 123, 164KEY_SPACE: 119–120 KEY_UP: 123, 164 KEY_LEFT: 123, 164 KEY_RIGHT: 123, 164KEY_DOWN: 123, 164 KEY_BACKSPACE: 164 KEY_DELETE: 164 KEY_HOME: 164 KEY_END: 164void kql_defaults(): 9–11, 187, 190 char *DATADIR_LOCAL: 9, 187 char *DATADIR: 9–10,33–34, 54, 89, 101, 104, 187 IDIR: 9 char *IMGDIR: 9–10, 33–34 char *MAPDIR: 9, 54char *BGDIR: 9, 39, 42

    9

  • 4 Modul defaults Program kraluk

    21: ANIPDIR = "animposts/"; // animace postav v DATADIR+IMGDIR+ANIPDIR

    22: INHOMEDIR = ".kraluk"; // ukladani a cteni pozic v $HOME/INHOMEDIR

    23:

    24: IMGSUFFIX = ".xpm"; // pripona pro obrazky

    25: MAPSUFFIX = ".xpm"; // pripona pro mapy

    26: SAVESUFFIX = ".kqs"; // pripona pro soubory pozic

    27: SAVELAST = "lastpos"; // posledni pozice (ulozena pri ukonceni programu)

    28: SAVECONF = "lastconf"; // konfigurace (ulozena pri ukonceni programu)

    29:

    30: UPSTR = "/up"; // animace postavy (nahoru) DATADIR+IMGDIR+nazev+UPSTR+n+IMGSUFFIX

    31: DOWNSTR = "/down"; // animace postavy (dolu)

    32: LEFTSTR = "/left"; // animace postavy (doleva)

    33: RIGHTSTR = "/right"; // animace postavy (doprava)

    34: ANIPSTR = "/anim"; // animace postavy (bez smeru)

    35:

    36: // Jazyky:

    37:

    38: LANGCAT = "languages"; // kategorie slov jazyku

    39: LANGDIR = "/languages/"; // adresar se soubory jazyku DATADIR+LANGDIR

    40: LANGFILE = "_languages.txt"; // soubor se seznamem jazyku DATADIR+LANGDIR+LANGFILE

    41:

    42: INPUTSUFFIX = "_input.txt"; // soubor inputu DATADIR+LANGDIR+zkratka+INPUTSUFFIX

    43: OUTPUTSUFFIX = "_output.txt"; // soubor textu DATADIR+LANGDIR+zkratka+OUTPUTSUFFIX

    44:

    45: // Udaje o oknu:

    46:

    47: WINDOW_NAME = "Kralovsky ukol"; // nazev okna programu

    48: ICON_NAME = "kraluk"; // nazev ikony programu

    Dále jsou ve funkci kql_defaults inicializovany parametry pro vzhled editačního řádku a vyska-kovacího okna. Proměnné DEF_POP_SIRKA, DEF_POP_VYSKA, DEF_POP_X a DEF_POP_Y jsou rozměry, kteréjsou obvykle předávány funkcím pro vyskakovací okno. Proměnné MINRATIO a MAXRATIO udávají hranice,ve kterých se může pohybovat poměr zvětšení.

    defaults.c50: // Editace textu:

    51:

    52: FONTNAME = "-*-helvetica-bold-r-normal-*-25-*-*-*-*-*-iso8859-2";

    53: HOT = 4; // horni okraj textu

    54: DOT = HOT; // dolni okraj textu

    55: LOT = HOT; // levy okraj textu

    56: POT = LOT; // pravy okraj textu

    57: STRKAL = 30; // strkani kursoru doleva

    58: STRKAP = STRKAL; // strkani kursoru doprava

    59: KURSIR = 4; // sirka kursoru

    60:

    61: // Vyskakovaci okno:

    62:

    63: POPUPSMALLFONT = "-*-helvetica-bold-r-normal--20-*-*-*-*-*-iso8859-2";

    64: POPUPBIGFONT = "-*-helvetica-bold-r-normal--34-*-*-*-*-*-iso8859-2";

    65: POPUPBIGWIDTH = 800;

    66: POPRAMOKR = 5;

    67: POPRAMSIR = 2;

    68: POPHOT = 5;

    69: POPDOT = POPHOT;

    char *ANIPDIR: 10, 72 char *INHOMEDIR: 10, 127 char *IMGSUFFIX: 10, 33–34 char*MAPSUFFIX: 54 char *SAVESUFFIX: 165–166 char *SAVELAST: 188 char *SAVECONF: 161char *UPSTR: 10, 72 char *DOWNSTR: 72 char *LEFTSTR: 72 char *RIGHTSTR: 72char *ANIPSTR: 72 char *LANGCAT: 105 char *LANGDIR: 10, 89, 101, 104 char *LANGFILE: 10, 104char *INPUTSUFFIX: 10, 89 char *OUTPUTSUFFIX: 10, 101 char *WINDOW_NAME: 40char *ICON_NAME: 40–41 int DEF_POP_SIRKA: 11, 21, 99–100, 107–108, 163, 184–186int DEF_POP_VYSKA: 11, 21, 99–100, 107–108, 163, 184–186 int DEF_POP_X: 11, 21, 99–100, 107–108,163, 184–186 int DEF_POP_Y: 11, 21, 99–100, 107–108, 163, 184–186 int MINRATIO: 11, 43int MAXRATIO: 11, 43

    10

  • 5 Modul pin Program kraluk

    70: POPLOT = POPHOT;

    71: POPPOT = POPLOT;

    72: INTERLINESKIP = 2;

    73: INTERCOLUMNSKIP = 20;

    74: SELECTOKR = 1;

    75:

    76: DEF_POP_SIRKA = 0.8;

    77: DEF_POP_VYSKA = 0.7;

    78: DEF_POP_X = 0.5;

    79: DEF_POP_Y = 0.5;

    80:

    81: UINVPOMER = 0.5;

    82: UINVSIRKA = 0.5;

    83:

    84: // Predefinovatelny zbytek:

    85:

    86: OKRAJ = 3;

    87: MINRATIO = 1;

    88: MAXRATIO = 20;

    89: ANIMPRIOR = -50;

    90: AUTOPRIOR = 50;

    91: IMAGRAT = 1;

    Konečně jsou ve funkci kql_defaults inicializovány hodnoty následujících globálních proměn-ných:

    defaults.c95: fullscreened = 0;

    96: // unfullratio = 0;

    97: okrajtext = 0;

    98: ratio = 2;

    99: }

    5 Modul pinTento modul deklaruje obecný datový typ kq_pin, který může být pointer, int nebo nic. Pin je

    zkratka těchto tří možností.pin.h

    9: struct kq_pin{

    10: int typ;

    11: union{

    12: void *p;

    13: int i;

    14: } u;

    15: };

    Položka typ v této struktuře určuje, co bude daný pin zastupovat. Může nabývat jednu z násle-dujících hodnot, jejichž význam je zřejmý:

    pin.h3: #define PINPOINTER 2

    4: #define PININT 1

    5: #define PINNULL 0

    Dále se ve struktuře nachází union, ve kterém je v položce i uložen případný int a v položce ppřípadný pointer. Pokud typ == PINNULL, je jedno v jakém stavu se tento union nachází.

    Pro snadné vytváření pinů je k dispozici funkce pinpointer, která dostane pointer a vrátí pin,jenž ho zastupuje, dále funkce pinint, která dostane int a vrátí pin, který ho zastupuje.

    pin.c6: kq_pin pinpointer (void *p)

    7: {

    8: kq_pin vysledek;

    9: vysledek.typ = PINPOINTER;

    10: vysledek.u.p = p;

    kq_pin: 6–7, 11–12, 17–20, 27, 33, 81, 86, 93–94, 99, 101, 105, 158–159, 246 PINPOINTER: 11,19, 81, 99, 102, 159, 185 PININT: 12, 93, 158–159 PINNULL: 11–12, 158–159, 187kq_pin pinpointer(): 11–12, 20, 65, 68, 73, 94, 102, 104, 167, 182, 224, 226, 233–234, 236, 239kq_pin pinint(): 12, 20–21, 93, 105, 207–208

    11

  • 6 Modul mystring Program kraluk

    11: return vysledek;

    12: }

    13:

    14: kq_pin pinint (int i)

    15: {

    16: kq_pin vysledek;

    17: vysledek.typ = PININT;

    18: vysledek.u.i = i;

    19: return vysledek;

    20: }

    Pro pin, jenž nezastupuje nic, není třeba deklarovat funkci, jelikož takový pin je jen jeden. Vedlefunkcí je tedy ještě deklarovaná proměnná pinnull, jejíž typ je nastaven ve funkci kql_init().

    pin.h19: kq_pin pinpointer(void *p);

    20: kq_pin pinint(int i);

    21: kq_pin pinnull;

    Datový typ kq_pin se často používá jakožto parametr pro uloženou funkci, které se předá takovýparametr, který ten pin zastupuje. To provede funkce spustsparem.

    pin.c24: void spustsparem (void (*funkce)(), kq_pin *parametr)

    25: {

    26: if(parametr->typ == PINNULL) funkce();

    27: else if(parametr->typ == PININT) funkce(parametr->u.i);

    28: else funkce(parametr->u.p);

    29: }

    6 Modul mystringTento modul má dvě části. V první je řešen nekonečný string a v druhé další operace se stringy.

    6.1 Nekonečný stringNekonečný string zastupuje datový typ kq_string.

    mystring.h7: struct caststr{

    8: char ch[STRDELKA];

    9: struct caststr *next;

    10: };

    11:

    12: struct kq_string{

    13: int delka;

    14: struct caststr *posledni;

    15: };

    Položka delka udává počet znaků toho stringu a posledni jsou zásobníkovým způsobem řazenypole znaků o velikosti STRDELKA.

    mystring.h3: #define STRDELKA 20

    Tato pole nejsou ukončena nulou jako v běžných strinzích, takže které znaky do stringu patří akteré ne je třeba spočítat z položky delka.

    Než se s nekonečným stringem začne pracovat, je třeba ho inicializovat funkcí initstr.mystring.c

    11: void initstr (kq_string *str)

    12: {

    13: str->posledni = NULL;

    14: str->delka = 0;

    15: }

    Poté se s ním dají dělat dvě věci. Můžete k nekonečnému stringu str přidat na konec jeden znakch funkcí zapisznak.

    kq_pin pinnull: 12, 20–21, 87–88, 94, 187, 221–222, 226, 229–232, 235 void spustsparem(): 12, 19, 30kq_string: 7, 12–13, 15, 90, 101, 104 STRDELKA: 12–13 void initstr(): 12–13, 90, 102, 104void zapisznak(): 13, 90, 102–104

    12

  • 6 Modul mystring Program kraluk

    mystring.c32: void zapisznak (char ch, kq_string *str)

    33: {

    34: struct caststr *pom;

    35:

    36: if(str->delka%STRDELKA == 0){

    37: pom = (struct caststr *)mymalloc(sizeof(struct caststr));

    38: pom->next = str->posledni;

    39: str->posledni = pom;

    40: }

    41: str->posledni->ch[str->delka%STRDELKA] = ch;

    42:

    43: str->delka++;

    44: }

    A ta druhá možnost je převod na standardní C-čkový string, který vrátí funkce zestringuj.mystring.c

    48: char *zestringuj (kq_string *str)

    49: {

    50: int i, j;

    51: struct caststr *pom;

    52: char *vysledek;

    53:

    54: vysledek = (char *)mymalloc((str->delka+1)*sizeof(char));

    55:

    56: i = str->delka-1;

    57: i /= STRDELKA;

    58: i *= STRDELKA;

    59: j = str->delka - i;

    60:

    61: for(pom = str->posledni; pom; pom = pom->next){

    62: strncpy(&vysledek[i], pom->ch, j);

    63: j = STRDELKA;

    64: i -= STRDELKA;

    65: }

    66: vysledek[str->delka] = 0;

    67:

    68: return vysledek;

    69: }

    Funkce zestringuj namallocuje nový string, takže když už ho nebudete potřebovat, je vhodné houvolnit funkcí free. Navíc původní nekonečný string neuvolní (jeho části), ale ponechá ho v původnímstavu. Uvolnit se dá funkcí smazstr, která ho zároveň pronuluje a připraví k dalšímu použití.

    mystring.c19: void smazstr (kq_string *str)

    20: {

    21: struct caststr *pom, *pomo;

    22:

    23: for(pom = str->posledni; pom; pom = pomo){

    24: pomo = pom->next;

    25: free(pom);

    26: }

    27: initstr(str);

    28: }

    6.2 Další operace se stringyV manuálové stránce o string jsem našel funkci strndup, která vytvoří nový string z určitého

    počtu znaků původního stringu. Kompilátor se však tvářil, že tuto funkci nezná, tak jsem se po chvílibádání rozhodl, že si naprogramuji svojí takovou funkci, kterou jsem pojmenoval dupnstr. Navíc v tétofunkci použiji svůj mymalloc.

    mystring.c73: char *dupnstr (char *src, int n)

    74: {

    75: char *vysledek;

    char *zestringuj(): 13, 90, 102, 104 void smazstr(): 13, 90, 102, 104 void dupnstr(): 13, 92–94,117

    13

  • 6 Modul mystring Program kraluk

    76:

    77: vysledek = mymalloc((n+1)*sizeof(char));

    78: strncpy(vysledek, src, n);

    79: vysledek[n] = 0;

    80:

    81: return vysledek;

    82: }

    Funkci strdup, která zduplikuje string, kompilátor zná, ale přesto zde mám funkci dupstr, kteráv případě selhání zavolá funkci error, takže program stejně spadne, ale alespoň je jasné proč.

    mystring.c86: char *dupstr (char *src)

    87: {

    88: char *vysledek;

    89:

    90: if(!(vysledek = strdup(src))) error("string duplication failed: \"%s\"", src);

    91: return vysledek;

    92: }

    Dále je zde funkce joinstrings, která vymallokuje nový string jakožto spojení jejich parametrů.Poslední parametr této funkce musí být NULL, aby jí bylo jasné, kde seznam parametrů končí.

    mystring.c96: char *joinstrings(char *prvni, ...)

    97: {

    98: va_list vl;

    99: char *pomstr, *vysledek;

    100: int i=1;

    101:

    102: va_start(vl, prvni);

    103: for(pomstr=prvni; pomstr; pomstr = va_arg(vl, char *)){

    104: i += strlen(pomstr);

    105: }

    106: va_end(vl);

    107:

    108: vysledek = (char *)mymalloc(i*sizeof(char));

    109:

    110: i=0;

    111: va_start(vl, prvni);

    112: for(pomstr=prvni; pomstr; pomstr = va_arg(vl, char *)){

    113: strcpy(&vysledek[i], pomstr);

    114: i += strlen(pomstr);

    115: }

    116: if(!prvni) vysledek[0] = 0;

    117:

    118: return vysledek;

    119: }

    Funkce zmensipism dostane znak a vrátí znak. Pokud dostane malé písmeno, vrátí ten samýznak. Dostane-li velké písmeno, vrátí to samé písmenko, ale malé. Pokud však dostane něco jiného vrátímezeru.

    mystring.c123: char zmensipism (char ch)

    124: {

    125: if(isalpha(ch)) return tolower(ch);

    126: else return ’ ’;

    127: }

    Tuto funkci využívá funkce upravstring, která na všechny znaky stringu aplikuje zmensipism apak odebere mezery z okrajů a více mezer u sebe nahradí jednou mezerou.

    mystring.c131: void upravstring (char *str)

    132: {

    133: int k,l,m;

    134:

    135: for(m=l=k=0; str[k]; k++){

    char *dupstr(): 14, 18, 36, 57, 81, 91, 93, 107, 119, 175–177, 182 char *joinstrings(): 14,34, 39, 42, 54, 72, 89, 101, 104, 107, 127, 130, 165–166, 188, 206 char zmensipism(): 14–15void upravstring(): 14, 81, 86, 91–92, 103–104

    14

  • 7 Modul list Program kraluk

    136: str[l] = zmensipism(str[k]);

    137: if(m==0){

    138: if(str[l] != ’ ’){

    139: m=1;

    140: l++;

    141: }

    142: }

    143: else{

    144: if(str[l] == ’ ’) m=0;

    145: l++;

    146: }

    147: }

    148: if(l > 0 && str[l-1] == ’ ’) str[l-1] = 0;

    149: else str[l] = 0;

    150: }

    7 Modul listTento modul řeší jednoduchý zásobník, jenž je zastoupen ukazatelem na datový typ kq_list.

    list.h3: struct kq_list{

    4: union{

    5: void *p;

    6: int i;

    7: } u;

    8: kq_list *next;

    9: };

    Fungují nad ním zhruba stejné operace jako nad kq_string, ale nejde o zásobník charů, ale intůnebo pointerů. Inicializaci není třeba provádět funkcí, stačí do daného kq_list dosadit NULL. Není v němvšak nikde přímo napsána jeho délka. Je třeba ji spočítat funkcí delkaL.

    list.c44: int delkaL (kq_list *l)

    45: {

    46: int vysledek;

    47:

    48: for(vysledek = 0; l; l = l->next) vysledek++;

    49:

    50: return vysledek;

    51: }

    To, zda jde o integery nebo pointery není nikde přesně řečeno a je tedy třeba vědět s jakýmzásobníkem se pracuje. Pro přidání pointeru do zásobníku je zde funkce addPdoL, funkce addIdoL přidáint.

    list.c22: void addPdoL (void *p, kq_list **l)

    23: {

    24: kq_list *pom;

    25:

    26: pom = (kq_list *)mymalloc(sizeof(kq_list));

    27: pom->u.p = p;

    28: pom->next = *l;

    29: *l = pom;

    30: }

    31:

    32: void addIdoL (int i, kq_list **l)

    33: {

    34: kq_list *pom;

    35:

    36: pom = (kq_list *)mymalloc(sizeof(kq_list));

    37: pom->u.i = i;

    38: pom->next = *l;

    39: *l = pom;

    kq_list: 7, 15–16, 80–82, 88, 91–93, 95, 101, 168, 170–173 int delkaL(): 15–16, 95–96void addPdoL(): 15, 81, 88, 93–94, 103 void addIdoL(): 15, 92

    15

  • 8 Modul hash Program kraluk

    40: }

    List se dá převést na pole pointerů nebo intů, jehož poslední člen je NULL nebo nula pomocí funkcíLdoPA (pole pointerů) a LdoIA (pole intů).

    list.c55: void **LdoPA (kq_list *l)

    56: {

    57: int i;

    58: void **vysledek;

    59:

    60: i = delkaL(l);

    61: vysledek = (void **)mymalloc((i+1)*sizeof(void *));

    62:

    63: vysledek[i] = NULL;

    64: for(;l; l = l->next) vysledek[--i] = l->u.p;

    65:

    66: return vysledek;

    67: }

    68:

    69: int *LdoIA (kq_list *l)

    70: {

    71: int i;

    72: int *vysledek;

    73:

    74: i = delkaL(l);

    75: vysledek = (int *)mymalloc((i+1)*sizeof(int));

    76:

    77: vysledek[i] = 0;

    78: for(;l; l = l->next) vysledek[--i] = l->u.i;

    79:

    80: return vysledek;

    81: }

    Nakonec se dá list uvolnit z paměti funkcí smazlist. Tato funkce navíc do toho listu dosadí NULL,čímž ho připraví pro další použití.

    list.c8: void smazlist (kq_list **l)

    9: {

    10: kq_list *pom;

    11:

    12: while(*l){

    13: pom = (*l)->next;

    14: free(*l);

    15: *l = pom;

    16: }

    17: *l = NULL;

    18: }

    8 Modul hashProgram potřebuje ukládat a vyhledávat slovníkové údaje. Například při analýze věty, kterou

    vkládá uživatel, je potřeba větu rozebrat na slova a podívat se do slovníku, zda taková slova známe aco znamenají. Nebo keybinding. Pro tyto účely se v programech běžně implementuje tzv. hash. Jedná seo implemantaci slovníku, který obsahuje množinu uspořádaných dvojic

    [klíč (slovo), hodnota (jak reagovat)].

    Bude potřeba řešit dotazy, kdy známe klíč, a hledáme hodnotu. Hash je inteligentní implementaceslovníku, kdy program nevyhledává mezi jednotlivými klíči sekvenčně, ale poněkud rychleji. Viz Knuth:The Art of Computer Programming, díl 3, strany 513–557. V programu jsem použil variantu algoritmupopsaného v uvedené knize na straně 520.

    Klíč ve slovníku nebude v mém programu slovo samotné, ale ještě k němu přidám typ slova. Slovastejně znějící různého typu totiž vyžadují úplně jinou reakci. Následuje výčet typů slov.

    void **LdoPA(): 16, 80, 88, 94–95 int *LdoIA(): 16, 92 void smazlist(): 16, 80–81, 88, 92, 94–95,102, 107

    16

  • 8 Modul hash Program kraluk

    hash.h3: #define WORD 1 // slovo

    4: #define WORDPART 2 // cast slova

    5: #define WORDCAT 3 // kategorie slova

    6: #define BINDTEXT 4 // klavesova zkratka, v modu psani, vice v bindings.h

    7: #define BINDWIN 5 // klavesova zkratka, v modu chozeni, vice v bindings.h

    8: #define OUTPUT 6 // odkaz na text pro output

    9:

    10: #define OTHERHASH 0 // cokoli dalsiho, nevsima si toho funkce uklid()

    Hodnota ve slovníku (jak reagovat) je implementovaná datovým typem kq_pin.Slovník je implementován jako pole hashtable délky HASHSIZE

    hash.h14: #define HASHSIZE 797 // velikost hashoveho pole

    Délka pole se podle doporučení volí jako prvočíslo zhruba tak velké, jak velký očekáváme slovník.Hodnoty pole jsou pointery do struktury hash:

    hash.h18: struct hash{

    19: char typ; // informace, na zaklade ktere se hleda

    20: char *string; // informace, na zaklade ktere se hleda

    21: kq_pin informace; // informace, ktera se hleda

    22: struct hash *next; // dalsi policko hashe (je pouzito separate chaining)

    23: } *hashtable[HASHSIZE];

    Každý klíč dostane přiděleno pomocí hashovací funkce číslo v rozsahu 0..HASHSIZE-1, které jeindexem v poli hashtable. Pokud se sejdou dva nebo více různých klíčů se stejnou hodnotou hashovacífunkce, je nutno řetězit jednotlivé struktury hash, jak ukazuje obrázek. Pole hashtable o velikostiHASHSIZE je na obrázku zakresleno svisle vlevo. Např. klíč1 má na obrázku hashovací index 3 stejnějako klíč5. Má-li se vyhledat hodnata ke klíč5, program vyhodnotí index 3 a dále projde „řádekÿ naobrázku sekvenčně.

    0

    1

    2

    3

    4

    hashtable

    NULL

    NULL

    NULL

    klic2 hod2 NULL

    klic1 hod1

    klic7 hod7 NULL

    klic5 hod5

    HASHSIZE

    Funkce inithash vynuluje hashtable a použije se na začátku programu.hash.c

    22: void inithash () // Vynuluje hashove pole.

    23: {

    24: int i;

    WORD: 19, 81, 94, 103, 106 WORDPART: 81, 94, 106 WORDCAT: 19, 93, 105–106 BINDTEXT: 18–21BINDWIN: 18–20 OUTPUT: 19, 99, 102, 106 OTHERHASH struct hash **hashtable: 17–19, 106HASHSIZE: 17–18, 106 voidinithash(): 17, 187

    17

  • 8 Modul hash Program kraluk

    25: for(i=0; inext)) // Prochazim hashovy radek.

    55: if((typ == (*pom)->typ) && !strcmp((*pom)->string, s)){

    56: // Skoncim, kdyz najdu stejny typ i string.

    57: uklid(*pom); // vycistim hashove policko

    58: if(informace) (*pom)->informace = *informace; // Je-li podavana informace, dosadim ji tam

    59: else{ // Je-li podavan NULL, zrusim policko:

    60: pomo = *pom;

    61: *pom = pomo->next;

    62: free(pomo->string);

    63: free(pomo);

    64: }

    65: return;

    66: }

    67:

    68: // V hashi jsem dany typ+string nenasel, takze zalozim novy:

    69:

    70: if(!informace) return;

    71:

    72: *pom = (struct hash *)mymalloc(sizeof(struct hash));

    73: (*pom)->typ = typ;

    74: (*pom)->string = dupstr(s);

    75: (*pom)->informace = *informace;

    76: (*pom)->next = NULL;

    77: }

    Při přepisování nebo mazání původní informace je někdy třeba odallokovat její pointer nebovypsat varování v závislosti na typu. To řeší funkce uklid.

    hash.c12: static void uklid (struct hash *h)

    13: {

    14: if(h->typ == BINDTEXT || h->typ == BINDWIN) free(h->informace.u.p);

    int hashfunc(): 18–19 void hash_add(): 18, 20, 93–94, 102, 105 void uklid /*hash*/ (): 17–18

    18

  • 9 Modul bindings Program kraluk

    15: if(h->typ == WORD) warning("podruhe ukladane slovo \"%s\" do hashe", h->string);

    16: if(h->typ == WORDCAT) warning("podruhe ukladana kategorie \"%s\" do hashe", h->string);

    17: if(h->typ == OUTPUT) warning("podruhe ukladany output \"%s\" do hashe", h->string);

    18: }

    Konečně funkce hash_find má parametr [typ,s], tedy klíč, a vrátí ukazatel na hodnotu, pokudúspěšně klíč ve slovníklu našla. Jestliže klíč ve slovníku není, vrátí NULL.

    hash.c81: kq_pin *hash_find (int typ, char *s)

    82: // Vyhleda zadany typ+string a vrati prislusnou informaci.

    83: {

    84: struct hash *pom;

    85:

    86: for(pom = hashtable[hashfunc(typ,s)]; pom; pom = pom->next) // Prochazim hashovy radek.

    87: if(typ == pom->typ && !strcmp(pom->string, s)) return &(pom->informace);

    88:

    89: return NULL; // Pozadovany typ+string jsem nenasel.

    90: }

    91:

    9 Modul bindingsTento modul řeší klávesové zkratky, nepodporuje však modifikační klávesy Shift, Ctrl, . . . Jediné,

    co tento modul tedy při zmáčknutí klávesy udělá, je, že se podívá do hashe, jestli tam je pod názvemdané klávesy nějaká akce. Akce pro klávesové zkratky jsou ukazatelem na strukturu keybind.

    bindings.h1: struct keybind{

    2: void (*funkce)();

    3: kq_pin parametr;

    4: };

    Tato struktura má jen dvě položky. Funkci, která se spustí, a parametr, který se funkci předá.Hash má ovšem dva typy pro klávesové zkratky. Pokud je aktivní rámeček, kam se píše text (okrajtextje true), je použit typ BINDTEXT. Jinak je použit typ hashe BINDWIN. Funkce dobind dostane string apokusí se podle něj provést klávesovou zkratku. Pokud se to povede, vrátí true, jinak vrátí false.

    bindings.c147: char dobind (char *s)

    148: {

    149: struct keybind *b;

    150: kq_pin *p;

    151:

    152: if(okrajtext) p = hash_find(BINDTEXT, s);

    153: else p = hash_find(BINDWIN, s);

    154: if(!p) return 0;

    155: if(p->typ != PINPOINTER){

    156: warning("Klavesova zkratka ma spatny typ.");

    157: return 0;

    158: }

    159: b=p->u.p;

    160: spustsparem(b->funkce, &(b->parametr));

    161: return 1;

    162: }

    Funkce addbind přidá klávesovou zkratku do hashe, přičemž dostane typ hashe, potom názevklávesy, pak funkci, která se má provést, a nakonec parametr typu kq_pin.

    bindings.c127: void addbind (int typ, char *s, void (*funkce)(),

    128: kq_pin parametr)

    129: {

    130: struct keybind *b;

    131: kq_pin p;

    132:

    133: b=(struct keybind *)mymalloc(sizeof(struct keybind));

    kq_pin hash_find(): 19, 81, 93, 99, 102–103 struct keybind: 19 char dobind(): 19, 25, 120void addbind(): 19–21

    19

  • 9 Modul bindings Program kraluk

    134: b->funkce = funkce;

    135: b->parametr = parametr;

    136: p = pinpointer(b);

    137: hash_add(typ, s, &p);

    138: }

    Funkce addgbind přidá také klávesovou zkratku, ale nedostane typ hashe, protože klávesovázkratka uložená touto funkcí bude fungovat bez závislosti na tom, zda je aktivní hrací okno nebo řádektextu. Funguje to jednoduše tak, že tato funkce zavolá dvakrát funkci addbind.

    bindings.c140: void addgbind (char *s, void (*funkce)(),

    141: kq_pin parametr)

    142: {

    143: addbind(BINDWIN, s, funkce, parametr);

    144: addbind(BINDTEXT, s, funkce, parametr);

    145: }

    Všechny klávesové zkratky uloží do hashe funkce initbindings.bindings.c

    58: void initbindings ()

    59: {

    60: addgbind("F1", popup_help, pinpointer("_help"));

    61: addgbind("F2", gsave, pinnull);

    62: addgbind("F3", gload, pinnull);

    63: addgbind("F4", grestart, pinnull);

    64: addgbind("F5", zmenFPS, pinint(1));

    65: addgbind("F6", zmenFPS, pinint(-1));

    66: addgbind("F7", zmenratio, pinint(-1));

    67: addgbind("F8", zmenratio, pinint(1));

    68: addgbind("F9", ukazinv, pinnull);

    69: addgbind("F10", popup_help, pinpointer("_about"));

    70: addgbind("F11", fullscreen, pinnull);

    71: addgbind("F12", zobrazjazyky, pinnull);

    72: addgbind("Return", text_enter, pinnull);

    73: addgbind("KP_Enter", text_enter, pinnull);

    74:

    75: addbind(BINDWIN, "Escape", kql_exit, pinnull);

    76:

    77: addbind(BINDWIN, "BackSpace", zkoumejhist, pinint(1));

    78: addbind(BINDWIN, "KP_End", zmensmer, pinint(LEDO));

    79: addbind(BINDWIN, "KP_1", zmensmer, pinint(LEDO));

    80: addbind(BINDWIN, "KP_Down", zmensmer, pinint(DOLU));

    81: addbind(BINDWIN, "KP_2", zmensmer, pinint(DOLU));

    82: addbind(BINDWIN, "Down", zmensmer, pinint(DOLU));

    83: addbind(BINDWIN, "KP_Next", zmensmer, pinint(PRADO));

    84: addbind(BINDWIN, "KP_3", zmensmer, pinint(PRADO));

    85: addbind(BINDWIN, "KP_Left", zmensmer, pinint(VLEVO));

    86: addbind(BINDWIN, "KP_4", zmensmer, pinint(VLEVO));

    87: addbind(BINDWIN, "Left", zmensmer, pinint(VLEVO));

    88: addbind(BINDWIN, "KP_Right", zmensmer, pinint(VPRAVO));

    89: addbind(BINDWIN, "KP_6", zmensmer, pinint(VPRAVO));

    90: addbind(BINDWIN, "Right", zmensmer, pinint(VPRAVO));

    91: addbind(BINDWIN, "KP_Home", zmensmer, pinint(LENA));

    92: addbind(BINDWIN, "KP_7", zmensmer, pinint(LENA));

    93: addbind(BINDWIN, "KP_Up", zmensmer, pinint(NAHORU));

    94: addbind(BINDWIN, "KP_8", zmensmer, pinint(NAHORU));

    95: addbind(BINDWIN, "Up", zmensmer, pinint(NAHORU));

    96: addbind(BINDWIN, "KP_Prior", zmensmer, pinint(PRANA));

    97: addbind(BINDWIN, "KP_9", zmensmer, pinint(PRANA));

    98:

    99: addbind(BINDWIN, "Tab", prepniokraj, pinint(1));

    100: addbind(BINDTEXT, "Tab", prepniokraj, pinint(0));

    101:

    102: addbind(BINDTEXT, "Delete", (void (*)())delete, pinint(0));

    103: addbind(BINDTEXT, "KP_Delete", (void (*)())delete, pinint(0));

    void addgbind(): 20 void initbindings(): 20, 187

    20

  • 9 Modul bindings Program kraluk

    104: addbind(BINDTEXT, "BackSpace", (void (*)())delete, pinint(1));

    105:

    106: addbind(BINDTEXT, "Left", posunkursor, pinint(0));

    107: addbind(BINDTEXT, "KP_Left", posunkursor, pinint(0));

    108: addbind(BINDTEXT, "Right", posunkursor, pinint(1));

    109: addbind(BINDTEXT, "KP_Right", posunkursor, pinint(1));

    110: addbind(BINDTEXT, "Home", posunkursor, pinint(2));

    111: addbind(BINDTEXT, "KP_Home", posunkursor, pinint(2));

    112: addbind(BINDTEXT, "End", posunkursor, pinint(3));

    113: addbind(BINDTEXT, "KP_End", posunkursor, pinint(3));

    114:

    115: addbind(BINDTEXT, "Down", zkoumejhist, pinint(0));

    116: addbind(BINDTEXT, "KP_Down", zkoumejhist, pinint(0));

    117: addbind(BINDTEXT, "Up", zkoumejhist, pinint(1));

    118: addbind(BINDTEXT, "KP_Up", zkoumejhist, pinint(1));

    119: addbind(BINDTEXT, "Next", zkoumejhist, pinint(2));

    120: addbind(BINDTEXT, "KP_Next", zkoumejhist, pinint(2));

    121: addbind(BINDTEXT, "Prior", zkoumejhist, pinint(3));

    122: addbind(BINDTEXT, "KP_Prior", zkoumejhist, pinint(3));

    123:

    124: addbind(BINDTEXT, "Escape", text_escape, pinnull);

    125: }

    Dále v tomto modulu mám funkce, které přímo souvisí s některými klávesovými zkratkami. Funkcegrestart vyskočí s oknem s labelíkem _restart? a v případě, že toto okno není zrušeno klávesou Escape,restartuje hru.

    bindings.c24: static void grestart ()

    25: {

    26: if(popup_info("_restart?")) kql_restart();

    27: }

    Funkce popup_help funguje stejně jako funkce popup_info, ale narozdíl od ní je typu void.bindings.c

    29: static void popup_help (char *label)

    30: {

    31: popupstring(DEF_POP_SIRKA, DEF_POP_VYSKA, DEF_POP_X, DEF_POP_Y, outputstring(label, NULL), 1);

    32: }

    Nakonec tu mám funkci zmensmer. Tato funkce dostane jeden z možných směrů: NAHORU, DOLU,VLEVO, VPRAVO, LENA, PRANA, LEDO, PRADO. Podle toho pak postavě ovlpost přiřadím správné položkyxx a yy. Pokud už ovlpost jde tím směrem, kterým by měla jít podle směru, který funkce zmensmerdostala, tak ji funkce zmensmer zastaví. V případě, že ovlpost == NULL, funkce zmensmer neudělá nic.

    bindings.c34: static void zmensmer (int smer)

    35: {

    36: int xx, yy;

    37:

    38: if(!ovlpost) return;

    39:

    40: if(smer == LENA || smer == VLEVO || smer == LEDO) xx = -1;

    41: else if(smer == PRANA || smer == VPRAVO || smer == PRADO) xx = 1;

    42: else xx = 0;

    43:

    44: if(smer == LENA || smer == NAHORU || smer == PRANA) yy = -1;

    45: else if(smer == LEDO || smer == DOLU || smer == PRADO) yy = 1;

    46: else yy = 0;

    47:

    48: if(xx == ovlpost->xx && yy == ovlpost->yy){

    49: ovlpost->xx = 0;

    50: ovlpost->yy = 0;

    51: }

    52: else{

    53: ovlpost->xx = xx;

    void grestart /*bindings*/ (): 20–21 void popup_help /*bindings*/ (): 20–21 void zmensmer/*bindings*/ (): 20–21 kq_postava *ovlpost: 21–22, 159, 185, 190, 204, 211, 215–217, 219, 221–224,232, 238

    21

  • 10 Modul X Program kraluk

    54: ovlpost->yy = yy;

    55: }

    56: }

    10 Modul XTento modul načítá hlavičkové soubory Xlibu, které jsou potřeba, takže pokud jiný modul používá

    X-ovou funkci, měl by načíst X.h.X.h

    3: #include

    4: #include

    5: #include

    6: #include

    7: #include

    Dále jsou zde proměnné, které s iXy souvisejí:X.h

    11: Display *display;

    12: int screen;

    13: int display_sirka, display_vyska;

    14: unsigned int depth;

    15: GC text_gc, ggc;

    16: Window root;

    Tyto proměnné zinicializuji ve funkci initX.X.c

    8: void initX ()

    9: /*******************************/

    10: {

    11: char *display_name = NULL;

    12:

    13: if ((display=XOpenDisplay(display_name)) == NULL)

    14: error("cannot connect to X server %s", XDisplayName(display_name));

    15:

    16: screen = DefaultScreen(display);

    17: display_sirka = DisplayWidth(display,screen);

    18: display_vyska = DisplayHeight(display,screen);

    19: root = RootWindow(display,screen);

    20: depth = DefaultDepth(display,screen);

    21: ggc = DefaultGC(display, screen);

    22: }

    Potom tady mám funkci kreslianim, která pošle frontu příkazů X-serveru (každý frame).X.c

    26: void kreslianim ()

    27: {

    28: if(mengraf) XSync(display, 0);

    29: mengraf = 0;

    30: }

    Abych neposílal X-serveru zbytečně prázdnou frontu událostí (nevím, zda to má funkce XSyncz Xlibu ošetřené), tak tato funkce pošle onu frontu jen v případě, že proměnná mengraf je nastavená natrue. Proměnná mengraf by se tedy měla nastavit na true vždy po volání X-ových funkcí.

    X.h20: char mengraf;

    11 Modul keyboardPro správné zacházení se znaky čtenými z klávesnice, je třeba zinicializovat input metodu a input

    context (viz Xlib Programming Manual). To udělám funkcí initklav. Input context je uložen do lokálníproměnné xic.

    Display *display: 22–23, 25, 34–37, 40–46, 48–50, 109–111, 119–123, 125–126, 147, 163, 186,188–189 int screen: 22, 40, 46, 121, 125, 147, 186 int display_sirka: 22, 39, 43int display_vyska: 22, 39, 43 unsigned int depth: 22, 35 GC text_gc: 40, 109–111, 189GC ggc: 22, 42, 49 Window root: 22, 35, 40 void initX(): 22, 187 void kreslianim(): 22, 24char mengraf: 22, 25, 41–42, 45–46, 48–50, 66, 115, 120, 123, 147 void initklav(): 23, 188XIC xic /*keyboard*/ : 23

    22

  • 11 Modul keyboard Program kraluk

    keyboard.c8: static XIC xic = NULL;

    9:

    10: void initklav () // Zinicializuje cteni z klavesnice.

    11: {

    12: XIM xim;

    13: char *imvalret;

    14: XIMStyles *xim_styles;

    15: XIMStyle xim_style = 0;

    16: int i;

    17:

    18: xim = XOpenIM (display, NULL, NULL, NULL);

    19: if (xim == NULL) {

    20: warning("openning of input method failed");

    21: }

    22: else{

    23: imvalret = XGetIMValues (xim, XNQueryInputStyle, &xim_styles, NULL);

    24: if (imvalret != NULL || xim_styles == NULL) {

    25: warning("input method doesn’t support any styles");

    26: }

    27:

    28: if (xim_styles) {

    29: xim_style = 0;

    30: for (i = 0; i < xim_styles->count_styles; i++) {

    31: if (xim_styles->supported_styles[i] ==

    32: (XIMPreeditNothing | XIMStatusNothing)) {

    33: xim_style = xim_styles->supported_styles[i];

    34: break;

    35: }

    36: }

    37:

    38: if (xim_style == 0) {

    39: warning("input method doesn’t support the style we support");

    40: }

    41: XFree (xim_styles);

    42: }

    43: }

    44: if (xim && xim_style) {

    45: xic = XCreateIC (xim,

    46: XNInputStyle, xim_style,

    47: XNClientWindow, textwin,

    48: XNFocusWindow, textwin,

    49: NULL);

    50:

    51: if (xic == NULL) {

    52: warning("Creating of XIC failed");

    53: }

    54: }

    55: }

    Poté, co mám klávesnici zinicializovanou, mohu převést událost na znak, co má být napsán, funkcíxkeyznak. Pokud tato událost nemůže vykreslit znak, funkce vrátí nulu. Jinak vrátí přislušný znak.

    keyboard.c57: char xkeyznak (XEvent *e)

    58: {

    59: int pocetznaku;

    60: char str[8];

    61: XKeyEvent *event = &(e->xkey);

    62:

    63: if(xic){

    64: if(XFilterEvent (e, textwin)) return 0;

    65: pocetznaku = XmbLookupString(xic, event, str, 8, NULL, NULL);

    66: }

    67: else pocetznaku = XLookupString (event, str, 8, NULL, NULL);

    68: // Nahradni varianta, kdyz se nenacte xic (zcela nefunguje)

    69:

    char xkeyznak(): 23, 25, 120, 164

    23

  • 12 Modul loop Program kraluk

    70: // Zkontroluji, zda jde skutecne o znak:

    71: if(pocetznaku != 1) return 0;

    72: if(isprint(str[0])) return str[0];

    73: return 0;

    74: }

    12 Modul loopModul loop obsahuje funkci loop() a pár dalších s kterými tato funkce souvisí. Funkce loop je

    spuštěná na startu a od té doby běží a spouští další funkce. Během jednoho svého cyklu tato funkceudělá následující:

    1) Zpracuje nové události.2) Provede timery a posune je o jedničku.3) Provede grafické změny.4) Počká předem určený čas.

    V tom čekání je malý háček, protože hardware není schopný čekat tak dlouho, jak chci, ale jen ponásobcích určitého minimálního času. Abych tedy nebyl omezen nějakou maximální rychlostí, kontrolujikaždý frame, jak se liší čas, který měl čekat a čas, který ve skutečnosti čekal. Pokud čekal x-krát delší(x > 1) dobu nez měl, pustím bez čekání x framů. Například pokud po něm chci, aby čekal 2 sekundya on čeká 10 nebo 11 sekund, přeskočím čtyřikrát žádost o čekání. Pokud by ale ve skutečnosti čekaljednu nebo tři sekundy, nic nepřeskakuji. Není to sice zcela přesné, ale alespoň nejsem omezen maximálnírychlostí.

    loop.c139: void loop ()

    140: /**********/

    141: {

    142: struct timeval tv, ocas, ncas;

    143: long int i = 0;

    144: long int opakovani = 0;

    145:

    146: // popup_sl("zkouska", (void (*)(char *))puts);

    147:

    148: gettimeofday(&ocas, NULL);

    149: for(;;){

    150: cekalose = 0;

    151:

    152: udalosti(); // zpracovavam udalosti

    153:

    154: dotimers(); // Provedu timery

    155: if(prvtimer) prvtimer-> zbyva--; //a posunu je o jednicku

    156:

    157: updateposts(); // provedu graficke

    158: kreslianim(); // zmeny

    159:

    160: if(opakovani) opakovani--;

    161:

    162: if(!opakovani){

    163: tv.tv_sec = vter;

    164: tv.tv_usec = uvter;

    165: select(0, NULL, NULL, NULL, &tv); // cekam

    166: }

    167:

    168: i++;

    169: gettimeofday(&ncas, NULL);

    170: if(ocas.tv_sec < ncas.tv_sec){/*

    171: printf("real FPS: %ld, ", i);

    172: printf("real delay: %ld\n", (ncas.tv_sec-ocas.tv_sec)*1000000

    173: + (ncas.tv_usec-ocas.tv_usec));*/

    174: i=0;

    175: }

    void loop(): 24–25, 28, 187–188

    24

  • 12 Modul loop Program kraluk

    176:

    177: if(!opakovani && !cekalose)

    178: opakovani =

    179: ((ncas.tv_sec-ocas.tv_sec)*1000000 + (ncas.tv_usec-ocas.tv_usec))/

    180: (vter*10000000 + uvter);

    181: if(cekalose) opakovani = 0;

    182:

    183: ocas = ncas;

    184: }

    185: }

    Do globální proměnné cekalose uložím true, pokud je vhodné přeskakování framů přerušit, Dalšíframe je do proměnné cekalose opět uložen false. Na true se nastavuje například, když měním rychlostnebo přepnu do textového módu. Do lokalní proměnné opakovani ukládám, kolikrát ještě chci přeskočitčekání. Pokud nic nepřeskakuji, je v opakovani nula.

    Ve funkci loop volám funkci udalosti pro zpracování událostí. Tato funkce projde všechny za-frontěné události a pokud je pak aktivní okno s textovým vstupem, nevypne se, a čeká na události, dokudse opět nezaktivní hlavní okénko s obrázky.

    loop.c101: static void udalosti ()

    102: /*********************/

    103: {

    104: XEvent report;

    105: KeySym ks;

    106: char *ksname, ch;

    107:

    108: while (okrajtext || XEventsQueued(display, QueuedAfterReading)){

    109: if(okrajtext){

    110: cekalose = 1;

    111: updateposts();

    112: }

    113: XNextEvent(display, &report); // seberu udalost ze fronty nebo na ni cekam

    114:

    115: switch (report.type){

    116:

    117: case Expose: // Pri odkryti textu

    118: redrawtext(); // je treba ho prekreslit.

    119: if(!okrajtext) mengraf = 1;

    120: break;

    121:

    122: case ButtonPress: // Pri zmacknuti tlacitka na mysi

    123: popup_info("_help"); // se ukaze napoveda

    124: break;

    125:

    126: case KeyPress: // Pri zmacknuti klavesy

    127: XLookupString (&report.xkey, NULL, 0, &ks, NULL);

    128: if (ks != NoSymbol && (ksname = XKeysymToString (ks))

    129: && dobind(ksname)) break; // zkusim spustit klavesovou zkratku

    130:

    131: ch = xkeyznak(&report);

    132: if(ch) pripisznak(ch); // nebo alespon pripsat zmacknuty znak do spodniho radku

    133: }

    134: }

    135: }

    Čas, který chci čekat, je uložený v proměnných vter a uvter. V proměnné vter je počet sekund,který se má čekat a v proměnné uvter zbyvající počet mikrosekund. Tento čekající čas se dá změnitpomocí funkce setdelay, která dostane počet sekund a mikrosekund. Tento čas vloží do proměnnýchvter a uvter, přižemž nejprve převede parametry do jednoho čísla a pak opět rozloží.

    loop.c86: void setdelay (int vteriny, int mikro)

    87: /***********************************/

    88: {

    char cekalose: 24–26, 34, 119, 123, 165 void udalosti /*loop*/ (): 24–25 int vter /*loop*/: 24–26 int uvter /*loop*/ : 24–26 void setdelay(): 25–27

    25

  • 12 Modul loop Program kraluk

    89: long int cas;

    90:

    91: cas = mikro + vteriny*1000000;

    92: if(cas>0){

    93: vter = cas/1000000;

    94: uvter = cas%1000000;

    95: }

    96: cekalose = 0;

    97: }

    Pomocí funkce setFPSs vytvořím pole FPSs rychlostí, které budou ve hře dostupné. Tato funkcemá proměnný počet parametrů, takže kompilátor nepozná, jaký je typ parametrů. Je proto třeba u kaž-dého parametru (kromě prvního) zdůraznit, že je typu double, například tím, že se za něj napíše desetinátečka. Seznam parametrů je ukončen nulou a záporný parametr bude načten jako aktuální rychlost (FPS).V proměnné aktuFPS je index do pole FPSs pro aktuální rychlost. Proměnná maxFPS udává index naposlední políčko pole FPSs tedy jeho délka minus jedna. Tato funkce by měla být spuštěna před funkcíkql_init.

    loop.c25: static double *FPSs = NULL;

    26:

    27: void setFPSs (double prvni, ...)

    28: {

    29: va_list vl;

    30: double d;

    31:

    32: if(FPSs) warning("rychlosti uz byly definovany");

    33:

    34: maxFPS = 0;

    35: va_start(vl, prvni);

    36: for(d=prvni; d; d = va_arg(vl, double)){

    37: maxFPS++;

    38: }

    39: va_end(vl);

    40:

    41: FPSs = malloc(maxFPS*sizeof(double));

    42:

    43: aktuFPS = maxFPS = -1;

    44: va_start(vl, prvni);

    45: for(d=prvni; d; d = va_arg(vl, double)){

    46: maxFPS++;

    47: if(d= 0) warning("aktualni FPS je vicenasobne");

    49: aktuFPS = maxFPS;

    50: d = -d;

    51: }

    52: FPSs[maxFPS] = d;

    53: }

    54: va_end(vl);

    55:

    56: if(aktuFPS == -1){

    57: warning("nenalezeno aktualni FPS");

    58: aktuFPS = 0;

    59: }

    60:

    61: setdelay(0, 1000000/FPSs[aktuFPS]);

    62: }

    Pro změnu aktuální rychlosti se dá použít funkce zmenFPS. Jejím parametrem je hodnota, kteráse přičte k proměnné aktuFPS.

    loop.c66: void zmenFPS(int oco)

    67: {

    68: int i;

    void setFPSs(): 26, 187, 190 double FPSs: 26–27 int aktuFPS: 26–27, 160–162int maxFPS: 26–27, 161–162 void zmenFPS(): 20, 26, 161–162

    26

  • 13 Modul timer Program kraluk

    69:

    70: if(!FPSs){

    71: warning("nenacteny rychlosti");

    72: return;

    73: }

    74:

    75: i = aktuFPS+oco;

    76: if(imaxFPS) i = maxFPS;

    78:

    79: if(i != aktuFPS) setdelay(0, 1000000/FPSs[i]);

    80: aktuFPS = i;

    81: printf("FPS: %f\n", FPSs[i]);

    82: }

    13 Modul timerZákladní představa timeru je jakýsi budík, který po předem určeném čase zazvoní, čili spustí

    určitou funkci. Obvykle (jinde než v tomto programu) se timeru zadává počet sekund a milisekund,jakožto čas, za který se má spustit. Tento přístup však není přesný, jelikož i výpočet trvá nějakou dobua navíc chci hru někdy zpomalovat nebo zrychlovat. Tady se tedy timeru přiřadí počet framů.

    Timer se deklaruje jako ukazatel na datový typ kq_timer. Definice tohoto datového typu vypadánásledovně:

    timer.h3: struct kq_timer{

    4: kq_timer *next;

    5:

    6: void (*funkce)();

    7: kq_pin parametr;

    8:

    9: unsigned int zbyva;

    10: float priorita;

    11:

    12: int opakovani;

    13: unsigned int cas;

    14:

    15: char pause;

    16: char lokalni;

    17:

    18: int Cislo;

    19: };

    S tímto datovým typem se dá manipulovat pomocí funkcí:timer.h

    32: void dotimers();

    33:

    34: int zjistitimer(kq_timer *tim);

    35: void zmentimer(kq_timer *tim, int cas, float priorita);

    36:

    37: void pausetimer(kq_timer *tim);

    38: void unpausetimer(kq_timer *tim);

    39:

    40: void deleteltimers();

    41: void deleteAtimers();

    42:

    43: kq_timer *vytvortimer(void (*funkce)(), kq_pin parametr, int cas,

    44: float priorita, int opakovani, char lokalni, char pause);

    45: void znictimer(kq_timer *tim);

    46:

    47: void vypistimer(kq_timer *tim);

    48: void vypistimery();

    První dvě položky struktury určují, co se má stát při „zazvoněníÿ timeru. Spustí se funkce funkces daným parametrem podle kq_pin, pin.

    kq_timer: 7, 27–33, 63, 65, 132, 136, 138–141, 143, 145–146, 148, 154, 167

    27

  • 13 Modul timer Program kraluk

    Poté, co timer „zazvoníÿ, se s ním mohou stát dvě věci. Buď zmizí (smaže se) a už se s ním nedánic dělat nebo se pustí znova. V položce opakovani je počet „zazvoněníÿ, které timeru ještě zbývají.Je-li opakovani záporné nebo nulové, bude se timer opakovat pořád. Položka cas udává, na jaký čas semá timer při opakování zpátky nastavit.

    Položky opakovani i cas se dají bez problémů měnit. Měníte-li však timer, co je právě spuštěný,je dobré vědět, co přesně dělá funkce dotimers().

    Funkce dotimers spustí timery, co jsou právě na řadě. Ukazatel na právě spuštěný timer přitomuloží do globální proměnn