Add missiles and test enemies
parent
7f04b61736
commit
20fec4e3cf
|
@ -1,6 +1,7 @@
|
|||
// Copyright © 2017 Project Golan, all rights reserved.
|
||||
entity TestObj
|
||||
{
|
||||
subtype Test
|
||||
health 1
|
||||
size 10
|
||||
drawsize 16
|
||||
|
|
|
@ -5,6 +5,10 @@ texture "gui/border" = "textures/Border.png"
|
|||
|
||||
texture "ent/player" = "sprites/Particle3_Pointer.png"
|
||||
texture "ent/testobj" = "sprites/Particle3.png"
|
||||
texture "ent/missile" = "sprites/Particle4.png"
|
||||
texture "ent/explosion1" = "sprites/Explosion1.png"
|
||||
texture "ent/explosion2" = "sprites/Explosion2.png"
|
||||
texture "ent/explosion3" = "sprites/Explosion3.png"
|
||||
|
||||
texture "box" = "textures/Box.png"
|
||||
texture "empty" = "textures/Empty.png"
|
||||
|
|
|
@ -1,5 +1,19 @@
|
|||
// Copyright © 2017 Project Golan, all rights reserved.
|
||||
{50 TestObj -200 0 16}
|
||||
{50 TestObj -200 100 16}
|
||||
{ 50 TestObj -300 -200 16}
|
||||
{ 60 TestObj -250 -200 16}
|
||||
{100 TestObj -150 -200 16}
|
||||
{110 TestObj -100 -200 16}
|
||||
{150 TestObj -200 -200 16}
|
||||
{160 TestObj -250 -200 16}
|
||||
{200 TestObj -300 -200 16}
|
||||
{210 TestObj -250 -200 16}
|
||||
{250 TestObj -300 -200 16}
|
||||
{260 TestObj -250 -200 16}
|
||||
{300 TestObj -150 -200 16}
|
||||
{310 TestObj -100 -200 16}
|
||||
{350 TestObj -200 -200 16}
|
||||
{360 TestObj -250 -200 16}
|
||||
{400 TestObj -300 -200 16}
|
||||
{410 TestObj -250 -200 16}
|
||||
|
||||
// EOF
|
||||
|
|
|
@ -13,21 +13,21 @@
|
|||
#define G_propMemExt(base, ofs, t, name) \
|
||||
G_propMemOfs(DGE_OME_##base + (ofs), t, name)
|
||||
|
||||
#define G_Entity_propMem(ofs, t, name) \
|
||||
G_propMemExt(Entity, ofs, t, name)
|
||||
|
||||
#define G_Entity_props() DGE_EntityProps() \
|
||||
G_propMemOfs(DGE_OME(Entity.subtype), int, subtype)
|
||||
#define G_Entity_propMem(ofs, t, name) G_propMemExt(Entity, ofs, t, name)
|
||||
|
||||
// Types ---------------------------------------------------------------------|
|
||||
|
||||
enum G_subty
|
||||
{
|
||||
subtype_none,
|
||||
subtype_missile,
|
||||
subtype_test,
|
||||
subtype_player,
|
||||
subtype_max,
|
||||
};
|
||||
|
||||
#define G_Entity_props() DGE_EntityProps() \
|
||||
G_propMemOfs(DGE_OME(Entity.subtype), int, subtype)
|
||||
typedef struct G_entit // Entity
|
||||
{
|
||||
int id;
|
||||
|
@ -35,6 +35,15 @@ typedef struct G_entit // Entity
|
|||
G_Entity_props()
|
||||
} G_entit;
|
||||
|
||||
#define G_Missile_props() DGE_MissileEntityProps() \
|
||||
G_propMemOfs(DGE_OME(Entity.subtype), int, subtype)
|
||||
typedef struct G_missl // Missile
|
||||
{
|
||||
int id;
|
||||
|
||||
G_Missile_props()
|
||||
} G_missl;
|
||||
|
||||
// Extern Functions ----------------------------------------------------------|
|
||||
|
||||
void G_Entity_Create(union G_mfdat *info);
|
||||
|
|
|
@ -2,14 +2,26 @@
|
|||
#define _GNU_SOURCE // Required for sincos(3). See feature_test_macros(7)
|
||||
#include "g_player.h"
|
||||
|
||||
#include "g_stage.h"
|
||||
#include "m_math.h"
|
||||
|
||||
#include <Doominati.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
|
||||
// Types ---------------------------------------------------------------------|
|
||||
|
||||
enum G_mslty
|
||||
{
|
||||
missile_player,
|
||||
};
|
||||
|
||||
// Extern Objects ------------------------------------------------------------|
|
||||
|
||||
int G_Player_Count = 1;
|
||||
int G_Player_Count;
|
||||
G_playr G_Player_InGame[G_Player_max];
|
||||
|
||||
// Static Functions ----------------------------------------------------------|
|
||||
|
||||
|
@ -35,21 +47,69 @@ static void G_Player_applyVelocity(G_playr th)
|
|||
|
||||
// Extern Functions ----------------------------------------------------------|
|
||||
|
||||
//
|
||||
// G_Missile_Fire
|
||||
//
|
||||
void G_Missile_Fire(enum G_mslty type, unsigned owner, fixed x, fixed y, fixed z, ulfra yaw)
|
||||
{
|
||||
G_missl th = {DGE_MissileEntity_Create(0)};
|
||||
th.subtype = subtype_missile;
|
||||
|
||||
th.x = x;
|
||||
th.y = y;
|
||||
th.z = z;
|
||||
th.yaw = yaw;
|
||||
th.health = 1;
|
||||
th.damage = 1;
|
||||
th.owner = owner;
|
||||
|
||||
float s, c;
|
||||
sincosf(M_angle(yaw), &s, &c);
|
||||
|
||||
switch(type)
|
||||
{
|
||||
case missile_player:
|
||||
th.sprite = DGE_Texture_Get(s"ent/missile");
|
||||
th.rsx = 3;
|
||||
th.rsy = 16;
|
||||
th.sx = 4;
|
||||
th.sy = 4;
|
||||
th.sz = 4;
|
||||
th.vx = c * 14;
|
||||
th.vy = s * 14;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// G_Player_Think
|
||||
//
|
||||
DGE_Callback
|
||||
void G_Player_Think(unsigned id)
|
||||
{
|
||||
DGE_Object_RefAdd(id);
|
||||
G_playr th = {id};
|
||||
// TODO: remove if david makes IEMs 0-init
|
||||
th.ammo = 0;
|
||||
th.lives = 5;
|
||||
th.nextfire = 0;
|
||||
|
||||
for(G_playr th = {id}; th.health > 0;)
|
||||
DGE_Object_RefAdd(id);
|
||||
G_Player_InGame[G_Player_Count++] = th;
|
||||
|
||||
while(th.health > 0)
|
||||
{
|
||||
G_Player_applyVelocity(th);
|
||||
|
||||
if(th.nextfire < G_Time) {
|
||||
G_Missile_Fire(missile_player, th.id, th.x - 7, th.y - 10, th.z, 0);
|
||||
G_Missile_Fire(missile_player, th.id, th.x + 7, th.y - 10, th.z, 0);
|
||||
th.nextfire = G_Time + 3;
|
||||
}
|
||||
|
||||
DGE_Task_Sleep(0, 1);
|
||||
}
|
||||
|
||||
G_Player_InGame[--G_Player_Count] = (G_playr){0};
|
||||
DGE_Object_RefSub(id);
|
||||
}
|
||||
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
#include "g_object.h"
|
||||
|
||||
#define G_Player_max 2
|
||||
#define G_Player_propMem(t, name) G_Entity_propMem(G_Player_##name, t, name)
|
||||
|
||||
// Types ---------------------------------------------------------------------|
|
||||
|
@ -11,11 +12,15 @@
|
|||
enum
|
||||
{
|
||||
G_Player_ammo,
|
||||
G_Player_lives,
|
||||
G_Player_nextfire,
|
||||
G_Player_propC
|
||||
};
|
||||
|
||||
#define G_Player_props() G_Entity_props() \
|
||||
G_Player_propMem(unsigned, ammo)
|
||||
G_Player_propMem(unsigned, ammo) \
|
||||
G_Player_propMem(unsigned, lives) \
|
||||
G_Player_propMem(unsigned, nextfire)
|
||||
typedef struct G_playr // Player
|
||||
{
|
||||
int id;
|
||||
|
@ -25,7 +30,8 @@ typedef struct G_playr // Player
|
|||
|
||||
// Extern Objects ------------------------------------------------------------|
|
||||
|
||||
extern int G_Player_Count;
|
||||
extern int G_Player_Count;
|
||||
extern G_playr G_Player_InGame[G_Player_max];
|
||||
|
||||
// Extern Functions ----------------------------------------------------------|
|
||||
|
||||
|
|
11
src/m_math.c
11
src/m_math.c
|
@ -1,6 +1,8 @@
|
|||
// Copyright © 2017 Project Golan, all rights reserved.
|
||||
#include "m_math.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
// Extern Functions ----------------------------------------------------------|
|
||||
|
||||
//
|
||||
|
@ -11,4 +13,13 @@ bool M_AABBPoint(fixed xl, fixed yl, fixed xu, fixed yu, fixed xp, fixed yp)
|
|||
return xp > xl && yp > yl && xp < xu && yp < yu;
|
||||
}
|
||||
|
||||
//
|
||||
// M_Random_Float
|
||||
//
|
||||
float M_Random_Float(float min, float max)
|
||||
{
|
||||
if(max < min) {float min_ = min; min = max; max = min_;}
|
||||
return (rand() / (double)RAND_MAX) * (max - min) + min;
|
||||
}
|
||||
|
||||
// EOF
|
||||
|
|
|
@ -4,8 +4,17 @@
|
|||
|
||||
#include "m_types.h"
|
||||
|
||||
#include <math.h>
|
||||
|
||||
#define M_pi (3.14159265359)
|
||||
#define M_pi2 (M_pi / 2.0)
|
||||
#define M_tau (M_pi * 2.0)
|
||||
|
||||
#define M_angle(n) (fmod((n) * M_tau - M_pi2, M_tau))
|
||||
|
||||
// Extern Functions ----------------------------------------------------------|
|
||||
|
||||
bool M_AABBPoint(fixed xl, fixed yl, fixed xu, fixed yu, fixed xp, fixed yp);
|
||||
float M_Random_Float(float min, float max);
|
||||
|
||||
#endif
|
||||
|
|
49
src/main.c
49
src/main.c
|
@ -3,6 +3,7 @@
|
|||
#include "g_object.h"
|
||||
#include "g_player.h"
|
||||
#include "r_draw.h"
|
||||
#include "m_math.h"
|
||||
|
||||
#include <Doominati.h>
|
||||
|
||||
|
@ -10,6 +11,53 @@
|
|||
|
||||
// Extern Functions ----------------------------------------------------------|
|
||||
|
||||
//
|
||||
// G_TestObj_Think
|
||||
//
|
||||
DGE_Callback
|
||||
void G_TestObj_Think(unsigned id)
|
||||
{
|
||||
G_entit th = {id};
|
||||
|
||||
DGE_Object_RefAdd(id);
|
||||
|
||||
while(th.health > 0)
|
||||
DGE_Task_Sleep(0, 1);
|
||||
|
||||
fixed x = th.x, y = th.y;
|
||||
|
||||
DGE_Object_RefSub(id);
|
||||
|
||||
DGE_ParticleSys ps = {DGE_ParticleSys_Create(0, 128)};
|
||||
|
||||
ps.sprite = DGE_Texture_Get(s"ent/explosion1");
|
||||
ps.x = x;
|
||||
ps.y = y;
|
||||
|
||||
DGE_Particle prt = {
|
||||
.life = 30,
|
||||
.size = {20, 20},
|
||||
.color = {1ulr, 1ulr, 0ulr, 1ulr}, {1ulr, 1ulr, 0ulr, 0ulr}, 0.05};
|
||||
|
||||
for(int i = 0; i < 7; i++)
|
||||
{
|
||||
prt.vel.x = M_Random_Float(-2, 2);
|
||||
prt.vel.y = M_Random_Float(-2, 2);
|
||||
prt.pos.x = M_Random_Float(-4, 4);
|
||||
prt.pos.y = M_Random_Float(-4, 4);
|
||||
DGE_ParticleSys_Add(ps.id, prt);
|
||||
}
|
||||
|
||||
DGE_Task_Sleep(0, 10);
|
||||
ps.sprite = DGE_Texture_Get(s"ent/explosion2");
|
||||
|
||||
DGE_Task_Sleep(0, 10);
|
||||
ps.sprite = DGE_Texture_Get(s"ent/explosion3");
|
||||
|
||||
DGE_Task_Sleep(0, 20);
|
||||
DGE_Thinker_Unlink(ps.id);
|
||||
}
|
||||
|
||||
//
|
||||
// GInit
|
||||
//
|
||||
|
@ -29,6 +77,7 @@ void GInit(char const *resdecl)
|
|||
printf("Loading object function table...\n");
|
||||
G_ObjDef_Init();
|
||||
G_ObjDef_AddType("Player", subtype_player, G_Player_propC, (DGE_CallbackType)G_Player_Think);
|
||||
G_ObjDef_AddType("Test", subtype_test, 0, (DGE_CallbackType)G_TestObj_Think);
|
||||
|
||||
printf("Loading object definitions...\n");
|
||||
G_ObjDef_Load("objdefs.dod");
|
||||
|
|
22
src/r_draw.c
22
src/r_draw.c
|
@ -2,6 +2,8 @@
|
|||
#include "r_draw.h"
|
||||
|
||||
#include "g_stage.h"
|
||||
#include "g_object.h"
|
||||
#include "g_player.h"
|
||||
#include "m_str.h"
|
||||
|
||||
#include <Doominati.h>
|
||||
|
@ -57,12 +59,22 @@ void R_DrawPost(ulfra delta)
|
|||
DGE_Font_Bind(DGE_Font_Get(s"base"));
|
||||
DGE_Draw_SetTextAlign(DGE_Align_Center, DGE_Align_Top);
|
||||
DGE_Draw_Text(760, 20, G_Place);
|
||||
DGE_Draw_SetTextAlign(DGE_Align_Left);
|
||||
DGE_Draw_Text(585, 70, u8"ハイスコア\nスコア\n\n残り再試行回");
|
||||
DGE_Draw_SetTextAlign(DGE_Align_Right);
|
||||
DGE_Draw_Text(945, 70, M_StrFmt("%.15i\n%.15i\n\n%i", 0, 0, 5));
|
||||
|
||||
R_drawHitboxes();
|
||||
DGE_Draw_SetTextAlign(DGE_Align_Left);
|
||||
DGE_Draw_Text(585, 70, u8"ハイスコア");
|
||||
DGE_Draw_SetTextAlign(DGE_Align_Right);
|
||||
DGE_Draw_Text(945, 70, M_StrFmt("%.15i", 0));
|
||||
|
||||
for(int i = 0; i < G_Player_Count; i++)
|
||||
{
|
||||
DGE_Draw_SetTextAlign(DGE_Align_Left);
|
||||
DGE_Draw_Text(585, 120 + i * 20,
|
||||
M_StrFmt(u8"PLAYER %i\nスコア\n残り再試行回", i + 1));
|
||||
DGE_Draw_SetTextAlign(DGE_Align_Right);
|
||||
DGE_Draw_Text(945, 140 + i * 20, M_StrFmt("%.15i\n%i", 0, 5));
|
||||
}
|
||||
|
||||
//R_drawHitboxes();
|
||||
}
|
||||
|
||||
// EOF
|
||||
|
|
Loading…
Reference in New Issue