From: <wjp...@us...> - 2007-03-02 21:57:41
|
Revision: 4520 http://gemrb.svn.sourceforge.net/gemrb/?rev=4520&view=rev Author: wjpalenstijn Date: 2007-03-02 13:57:36 -0800 (Fri, 02 Mar 2007) Log Message: ----------- randomly choose attack animation Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actor.cpp gemrb/trunk/gemrb/plugins/Core/Actor.h gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp gemrb/trunk/gemrb/plugins/Core/ActorBlock.h gemrb/trunk/gemrb/plugins/Core/CharAnimations.cpp gemrb/trunk/gemrb/plugins/Core/CharAnimations.h Modified: gemrb/trunk/gemrb/plugins/Core/Actor.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2007-03-02 21:54:21 UTC (rev 4519) +++ gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2007-03-02 21:57:36 UTC (rev 4520) @@ -189,9 +189,6 @@ ShieldRef[0]=0; HelmetRef[0]=0; WeaponRef[0]=0; - AttackMovements[0]=100; - AttackMovements[1]=0; - AttackMovements[2]=0; for (i = 0; i < EXTRA_ACTORCOVERS; ++i) extraCovers[i] = NULL; @@ -337,7 +334,6 @@ anims->SetOffhandRef(ShieldRef); anims->SetHelmetRef(HelmetRef); anims->SetWeaponRef(WeaponRef); - anims->SetAttackMoveChances(AttackMovements); //if we have a recovery palette, then set it back assert(anims->palette[PAL_MAIN] == 0); @@ -2709,12 +2705,12 @@ CharAnimations* ca = GetAnims(); int StanceID = GetStance(); - int x = rand()%1000; if (ca->autoSwitchOnEnd) { SetStance( ca->nextStanceID ); ca->autoSwitchOnEnd = false; return true; } + int x = rand()%1000; if ((StanceID==IE_ANI_AWAKE) && !x ) { SetStance( IE_ANI_HEAD_TURN ); return true; @@ -2723,6 +2719,12 @@ SetStance( IE_ANI_AWAKE ); return true; } + if (StanceID == IE_ANI_ATTACK || StanceID == IE_ANI_ATTACK_JAB || + StanceID == IE_ANI_ATTACK_SLASH || StanceID == IE_ANI_ATTACK_BACKSLASH) + { + SetStance( IE_ANI_ATTACK ); + return true; + } return false; } @@ -3043,13 +3045,12 @@ void Actor::SetUsedWeapon(char* AnimationType, ieWord* MeleeAnimation, int wt) { memcpy(WeaponRef, AnimationType, sizeof(WeaponRef) ); - memcpy(AttackMovements, MeleeAnimation, sizeof(AttackMovements) ); if (wt != -1) WeaponType = wt; if (!anims) return; anims->SetWeaponRef(AnimationType); anims->SetWeaponType(WeaponType); - anims->SetAttackMoveChances(MeleeAnimation); + SetAttackMoveChances(MeleeAnimation); } void Actor::SetUsedShield(char* AnimationType, int wt) Modified: gemrb/trunk/gemrb/plugins/Core/Actor.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.h 2007-03-02 21:54:21 UTC (rev 4519) +++ gemrb/trunk/gemrb/plugins/Core/Actor.h 2007-03-02 21:57:36 UTC (rev 4520) @@ -156,7 +156,6 @@ ieDword LastMarked; // no idea if non-actors could mark objects ieDword LastHeard; ieDword HotKey; - ieWord AttackMovements[3]; char ShieldRef[2]; char HelmetRef[2]; char WeaponRef[2]; Modified: gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp 2007-03-02 21:54:21 UTC (rev 4519) +++ gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp 2007-03-02 21:57:36 UTC (rev 4520) @@ -666,6 +666,9 @@ timeStartStep = 0; lastFrame = NULL; Area[0] = 0; + AttackMovements[0] = 100; + AttackMovements[1] = 0; + AttackMovements[2] = 0; } Movable::~Movable(void) @@ -718,12 +721,35 @@ { if (arg<MAX_ANIMS) { StanceID=(unsigned char) arg; + + if (StanceID == IE_ANI_ATTACK) { + // Set stance to a random attack animation + + int random = rand()%100; + if (random < AttackMovements[0]) { + StanceID = IE_ANI_ATTACK_BACKSLASH; + } else if (random < AttackMovements[0] + AttackMovements[1]) { + StanceID = IE_ANI_ATTACK_SLASH; + } else { + StanceID = IE_ANI_ATTACK_JAB; + } + } + } else { StanceID=IE_ANI_AWAKE; // printf("Tried to set invalid stance id (%u)\n", arg); } } +void Movable::SetAttackMoveChances(ieWord *amc) +{ + AttackMovements[0]=amc[0]; + AttackMovements[1]=amc[1]; + AttackMovements[2]=amc[2]; +} + + + //this could be used for WingBuffet as well void Movable::MoveLine(int steps, int Pass, ieDword orient) { Modified: gemrb/trunk/gemrb/plugins/Core/ActorBlock.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ActorBlock.h 2007-03-02 21:54:21 UTC (rev 4519) +++ gemrb/trunk/gemrb/plugins/Core/ActorBlock.h 2007-03-02 21:57:36 UTC (rev 4520) @@ -303,6 +303,8 @@ private: //these seem to be sensitive, so get protection unsigned char StanceID; unsigned char Orientation, NewOrientation; + ieWord AttackMovements[3]; + PathNode* path; //whole path PathNode* step; //actual step public: @@ -353,6 +355,7 @@ } void SetStance(unsigned int arg); + void SetAttackMoveChances(ieWord *amc); void DoStep(unsigned int walk_speed); void AddWayPoint(Point &Des); void RunAwayFrom(Point &Des, int PathLength, int flags); Modified: gemrb/trunk/gemrb/plugins/Core/CharAnimations.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/CharAnimations.cpp 2007-03-02 21:54:21 UTC (rev 4519) +++ gemrb/trunk/gemrb/plugins/Core/CharAnimations.cpp 2007-03-02 21:57:36 UTC (rev 4520) @@ -177,13 +177,6 @@ } } -void CharAnimations::SetAttackMoveChances(ieWord *amc) -{ - AttackMoves[0]=amc[0]; - AttackMoves[1]=amc[1]; - AttackMoves[2]=amc[2]; -} - void CharAnimations::SetHelmetRef(const char* ref) { HelmetRef[0] = ref[0]; @@ -1013,6 +1006,9 @@ switch (StanceID) { case IE_ANI_ATTACK: + case IE_ANI_ATTACK_SLASH: + case IE_ANI_ATTACK_JAB: + case IE_ANI_ATTACK_BACKSLASH: Cycle=SixteenToFive[Orient]; Prefix="at1"; break; case IE_ANI_DAMAGE: @@ -1234,8 +1230,6 @@ EquipData = new EquipResRefData; EquipData->Suffix[0] = 0; switch (StanceID) { - //Attack is a special case... it takes cycles randomly - //based on the weapon type (TODO) case IE_ANI_ATTACK: case IE_ANI_ATTACK_SLASH: strcat( ResRef, SlashPrefix[WeaponType] ); @@ -1429,9 +1423,6 @@ Orient /= 2; switch (StanceID) { - //Attack is a special case... it cycles randomly - //through SLASH, BACKSLASH and JAB so we will choose - //which animation return randomly case IE_ANI_READY: case IE_ANI_CAST: case IE_ANI_CONJURE: @@ -1485,9 +1476,6 @@ EquipData->Suffix[0] = 0; switch (StanceID) { - //Attack is a special case... it cycles randomly - //through SLASH, BACKSLASH and JAB so we will choose - //which animation return randomly case IE_ANI_ATTACK: case IE_ANI_ATTACK_SLASH: strcat (ResRef, SlashPrefix[WeaponType]); @@ -1806,9 +1794,6 @@ unsigned char& Cycle, unsigned char Orient) { switch (StanceID) { - //Attack is a special case... it cycles randomly - //through SLASH, BACKSLASH and JAB so we will choose - //which animation return randomly case IE_ANI_ATTACK: case IE_ANI_ATTACK_SLASH: case IE_ANI_ATTACK_BACKSLASH: Modified: gemrb/trunk/gemrb/plugins/Core/CharAnimations.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/CharAnimations.h 2007-03-02 21:54:21 UTC (rev 4519) +++ gemrb/trunk/gemrb/plugins/Core/CharAnimations.h 2007-03-02 21:57:36 UTC (rev 4520) @@ -136,7 +136,6 @@ Palette* modifiedPalette[4]; unsigned int AvatarsRowNum; unsigned char ArmorType, WeaponType, RangedType; - ieDword AttackMoves[3]; //percentages for the 3 attack move types ieResRef ResRef; ieResRef PaletteResRef; unsigned char nextStanceID; @@ -148,7 +147,6 @@ static void ReleaseMemory(); void SetArmourLevel(int ArmourLevel); void SetWeaponType(int WeaponType); - void SetAttackMoveChances(ieWord *amc); void SetHelmetRef(const char* ref); void SetWeaponRef(const char* ref); void SetOffhandRef(const char* ref); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |