1 /*
2 *  Open Fodder
3 *  ---------------
4 *
5 *  Copyright (C) 2008-2018 Open Fodder
6 *
7 *  This program is free software; you can redistribute it and/or modify
8 *  it under the terms of the GNU General Public License as published by
9 *  the Free Software Foundation; either version 3 of the License, or
10 *  (at your option) any later version.
11 *
12 *  This program is distributed in the hope that it will be useful,
13 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 *  GNU General Public License for more details.
16 *
17 *  You should have received a copy of the GNU General Public License along
18 *  with this program; if not, write to the Free Software Foundation, Inc.,
19 *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 */
22 
23 #include "stdafx.hpp"
24 
cGraphics_Amiga2()25 cGraphics_Amiga2::cGraphics_Amiga2() : cGraphics_Amiga() {
26 
27 }
28 
~cGraphics_Amiga2()29 cGraphics_Amiga2::~cGraphics_Amiga2() {
30 
31 }
32 
Map_Load_Resources()33 void cGraphics_Amiga2::Map_Load_Resources() {
34 
35     mSpriteSheet_InGame2 = GetImage(mFodder->mFilenameCopt, 0 );
36     mSpriteSheet_InGame1 = GetImage(mFodder->mFilenameArmy, 0 );
37 
38     mSpriteSheet_InGame2.mDimension.mHeight = 0x151;
39     mSpriteSheet_InGame1.mDimension.mHeight = 0x150;
40 
41     SetActiveSpriteSheet(eGFX_IN_GAME);
42 }
43 
Mission_Intro_Load_Resources(const eTileTypes pTileset)44 void cGraphics_Amiga2::Mission_Intro_Load_Resources(const eTileTypes pTileset) {
45 
46     // Briefing images
47     std::string JunData1 = mTileTypes[pTileset].mName + "PLAY";
48     std::string JunData2 = mTileTypes[pTileset].mName + "sky.pl8";
49     std::string JunData3 = mTileTypes[pTileset].mName + "mid.pl8";
50     std::string JunData4 = mTileTypes[pTileset].mName + "fgnd.pl8";
51     std::string JunData5 = mTileTypes[pTileset].mName + "fgn2.pl8";
52     std::string JunData6 = mTileTypes[pTileset].mName + "heli.pal";
53 
54     // Load the intro images
55     mImageMissionIntro = GetImage(JunData1, 0);
56     if (!mImageMissionIntro.mData->size())
57         return;
58 
59     mImageMissionIntro.mPlanes = 3;
60     mImageMissionIntro.mDimension.mHeight = 0x12C;
61 
62     // Load the palettes
63     auto Data = g_Resource->fileGet(JunData2);
64     mImageMissionIntro.LoadPalette_Amiga(Data->data(), 16, 0xA0);
65 
66     Data = g_Resource->fileGet(JunData3);
67     mImageMissionIntro.LoadPalette_Amiga(Data->data(), 16, 0xB0);
68 
69     Data = g_Resource->fileGet(JunData4);
70     mImageMissionIntro.LoadPalette_Amiga(Data->data(), 16, 0xC0);
71 
72     Data = g_Resource->fileGet(JunData5);
73     mImageMissionIntro.LoadPalette_Amiga(Data->data(), 16, 0xD0);
74 
75     Data = g_Resource->fileGet(JunData6);
76     mImageMissionIntro.LoadPalette_Amiga(Data->data(), 16, 0xE0);
77 }
78 
SetActiveSpriteSheet(eGFX_Types pSpriteType)79 void cGraphics_Amiga2::SetActiveSpriteSheet(eGFX_Types pSpriteType) {
80     switch (pSpriteType) {
81     case eGFX_IN_GAME:
82         mFodder->SetActiveSpriteSheetPtr(mSpriteSheetTypes_InGame_Amiga_CF2);
83         return;
84 
85     default:
86         cGraphics_Amiga::SetActiveSpriteSheet(pSpriteType);
87         return;
88     }
89 }
90 
GetPalette(const std::string pFilename)91 tSharedBuffer cGraphics_Amiga2::GetPalette(const std::string pFilename) {
92     tSharedBuffer PaletteFinal = std::make_shared<std::vector<uint8>>();
93     std::string Filename = pFilename;
94 
95     if (Filename.find('.') == std::string::npos)
96         Filename.append(".PAL");
97 
98     auto Palette = g_Resource->fileGet(Filename);
99 
100     auto a0 = Palette->data();
101     for (; a0 < Palette->data() + Palette->size(); ++a0) {
102 
103         uint16 d0 = *a0++;
104         uint16 d1 = *a0++;
105 
106         d0 &= 0xF0;
107         d0 <<= 4;
108 
109         d1 &= 0xF0;
110         d0 |= d1;
111 
112         d1 = *a0;
113         d1 &= 0xF0;
114         d1 >>= 4;
115         d0 |= d1;
116 
117         // push as little endian
118         PaletteFinal->push_back(d0 >> 8);
119         PaletteFinal->push_back(d0 & 0xFFFF);
120     }
121 
122     return PaletteFinal;
123 }
124 
GetImage(const std::string & pFilename,const size_t pPaletteIndex)125 sImage cGraphics_Amiga2::GetImage(const std::string& pFilename, const size_t pPaletteIndex) {
126     auto Palette = GetPalette(pFilename);
127 
128     sImage Decoded;
129 
130     // No, treat as a raw file
131     Decoded.mData = g_Resource->fileGet(pFilename + ".RAW");
132     if (!Decoded.mData->size())
133         return Decoded;
134 
135     // Calculate planes based on file size
136     if (Decoded.mData->size() == 51400)
137         Decoded.mPlanes = 5;
138     else {
139         Decoded.mPlanes = 4;
140     }
141 
142     Decoded.mDimension.mWidth = 0x140;
143     Decoded.mDimension.mHeight = 0x100;
144 
145     Decoded.LoadPalette_Amiga((uint8*)Palette->data(), Palette->size() / 2, pPaletteIndex);
146 
147     return Decoded;
148 }
149 
Decode_Image(const std::string & pFilename,const size_t pCount,const size_t pPaletteOffset,const size_t pStartIndex)150 sImage cGraphics_Amiga2::Decode_Image(const std::string& pFilename, const size_t pCount, const size_t pPaletteOffset, const size_t pStartIndex) {
151     sImage Image;
152 
153     Image = GetImage(pFilename, 0);
154     Image.CopyPalette(mPalette, pCount, pStartIndex);
155 
156     return Image;
157 }
Load_pStuff()158 void cGraphics_Amiga2::Load_pStuff() {
159 
160     mImagePStuff = GetImage("PSTUFF", 0x00);
161     mImagePStuff.CopyPalette(mImageFonts.mPalette, 16);
162 
163     mImageFonts = mImagePStuff;
164 }
165 
Load_Service_Data()166 void cGraphics_Amiga2::Load_Service_Data() {
167 
168     mImageService = Decode_Image("morphbig", 64, 0, 0);
169     mImageService.mDimension.mHeight = 0x150;
170     mImageService.mPlanes = 5;
171 
172     mSpriteSheet_RankFont = GetImage("rankfont", 0);
173 }
174 
Load_And_Draw_Image(const std::string & pFilename,unsigned int pColors,size_t pBackColor)175 void cGraphics_Amiga2::Load_And_Draw_Image(const std::string &pFilename, unsigned int pColors, size_t pBackColor) {
176     std::string	Filename = pFilename;
177 
178     // Try it as an IFF
179     sImage Decoded = GetImage(pFilename, 0);
180 
181     // All raws are 320x257
182     Decoded.mDimension.mWidth = 0x140;
183     Decoded.mDimension.mHeight = 0x101;
184 
185     // Load the palette
186     Decoded.CopyPalette(mPalette, (1LL << 5));
187 
188     mBMHD_Current = Decoded.GetHeader();
189 
190     mFodder->mVideo_Draw_FrameDataPtr = Decoded.mData->data();
191     mFodder->mVideo_Draw_PosX = 16;
192     mFodder->mVideo_Draw_PosY = 16;
193     mFodder->mVideo_Draw_Columns = Decoded.mDimension.mWidth >> 3;
194     mFodder->mVideo_Draw_Rows = Decoded.mDimension.mHeight;
195     mFodder->mVideo_Draw_PaletteIndex = 0x00;
196 
197     mSurface->clearBuffer(pBackColor);
198 
199     Video_Draw_16();
200     mBMHD_Current = 0;
201 }
202 
203 
Recruit_Draw_Hill()204 void cGraphics_Amiga2::Recruit_Draw_Hill() {
205     //auto Grave = GetPalette("grave32");
206     // mImagePStuff.LoadPalette_Amiga(Grave->data(), Grave->size() / 2);
207 
208     {
209         mFodder->mVideo_Draw_FrameDataPtr = mImageHillBackground.mData->data() + (29 * 40) + 6;
210 
211         mBMHD_Current = mImageHillBackground.GetHeader();
212         mFodder->mVideo_Draw_PaletteIndex = 0xD0;
213 
214         mFodder->mVideo_Draw_PosX = 0x40;
215         mFodder->mVideo_Draw_PosY = 0x28;
216         mFodder->mVideo_Draw_Columns = 0x110 >> 3;		// W
217         mFodder->mVideo_Draw_Rows = 0xB8;				// H
218         mFodder->mVideo_Draw_ColumnsMax = 0x140;
219 
220         Video_Draw_16();
221     }
222 
223     Recruit_Draw_HomeAway();
224 }