ddnet/src/game/gamecore.hpp

201 lines
3.7 KiB
C++
Raw Normal View History

2007-11-25 19:42:40 +00:00
/* copyright (c) 2007 magnus auvinen, see licence.txt for more info */
2008-01-12 17:09:00 +00:00
#ifndef GAME_GAME_H
#define GAME_GAME_H
#include <base/system.h>
#include <base/math.hpp>
#include <engine/e_common_interface.h>
2007-05-22 15:03:32 +00:00
#include <math.h>
2008-08-17 08:52:24 +00:00
#include "collision.hpp"
#include <game/generated/g_protocol.hpp>
2007-08-22 21:13:33 +00:00
struct TUNING_PARAMS
{
TUNING_PARAMS()
{
const float ticks_per_second = 50.0f;
2008-03-22 14:42:35 +00:00
#define MACRO_TUNING_PARAM(name,value) name.set((int)(value*100.0f));
2008-08-17 08:52:24 +00:00
#include "tuning.hpp"
#undef MACRO_TUNING_PARAM
}
static const char *names[];
#define MACRO_TUNING_PARAM(name,value) tune_param name;
2008-08-17 08:52:24 +00:00
#include "tuning.hpp"
#undef MACRO_TUNING_PARAM
static int num() { return sizeof(TUNING_PARAMS)/sizeof(int); }
bool set(int index, float value);
bool set(const char *name, float value);
bool get(int index, float *value);
bool get(const char *name, float *value);
};
inline vec2 get_direction(int angle)
2007-05-22 15:03:32 +00:00
{
float a = angle/256.0f;
return vec2(cosf(a), sinf(a));
2007-05-22 15:03:32 +00:00
}
2007-10-07 15:32:54 +00:00
inline vec2 get_dir(float a)
{
return vec2(cosf(a), sinf(a));
}
inline float get_angle(vec2 dir)
2007-05-22 15:03:32 +00:00
{
float a = atan(dir.y/dir.x);
if(dir.x < 0)
a = a+pi;
2007-05-22 15:03:32 +00:00
return a;
}
inline void str_to_ints(int *ints, int num, const char *str)
{
int index = 0;
while(num)
{
char buf[4] = {0,0,0,0};
for(int c = 0; c < 4 && str[index]; c++, index++)
buf[c] = str[index];
*ints = (buf[0]<<24)|(buf[1]<<16)|(buf[2]<<8)|buf[3];
ints++;
num--;
}
// null terminate
ints[-1] &= 0xffffff00;
}
inline void ints_to_str(const int *ints, int num, char *str)
{
while(num)
{
str[0] = ((*ints)>>24)&0xff;
str[1] = ((*ints)>>16)&0xff;
str[2] = ((*ints)>>8)&0xff;
str[3] = (*ints)&0xff;
str += 4;
ints++;
num--;
}
// null terminate
str[-1] = 0;
}
inline vec2 calc_pos(vec2 p, vec2 v, float curvature, float speed, float t)
{
vec2 n;
t *= speed;
n.x = p.x + v.x*t;
n.y = p.y + v.y*t + curvature/10000*(t*t);
return n;
}
template<typename T>
inline T saturated_add(T min, T max, T current, T modifier)
{
if(modifier < 0)
{
if(current < min)
return current;
current += modifier;
if(current < min)
current = min;
return current;
}
else
{
if(current > max)
return current;
current += modifier;
if(current > max)
current = max;
return current;
}
}
void move_point(vec2 *inout_pos, vec2 *inout_vel, float elasticity, int *bounces);
void move_box(vec2 *inout_pos, vec2 *inout_vel, vec2 size, float elasticity);
2007-12-12 19:52:57 +00:00
bool test_box(vec2 pos, vec2 size);
float velocity_ramp(float value, float start, float range, float curvature);
// hooking stuff
enum
{
HOOK_RETRACTED=-1,
HOOK_IDLE=0,
2008-03-22 13:03:52 +00:00
HOOK_RETRACT_START=1,
HOOK_RETRACT_END=3,
HOOK_FLYING,
2007-12-09 12:40:34 +00:00
HOOK_GRABBED,
COREEVENT_GROUND_JUMP=0x01,
COREEVENT_AIR_JUMP=0x02,
COREEVENT_HOOK_LAUNCH=0x04,
COREEVENT_HOOK_ATTACH_PLAYER=0x08,
COREEVENT_HOOK_ATTACH_GROUND=0x10,
2008-09-23 14:38:13 +00:00
COREEVENT_HOOK_HIT_NOHOOK=0x20,
COREEVENT_HOOK_RETRACT=0x40,
};
class WORLD_CORE
{
public:
WORLD_CORE()
{
mem_zero(characters, sizeof(characters));
}
TUNING_PARAMS tuning;
class CHARACTER_CORE *characters[MAX_CLIENTS];
};
class CHARACTER_CORE
{
public:
WORLD_CORE *world;
vec2 pos;
vec2 vel;
vec2 hook_pos;
vec2 hook_dir;
int hook_tick;
int hook_state;
int hooked_player;
int jumped;
2008-09-23 07:43:41 +00:00
int direction;
int angle;
2008-02-24 16:03:58 +00:00
NETOBJ_PLAYER_INPUT input;
2007-12-09 12:40:34 +00:00
int triggered_events;
void reset();
2008-09-23 07:43:41 +00:00
void tick(bool use_input);
void move();
void read(const NETOBJ_CHARACTER_CORE *obj_core);
void write(NETOBJ_CHARACTER_CORE *obj_core);
void quantize();
};
2007-07-21 19:03:50 +00:00
#define LERP(a,b,t) (a + (b-a) * t)
#define min(a, b) ( a > b ? b : a)
#define max(a, b) ( a > b ? a : b)
inline bool col_check_point(float x, float y) { return col_is_solid((int)x, (int)y) != 0; }
inline bool col_check_point(vec2 p) { return col_check_point(p.x, p.y); }
2007-05-22 15:03:32 +00:00
2008-01-12 17:09:00 +00:00
#endif