void SetupMission( int buildTables, Mission *m, struct MissionOptions *mo, int missionIndex) { int i; MissionOptionsInit(mo); mo->index = missionIndex; mo->missionData = m; mo->doorPics = doorStyles[abs(m->DoorStyle) % DOORSTYLE_COUNT]; mo->keyPics = keyStyles[abs(m->KeyStyle) % KEYSTYLE_COUNT]; for (i = 0; i < (int)m->Items.size; i++) { CArrayPushBack( &mo->MapObjects, MapObjectGet(*(int32_t *)CArrayGet(&m->Items, i))); } mo->exitPic = exitPics[2 * (abs(m->ExitStyle) % EXIT_COUNT)]; mo->exitShadow = exitPics[2 * (abs(m->ExitStyle) % EXIT_COUNT) + 1]; ActorsInit(); ObjsInit(); MobObjsInit(); SetupObjectives(mo, m); SetupBadguysForMission(m); SetupWeapons(gPlayerDatas, &m->Weapons); SetPaletteRanges(m->WallColor, m->FloorColor, m->RoomColor, m->AltColor); if (buildTables) { BuildTranslationTables(gPicManager.palette); } }
static void SetupObjectives(struct MissionOptions *mo, Mission *mission) { for (int i = 0; i < (int)mission->Objectives.size; i++) { MissionObjective *mobj = CArrayGet(&mission->Objectives, i); struct Objective o; memset(&o, 0, sizeof o); assert(i < OBJECTIVE_MAX_OLD); // Set objective colours based on type o.color = ObjectiveTypeColor(mobj->Type); o.blowupObject = MapObjectGet(mobj->Index); o.pickupItem = pickupItems[mobj->Index % PICKUPS_COUNT]; CArrayPushBack(&mo->Objectives, &o); } }
static void DrawObjectiveInfo( const struct MissionOptions *mo, const int idx, const Vec2i pos) { const MissionObjective *mobj = CArrayGet(&mo->missionData->Objectives, idx); const struct Objective *o = CArrayGet(&mo->Objectives, idx); const CharacterStore *store = &gCampaign.Setting.characters; switch (mobj->Type) { case OBJECTIVE_KILL: { const Character *cd = CArrayGet( &store->OtherChars, CharacterStoreGetSpecialId(store, 0)); const int i = cd->looks.face; TOffsetPic pic; pic.picIndex = cHeadPic[i][DIRECTION_DOWN][STATE_IDLE]; pic.dx = cHeadOffset[i][DIRECTION_DOWN].dx; pic.dy = cHeadOffset[i][DIRECTION_DOWN].dy; DrawTTPic( pos.x + pic.dx, pos.y + pic.dy, PicManagerGetOldPic(&gPicManager, pic.picIndex), &cd->table); } break; case OBJECTIVE_RESCUE: { const Character *cd = CArrayGet( &store->OtherChars, CharacterStoreGetPrisonerId(store, 0)); const int i = cd->looks.face; TOffsetPic pic; pic.picIndex = cHeadPic[i][DIRECTION_DOWN][STATE_IDLE]; pic.dx = cHeadOffset[i][DIRECTION_DOWN].dx; pic.dy = cHeadOffset[i][DIRECTION_DOWN].dy; DrawTTPic( pos.x + pic.dx, pos.y + pic.dy, PicManagerGetOldPic(&gPicManager, pic.picIndex), &cd->table); } break; case OBJECTIVE_COLLECT: { const Pic *p = PicManagerGetFromOld( &gPicManager, cGeneralPics[o->pickupItem].picIndex); Blit(&gGraphicsDevice, p, Vec2iAdd(pos, p->offset)); } break; case OBJECTIVE_DESTROY: { Vec2i picOffset; const Pic *p = MapObjectGetPic( MapObjectGet(mobj->Index), &gPicManager, &picOffset); Blit(&gGraphicsDevice, p, Vec2iAdd(pos, picOffset)); } break; case OBJECTIVE_INVESTIGATE: // Don't draw return; default: CASSERT(false, "Unknown objective type"); return; } }