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 }