#import "DynamicEntity.h"
#include "cube.h"
struct dynent {
OFVector3D o, vel;
float yaw, pitch, roll;
float maxspeed;
bool outsidemap;
bool inwater;
bool onfloor, jumpnext;
int move, strafe;
bool k_left, k_right, k_up, k_down;
int timeinair;
float radius, eyeheight, aboveeye;
int lastupdate, plag, ping;
int lifesequence;
int state;
int frags;
int health, armour, armourtype, quadmillis;
int gunselect, gunwait;
int lastaction, lastattackgun, lastmove;
bool attacking;
int ammo[NUMGUNS];
int monsterstate;
int mtype;
void *enemy;
float targetyaw;
bool blocked, moving;
int trigger;
OFVector3D attacktarget;
int anger;
char name[260], team[260];
};
@implementation DynamicEntity
+ (size_t)serializedSize
{
return sizeof(struct dynent);
}
- (instancetype)init
{
self = [super init];
_ammo = (int *)OFAllocZeroedMemory(NUMGUNS, sizeof(int));
return self;
}
- (void)dealloc
{
OFFreeMemory(_ammo);
}
- (id)copy
{
DynamicEntity *copy = [[self.class alloc] init];
copy->_o = _o;
copy->_vel = _vel;
copy->_yaw = _yaw;
copy->_pitch = _pitch;
copy->_roll = _roll;
copy->_maxspeed = _maxspeed;
copy->_outsidemap = _outsidemap;
copy->_inwater = _inwater;
copy->_onfloor = _onfloor;
copy->_jumpnext = _jumpnext;
copy->_move = _move;
copy->_strafe = _strafe;
copy->_k_left = _k_left;
copy->_k_right = _k_right;
copy->_k_up = _k_up;
copy->_k_down = _k_down;
copy->_timeinair = _timeinair;
copy->_radius = _radius;
copy->_eyeheight = _eyeheight;
copy->_aboveeye = _aboveeye;
copy->_lastupdate = _lastupdate;
copy->_plag = _plag;
copy->_ping = _ping;
copy->_lifesequence = _lifesequence;
copy->_state = _state;
copy->_frags = _frags;
copy->_health = _health;
copy->_armour = _armour;
copy->_armourtype = _armourtype;
copy->_quadmillis = _quadmillis;
copy->_gunselect = _gunselect;
copy->_gunwait = _gunwait;
copy->_lastaction = _lastaction;
copy->_lastattackgun = _lastattackgun;
copy->_lastmove = _lastmove;
copy->_attacking = _attacking;
for (size_t i = 0; i < NUMGUNS; i++)
copy->_ammo[i] = _ammo[i];
copy->_monsterstate = _monsterstate;
copy->_mtype = _mtype;
copy->_enemy = _enemy;
copy->_targetyaw = _targetyaw;
copy->_blocked = _blocked;
copy->_moving = _moving;
copy->_trigger = _trigger;
copy->_attacktarget = _attacktarget;
copy->_anger = _anger;
copy->_name = [_name copy];
copy->_team = [_team copy];
return copy;
}
- (OFData *)dataBySerializing
{
// This is frighteningly *TERRIBLE*, but the format used by existing
// savegames.
struct dynent data = { .o = _o,
.vel = _vel,
.yaw = _yaw,
.pitch = _pitch,
.roll = _roll,
.maxspeed = _maxspeed,
.outsidemap = _outsidemap,
.inwater = _inwater,
.onfloor = _onfloor,
.jumpnext = _jumpnext,
.move = _move,
.strafe = _strafe,
.k_left = _k_left,
.k_right = _k_right,
.k_up = _k_up,
.k_down = _k_down,
.timeinair = _timeinair,
.radius = _radius,
.eyeheight = _eyeheight,
.aboveeye = _aboveeye,
.lastupdate = _lastupdate,
.plag = _plag,
.ping = _ping,
.lifesequence = _lifesequence,
.state = _state,
.frags = _frags,
.health = _health,
.armour = _armour,
.armourtype = _armourtype,
.quadmillis = _quadmillis,
.gunselect = _gunselect,
.gunwait = _gunwait,
.lastaction = _lastaction,
.lastattackgun = _lastattackgun,
.lastmove = _lastmove,
.attacking = _attacking,
.monsterstate = _monsterstate,
.mtype = _mtype,
.targetyaw = _targetyaw,
.blocked = _blocked,
.moving = _moving,
.trigger = _trigger,
.attacktarget = _attacktarget,
.anger = _anger };
for (int i = 0; i < NUMGUNS; i++)
data.ammo[i] = _ammo[i];
memcpy(data.name, _name.UTF8String, min(_name.UTF8StringLength, 259));
memcpy(data.team, _team.UTF8String, min(_team.UTF8StringLength, 259));
return [OFData dataWithItems:&data count:sizeof(data)];
}
- (void)setFromSerializedData:(OFData *)data
{
struct dynent d;
if (data.count != sizeof(struct dynent))
@throw [OFOutOfRangeException exception];
memcpy(&d, data.items, data.count);
_o = d.o;
_vel = d.vel;
_yaw = d.yaw;
_pitch = d.pitch;
_roll = d.roll;
_maxspeed = d.maxspeed;
_outsidemap = d.outsidemap;
_inwater = d.inwater;
_onfloor = d.onfloor;
_jumpnext = d.jumpnext;
_move = d.move;
_strafe = d.strafe;
_k_left = d.k_left;
_k_right = d.k_right;
_k_up = d.k_up;
_k_down = d.k_down;
_timeinair = d.timeinair;
_radius = d.radius;
_eyeheight = d.eyeheight;
_aboveeye = d.aboveeye;
_lastupdate = d.lastupdate;
_plag = d.plag;
_ping = d.ping;
_lifesequence = d.lifesequence;
_state = d.state;
_frags = d.frags;
_health = d.health;
_armour = d.armour;
_armourtype = d.armourtype;
_quadmillis = d.quadmillis;
_gunselect = d.gunselect;
_gunwait = d.gunwait;
_lastaction = d.lastaction;
_lastattackgun = d.lastattackgun;
_lastmove = d.lastmove;
_attacking = d.attacking;
for (int i = 0; i < NUMGUNS; i++)
_ammo[i] = d.ammo[i];
_monsterstate = d.monsterstate;
_mtype = d.mtype;
_targetyaw = d.targetyaw;
_blocked = d.blocked;
_moving = d.moving;
_trigger = d.trigger;
_attacktarget = d.attacktarget;
_anger = d.anger;
_name = [[OFString alloc] initWithUTF8String:d.name];
_team = [[OFString alloc] initWithUTF8String:d.team];
}
@end