REPORT ztest_mine_bom NO STANDARD PAGE HEADING LINE-SIZE 125.
blank_hidden TYPE c VALUE '0',
blank_marked TYPE c VALUE 'm',
blank_opened TYPE c VALUE '.',
bomb_hidden TYPE c VALUE '*',
bomb_marked TYPE c VALUE 'M',
bomb_opened TYPE c VALUE '&',
endgame_bomb_boom TYPE c VALUE 'X',
endgame_bomb_missmark TYPE c VALUE '@',
board(9999) TYPE c, " 2D board, x_size * y_size + borders
ofs TYPE i, " board[ofs] = cell unique ID
min TYPE i, " board[min] .. board[max]
rdx TYPE i, " = 2 + width of board
rdy TYPE i, " = 2 + height of board
square TYPE i, " = x_size * y_size = visible area
square2 TYPE i, " = rdx * rdy = visible area + border
range TYPE i, " = max - min + 1
rest TYPE i, " = square - bomb_cnt = empty cells to invent
game TYPE c, " gamestate = 1,2,3
game_size TYPE c, " B=Beginner, I=Interm, E=Expert, C=Custom
game_time(5) TYPE c, " seconds
b_left(4) TYPE c. " unmarked bombs left
" >> eight directions: North, South, East, West, NE, NW, SE, SW
DATA: eight_directions TYPE TABLE OF i INITIAL SIZE 8 WITH HEADER LINE .
" >> cells2update list, to track board[] changes
DATA: cells2update TYPE TABLE OF celltype INITIAL SIZE 1000 WITH HEADER LINE.
game_time1 TYPE timestamp, " game begin
game_time2 TYPE timestamp.
database_id_prefix(21) TYPE c VALUE 'ABAPMINESWEEPERSCORES'.
high_scores TYPE SORTED TABLE OF score_line
WITH UNIQUE KEY time WITH HEADER LINE,
database_id LIKE indx-srtfd. " export/import to database ID
SELECTION-SCREEN BEGIN OF BLOCK bl_game_difficulty.
SELECTION-SCREEN: BEGIN OF LINE.
SELECTION-SCREEN: COMMENT (23) hstitle1.
SELECTION-SCREEN: END OF LINE.
SELECTION-SCREEN: BEGIN OF LINE.
PARAMETERS g1 RADIOBUTTON GROUP one
USER-COMMAND radiogroup01.
SELECTION-SCREEN: COMMENT (10) text1.
SELECTION-SCREEN: END OF LINE.
SELECTION-SCREEN: BEGIN OF LINE.
PARAMETERS g2 RADIOBUTTON GROUP one.
SELECTION-SCREEN: COMMENT (12) text2.
SELECTION-SCREEN: END OF LINE.
SELECTION-SCREEN: BEGIN OF LINE.
PARAMETERS g3 RADIOBUTTON GROUP one.
SELECTION-SCREEN: COMMENT (10) text3.
SELECTION-SCREEN: END OF LINE.
SELECTION-SCREEN: BEGIN OF LINE.
PARAMETERS g4 RADIOBUTTON GROUP one.
SELECTION-SCREEN: COMMENT (10) text4.
SELECTION-SCREEN: END OF LINE.
SELECTION-SCREEN: END OF BLOCK bl_game_difficulty.
SELECTION-SCREEN BEGIN OF BLOCK bl_high_scores.
SELECTION-SCREEN: BEGIN OF LINE.
SELECTION-SCREEN: COMMENT (1) dummy1.
SELECTION-SCREEN: END OF LINE.
SELECTION-SCREEN: BEGIN OF LINE.
SELECTION-SCREEN: COMMENT (23) hstitle2.
SELECTION-SCREEN: END OF LINE.
selection-screen: begin of line.
selection-screen: comment (1) hs1_&1.
selection-screen: comment (12) hs2_&1.
selection-screen: comment (5) hs3_&1.
selection-screen: end of line.
SELECTION-SCREEN ULINE /1(20).
SELECTION-SCREEN ULINE /1(20).
SELECTION-SCREEN: END OF BLOCK bl_high_scores.
" >> Window: Custom Game Dimensions
SELECTION-SCREEN BEGIN OF SCREEN 1001.
SELECTION-SCREEN: BEGIN OF LINE.
SELECTION-SCREEN: COMMENT (12) txtcustw.
PARAMETERS: x_size TYPE i DEFAULT '09'.
SELECTION-SCREEN: END OF LINE.
SELECTION-SCREEN: BEGIN OF LINE.
SELECTION-SCREEN: COMMENT (12) txtcusth.
PARAMETERS: y_size TYPE i DEFAULT '09'.
SELECTION-SCREEN: END OF LINE.
SELECTION-SCREEN: BEGIN OF LINE.
SELECTION-SCREEN: COMMENT (12) txtcustb.
PARAMETERS: bomb_cnt TYPE i DEFAULT '10'.
SELECTION-SCREEN: END OF LINE.
SELECTION-SCREEN END OF SCREEN 1001.
" >> modify board[ofs] and track changes
cells2update-offset = ofs.
if game_time1 is initial.
get time stamp field game_time1.
*----------------------------------------------------------------------*
* CLASS cl_my_gui_html_viewer DEFINITION
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
CLASS cl_my_gui_html_viewer DEFINITION INHERITING FROM
METHODS: constructor IMPORTING parent TYPE REF TO cl_gui_container.
METHODS: html_board_update.
METHODS: on_sapevent FOR EVENT sapevent OF cl_gui_html_viewer
IMPORTING action query_table.
DATA: js TYPE STANDARD TABLE OF char255 INITIAL SIZE 1000.
ENDCLASS. "cl_my_gui_html_viewer DEFINITION
lo_dock TYPE REF TO cl_gui_docking_container,
lo_cont TYPE REF TO cl_gui_container,
html_control TYPE REF TO cl_my_gui_html_viewer,
hstitle1 = ' :: GAME DIFFICULTY ::'.
hstitle2 = ' :: HIGH SCORES ::'.
wnd_style = cl_gui_control=>ws_thickframe + cl_gui_control=>ws_child.
side = cl_gui_docking_container=>dock_at_right
CREATE OBJECT html_control
PERFORM game_create USING 'B' x_size y_size bomb_cnt.
AT LINE-SELECTION. " abap-mode, cmd 'PICK'
PERFORM cell_get_clicked CHANGING ofs.
PERFORM cell_open USING ofs.
IF rest <= 0 AND game = game_in.
GET TIME STAMP FIELD game_time2.
game_time = game_time2 - game_time1.
AT PF09. " abap-mode, cmd 'MARK'
PERFORM cell_get_clicked CHANGING ofs.
PERFORM cell_mark USING ofs.
AT SELECTION-SCREEN OUTPUT.
IF lines( cells2update ) > 0.
" here: switch back from abap to html
CALL METHOD html_control->html_board_update( ).
AT SELECTION-SCREEN ON RADIOBUTTON GROUP one.
CHECK sy-ucomm = 'RADIOGROUP01'.
PERFORM game_create USING 'B' 09 09 10.
PERFORM game_create USING 'I' 16 16 40.
PERFORM game_create USING 'E' 30 16 99.
CALL SELECTION-SCREEN 1001
PERFORM game_create USING 'C' x_size y_size bomb_cnt.
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
DATA: ofs TYPE i, ch TYPE c.
WRITE: / 'Bombs left: ', b_left NO-ZERO.
WRITE AT x_ofs '|' NO-GAP.
WHEN '1' OR '2' OR '3' OR '4' OR '5' OR '6' OR '7' OR '8'.
WRITE: ' ' NO-GAP, ch NO-GAP.
WRITE icon_breakpoint AS ICON NO-GAP.
OR 'a' OR 'b' OR 'c' OR 'd' OR 'e' OR 'f' OR 'g' OR 'h'.
WRITE icon_breakpoint AS ICON NO-GAP.
WHEN endgame_bomb_missmark.
WRITE icon_breakpoint_disable AS ICON NO-GAP.
WRITE icon_system_cancel AS ICON NO-GAP.
WHEN bomb_opened. "endgame only
WRITE icon_dummy AS ICON NO-GAP.
WRITE: icon_wd_transparent_container AS ICON NO-GAP.
WRITE: AT x_ofs '' NO-GAP, ' switch back ' COLOR 2 HOTSPOT ON.
WRITE: /, /4 'Game over', /, /.
WRITE: /, /4 'You win', /, /.
WRITE: / ' open: double-click'.
WRITE: / ' mark: click and press F9'.
ENDFORM. "game_print_abap
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
* mark a cell with 'bomb sign'
*----------------------------------------------------------------------*
FORM cell_mark USING VALUE(ofs) TYPE i.
WHEN blank_hidden. setcell blank_marked. ADD -1 TO b_left.
WHEN blank_marked. setcell blank_hidden. ADD +1 TO b_left.
WHEN bomb_hidden. setcell bomb_marked. ADD -1 TO b_left.
WHEN bomb_marked. setcell bomb_hidden. ADD +1 TO b_left.
WHEN 'A' OR 'B' OR 'C' OR 'D' OR 'E' OR 'F' OR 'G' OR 'H'.
TRANSLATE ch TO LOWER CASE.
setcell ch. ADD -1 TO b_left.
WHEN 'a' OR 'b' OR 'c' OR 'd' OR 'e' OR 'f' OR 'g' OR 'h'.
TRANSLATE ch TO UPPER CASE.
setcell ch. ADD +1 TO b_left.
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
* open a cell, at one's own risk
*----------------------------------------------------------------------*
FORM cell_open USING VALUE(ofs) TYPE i.
PERFORM cell_floodfill USING ofs.
WHEN 'A'. setcell '1'. ADD -1 TO rest.
WHEN 'B'. setcell '2'. ADD -1 TO rest.
WHEN 'C'. setcell '3'. ADD -1 TO rest.
WHEN 'D'. setcell '4'. ADD -1 TO rest.
WHEN 'E'. setcell '5'. ADD -1 TO rest.
WHEN 'F'. setcell '6'. ADD -1 TO rest.
WHEN 'G'. setcell '7'. ADD -1 TO rest.
WHEN 'H'. setcell '8'. ADD -1 TO rest.
WHEN '1' OR '2' OR '3' OR '4' OR '5' OR '6' OR '7' OR '8'.
PERFORM cell_open_around USING ofs.
setcell endgame_bomb_boom.
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
FORM cell_get_clicked CHANGING ofs TYPE i.
DATA: row TYPE i, col TYPE i.
col = ( sy-cucol - x_ofs - 2 ) DIV 2.
ofs = ( 1 + row ) * rdx + col + 1.
IF row < 0 OR row > y_size OR
ENDFORM. "cell_get_clicked
DATA: floodfill TYPE TABLE OF i INITIAL SIZE 1000.
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
* open all adjacent empty cells
*----------------------------------------------------------------------*
FORM cell_floodfill USING VALUE(x) TYPE i.
ofs = x + 00. " cell itself
setcell blank_opened. ADD -1 TO rest.
LOOP AT floodfill INTO x.
LOOP AT eight_directions.
ofs = x + eight_directions.
setcell blank_opened. ADD -1 TO rest.
WHEN 'A'. setcell '1'. ADD -1 TO rest.
WHEN 'B'. setcell '2'. ADD -1 TO rest.
WHEN 'C'. setcell '3'. ADD -1 TO rest.
WHEN 'D'. setcell '4'. ADD -1 TO rest.
WHEN 'E'. setcell '5'. ADD -1 TO rest.
WHEN 'F'. setcell '6'. ADD -1 TO rest.
WHEN 'G'. setcell '7'. ADD -1 TO rest.
WHEN 'H'. setcell '8'. ADD -1 TO rest.
ENDFORM. "cell_flood_fill
*&---------------------------------------------------------------------*
*& Form cell_open_eight_directions
*&---------------------------------------------------------------------*
* Open up to 8 cells around current one
*----------------------------------------------------------------------*
FORM cell_open_around USING VALUE(x) TYPE i.
" 1 >> get cell's VALUE (1 to 8)
" 2 >> look around it, get count of marked
LOOP AT eight_directions.
ofs = x + eight_directions.
" 4 >> here: opening is possible
LOOP AT eight_directions.
ofs = x + eight_directions.
PERFORM cell_floodfill USING ofs.
WHEN 'A'. setcell '1'. ADD -1 TO rest.
WHEN 'B'. setcell '2'. ADD -1 TO rest.
WHEN 'C'. setcell '3'. ADD -1 TO rest.
WHEN 'D'. setcell '4'. ADD -1 TO rest.
WHEN 'E'. setcell '5'. ADD -1 TO rest.
WHEN 'F'. setcell '6'. ADD -1 TO rest.
WHEN 'G'. setcell '7'. ADD -1 TO rest.
WHEN 'H'. setcell '8'. ADD -1 TO rest.
setcell endgame_bomb_missmark.
setcell endgame_bomb_boom.
ENDFORM. "cell_open_eight_directions
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------
WHILE board(square2) CA '*abcdefghm'. " digit_marked + blank_marked
IF board+ofs(1) = bomb_hidden. " if = '*'
setcell endgame_bomb_missmark.
MESSAGE s000(su) WITH 'Game over'.
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
WHILE board(square2) CS bomb_hidden.
MESSAGE s000(su) WITH 'You win!' .
PERFORM high_scores_read.
PERFORM high_scores_update.
PERFORM high_scores_show.
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
prng TYPE REF TO cl_abap_random_int,
CONCATENATE database_id_prefix game_size INTO database_id.
PERFORM high_scores_read.
PERFORM high_scores_show.
square = x_size * y_size.
bomb_cnt = square. " limit bombs to 100%
rest = square - bomb_cnt. " empty places to invent
rdx = 2 + x_size. " width + left and right border
rdy = 2 + y_size. " height + top and button border
MESSAGE e000(su) WITH 'board too large (9999)'.
" >> board[9999]'s used space
min = 1 + 1 * rdx. " topleft
max = square2 - rdx - 2. " bottomright
REFRESH eight_directions.
eight_directions = -1 + rdx * -1. APPEND eight_directions. " NW
eight_directions = 00 + rdx * -1. APPEND eight_directions. " North
eight_directions = +1 + rdx * -1. APPEND eight_directions. " NE
eight_directions = -1 + rdx * 00. APPEND eight_directions. " W
eight_directions = +1 + rdx * 00. APPEND eight_directions. " E
eight_directions = -1 + rdx * +1. APPEND eight_directions. " SW
eight_directions = 00 + rdx * +1. APPEND eight_directions. " S
eight_directions = 01 + rdx * +1. APPEND eight_directions. " SE
" if bombs < 50%, place bombs randomly
" if bombs > 50%, place spaces randomly
half = x_size * y_size DIV 2.
drop_bombs = 'X'. " straight order
drop_bombs = ' '. " reversed order
ofs = square2 - sy-index .
ofs = sy-index * rdx + rdx - 1.
seed = cl_abap_random=>seed( ).
prng = cl_abap_random_int=>create(
seed = seed min = min max = max ).
EXIT. " found unused (BG 1 2 3 4 5 6 7 8)
" add 1 point to cells around
LOOP AT eight_directions.
j = ofs + eight_directions.
WHEN bomb_hidden OR border.
board+j(1) = board+j(1) + 1.
" get 1 point from every bomb around
LOOP AT eight_directions.
j = ofs + eight_directions.
board+ofs(1) = board+ofs(1) + 1.
TRANSLATE board(square2) USING '1A2B3C4D5E6F7G8H'.
*----------------------------------------------------------------------*
* CLASS my_cl_gui_html_viewer IMPLEMENTATION
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
CLASS cl_my_gui_html_viewer IMPLEMENTATION.
DATA: myevent_tab TYPE cntl_simple_events,
myevent TYPE cntl_simple_event.
CALL METHOD super->constructor(
uiflag = html_control->uiflag_noiemenu
myevent-appl_event = 'X'.
myevent-eventid = html_control->m_id_sapevent.
APPEND myevent TO myevent_tab.
myevent-eventid = html_control->m_id_navigate_complete.
APPEND myevent TO myevent_tab.
CALL METHOD html_control->set_registered_events(
SET HANDLER me->on_sapevent FOR html_control.
METHOD on_sapevent. " arguments: action, query_table[]
DATA: param LIKE LINE OF query_table.
READ TABLE query_table WITH KEY name = 'ID' INTO param.
IF sy-subrc EQ 0. cell_ofs = param-value. ENDIF.
READ TABLE query_table WITH KEY name = 'TIME' INTO param.
IF sy-subrc EQ 0. game_time = param-value. ENDIF.
WHEN 'click'. " left-click
PERFORM cell_open USING cell_ofs.
IF rest <= 0 AND game = game_in.
CALL METHOD me->html_board_update( ).
WHEN 'mouseup'. " right-click
PERFORM cell_mark USING cell_ofs.
CALL METHOD me->html_board_update( ).
PERFORM game_create USING game_size x_size y_size bomb_cnt.
LEAVE TO LIST-PROCESSING.
" >> transport board[]'s changes (saved in cells2update[]), to HTML
METHOD html_board_update.
DATA: ofs TYPE i, new TYPE i, len TYPE i, end TYPE i.
DATA: jsline LIKE LINE OF js.
" >> convert cells2update[] to plain string
CONCATENATE LINES OF cells2update INTO buf SEPARATED BY '|'.
" >> convert plain string to JavaScript code
" and pack it to HTML_VIEWER's compatible table
new = ofs + 249. " 255 - strlen ( b+=""; ) is 249
CONCATENATE 'b+="' buf+ofs(len) '";' INTO jsline.
CONCATENATE 'updateCells(' game ',"' b_left+1 '")' INTO jsline.
CALL METHOD me->set_script( script = js[] ).
CALL METHOD me->execute_script( ).
ENDMETHOD. "html_board_update
ENDCLASS. "cl_my_gui_html_viewer IMPLEMENTATION
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
FORM html_create TABLES html.
DATA: html_str TYPE string, s TYPE string,
table1 TYPE TABLE OF char255 WITH HEADER LINE INITIAL SIZE 150.
" CALL FUNCTION 'WS_UPLOAD'
" filename = 'C:\SAP\game\source.html'
" CONCATENATE LINES OF html INTO html_str SEPARATED BY '~'.
' href="SAPEVENT:click?dummy">SAPEVENT:click'
INTO html_str SEPARATED BY '~'.
" >> patch html with game parameters
DATA: xstr(4) TYPE c, ystr(4) TYPE c.
WRITE x_size TO xstr NO-GROUPING.
WRITE y_size TO ystr NO-GROUPING.
CONCATENATE 'DX=' xstr ',DY=' ystr ',BB="' b_left '";' INTO s.
REPLACE FIRST OCCURRENCE OF
'/*VARIABLES_INITIALIZATION_HERE_DONT_DELETE*/'
MESSAGE e000(su) WITH 'html template is broken'.
" >> performance improvement: condense html to width 255,
" to reduce whitespaces sent to client
SPLIT html_str AT '~' INTO TABLE table1.
DATA: ofs TYPE i, len TYPE i, nex TYPE i.
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
* create GIF-images from scratch
*----------------------------------------------------------------------*
PERFORM html_load_gif USING 'open0.gif'
'R0lGODlhEAAQAIAAAHt7e729vSH5BAAAAAAALAAAAAAQABAAA'
'AIdhI9pwe0PnnRxzmphlniz7oGbmJGWeXmU2qAcyxQAOw=='
PERFORM html_load_gif USING 'open1.gif'
'R0lGODlhEAAQAJEAAAAA/3t7e729vQAAACH5BAAAAAAALAAAA'
'AAQABAAAAIpjI9pwu0fnnRRAiCruxg+3lEbmFlX+Z1eGjZaw6'
'EMGLsjLU7Tq9v9UwAAOw==' '' '' ''.
PERFORM html_load_gif USING 'open2.gif'
'R0lGODlhEAAQAJEAAAB7AHt7e729vQAAACH5BAAAAAAALAAAA'
'AAQABAAAAItjI9pwu0fnnSRgYsvtbm3ijkhU02jUIon+ngbt3'
'4wMJFzR9sCnsm1lPrphI0CADs=' '' '' ''.
PERFORM html_load_gif USING 'open3.gif'
'R0lGODlhEAAQAJEAAHt7e729vf8AAAAAACH5BAAAAAAALAAAA'
'AAQABAAAAIshI9pwe0PnnQxiIsxZbmLVk0aE0pjUFrd5niseI'
'ETF5O0V6O3K89S6tMFHQUAOw==' '' '' ''.
PERFORM html_load_gif USING 'open4.gif'
'R0lGODlhEAAQAJEAAAAAe3t7e729vQAAACH5BAAAAAAALAAAA'
'AAQABAAAAIujI9pwu0fnnSxgSsuoE5n3FTfNnKMV4anxoJC1b'
'bqhDLiU79Tau/5vZsFTcNGAQA7' '' '' ''.
PERFORM html_load_gif USING 'open5.gif'
'R0lGODlhEAAQAJEAAHsAAHt7e729vQAAACH5BAAAAAAALAAAA'
'AAQABAAAAIpjI9pwu0fnnRRgItzq7mDzWATaF0jw3kmqYro6Q'
'rVFKcte5MntUO9UwAAOw==' '' '' ''.
PERFORM html_load_gif USING 'open6.gif'
'R0lGODlhEAAQAJEAAAB7e3t7e729vQAAACH5BAAAAAAALAAAA'
'AAQABAAAAIsjI9pwu0fnnSRgYsvtTlvgU1NFYoC2ZUMmmorBz'
'gqK7sn3I5NG+sm9AMGGwUAOw==' '' '' ''.
PERFORM html_load_gif USING 'open7.gif'
'R0lGODlhEAAQAJEAAAAAAHt7e729vQAAACH5BAAAAAAALAAAA'
'AAQABAAAAIqjI9pwu0fnnRRgItzq7mDPTEYGI5MJZlneVGTuq'
'at+8CxYwtoSPO9zygAADs=' '' '' ''.
PERFORM html_load_gif USING 'open8.gif'
'R0lGODlhEAAQAIAAAHt7e729vSH5BAAAAAAALAAAAAAQABAAA'
'AIphI9pwe0PnnSRqdXqPdliXwXaJ37hRmVXWoZt96onuFpywk'
'6Sq8O9UwAAOw==' '' '' ''.
PERFORM html_load_gif USING 'blank.gif'
'R0lGODlhEAAQAJEAAHt7e729vf///wAAACH5BAAAAAAALAAAA'
'AAQABAAAAIqlI8ZyRdggpxUAiiqfnjXG3kTmIlWZ3KhSaZqya'
'LxKrYpyF36ruf8DygAADs=' '' '' ''.
PERFORM html_load_gif USING 'bombdeath.gif'
'R0lGODlhEAAQAJEAAAAAAHt7e/8AAP///yH5BAAAAAAALAAAA'
'AAQABAAAAI0jI9pwu0fHgNSREnlFRR4zzUb933O5g1DmVlNup'
'YiydbuVIMMmrdjfnrRQL5KK4ipjCqOAgA7' '' '' ''.
PERFORM html_load_gif USING 'bombflagged.gif'
'R0lGODlhEAAQAKIAAAAAAHt7e729vf8AAP///wAAAAAAAAAAA'
'CH5BAAAAAAALAAAAAAQABAAAAM8SLrc0nCJoIS92AZK8hjZVl'
'nfF3JkCWJil5osisFXmwnAOWJ5vOOAoM8VLBY1MqMR+bsxJ5u'
PERFORM html_load_gif USING 'bombmisflagged.gif'
'R0lGODlhEAAQAKIAAAAAAHt7e729vf8AAP///wAAAAAAAAAAA'
'CH5BAAAAAAALAAAAAAQABAAAANEGLrcKjDKGSYEVtQxJI6cBo'
'VAWQqhOA5mmaoCwBEuG1WXzHInVLU6Vgtm4gg/RJ0SiVsVOzf'
'QsRZFQWNSn9UjCTUzkwQAOw==' '' ''.
PERFORM html_load_gif USING 'bombrevealed.gif'
'R0lGODlhEAAQAJEAAAAAAHt7e729vf///yH5BAAAAAAALAAAA'
'AAQABAAAAI0jI9pwu0fHgNSREnlFRR4zzUb933O5g1DmVlNup'
'YiydbuVIMMmrdjfnrRQL5KK4ipjCqOAgA7' '' '' ''.
PERFORM html_load_gif USING 'facedead.gif'
'R0lGODlhGgAaAKIAAAAAAHt7e729vf//AP///wAAAAAAAAAAA'
'CH5BAAAAAAALAAAAAAaABoAAAOAGLrcziKQSau9M0rMr95CKI'
'4kyWRlWp6ECrxvypbvYNvxOI/A7eO6BSrU+/0Aop2g2CsOmsA'
'PiHhz4qqhnRN63UpRVuPx21qKz0jtWZwWlsOwmq+tGG6PWLKI'
'yY4qzWtPSW4kYXNBdWU8cEiIUzRxMoQqlFlCUg+ZDZianZydm'
PERFORM html_load_gif USING 'facesmile.gif'
'R0lGODlhGgAaAKIAAAAAAHt7e729vf//AP///wAAAAAAAAAAA'
'CH5BAAAAAAALAAAAAAaABoAAAN/GLrcziKQSau9M0rMr95CKI'
'4kyWRlWp6ECrxvypbvYNvxOI/A7eO6BSrU+/0Aop2gaDyGlMw'
'aLvoUtpY+6UC7/YCwzSZyxwxnvaiyGUi+qXFu9BW8PcblojKM'
'i8Tn111VCkNEZn2CXzxqOUlWLnsyjiqTiC0Pl5hemJsBmpyYC'
PERFORM html_load_gif USING 'facesmile.gif'
'R0lGODlhGgAaAKIAAAAAAHt7e729vf//AP///wAAAAAAAAAAA'
'CH5BAAAAAAALAAAAAAaABoAAAN/GLrcziKQSau9M0rMr95CKI'
'4kyWRlWp6ECrxvypbvYNvxOI/A7eO6BSrU+/0Aop2gaDyGlMw'
'aLvoUtpY+6UC7/YCwzSZyxwxnvaiyGUi+qXFu9BW8PcblojKM'
'i8Tn111VCkNEZn2CXzxqOUlWLnsyjiqTiC0Pl5hemJsBmpyYC'
PERFORM html_load_gif USING 'facewin.gif'
'R0lGODlhGgAaAKIAAAAAAHt7AHt7e729vf//AP///wAAAAAAA'
'CH5BAAAAAAALAAAAAAaABoAAAOEKLrczkOUSau9M0rMr95DKI'
'4kyWRlWp6FCrxvypYvYdvxOI/A7eO6BSrU+/0Aot2gaDyGlEW'
'YtEZAfkBLnLS6rV5RvTCMWwt/W8tigMoNaM/Ephy5Y8p9dCE6'
'izverFB4XUBwInZNVoWGd4mKhoc5SXouUjKTKphPQlcPnQ2cn'
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
gif_binary_table TYPE TABLE OF w3mime.
CONCATENATE s1 s2 s3 s4 s5 s6 INTO gif_base64.
CALL FUNCTION 'SSFC_BASE64_DECODE'
CALL METHOD html_control->load_data
data_table = gif_binary_table
*---------------------------------------------------------------------*
* FORM XSTRING_TO_TABLE *
*---------------------------------------------------------------------*
* convert xstring to xtable[255]
*---------------------------------------------------------------------*
USING buffer TYPE xstring
CHANGING binary_size TYPE i.
DATA: rows TYPE i, pos TYPE i.
ASSIGN COMPONENT 0 OF STRUCTURE table1 TO TYPE 'X'.
binary_size = xstrlen( buffer ).
rows = ( binary_size + 255 - 1 ) DIV 255.
ENDFORM. "xstring_to_table
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
html TYPE TABLE OF w3html INITIAL SIZE 150.
PERFORM html_create TABLES html.
CALL METHOD html_control->load_data(
CALL METHOD html_control->show_url( url = doc_url ).
*---------------------------------------------------------------------*
* FORM high_scores_read *
*---------------------------------------------------------------------*
IMPORT lines = high_scores[] FROM DATABASE indx(st) ID database_id.
ENDFORM. "high_scores_read
*---------------------------------------------------------------------*
* FORM high_scores_show *
*---------------------------------------------------------------------*
DATA: s(6) TYPE c, line TYPE c.
FIELD-SYMBOLS: <fs1> TYPE c, <fs2> TYPE c.
CONCATENATE 'hs2_' line INTO s.
CONCATENATE 'hs3_' line INTO s.
READ TABLE high_scores INDEX sy-index.
<fs1> = high_scores-user.
<fs2> = high_scores-time.
ENDFORM. "high_scores_show
*---------------------------------------------------------------------*
* FORM high_scores_update *
*---------------------------------------------------------------------*
high_scores-user = sy-uname.
WRITE game_time TO high_scores-time RIGHT-JUSTIFIED.
INSERT high_scores INTO TABLE high_scores[].
LOOP AT high_scores FROM 10.
DELETE high_scores INDEX sy-tabix.
EXPORT lines = high_scores[] TO DATABASE indx(st) ID database_id.
ENDFORM. "high_scores_update
