* @brief Render object sprites * @param out Target buffer * @param tilePosition dPiece coordinates * @param targetBufferPosition Target buffer coordinates */
| 790 | * @param targetBufferPosition Target buffer coordinates |
| 791 | */ |
| 792 | void DrawDungeon(const Surface &out, Point tilePosition, Point targetBufferPosition) |
| 793 | { |
| 794 | assert(InDungeonBounds(tilePosition)); |
| 795 | |
| 796 | if (dRendered.test(tilePosition.x, tilePosition.y)) |
| 797 | return; |
| 798 | dRendered.set(tilePosition.x, tilePosition.y); |
| 799 | |
| 800 | LightTableIndex = dLight[tilePosition.x][tilePosition.y]; |
| 801 | |
| 802 | DrawCell(out, tilePosition, targetBufferPosition); |
| 803 | |
| 804 | int8_t bDead = dCorpse[tilePosition.x][tilePosition.y]; |
| 805 | int8_t bMap = dTransVal[tilePosition.x][tilePosition.y]; |
| 806 | |
| 807 | #ifdef _DEBUG |
| 808 | if (DebugVision && IsTileLit(tilePosition)) { |
| 809 | ClxDraw(out, targetBufferPosition, (*pSquareCel)[0]); |
| 810 | } |
| 811 | #endif |
| 812 | |
| 813 | if (MissilePreFlag) { |
| 814 | DrawMissile(out, tilePosition, targetBufferPosition, true, LightTableIndex); |
| 815 | } |
| 816 | |
| 817 | if (LightTableIndex < LightsMax && bDead != 0) { |
| 818 | Corpse &corpse = Corpses[(bDead & 0x1F) - 1]; |
| 819 | const Point position { targetBufferPosition.x - CalculateWidth2(corpse.width), targetBufferPosition.y }; |
| 820 | const ClxSprite sprite = corpse.spritesForDirection(static_cast<Direction>((bDead >> 5) & 7))[corpse.frame]; |
| 821 | if (corpse.translationPaletteIndex != 0) { |
| 822 | const uint8_t *trn = Monsters[corpse.translationPaletteIndex - 1].uniqueMonsterTRN.get(); |
| 823 | ClxDrawTRN(out, position, sprite, trn); |
| 824 | } else { |
| 825 | ClxDrawLight(out, position, sprite, LightTableIndex); |
| 826 | } |
| 827 | } |
| 828 | DrawObject(out, tilePosition, targetBufferPosition, true); |
| 829 | DrawItem(out, tilePosition, targetBufferPosition, true); |
| 830 | |
| 831 | if (TileContainsDeadPlayer(tilePosition)) { |
| 832 | DrawDeadPlayer(out, tilePosition, targetBufferPosition); |
| 833 | } |
| 834 | int8_t playerId = dPlayer[tilePosition.x][tilePosition.y]; |
| 835 | if (static_cast<size_t>(playerId - 1) < Players.size()) { |
| 836 | DrawPlayerHelper(out, Players[playerId - 1], tilePosition, targetBufferPosition); |
| 837 | } |
| 838 | if (dMonster[tilePosition.x][tilePosition.y] != 0) { |
| 839 | DrawMonsterHelper(out, tilePosition, targetBufferPosition); |
| 840 | } |
| 841 | DrawMissile(out, tilePosition, targetBufferPosition, false, LightTableIndex); |
| 842 | DrawObject(out, tilePosition, targetBufferPosition, false); |
| 843 | DrawItem(out, tilePosition, targetBufferPosition, false); |
| 844 | |
| 845 | if (leveltype != DTYPE_TOWN) { |
| 846 | char bArch = dSpecial[tilePosition.x][tilePosition.y]; |
| 847 | if (bArch != 0) { |
| 848 | bool transparency = TransList[bMap]; |
| 849 | #ifdef _DEBUG |
no test coverage detected