mirror of
https://github.com/stevenhowes/CTheEscape.git
synced 2026-05-26 15:53:29 +01:00
433 lines
11 KiB
C
433 lines
11 KiB
C
#include <stdio.h>
|
|
#include "swis.h"
|
|
#include <kernel.h>
|
|
#include <time.h>
|
|
#include "Sound.h"
|
|
|
|
// SWI Registers
|
|
_kernel_swi_regs inreg;
|
|
_kernel_swi_regs outreg;
|
|
|
|
// Sprite buffer
|
|
unsigned char *buffer;
|
|
|
|
extern struct CompositionElement composition[128];
|
|
extern int current_element;
|
|
|
|
#define DISPLAY_MODE 28
|
|
#define DISPLAY_X 1280
|
|
#define DISPLAY_Y 960
|
|
|
|
#define PLAYER_Y_START 100
|
|
#define PLAYER_X_SPEED 10
|
|
#define MAX_NPCS 5
|
|
#define MAX_STARS 49
|
|
|
|
enum sprite_e{player_ship, durno_ship,player_shipl,player_shipr};
|
|
char *sprites[] = {"player_ship","durno_ship","player_shipl","player_shipr"};
|
|
|
|
char hudbuffer[63];
|
|
|
|
enum font_e{sys_12_8,font_max};
|
|
|
|
enum colour_e{lcars_black,lcars_violet1,debugpink,stargrey1,stargrey2,stargrey3,debuggreen};
|
|
int colours[] = {0x11111100,0xc4727200,0xcc00ff00,0x66666600,0x22222200,0x44444400,0x00ff0000};
|
|
int font[font_max];
|
|
|
|
enum debugs_e{dbbase,dbhitbox,dbweapons,dbinput,dbmax};
|
|
int debugs[dbmax];
|
|
|
|
struct EntityLocation_s {
|
|
short int X,Y;
|
|
};
|
|
|
|
struct NPC_s {
|
|
struct EntityLocation_s location;
|
|
enum sprite_e sprite;
|
|
unsigned char velocity;
|
|
};
|
|
|
|
struct Star_s {
|
|
struct EntityLocation_s location;
|
|
int colour;
|
|
unsigned char length;
|
|
};
|
|
|
|
|
|
struct Player_s {
|
|
struct EntityLocation_s location;
|
|
enum sprite_e sprite;
|
|
unsigned char velocity;
|
|
int shields;
|
|
int integrity;
|
|
int remainingdistance;
|
|
struct EntityLocation_s hitbox_bl;
|
|
struct EntityLocation_s hitbox_tr;
|
|
struct EntityLocation_s phaser1;
|
|
struct EntityLocation_s phaser2;
|
|
};
|
|
|
|
struct NPC_s NPCS[MAX_NPCS];
|
|
struct Player_s Player;
|
|
struct Star_s Stars[MAX_STARS];
|
|
|
|
int tick = 0;
|
|
int lasttick = 0;
|
|
extern int screen;
|
|
void intro()
|
|
{
|
|
int currentstart = 0;
|
|
|
|
sound_voices(4);
|
|
|
|
sound_set_voice(1,"WaveSynth-Beep");
|
|
sound_set_voice(2,"WaveSynth-Beep");
|
|
sound_set_voice(3,"WaveSynth-Beep");
|
|
sound_set_voice(4,"WaveSynth-Beep");
|
|
sound_composition_init();
|
|
|
|
// DUn, dun, daan duhhn
|
|
sound_composition_element_add(currentstart,1,sound_note("A4#"),200);
|
|
sound_composition_element_add(currentstart,2,sound_note("A5#"),200);
|
|
currentstart += 200;
|
|
sound_composition_element_add(currentstart,1,sound_note("F3"),200);
|
|
sound_composition_element_add(currentstart,2,sound_note("F4"),200);
|
|
currentstart += 200;
|
|
sound_composition_element_add(currentstart,1,sound_note("G3#"),200);
|
|
sound_composition_element_add(currentstart,2,sound_note("G4#"),200);
|
|
currentstart += 200;
|
|
sound_composition_element_add(currentstart,1,sound_note("C3"),200);
|
|
sound_composition_element_add(currentstart,2,sound_note("C4"),200);
|
|
currentstart += 200;
|
|
|
|
// DUn, dun, daan duhhn
|
|
sound_composition_element_add(currentstart,1,sound_note("A3#"),200);
|
|
sound_composition_element_add(currentstart,2,sound_note("A4#"),200);
|
|
currentstart += 200;
|
|
sound_composition_element_add(currentstart,1,sound_note("F2"),200);
|
|
currentstart += 200;
|
|
sound_composition_element_add(currentstart,2,sound_note("G2#"),200);
|
|
currentstart += 200;
|
|
sound_composition_element_add(currentstart,1,sound_note("C2"),200);
|
|
currentstart += 250;
|
|
|
|
// Duh
|
|
sound_composition_element_add(currentstart,3,sound_note("A3#"),300);
|
|
sound_composition_element_add(currentstart,4,sound_note("A2#"),300);
|
|
currentstart += 200;
|
|
|
|
//REM Dun De Da
|
|
sound_composition_element_add(currentstart,1,sound_note("F1"),20);
|
|
currentstart += 50;
|
|
sound_composition_element_add(currentstart,2,sound_note("A2#"),5);
|
|
currentstart += 20;
|
|
sound_composition_element_add(currentstart,1,sound_note("D2#"),200);
|
|
currentstart += 180;
|
|
|
|
|
|
sound_composition_element_add(currentstart,2,sound_note("D2"),50);
|
|
currentstart += 50;
|
|
sound_composition_element_add(currentstart,1,sound_note("A2#"),30);
|
|
currentstart += 30;
|
|
sound_composition_element_add(currentstart,2,sound_note("G1"),50);
|
|
currentstart += 50;
|
|
sound_composition_element_add(currentstart,1,sound_note("C2"),50);
|
|
currentstart += 50;
|
|
sound_composition_element_add(currentstart,3,sound_note("A2#"),100);
|
|
sound_composition_element_add(currentstart,4,sound_note("F2"),100);
|
|
currentstart += 100;
|
|
|
|
draw_sprite("tng",320,400);
|
|
sound_composition_start(clock());
|
|
|
|
while(sound_composition_incomplete())
|
|
{
|
|
sound_composition_tick(clock());
|
|
|
|
if(input_readkey(98))
|
|
sound_composition_stop();
|
|
}
|
|
}
|
|
|
|
void game_draw_player()
|
|
{
|
|
draw_sprite(sprites[Player.sprite], Player.location.X, Player.location.Y);
|
|
|
|
if(debugs[dbhitbox])
|
|
{
|
|
graphics_colour(colours[debugpink]);
|
|
|
|
// Bounding box debug
|
|
draw_rectangle(
|
|
Player.location.X + Player.hitbox_bl.X,
|
|
Player.location.Y + Player.hitbox_bl.Y,
|
|
Player.location.X + Player.hitbox_tr.X,
|
|
Player.location.Y + Player.hitbox_tr.Y
|
|
);
|
|
}
|
|
|
|
if(debugs[dbweapons])
|
|
{
|
|
graphics_colour(colours[debuggreen]);
|
|
|
|
// Draw phaser banks
|
|
draw_line(
|
|
Player.location.X + Player.phaser1.X,
|
|
Player.location.Y + Player.phaser1.Y -5,
|
|
Player.location.X + Player.phaser1.X,
|
|
Player.location.Y + Player.phaser1.Y + 5
|
|
);
|
|
draw_line(
|
|
Player.location.X + Player.phaser1.X -5,
|
|
Player.location.Y + Player.phaser1.Y,
|
|
Player.location.X + Player.phaser1.X +5,
|
|
Player.location.Y + Player.phaser1.Y
|
|
);
|
|
draw_line(
|
|
Player.location.X + Player.phaser2.X,
|
|
Player.location.Y + Player.phaser2.Y -5,
|
|
Player.location.X + Player.phaser2.X,
|
|
Player.location.Y + Player.phaser2.Y + 5
|
|
);
|
|
draw_line(
|
|
Player.location.X + Player.phaser2.X -5,
|
|
Player.location.Y + Player.phaser2.Y,
|
|
Player.location.X + Player.phaser2.X +5,
|
|
Player.location.Y + Player.phaser2.Y
|
|
);
|
|
}
|
|
}
|
|
void game_draw_stars()
|
|
{
|
|
unsigned char i;
|
|
|
|
|
|
|
|
for(i = 0; i <= MAX_STARS; i++)
|
|
{
|
|
graphics_colour(Stars[i].colour);
|
|
draw_line(Stars[i].location.X,Stars[i].location.Y,Stars[i].location.X,Stars[i].location.Y+Stars[i].length);
|
|
}
|
|
}
|
|
|
|
void game_setup_player()
|
|
{
|
|
Player.location.X = DISPLAY_X/2;
|
|
Player.location.Y = PLAYER_Y_START;
|
|
Player.sprite = player_ship;
|
|
Player.velocity = 100;
|
|
Player.shields = 100;
|
|
Player.integrity = 50;
|
|
Player.remainingdistance = 1500000;
|
|
Player.hitbox_bl.X = 0;
|
|
Player.hitbox_bl.Y = 0;
|
|
Player.hitbox_tr.X = 60;
|
|
Player.hitbox_tr.Y = 81;
|
|
Player.phaser1.X = 20;
|
|
Player.phaser1.Y = 75;
|
|
Player.phaser2.X = 41;
|
|
Player.phaser2.Y = 75;
|
|
|
|
}
|
|
|
|
void game_tick_stars()
|
|
{
|
|
unsigned char i;
|
|
for(i = 0; i <= MAX_STARS; i++)
|
|
{
|
|
Stars[i].location.Y -= (tick - lasttick) * 2;
|
|
if((Stars[i].location.Y + Stars[i].length) <= 0)
|
|
{
|
|
Stars[i].colour = colours[stargrey1 + (rand() % 2)];
|
|
Stars[i].length = 30 + (rand() % 10);
|
|
Stars[i].location.X = rand() % DISPLAY_X;
|
|
Stars[i].location.Y = DISPLAY_Y + Stars[i].length;
|
|
}
|
|
}
|
|
}
|
|
|
|
void game_setup_stars()
|
|
{
|
|
unsigned char i;
|
|
for(i = 0; i <= MAX_STARS; i++)
|
|
{
|
|
Stars[i].colour = colours[stargrey1 + (rand() % 2)];
|
|
Stars[i].length = 30 + (rand() % 10);
|
|
Stars[i].location.X = rand() % DISPLAY_X;
|
|
Stars[i].location.Y = rand() % DISPLAY_Y;
|
|
}
|
|
}
|
|
|
|
void game_setup_input()
|
|
{
|
|
/*
|
|
inreg.r[0] = 4;
|
|
inreg.r[1] = 1;
|
|
_kernel_swi(OS_Byte,&inreg,&outreg);
|
|
*/
|
|
}
|
|
|
|
void game_draw_debugmenu()
|
|
{
|
|
if(debugs[dbbase])
|
|
{
|
|
font_colour(colours[debuggreen],colours[lcars_black],font[sys_12_8]);
|
|
draw_text("Debug List",DISPLAY_X-200,DISPLAY_Y-40,font[sys_12_8]);
|
|
font_colour(colours[debugs[dbhitbox]?debugpink:stargrey1],colours[lcars_black],font[sys_12_8]);
|
|
draw_text("1: hitbox",DISPLAY_X-200,DISPLAY_Y-60,font[sys_12_8]);
|
|
font_colour(colours[debugs[dbweapons]?debugpink:stargrey1],colours[lcars_black],font[sys_12_8]);
|
|
draw_text("2: weapons",DISPLAY_X-200,DISPLAY_Y-80,font[sys_12_8]);
|
|
font_colour(colours[debugs[dbinput]?debugpink:stargrey1],colours[lcars_black],font[sys_12_8]);
|
|
draw_text("3: input",DISPLAY_X-200,DISPLAY_Y-100,font[sys_12_8]);
|
|
}
|
|
}
|
|
|
|
void game_input_tick()
|
|
{
|
|
if(debugs[dbbase])
|
|
{
|
|
if(input_readkey(17))
|
|
{
|
|
debugs[dbinput] = 1;
|
|
}
|
|
|
|
if(input_readkey(48))
|
|
{
|
|
debugs[dbhitbox] = 1;
|
|
}
|
|
|
|
if(input_readkey(49))
|
|
{
|
|
debugs[dbweapons] = 1;
|
|
}
|
|
}
|
|
|
|
if(debugs[dbinput])
|
|
{
|
|
font_colour(colours[debuggreen],colours[lcars_black],font[sys_12_8]);
|
|
sprintf(hudbuffer,"Keycode: %i",input_readanykey());
|
|
draw_text(hudbuffer,DISPLAY_X-500,DISPLAY_Y-40,font[sys_12_8]);
|
|
}
|
|
|
|
if(input_readkey(16))
|
|
{
|
|
debugs[dbbase] = 1;
|
|
}
|
|
|
|
// Right arrow
|
|
if(input_readkey(121))
|
|
{
|
|
Player.location.X += PLAYER_X_SPEED * (tick - lasttick);
|
|
Player.sprite = player_shipr;
|
|
// TODO: SHIP WIDTH
|
|
if((Player.location.X + Player.hitbox_tr.X) > DISPLAY_X)
|
|
{
|
|
Player.location.X = DISPLAY_X - Player.hitbox_tr.X;
|
|
Player.sprite = player_ship;
|
|
}
|
|
}
|
|
|
|
// Left arrow
|
|
if(input_readkey(25))
|
|
{
|
|
Player.location.X -= PLAYER_X_SPEED * (tick - lasttick);
|
|
Player.sprite = player_shipl;
|
|
if((Player.location.X + Player.hitbox_bl.X) < 0)
|
|
{
|
|
Player.location.X = 0 - Player.hitbox_bl.X;
|
|
Player.sprite = player_ship;
|
|
}
|
|
}
|
|
}
|
|
|
|
void game_setup_audio()
|
|
{
|
|
sound_voices(4);
|
|
|
|
sound_set_voice(1,"WaveSynth-Beep");
|
|
sound_set_voice(2,"Percussion-Noise");
|
|
sound_set_voice(3,"Percussion-Soft");
|
|
sound_set_voice(4,"Percussion-Noise");
|
|
}
|
|
|
|
void game_draw_hud()
|
|
{
|
|
draw_sprite("lcars",4,DISPLAY_Y-180);
|
|
|
|
font_colour(colours[lcars_black],colours[lcars_violet1],font[sys_12_8]);
|
|
|
|
draw_text("Shields",75,DISPLAY_Y-62,font[sys_12_8]);
|
|
draw_text("Integrity",75,DISPLAY_Y-92,font[sys_12_8]);
|
|
draw_text("Velocity",75,DISPLAY_Y-122,font[sys_12_8]);
|
|
draw_text("Distance",75,DISPLAY_Y-152,font[sys_12_8]);
|
|
|
|
font_colour(colours[lcars_violet1],colours[lcars_black],font[sys_12_8]);
|
|
|
|
sprintf(hudbuffer,"%i",Player.shields);
|
|
draw_text(hudbuffer,230,DISPLAY_Y-62,font[sys_12_8]);
|
|
|
|
sprintf(hudbuffer,"%i",Player.integrity);
|
|
draw_text(hudbuffer,230,DISPLAY_Y-92,font[sys_12_8]);
|
|
|
|
sprintf(hudbuffer,"%i",Player.velocity);
|
|
draw_text(hudbuffer,230,DISPLAY_Y-122,font[sys_12_8]);
|
|
|
|
sprintf(hudbuffer,"%i",Player.remainingdistance/1000);
|
|
draw_text(hudbuffer,230,DISPLAY_Y-152,font[sys_12_8]);
|
|
}
|
|
|
|
void game_setup()
|
|
{
|
|
game_setup_input();
|
|
game_setup_audio();
|
|
game_setup_stars();
|
|
game_setup_player();
|
|
tick = clock();
|
|
}
|
|
|
|
void game_tick_player()
|
|
{
|
|
Player.remainingdistance -= Player.velocity * (tick - lasttick);
|
|
}
|
|
|
|
void game_tick()
|
|
{
|
|
lasttick = tick;
|
|
tick = clock();
|
|
|
|
screen_flipbuffer();
|
|
screen_clear();
|
|
|
|
game_tick_stars();
|
|
game_input_tick();
|
|
game_tick_player();
|
|
|
|
game_draw_stars();
|
|
game_draw_player();
|
|
|
|
game_draw_hud();
|
|
game_draw_debugmenu();
|
|
}
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
sound_on();
|
|
|
|
display_mode(DISPLAY_MODE);
|
|
load_sprites("Spr");
|
|
|
|
//intro();
|
|
|
|
display_mode(DISPLAY_MODE);
|
|
|
|
font[sys_12_8] = font_find("System.Medium",12,8);
|
|
|
|
game_setup();
|
|
|
|
while(1)
|
|
game_tick();
|
|
free(buffer);
|
|
|
|
return 0;
|
|
}
|