Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * OpenTyrian: A modern cross-platform port of Tyrian
  3.  * Copyright (C) 2007-2009  The OpenTyrian Development Team
  4.  *
  5.  * This program is free software; you can redistribute it and/or
  6.  * modify it under the terms of the GNU General Public License
  7.  * as published by the Free Software Foundation; either version 2
  8.  * of the License, or (at your option) any later version.
  9.  *
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License
  16.  * along with this program; if not, write to the Free Software
  17.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  18.  */
  19. #include "fonthand.h"
  20.  
  21. #include "network.h"
  22. #include "nortsong.h"
  23. #include "nortvars.h"
  24. #include "opentyr.h"
  25. #include "params.h"
  26. #include "sprite.h"
  27. #include "vga256d.h"
  28. #include "video.h"
  29.  
  30. const int font_ascii[256] =
  31. {
  32.          -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
  33.          -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
  34.          -1,  26,  33,  60,  61,  62,  -1,  32,  64,  65,  63,  84,  29,  83,  28,  80, //  !"#$%&'()*+,-./
  35.          79,  70,  71,  72,  73,  74,  75,  76,  77,  78,  31,  30,  -1,  85,  -1,  27, // 0123456789:;<=>?
  36.          -1,   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14, // @ABCDEFGHIJKLMNO
  37.          15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  68,  82,  69,  -1,  -1, // PQRSTUVWXYZ[\]^_
  38.          -1,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,  48, // `abcdefghijklmno
  39.          49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  66,  81,  67,  -1,  -1, // pqrstuvwxyz{|}~⌂
  40.  
  41.          86,  87,  88,  89,  90,  91,  92,  93,  94,  95,  96,  97,  98,  99, 100, 101, // ÇüéâäàåçêëèïîìÄÅ
  42.         102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, // ÉæÆôöòûùÿÖÜ¢£¥₧ƒ
  43.         118, 119, 120, 121, 122, 123, 124, 125, 126,  -1,  -1,  -1,  -1,  -1,  -1,  -1, // áíóúñѪº¿
  44.          -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
  45.          -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
  46.          -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
  47.          -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
  48.          -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
  49. };
  50.  
  51. /* shape constants included in newshape.h */
  52.  
  53. JE_byte textGlowFont, textGlowBrightness = 6;
  54.  
  55. JE_boolean levelWarningDisplay;
  56. JE_byte levelWarningLines;
  57. char levelWarningText[10][61]; /* [1..10] of string [60] */
  58. JE_boolean warningRed;
  59.  
  60. JE_byte warningSoundDelay;
  61. JE_word armorShipDelay;
  62. JE_byte warningCol;
  63. JE_shortint warningColChange;
  64.  
  65. void JE_dString( SDL_Surface * screen, int x, int y, const char *s, unsigned int font )
  66. {
  67.         const int defaultBrightness = -3;
  68.  
  69.         int bright = 0;
  70.  
  71.         for (int i = 0; s[i] != '\0'; ++i)
  72.         {
  73.                 int sprite_id = font_ascii[(unsigned char)s[i]];
  74.  
  75.                 switch (s[i])
  76.                 {
  77.                 case ' ':
  78.                         x += 6;
  79.                         break;
  80.  
  81.                 case '~':
  82.                         bright = (bright == 0) ? 2 : 0;
  83.                         break;
  84.  
  85.                 default:
  86.                         if (sprite_id != -1)
  87.                         {
  88.                                 blit_sprite_dark(screen, x + 2, y + 2, font, sprite_id, false);
  89.                                 blit_sprite_hv_unsafe(screen, x, y, font, sprite_id, 0xf, defaultBrightness + bright);
  90.  
  91.                                 x += sprite(font, sprite_id)->width + 1;
  92.                         }
  93.                         break;
  94.                 }
  95.         }
  96. }
  97.  
  98. int JE_fontCenter( const char *s, unsigned int font )
  99. {
  100.         return 160 - (JE_textWidth(s, font) / 2);
  101. }
  102.  
  103. int JE_textWidth( const char *s, unsigned int font )
  104. {
  105.         int x = 0;
  106.  
  107.         for (int i = 0; s[i] != '\0'; ++i)
  108.         {
  109.                 int sprite_id = font_ascii[(unsigned char)s[i]];
  110.  
  111.                 if (s[i] == ' ')
  112.                         x += 6;
  113.                 else if (sprite_id != -1)
  114.                         x += sprite(font, sprite_id)->width + 1;
  115.         }
  116.  
  117.         return x;
  118. }
  119.  
  120. void JE_textShade( SDL_Surface * screen, int x, int y, const char *s, unsigned int colorbank, int brightness, unsigned int shadetype )
  121. {
  122.         switch (shadetype)
  123.         {
  124.                 case PART_SHADE:
  125.                         JE_outText(screen, x+1, y+1, s, 0, -1);
  126.                         JE_outText(screen, x, y, s, colorbank, brightness);
  127.                         break;
  128.                 case FULL_SHADE:
  129.                         JE_outText(screen, x-1, y, s, 0, -1);
  130.                         JE_outText(screen, x+1, y, s, 0, -1);
  131.                         JE_outText(screen, x, y-1, s, 0, -1);
  132.                         JE_outText(screen, x, y+1, s, 0, -1);
  133.                         JE_outText(screen, x, y, s, colorbank, brightness);
  134.                         break;
  135.                 case DARKEN:
  136.                         JE_outTextAndDarken(screen, x+1, y+1, s, colorbank, brightness, TINY_FONT);
  137.                         break;
  138.                 case TRICK:
  139.                         JE_outTextModify(screen, x, y, s, colorbank, brightness, TINY_FONT);
  140.                         break;
  141.         }
  142. }
  143.  
  144. void JE_outText( SDL_Surface * screen, int x, int y, const char *s, unsigned int colorbank, int brightness )
  145. {
  146.         int bright = 0;
  147.  
  148.         for (int i = 0; s[i] != '\0'; ++i)
  149.         {
  150.                 int sprite_id = font_ascii[(unsigned char)s[i]];
  151.  
  152.                 switch (s[i])
  153.                 {
  154.                 case ' ':
  155.                         x += 6;
  156.                         break;
  157.  
  158.                 case '~':
  159.                         bright = (bright == 0) ? 4 : 0;
  160.                         break;
  161.  
  162.                 default:
  163.                         if (sprite_id != -1 && sprite_exists(TINY_FONT, sprite_id))
  164.                         {
  165.                                 if (brightness >= 0)
  166.                                         blit_sprite_hv_unsafe(screen, x, y, TINY_FONT, sprite_id, colorbank, brightness + bright);
  167.                                 else
  168.                                         blit_sprite_dark(screen, x, y, TINY_FONT, sprite_id, true);
  169.  
  170.                                 x += sprite(TINY_FONT, sprite_id)->width + 1;
  171.                         }
  172.                         break;
  173.                 }
  174.         }
  175. }
  176.  
  177. void JE_outTextModify( SDL_Surface * screen, int x, int y, const char *s, unsigned int filter, unsigned int brightness, unsigned int font )
  178. {
  179.         for (int i = 0; s[i] != '\0'; ++i)
  180.         {
  181.                 int sprite_id = font_ascii[(unsigned char)s[i]];
  182.  
  183.                 if (s[i] == ' ')
  184.                 {
  185.                         x += 6;
  186.                 }
  187.                 else if (sprite_id != -1)
  188.                 {
  189.                         blit_sprite_hv_blend(screen, x, y, font, sprite_id, filter, brightness);
  190.  
  191.                         x += sprite(font, sprite_id)->width + 1;
  192.                 }
  193.         }
  194. }
  195.  
  196. void JE_outTextAdjust( SDL_Surface * screen, int x, int y, const char *s, unsigned int filter, int brightness, unsigned int font, JE_boolean shadow )
  197. {
  198.         int bright = 0;
  199.  
  200.         for (int i = 0; s[i] != '\0'; ++i)
  201.         {
  202.                 int sprite_id = font_ascii[(unsigned char)s[i]];
  203.  
  204.                 switch (s[i])
  205.                 {
  206.                 case ' ':
  207.                         x += 6;
  208.                         break;
  209.  
  210.                 case '~':
  211.                         bright = (bright == 0) ? 4 : 0;
  212.                         break;
  213.  
  214.                 default:
  215.                         if (sprite_id != -1 && sprite_exists(TINY_FONT, sprite_id))
  216.                         {
  217.                                 if (shadow)
  218.                                         blit_sprite_dark(screen, x + 2, y + 2, font, sprite_id, false);
  219.                                 blit_sprite_hv(screen, x, y, font, sprite_id, filter, brightness + bright);
  220.  
  221.                                 x += sprite(font, sprite_id)->width + 1;
  222.                         }
  223.                         break;
  224.                 }
  225.         }
  226. }
  227.  
  228. void JE_outTextAndDarken( SDL_Surface * screen, int x, int y, const char *s, unsigned int colorbank, unsigned int brightness, unsigned int font )
  229. {
  230.         int bright = 0;
  231.  
  232.         for (int i = 0; s[i] != '\0'; ++i)
  233.         {
  234.                 int sprite_id = font_ascii[(unsigned char)s[i]];
  235.  
  236.                 switch (s[i])
  237.                 {
  238.                 case ' ':
  239.                         x += 6;
  240.                         break;
  241.  
  242.                 case '~':
  243.                         bright = (bright == 0) ? 4 : 0;
  244.                         break;
  245.  
  246.                 default:
  247.                         if (sprite_id != -1 && sprite_exists(TINY_FONT, sprite_id))
  248.                         {
  249.                                 blit_sprite_dark(screen, x + 1, y + 1, font, sprite_id, false);
  250.                                 blit_sprite_hv_unsafe(screen, x, y, font, sprite_id, colorbank, brightness + bright);
  251.  
  252.                                 x += sprite(font, sprite_id)->width + 1;
  253.                         }
  254.                         break;
  255.                 }
  256.         }
  257. }
  258.  
  259. void JE_updateWarning( SDL_Surface * screen )
  260. {
  261.         if (delaycount2() == 0)
  262.         { /*Update Color Bars*/
  263.  
  264.                 warningCol += warningColChange;
  265.                 if (warningCol > 14 * 16 + 10 || warningCol < 14 * 16 + 4)
  266.                 {
  267.                         warningColChange = -warningColChange;
  268.                 }
  269.                 fill_rectangle_xy(screen, 0, 0, 319, 5, warningCol);
  270.                 fill_rectangle_xy(screen, 0, 194, 319, 199, warningCol);
  271.                 JE_showVGA();
  272.  
  273.                 setjasondelay2(6);
  274.  
  275.                 if (warningSoundDelay > 0)
  276.                 {
  277.                         warningSoundDelay--;
  278.                 }
  279.                 else
  280.                 {
  281.                         warningSoundDelay = 14;
  282.                         JE_playSampleNum(S_WARNING);
  283.                 }
  284.         }
  285. }
  286.  
  287. void JE_outTextGlow( SDL_Surface * screen, int x, int y, const char *s )
  288. {
  289.         JE_integer z;
  290.         JE_byte c = 15;
  291.  
  292.         if (warningRed)
  293.         {
  294.                 c = 7;
  295.         }
  296.  
  297.         JE_outTextAdjust(screen, x - 1, y,     s, 0, -12, textGlowFont, false);
  298.         JE_outTextAdjust(screen, x,     y - 1, s, 0, -12, textGlowFont, false);
  299.         JE_outTextAdjust(screen, x + 1, y,     s, 0, -12, textGlowFont, false);
  300.         JE_outTextAdjust(screen, x,     y + 1, s, 0, -12, textGlowFont, false);
  301.         if (frameCountMax > 0)
  302.                 for (z = 1; z <= 12; z++)
  303.                 {
  304.                         setjasondelay(frameCountMax);
  305.                         JE_outTextAdjust(screen, x, y, s, c, z - 10, textGlowFont, false);
  306.                         if (JE_anyButton())
  307.                         {
  308.                                 frameCountMax = 0;
  309.                         }
  310.  
  311.                         NETWORK_KEEP_ALIVE();
  312.  
  313.                         JE_showVGA();
  314.  
  315.                         wait_delay();
  316.                 }
  317.         for (z = (frameCountMax == 0) ? 6 : 12; z >= textGlowBrightness; z--)
  318.         {
  319.                 setjasondelay(frameCountMax);
  320.                 JE_outTextAdjust(screen, x, y, s, c, z - 10, textGlowFont, false);
  321.                 if (JE_anyButton())
  322.                 {
  323.                         frameCountMax = 0;
  324.                 }
  325.  
  326.                 NETWORK_KEEP_ALIVE();
  327.  
  328.                 JE_showVGA();
  329.  
  330.                 wait_delay();
  331.         }
  332.         textGlowBrightness = 6;
  333. }
  334.  
  335.