/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* 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 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
*/
/*
* This file is based on WME.
* http://dead-code.org/redir.php?target=wme
* Copyright (c) 2003-2013 Jan Nedoma and contributors
*/
#ifndef WINTERMUTE_AD_ACTOR_3DX_H
#define WINTERMUTE_AD_ACTOR_3DX_H
#include "engines/wintermute/ad/ad_object_3d.h"
#include "engines/wintermute/base/base_animation_transition_time.h"
#include "engines/wintermute/base/base_point.h"
#include "engines/wintermute/base/gfx/xmath.h"
#include "engines/wintermute/coll_templ.h"
namespace Wintermute {
class AdAttach3DX;
class AdPath;
class AdPath3D;
class AdActor3DX : public AdObject3D {
public:
PartEmitter *createParticleEmitter(bool followParent = false, int offsetX = 0, int offsetY = 0) override;
virtual PartEmitter *createParticleEmitter(const char *boneName, DXVector3 offset);
bool updatePartEmitter() override;
char *_partBone;
DXVector3 _partOffset;
bool displayShadowVolume();
bool displayFlatShadow();
bool restoreDeviceObjects() override;
bool invalidateDeviceObjects() override;
int32 _stateAnimChannel;
void talk(const char *text, const char *sound = nullptr, uint32 duration = 0, const char *stances = nullptr, TTextAlign align = TAL_CENTER) override;
int32 getHeight() override;
bool playAnim3DX(const char *name, bool setState);
bool playAnim3DX(int channel, const char *name, bool setState);
uint32 getAnimTransitionTime(const char *from, const char *to) override;
BaseArray _transitionTimes;
virtual bool renderModel() override;
uint32 _defaultTransTime;
uint32 _defaultStopTransTime;
float _afterWalkAngle;
char *_talkAnimName;
char *_idleAnimName;
char *_walkAnimName;
char *_turnLeftAnimName;
char *_turnRightAnimName;
int32 _talkAnimChannel;
TDirectWalkMode _directWalkMode;
TDirectTurnMode _directTurnMode;
char *_directWalkAnim;
char *_directTurnAnim;
float _directWalkVelocity;
float _directTurnVelocity;
int32 _goToTolerance;
DECLARE_PERSISTENT(AdActor3DX, AdObject3D)
bool _turningLeft;
void initLine3D(DXVector3 startPt, DXVector3 endPt, bool firstStep);
void getNextStep3D();
void followPath3D();
void getNextStep2D();
void followPath2D();
void goTo3D(DXVector3 targetPos, float targetAngle = -1.0f);
void goTo2D(int x, int y, float targetAngle = -1.0f);
bool turnTo(float angle);
DXVector3 _targetPoint3D;
BasePoint *_targetPoint2D;
float _targetAngle;
bool display() override;
bool update() override;
AdActor3DX(BaseGame *inGame);
virtual ~AdActor3DX();
AdPath3D *_path3D;
AdPath *_path2D;
bool loadFile(const char *filename);
bool loadBuffer(char *buffer, bool complete = true);
float dirToAngle(TDirection dir);
TDirection angleToDir(float angle);
bool updateAttachments();
bool displayAttachments(bool registerObjects);
// scripting interface
ScValue *scGetProperty(const char *name) override;
bool scSetProperty(const char *name, ScValue *value) override;
bool scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, const char *name) override;
const char *scToString() override;
private:
bool parseEffect(char *buffer);
BaseArray _attachments;
bool turnToStep(float velocity);
bool prepareTurn(float targetAngle);
bool mergeAnimations(const char *filename);
bool mergeAnimations2(const char *filename);
bool unloadAnimation(const char *animName);
bool isGoToNeeded(int32 x, int32 y);
};
} // namespace Wintermute
#endif