Show peepclient.cpp syntax highlighted
/***************************************************************************
peepclient.cpp
-------------------
begin : Fri Jun 18 2004
copyright : (C) 2004 by Brendon Higgins
email : freepop-devel@lists.sourceforge.net
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include <client.h>
#include <clientmisc.h>
#include <maptilepos.h>
#include <peep.h>
#include <peepclient.h>
#include <peepmagnetclient.h>
#include <playerclient.h>
#include <oversprite.h>
#include <rules.h>
#include <worldclient.h>
OverSprite* PeepClient::spriteCacheWalking = 0;
OverSprite* PeepClient::spriteCacheBurning = 0;
PeepClient::PeepClient(WorldClient* w, const Identity& ident,
CL_NetPacket &p, int reason):
EntityClient(ident),
pos(WorldPos::extract(p.input)),
direction(WorldPos::extract(p.input)),
ownerSlot(p.input.read_int32()),
strength(p.input.read_float32()),
state(p.input.read_int32()),
isLeader(p.input.read_bool8()),
sprite(0) {
sprite = new OverSprite(*spriteCacheWalking, intToCL_Color(
w->findPlayer(ownerSlot)->getColour()));
}
PeepClient::~PeepClient() {
delete sprite;
}
WorldPos PeepClient::getPos() const {
return pos;
}
bool PeepClient::drawUpdate(const WorldClient* w, unsigned int d) {
sprite->update(d / 1000.0f);
return true;
}
void PeepClient::draw(const WorldClient* w) const {
if (w->getMap()->isValid(pos)) {
CL_Point gp = w->getMap()->findPos(pos);
sprite->draw(gp.x, gp.y);
if (isLeader) {
// TODO: Offset not builtin
// HACK, A little bit of a
PeepMagnetClient::spriteMiniCache->set_color(
intToCL_Color(w->findPlayer(ownerSlot)->getColour()));
PeepMagnetClient::spriteMiniCache->draw(gp.x +15, gp.y -30);
}
}
}
void PeepClient::playerColourChange(WorldClient* w) {
sprite->set_color(intToCL_Color(w->findPlayer(ownerSlot)->getColour()));
}
void PeepClient::predict(const WorldClient* w, unsigned int d) {
if (state != Peep::State::DROWNING) {
pos += direction * d / w->getRules()->peep_walkspeed;
}
}
void PeepClient::onFullUpdate(WorldClient* w, CL_NetPacket& p) {
pos = WorldPos::extract(p.input);
direction = WorldPos::extract(p.input);
ownerSlot = p.input.read_int32();
sprite->set_color(intToCL_Color(w->findPlayer(ownerSlot)->getColour()));
strength = p.input.read_float32();
state = p.input.read_int32();
isLeader = p.input.read_bool8();
}
void PeepClient::onDestroy(WorldClient* w, int reason) {
}
void PeepClient::onMessage(WorldClient* w, int m, CL_NetPacket& p) {
if (m == Peep::Message::DIRECTION) onDirection(p);
if (m == Peep::Message::STATE) onState(w, p);
if (m == Peep::Message::STRENGTH) onStrength(p);
}
void PeepClient::onDirection(CL_NetPacket& p) {
pos = WorldPos::extract(p.input);
direction = WorldPos::extract(p.input);
}
void PeepClient::onState(WorldClient* w, CL_NetPacket& p) {
state = p.input.read_int32();
delete sprite;
if (state == Peep::State::WALKING) {
sprite = new OverSprite(*spriteCacheWalking, intToCL_Color(
w->findPlayer(ownerSlot)->getColour()));
pos = WorldPos::extract(p.input);
direction = WorldPos::extract(p.input);
} else if (state == Peep::State::DROWNING) {
sprite = new OverSprite(*spriteCacheWalking, intToCL_Color(
w->findPlayer(ownerSlot)->getColour()));
pos = WorldPos::extract(p.input);
} else if (state == Peep::State::BURNING) {
sprite = new OverSprite(*spriteCacheBurning, intToCL_Color(
w->findPlayer(ownerSlot)->getColour()));
}
}
void PeepClient::onStrength(CL_NetPacket& p) {
strength = p.input.read_float32();
}
void PeepClient::loadSprites() {
spriteCacheWalking = new OverSprite("entities/peeps/human/1/walking/dir0",
app.getResources());
spriteCacheBurning = new OverSprite("entities/peeps/human/1/burning/dir0",
app.getResources());
}
void PeepClient::freeSprites() {
delete spriteCacheWalking;
delete spriteCacheBurning;
}
See more files for this project here