//
// Thunder Graphic User Interface
//
-// by James L. Hammons
-// (c) 2004, 2009 Underground Software
+// by James Hammons
+// (c) 2004, 2014 Underground Software
//
-// JLH = James L. Hammons <jlhamm@acm.org>
+// JLH = James Hammons <jlhamm@acm.org>
//
// WHO WHEN WHAT
// --- ---------- ------------------------------------------------------------
// JLH 07/23/2009 Added changelog ;-)
//
+#include "gui.h"
+
#include <string>
#include <fstream> // Needed for tracelog
-#include "SDL.h" // Needed for screen.h
+//#include "SDL.h" // Needed for screen.h
#include "screen.h"
-#include "gui.h"
#include "resource.h" // Thunder graphics & sounds
using namespace std; // Yes!
extern SDL_Surface * screen;
-extern BYTE my_scr[0x14000]; // Screen buffer...
-extern BYTE * gram1; // Game RAM (do here??)
-extern BYTE hScrollOffset; // Horizontal scroll offset
-extern BYTE vScrollOffset; // Vertical scroll offset
-extern DWORD voffsets[8];
-extern BYTE * voice_rom; // PCM data pointer
+extern uint8_t my_scr[0x14000]; // Screen buffer...
+extern uint8_t gram1[]; // Game RAM (do here??)
+extern uint8_t hScrollOffset; // Horizontal scroll offset
+extern uint8_t vScrollOffset; // Vertical scroll offset
+extern uint32_t voffsets[8];
+extern uint8_t voice_rom[]; // PCM data pointer
extern fstream tr; // Tracelog
// Global shit
-WORD text_life; // How long text is visible
+uint16_t text_life; // How long text is visible
bool show_text; // Whether or not to show text
-WORD show_which_msg; // Which message to show
+uint16_t show_which_msg; // Which message to show
bool show_gui; // Whether or not to show GUI
-WORD selection; // Which GUI item currently selected
-WORD snd_num;
-WORD gui_debounce; // GUI key debounce value
-WORD num_coins; // Number of coins dropped
-WORD blink = 0; // Used to blink player 1 & 2 start buttons
-WORD flash = 23; // Used to flash GUI lights
-WORD iline = 0; // Used to roll line
-WORD dcurcol = 179; // dipswitch cursor color
+uint16_t selection; // Which GUI item currently selected
+uint16_t snd_num;
+uint16_t gui_debounce; // GUI key debounce value
+uint16_t num_coins; // Number of coins dropped
+uint16_t blink = 0; // Used to blink player 1 & 2 start buttons
+uint16_t flash = 23; // Used to flash GUI lights
+uint16_t iline = 0; // Used to roll line
+uint16_t dcurcol = 179; // dipswitch cursor color
int dcurdir = 1; // Initially going up...
bool blink_on = false;
bool game_refresh; // Refresh rate user set
bool do_decrement; // Flag to handle decrement...
bool user_selected_something; // Flag for well, you know...
-WORD dswitch; // Which dipswitch is selected...
+uint16_t dswitch; // Which dipswitch is selected...
// The following are global for the sound routines...
bool snd_go = false;
bool chan1_go = false, chan2_go = false, chan3_go = false;
bool chan4_go = false, chan5_go = false, chan6_go = false;
-BYTE * sndp1, * sndp2, * sndp3, * sndp4, * sndp5, * sndp6;
-uint32 rom_pos, end_pos;
-uint32 spos1, end_pos1;
-uint32 spos2, end_pos2;
-uint32 spos3, end_pos3;
-uint32 spos4, end_pos4;
-uint32 spos5, end_pos5;
-uint32 spos6, end_pos6;
+uint8_t * sndp1, * sndp2, * sndp3, * sndp4, * sndp5, * sndp6;
+uint32_t rom_pos, end_pos;
+uint32_t spos1, end_pos1;
+uint32_t spos2, end_pos2;
+uint32_t spos3, end_pos3;
+uint32_t spos4, end_pos4;
+uint32_t spos5, end_pos5;
+uint32_t spos6, end_pos6;
float sample1;
-uint8 prevSamp1;
-int8 delta_x1;
+uint8_t prevSamp1;
+int8_t delta_x1;
float sample2;
-uint8 prevSamp2;
-int8 delta_x2;
+uint8_t prevSamp2;
+int8_t delta_x2;
-BYTE * snd_array[3] = { sunknown, scya, scamera }; // From RESOURCE.H
-DWORD snd_lens[3] = { sunknownlen, scyalen, scameralen };
+uint8_t * snd_array[3] = { sunknown, scya, scamera }; // From RESOURCE.H
+uint32_t snd_lens[3] = { sunknownlen, scyalen, scameralen };
// Bitmaps
-BYTE bmp1[] = {
+uint8_t bmp1[] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,1,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,0,0,0,
0,1,0,0,0,0,1,0,0,1,0,1,0,0,1,0,1,1,1,1,0,
0,0,1,1,0,0,0,1,1,0,0,1,0,0,1,0,1,1,1,1,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
-BYTE bmp2[] = {
+uint8_t bmp2[] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,1,1,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,0,0,0,
0,0,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,1,1,1,0,
0,1,1,1,0,0,0,1,1,0,0,1,0,0,1,0,1,1,1,1,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
-BYTE bmp3[] = {
+uint8_t bmp3[] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,1,0,0,0,0,1,1,1,0,0,0,1,1,0,0,1,1,1,0,0,
0,1,1,1,0,0,1,0,0,1,0,0,1,1,1,0,1,1,1,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0
};
-BYTE boptions[] = { // 35x9
+uint8_t boptions[] = { // 35x9
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,1,1,0,0,1,1,1,0,0,0,0,1,1,0,1,1,1,0,0,1,1,0,0,1,0,0,1,0,0,1,1,0,0,
0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
-BYTE bn0[] = {
+uint8_t bn0[] = {
0,0,0,0,0,0,
0,0,1,1,0,0,
0,1,0,0,1,0,
0,0,1,1,0,0,
0,0,0,0,0,0
};
-BYTE bn1[] = {
+uint8_t bn1[] = {
0,0,0,0,0,0,
0,0,1,0,0,0,
0,1,1,0,0,0,
0,1,1,1,0,0,
0,0,0,0,0,0
};
-BYTE bn2[] = {
+uint8_t bn2[] = {
0,0,0,0,0,0,
0,1,1,1,0,0,
0,0,0,0,1,0,
0,1,1,1,1,0,
0,0,0,0,0,0
};
-BYTE bn3[] = {
+uint8_t bn3[] = {
0,0,0,0,0,0,
0,1,1,1,0,0,
0,0,0,0,1,0,
0,1,1,1,0,0,
0,0,0,0,0,0
};
-BYTE bn4[] = {
+uint8_t bn4[] = {
0,0,0,0,0,0,
0,0,0,1,0,0,
0,1,0,1,0,0,
0,0,0,1,0,0,
0,0,0,0,0,0
};
-BYTE bn5[] = {
+uint8_t bn5[] = {
0,0,0,0,0,0,
0,1,1,1,1,0,
0,1,0,0,0,0,
0,1,1,1,0,0,
0,0,0,0,0,0
};
-BYTE bn6[] = {
+uint8_t bn6[] = {
0,0,0,0,0,0,
0,0,1,1,0,0,
0,1,0,0,0,0,
0,0,1,1,0,0,
0,0,0,0,0,0
};
-BYTE bn7[] = {
+uint8_t bn7[] = {
0,0,0,0,0,0,
0,1,1,1,1,0,
0,0,0,0,1,0,
0,0,1,0,0,0,
0,0,0,0,0,0
};
-BYTE bn8[] = {
+uint8_t bn8[] = {
0,0,0,0,0,0,
0,0,1,1,0,0,
0,1,0,0,1,0,
0,0,1,1,0,0,
0,0,0,0,0,0
};
-BYTE bn9[] = {
+uint8_t bn9[] = {
0,0,0,0,0,0,
0,0,1,1,0,0,
0,1,0,0,1,0,
0,0,1,1,0,0,
0,0,0,0,0,0
};
-BYTE bnA[] = {
+uint8_t bnA[] = {
0,0,0,0,0,0,
0,0,1,1,0,0,
0,1,0,0,1,0,
0,1,0,0,1,0,
0,0,0,0,0,0
};
-BYTE bnB[] = {
+uint8_t bnB[] = {
0,0,0,0,0,0,
0,1,1,1,0,0,
0,1,0,0,1,0,
0,1,1,1,0,0,
0,0,0,0,0,0
};
-BYTE bnC[] = {
+uint8_t bnC[] = {
0,0,0,0,0,0,
0,0,1,1,0,0,
0,1,0,0,1,0,
0,0,1,1,0,0,
0,0,0,0,0,0
};
-BYTE bnD[] = {
+uint8_t bnD[] = {
0,0,0,0,0,0,
0,1,1,1,0,0,
0,1,0,0,1,0,
0,1,1,1,0,0,
0,0,0,0,0,0
};
-BYTE bnE[] = {
+uint8_t bnE[] = {
0,0,0,0,0,0,
0,1,1,1,1,0,
0,1,0,0,0,0,
0,1,1,1,1,0,
0,0,0,0,0,0
};
-BYTE bnF[] = {
+uint8_t bnF[] = {
0,0,0,0,0,0,
0,1,1,1,1,0,
0,1,0,0,0,0,
//
// Draw the small icons...
//
-void DrawSmallIcons(WORD icon_not_to_draw)
+void DrawSmallIcons(uint16_t icon_not_to_draw)
{
- BYTE * iconmem;
- BYTE xl, yl;
- BYTE * sIcons[12] = { inoguis, icoinus, ipl1sts, ipl2sts, ii30hzs, ii60hzs,
+ uint8_t * iconmem;
+ uint8_t xl, yl;
+ uint8_t * sIcons[12] = { inoguis, icoinus, ipl1sts, ipl2sts, ii30hzs, ii60hzs,
idipsws, ichecks, ikeycns, isnapss, iresets, ibyebys };
- BYTE xlens[12] = { 31, 18, 32, 35, 37, 37, 29, 23, 28, 32, 19, 19 };
- BYTE ylens[12] = { 31, 18, 19, 19, 21, 21, 23, 20, 16, 17, 20, 23 };
- BYTE xpos[11] = { 33, 48, 63, 78, 104, 0, 184, 210, 225, 240, 255 };
- BYTE iconidx[11] = { 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 6 };
+ uint8_t xlens[12] = { 31, 18, 32, 35, 37, 37, 29, 23, 28, 32, 19, 19 };
+ uint8_t ylens[12] = { 31, 18, 19, 19, 21, 21, 23, 20, 16, 17, 20, 23 };
+ uint8_t xpos[11] = { 33, 48, 63, 78, 104, 0, 184, 210, 225, 240, 255 };
+ uint8_t iconidx[11] = { 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 6 };
if (game_refresh) iconidx[9] = 5; // 60 Hz...
for(int i=0; i<5; i++)
{
- WORD idx = i + icon_not_to_draw; // Get correct start pos.
+ uint16_t idx = i + icon_not_to_draw; // Get correct start pos.
if (idx > 10) idx -= 11;
iconmem = sIcons[iconidx[idx]];
xl = xlens[iconidx[idx]]; yl = ylens[iconidx[idx]];
- DWORD scadr = hScrollOffset + voffsets[vScrollOffset];
+ uint32_t scadr = hScrollOffset + voffsets[vScrollOffset];
scadr += 320*((224-yl)/2); // Center vertically
scadr += xpos[i] - (xl/2); // Center around horiz. pos.
- WORD bmpptr = 0;
+ uint16_t bmpptr = 0;
for(int yy=0; yy<yl; yy++)
{
for(int xx=0; xx<xl; xx++)
{
- BYTE b = iconmem[bmpptr++];
+ uint8_t b = iconmem[bmpptr++];
if (b) my_scr[scadr+xx+yy*320] = b;
}
}
}
for(int i=10; i>5; i--)
{
- WORD idx = i + icon_not_to_draw; // Get correct start pos.
+ uint16_t idx = i + icon_not_to_draw; // Get correct start pos.
if (idx > 10) idx -= 11;
iconmem = sIcons[iconidx[idx]];
xl = xlens[iconidx[idx]]; yl = ylens[iconidx[idx]];
- DWORD scadr = hScrollOffset + voffsets[vScrollOffset];
+ uint32_t scadr = hScrollOffset + voffsets[vScrollOffset];
scadr += 320*((224-yl)/2); // Center vertically
scadr += xpos[i] - (xl/2); // Center around horiz. pos.
- WORD bmpptr = 0;
+ uint16_t bmpptr = 0;
for(int yy=0; yy<yl; yy++)
{
for(int xx=0; xx<xl; xx++)
{
- BYTE b = iconmem[bmpptr++];
+ uint8_t b = iconmem[bmpptr++];
if (b) my_scr[scadr+xx+yy*320] = b;
}
}
//
// Draw the large (selected) icon
//
-void DrawLargeIcon(WORD icon)
+void DrawLargeIcon(uint16_t icon)
{
- BYTE * iconmem;
- BYTE xl, yl;
- BYTE * lIcons[11] = { inoguib, icoinub, ipl1stb, ipl2stb, ii30hzb, ii60hzb,
+ uint8_t * iconmem;
+ uint8_t xl, yl;
+ uint8_t * lIcons[11] = { inoguib, icoinub, ipl1stb, ipl2stb, ii30hzb, ii60hzb,
idipswb, ikeycnb, isnapsb, iresetb, ibyebyb };
- BYTE xlens[11] = { 44, 45, 50, 52, 59, 59, 42, 45, 48, 58, 42 };
- BYTE ylens[11] = { 44, 40, 33, 29, 52, 52, 34, 45, 37, 40, 50 };
+ uint8_t xlens[11] = { 44, 45, 50, 52, 59, 59, 42, 45, 48, 58, 42 };
+ uint8_t ylens[11] = { 44, 40, 33, 29, 52, 52, 34, 45, 37, 40, 50 };
- BYTE gsubs1[24] = { 21, 21, 20, 19, 168, 168, 31, 155, 68, 68, 67, 66,
+ uint8_t gsubs1[24] = { 21, 21, 20, 19, 168, 168, 31, 155, 68, 68, 67, 66,
36, 36, 35, 34, 188, 188, 183, 181, 81, 81, 85, 80 },
gsubs2[24] = { 20, 20, 19, 19, 31, 31, 155, 155, 67, 67, 66, 66,
35, 35, 34, 34, 183, 183, 181, 181, 85, 85, 80, 80 },
xl = xlens[6]; yl = ylens[6];
}
- DWORD scadr = hScrollOffset + voffsets[vScrollOffset];
+ uint32_t scadr = hScrollOffset + voffsets[vScrollOffset];
scadr += 320*((224-yl)/2); // Center vertically
scadr += (288-xl)/2; // Center horizontally
- WORD bmpptr = 0;
+ uint16_t bmpptr = 0;
for(int yy=0; yy<yl; yy++)
{
for(int xx=0; xx<xl; xx++)
{
- BYTE b = iconmem[bmpptr++];
+ uint8_t b = iconmem[bmpptr++];
if (b)
{
if ((icon == PL1START) && (b == 235) && (num_coins) && !blink_on)
36,35,34; 188,183,181; 81,85,80 */
if (icon == NOGUI)
{
- BYTE fln = (23 - flash) + 1; // Want to go forward (maybe fix it?)
+ uint8_t fln = (23 - flash) + 1; // Want to go forward (maybe fix it?)
switch (b)
{
case 36: { b = gsubs1[fln]; break; }
//
void DrawDipswitch(void)
{
- BYTE dseloff[16] = { 0, 1, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 10, 11, 11, 12 };
- BYTE * dtxt[13] = { idstext1, idstext2, idstext3, idstext4, idstext5,
+ uint8_t dseloff[16] = { 0, 1, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 10, 11, 11, 12 };
+ uint8_t * dtxt[13] = { idstext1, idstext2, idstext3, idstext4, idstext5,
idstext2, idstext6, idstext7, idstext8, idstext9,
idstext10, idstext11, idstext12 };
- BYTE dtx[13] = { 48, 80, 96, 82, 60, 80, 76, 57, 33, 50, 62, 65, 63 },
+ uint8_t dtx[13] = { 48, 80, 96, 82, 60, 80, 76, 57, 33, 50, 62, 65, 63 },
dty[13] = { 7, 9, 7, 9, 7, 9, 7, 7, 7, 9, 7, 9, 7 };
- DWORD dtxtoff[13] = { 4*320+24, 14*320-78, 25*320+24, 32*320-80,
+ uint32_t dtxtoff[13] = { 4*320+24, 14*320-78, 25*320+24, 32*320-80,
39*320+24, 49*320-78,
4*320+24, 11*320-55, 18*320+24, 25*320-48,
32*320+24, 42*320-63, 53*320+24 };
- DWORD scadr, bmpptr;
+ uint32_t scadr, bmpptr;
//dsx = //26x65
- DWORD dbase = hScrollOffset + voffsets[vScrollOffset];
+ uint32_t dbase = hScrollOffset + voffsets[vScrollOffset];
dbase += (288-26)/2; // Center horizontally
dbase += 320*((224-((65*2)+8))/2); // Center vertically
{
for(int xx=0; xx<26; xx++)
{
- BYTE b = idswitch[bmpptr++];
+ uint8_t b = idswitch[bmpptr++];
if (b) my_scr[scadr+xx+yy*320] = b;
}
}
{
for(int xx=0; xx<26; xx++)
{
- BYTE b = idswitch[bmpptr++];
+ uint8_t b = idswitch[bmpptr++];
if (b) my_scr[scadr+xx+yy*320] = b;
}
}
scadr += 315; // Adjust position...
}
}
- BYTE dselected_text = dseloff[dswitch];
+ uint8_t dselected_text = dseloff[dswitch];
for(int i=0; i<13; i++)
{
if (dselected_text != i)
{
for(int xx=0; xx<dtx[i]; xx++)
{
- BYTE b = dtxt[i][bmpptr++];
+ uint8_t b = dtxt[i][bmpptr++];
if (b) my_scr[scadr] = b;
scadr++;
}
{
for(int xx=0; xx<dtx[dselected_text]; xx++)
{
- BYTE b = dtxt[dselected_text][bmpptr++];
+ uint8_t b = dtxt[dselected_text][bmpptr++];
if (b) my_scr[scadr] = 125;
scadr++;
}
//
// User selected something! Handle it!
//
-BYTE UserSelectedSomething(void)
+uint8_t UserSelectedSomething(void)
{
- //extern BYTE * gram1;
+ //extern uint8_t * gram1;
if (!gui_debounce)
{
//
void ShowNumbers(int number)
{
- BYTE * bnarray[16] = { bn0, bn1, bn2, bn3, bn4, bn5, bn6, bn7, bn8, bn9,
+ uint8_t * bnarray[16] = { bn0, bn1, bn2, bn3, bn4, bn5, bn6, bn7, bn8, bn9,
bnA, bnB, bnC, bnD, bnE, bnF };
- DWORD scadr = hScrollOffset + voffsets[vScrollOffset] + 642 + 2560;
- WORD bmpptr = 0;
+ uint32_t scadr = hScrollOffset + voffsets[vScrollOffset] + 642 + 2560;
+ uint16_t bmpptr = 0;
- BYTE first_dig = number>>4, second_dig = number&0x0F;
+ uint8_t first_dig = number>>4, second_dig = number&0x0F;
for(int y=0; y<7; y++)
{
for(int x=0; x<6; x++)
//
// Spawn a message
//
-void SpawnMsg(BYTE msg)
+void SpawnMsg(uint8_t msg)
{
text_life = 60; // 1 second...
show_text = true; // Show the damn thing...
text_life--; // Your life force is running out...
// Draw the message here...
- DWORD scadr = hScrollOffset + voffsets[vScrollOffset] + 642;
- WORD bmpptr = 0;
+ uint32_t scadr = hScrollOffset + voffsets[vScrollOffset] + 642;
+ uint16_t bmpptr = 0;
for(int y=0; y<7; y++)
{
//
void SpawnSound(int type, int snd, int channel/* = 0*/)
{
- extern DWORD psg_lens[16];
- extern BYTE * psg_adrs[16];
- extern DWORD voc_lens[32];
- extern BYTE * voc_adrs[32];
- extern DWORD fm_lens[14];
- extern BYTE * fm_adrs[14];
+ extern uint32_t psg_lens[16];
+ extern uint8_t * psg_adrs[16];
+ extern uint32_t voc_lens[32];
+ extern uint8_t * voc_adrs[32];
+ extern uint32_t fm_lens[14];
+ extern uint8_t * fm_adrs[14];
snd_num = snd;
SpawnMsg(MSHOWNUMS);
if (channel == 0)
{
// 00 nn ss (nn # of repeats of sample ss)
- DWORD st = 0;
+ uint32_t st = 0;
if (snd & 0x40)
{
}
else
{
- DWORD st = 0;
+ uint32_t st = 0;
if (snd & 0x40)
{
//
void SoundFunc(void * userdata, Uint8 * buff, int num)
{
- uint16 cnt = 0, sample; // 0-22 different sounds...
- uint8 start_samp1, end_samp1, start_samp2, end_samp2;
- uint8 samp1 = 128, samp2 = 128, samp3 = 128,
+ uint16_t cnt = 0, sample; // 0-22 different sounds...
+ uint8_t start_samp1, end_samp1, start_samp2, end_samp2;
+ uint8_t samp1 = 128, samp2 = 128, samp3 = 128,
samp4 = 128, samp5 = 128, samp6 = 128; // Zero samples...
memset(buff, 128, num); // Kill sound...