Skip to content

Instantly share code, notes, and snippets.

@jkoppel
Created October 2, 2023 09:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jkoppel/a38161c3d0c1f5fc07b93cd38679fc5f to your computer and use it in GitHub Desktop.
Save jkoppel/a38161c3d0c1f5fc07b93cd38679fc5f to your computer and use it in GitHub Desktop.
army::Walk
void __thiscall army::Walk(army *ecx0, signed int dir, int last, int notFirst)
{
int v4; // ST3C_4@78
int v6; // [sp+1Ch] [bp-24h]@26
int v7; // [sp+20h] [bp-20h]@80
int i; // [sp+24h] [bp-1Ch]@47
int v9; // [sp+28h] [bp-18h]@77
signed int targCell; // [sp+30h] [bp-10h]@1
int offsetY; // [sp+34h] [bp-Ch]@26
int v12; // [sp+38h] [bp-8h]@26
int offsetX; // [sp+3Ch] [bp-4h]@26
targCell = army::GetAdjacentCellIndex(ecx0, ecx0->occupiedHex, dir); // fetches data, used for multiple purposes
if ( ecx0->owningSide == 1
&& gpCombatManager->isCastleBattle
&& (targCell == 58 || targCell == 59 || targCell == 60 && ecx0->owningSide == 1 && ecx0->creature.creature_flags & 1)
&& gpCombatManager->drawBridgePosition == BRIDGE_CLOSED )
{ // isCastleBattle, drawBridgePosition, and BRIDGE_CLOSED are all associated with siege combat.
ecx0->animationType = ANIMATION_TYPE_STANDING; // concept: animation, standing
ecx0->animationFrame = 0; // concept: animation
combatManager::DrawFrame(gpCombatManager, 1, 0, 0, 0, 75, 1, 1); // concept: drawing, animation
combatManager::LowerDoor(gpCombatManager); // concept: siege combat
notFirst = 0; // ???
}
giWalkingFrom = ecx0->occupiedHex;
if ( ecx0->creature.creature_flags & 1 ) // this implements two-hexers
giWalkingFrom2 = ecx0->occupiedHex + ((unsigned int)(ecx0->facingRight - 1) < 1 ? 1 : -1);
else
giWalkingFrom2 = -1;
giWalkingTo = targCell;
if ( ecx0->creature.creature_flags & 1 )
giWalkingTo2 = targCell + ((unsigned int)(ecx0->facingRight - 1) < 1 ? 1 : -1);
else
giWalkingTo2 = -1;
giWalkingYMod = 0;
BuildTempWalkSeq(&ecx0->frameInfo, last, notFirst);
ecx0->field_8A = dir;
if ( !notFirst )
{
giMinExtentY = 640;
giMinExtentX = 640;
giMaxExtentY = 0;
giMaxExtentX = 0;
gbComputeExtent = 1;
gbSaveBiggestExtent = 1;
gbReturnAfterComputeExtent = 1;
army::DrawToBuffer(
ecx0,
gpCombatManager->combatGrid[ecx0->occupiedHex].centerX,
gpCombatManager->combatGrid[ecx0->occupiedHex].occupyingCreatureBottomY,
0);
gbReturnAfterComputeExtent = 0;
gbSaveBiggestExtent = 0;
gbComputeExtent = 0;
}
if ( giMinExtentX < 0 )
giMinExtentX = 0;
if ( giMinExtentY < 0 )
giMinExtentY = 0;
if ( giMaxExtentX > 639 )
giMaxExtentX = 639;
if ( giMaxExtentY > 442 )
giMaxExtentY = 442;
offsetX = giMinExtentX;
offsetY = giMinExtentY;
v12 = giMaxExtentX;
v6 = giMaxExtentY;
ecx0->field_8E = 0;
if ( dir >= 3 )
{
if ( ecx0->facingRight == 1 )
{
ecx0->field_8E = 1;
ecx0->facingRight = 1 - ecx0->facingRight;
if ( ecx0->creature.creature_flags & TWO_HEXER )
++ecx0->occupiedHex;
}
}
else if ( !ecx0->facingRight )
{
ecx0->field_8E = 1;
ecx0->facingRight = 1 - ecx0->facingRight;
if ( ecx0->creature.creature_flags & TWO_HEXER )
--ecx0->occupiedHex;
}
if ( !dir || dir == 5 )
ecx0->field_6 = 0;
if ( dir == 2 || dir == 3 )
ecx0->field_6 = 3;
ecx0->animationFrame = 0;
ecx0->animationType = 6;
if ( !gbNoShowCombat )
soundManager::MemorySample((soundManager *)gpSoundManager, ecx0->combatSounds[0]);
if ( !notFirst )
{
gpCombatManager->combatGrid[ecx0->occupiedHex].unitOwner = -1;
combatManager::DrawFrame(gpCombatManager, 0, 0, 0, 0, 75, 1, 1);
gpCombatManager->combatGrid[ecx0->occupiedHex].unitOwner = LOBYTE(gpCombatManager->activeStackOwner);
if ( !gbNoShowCombat )
bitmap::CopyTo(
gpWindowManager->screenBuffer,
gpCombatManager->probablyBitmapForCombatScreen,
0,
0,
0,
0,
0x280u,
443);
gpCombatManager->zeroedAfterAnimatingDeathAndHolySpells = 0;
}
if ( !gbNoShowCombat )
{
for ( i = 0; ecx0->frameInfo.animationLengths[6] > i; ++i )
{
ecx0->animationFrame = i;
if ( notFirst || i )
{
bitmap::CopyTo(
gpCombatManager->probablyBitmapForCombatScreen,
gpWindowManager->screenBuffer,
giMinExtentX,
giMinExtentY,
giMinExtentX,
giMinExtentY,
giMaxExtentX - giMinExtentX + 1,
giMaxExtentY - giMinExtentY + 1);
if ( giMinExtentX < 0 )
giMinExtentX = 0;
if ( giMinExtentY < 0 )
giMinExtentY = 0;
if ( giMaxExtentX > 639 )
giMaxExtentX = 639;
if ( giMaxExtentY > 442 )
giMaxExtentY = 442;
offsetX = giMinExtentX;
offsetY = giMinExtentY;
v12 = giMaxExtentX;
v6 = giMaxExtentY;
}
giMinExtentY = 640;
giMinExtentX = 640;
giMaxExtentY = 0;
giMaxExtentX = 0;
gbComputeExtent = 1;
gbSaveBiggestExtent = 1;
gbReturnAfterComputeExtent = 1;
army::DrawToBuffer(
ecx0,
gpCombatManager->combatGrid[ecx0->occupiedHex].centerX,
gpCombatManager->combatGrid[ecx0->occupiedHex].occupyingCreatureBottomY,
0);
gbReturnAfterComputeExtent = 0;
gbComputeExtent = 0;
gbSaveBiggestExtent = 0;
if ( giMinExtentX < 0 )
giMinExtentX = 0;
if ( giMinExtentY < 0 )
giMinExtentY = 0;
if ( giMaxExtentX > 639 )
giMaxExtentX = 639;
if ( giMaxExtentY > 442 )
giMaxExtentY = 442;
gbCurrArmyDrawn = 0;
gbComputeExtent = 1;
gbLimitToExtent = 1;
ecx0->field_11D = 0;
combatManager::DrawFrame(gpCombatManager, 0, 0, 0, 0, 75, 0, 1);
ecx0->field_11D = 1;
gbLimitToExtent = 0;
gbComputeExtent = 0;
gbCurrArmyDrawn = 1;
if ( giMinExtentX < offsetX )
offsetX = giMinExtentX;
if ( offsetY > giMinExtentY )
offsetY = giMinExtentY;
if ( giMaxExtentX > v12 )
v12 = giMaxExtentX;
if ( giMaxExtentY > v6 )
v6 = giMaxExtentY;
DelayTil(&glTimers);
glTimers = (signed __int64)((double)KBTickCount()
+ (double)ecx0->frameInfo.stepTime
* gfCombatSpeedMod[giCombatSpeed]
/ (double)ecx0->frameInfo.animationLengths[6]);
heroWindowManager::UpdateScreenRegion(gpWindowManager, offsetX, offsetY, v12 - offsetX + 1, v6 - offsetY + 1);
}
}
v9 = army::GetAdjacentCellIndex(ecx0, ecx0->occupiedHex, dir);
gpCombatManager->combatGrid[ecx0->occupiedHex].stackIdx = -1;
gpCombatManager->combatGrid[ecx0->occupiedHex].unitOwner = -1;
gpCombatManager->combatGrid[ecx0->occupiedHex].occupiersOtherHexIsToLeft = -1;
if ( ecx0->creature.creature_flags & 1 )
{
v4 = ecx0->occupiedHex + ((unsigned int)(ecx0->facingRight - 1) < 1 ? 1 : -1);
gpCombatManager->combatGrid[v4].stackIdx = -1;
gpCombatManager->combatGrid[v4].unitOwner = -1;
gpCombatManager->combatGrid[v4].occupiersOtherHexIsToLeft = -1;
}
gpCombatManager->combatGrid[v9].unitOwner = LOBYTE(ecx0->owningSide);
gpCombatManager->combatGrid[v9].stackIdx = LOBYTE(ecx0->stackIdx);
gpCombatManager->combatGrid[v9].occupiersOtherHexIsToLeft = -1;
if ( ecx0->creature.creature_flags & 1 )
{
v7 = v9 + ((unsigned int)(ecx0->facingRight - 1) < 1 ? 1 : -1);
gpCombatManager->combatGrid[v7].unitOwner = LOBYTE(ecx0->owningSide);
gpCombatManager->combatGrid[v7].stackIdx = LOBYTE(ecx0->stackIdx);
gpCombatManager->combatGrid[v7].occupiersOtherHexIsToLeft = v9 <= v7;
gpCombatManager->combatGrid[v9].occupiersOtherHexIsToLeft = v9 >= v7;
}
ecx0->occupiedHex = v9;
if ( ecx0->field_8E )
{
ecx0->facingRight = 1 - ecx0->facingRight;
if ( ecx0->creature.creature_flags & TWO_HEXER )
{
if ( ecx0->facingRight )
--ecx0->occupiedHex;
else
++ecx0->occupiedHex;
}
ecx0->field_8E = 0;
}
giWalkingFrom = -1;
giWalkingFrom2 = -1;
giWalkingTo = -1;
giWalkingTo2 = -1;
ecx0->field_6 = 1;
if ( last == 1 )
{
ecx0->animationType = 7;
ecx0->animationFrame = 0;
combatManager::DrawFrame(gpCombatManager, 1, 1, 0, 0, 75, 1, 1);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment