static void DrawObjectiveCounts(HUD *hud) { int x = 5 + GAUGE_WIDTH; int y = hud->device->cachedConfig.Res.y - 5 - FontH(); for (int i = 0; i < (int)gMission.missionData->Objectives.size; i++) { MissionObjective *mo = CArrayGet(&gMission.missionData->Objectives, i); const ObjectiveDef *o = CArrayGet(&gMission.Objectives, i); // Don't draw anything for optional objectives if (mo->Required == 0) { continue; } // Objective color dot Draw_Rect(x, y + 3, 2, 2, o->color); x += 5; char s[32]; int itemsLeft = mo->Required - o->done; if (itemsLeft > 0) { if (!(mo->Flags & OBJECTIVE_UNKNOWNCOUNT)) { sprintf(s, "%s: %d", ObjectiveTypeStr(mo->Type), itemsLeft); } else { sprintf(s, "%s: ?", ObjectiveTypeStr(mo->Type)); } } else { strcpy(s, "Done"); } FontStr(s, Vec2iNew(x, y)); DrawNumUpdate( CArrayGet(&hud->objectiveUpdates, i), "%d", o->done, Vec2iNew(x + FontStrW(s) - 8, y), 0); x += 40; } }
static const char *MissionGetObjectiveStr(UIObject *o, void *vData) { UNUSED(o); MissionIndexData *data = vData; if (!CampaignGetCurrentMission(data->co)) return NULL; if ((int)CampaignGetCurrentMission(data->co)->Objectives.size <= data->index) return NULL; return ObjectiveTypeStr(((const Objective *)CArrayGet( &CampaignGetCurrentMission(data->co)->Objectives, data->index))->Type); }
static void DrawObjectiveName( const TTileItem *ti, DrawBuffer *b, const Vec2i offset) { const int objective = ObjectiveFromTileItem(ti->flags); const Objective *o = CArrayGet(&gMission.missionData->Objectives, objective); const char *typeName = ObjectiveTypeStr(o->Type); const Vec2i textPos = Vec2iNew( ti->x - b->xTop + offset.x - FontStrW(typeName) / 2, ti->y - b->yTop + offset.y); FontStr(typeName, textPos); }
static void DrawObjectiveName( const Thing *ti, DrawBuffer *b, const struct vec2i offset) { const int objective = ObjectiveFromThing(ti->flags); const Objective *o = CArrayGet(&gMission.missionData->Objectives, objective); const char *typeName = ObjectiveTypeStr(o->Type); const struct vec2i textPos = svec2i( (int)ti->Pos.x - b->xTop + offset.x - FontStrW(typeName) / 2, (int)ti->Pos.y - b->yTop + offset.y); FontStr(typeName, textPos); }
static json_t *SaveObjectives(CArray *a) { json_t *objectivesNode = json_new_array(); int i; for (i = 0; i < (int)a->size; i++) { json_t *objNode = json_new_object(); MissionObjective *mo = CArrayGet(a, i); AddStringPair(objNode, "Description", mo->Description); AddStringPair(objNode, "Type", ObjectiveTypeStr(mo->Type)); AddIntPair(objNode, "Index", mo->Index); AddIntPair(objNode, "Count", mo->Count); AddIntPair(objNode, "Required", mo->Required); AddIntPair(objNode, "Flags", mo->Flags); json_insert_child(objectivesNode, objNode); } return objectivesNode; }
static void CreateAddObjectiveSubObjs(UIObject *c, void *vData) { EditorBrushAndCampaign *data = vData; Mission *m = CampaignGetCurrentMission(data->Campaign); // Check if the data is still the same; if so don't recreate the // child UI objects // This is because during the course of UI operations, this element // could be highlighted again; if we recreate then we invalidate // UI pointers. bool needToRecreate = false; int childIndex = 0; CA_FOREACH(const Objective, obj, m->Objectives) int secondaryCount = 1; const CharacterStore *store = &data->Campaign->Setting.characters; switch (obj->Type) { case OBJECTIVE_KILL: secondaryCount = (int)store->specialIds.size; break; case OBJECTIVE_COLLECT: break; case OBJECTIVE_DESTROY: break; case OBJECTIVE_RESCUE: secondaryCount = (int)store->prisonerIds.size; break; default: continue; } for (int j = 0; j < (int)secondaryCount; j++) { if ((int)c->Children.size <= childIndex) { needToRecreate = true; break; } UIObject *o2 = *(UIObject **)CArrayGet(&c->Children, childIndex); if (((EditorBrushAndCampaign *)o2->Data)->Brush.u.ItemIndex != _ca_index || ((EditorBrushAndCampaign *)o2->Data)->Brush.Index2 != j) { needToRecreate = true; break; } childIndex++; } if (needToRecreate) { break; } CA_FOREACH_END() if (!needToRecreate) { return; } // Recreate the child UI objects c->Highlighted = NULL; CA_FOREACH(UIObject *, obj, c->Children) UIObjectDestroy(*obj); CA_FOREACH_END() CArrayTerminate(&c->Children); CArrayInit(&c->Children, sizeof c); UIObject *o = UIObjectCreate( UITYPE_CUSTOM, 0, Vec2iZero(), Vec2iNew(TILE_WIDTH + 4, TILE_HEIGHT * 2 + 4)); o->ChangeFunc = BrushSetBrushTypeAddObjective; o->u.CustomDrawFunc = DrawObjective; o->OnFocusFunc = ActivateEditorBrushAndCampaignBrush; o->OnUnfocusFunc = DeactivateEditorBrushAndCampaignBrush; Vec2i pos = Vec2iZero(); CA_FOREACH(const Objective, obj, m->Objectives) int secondaryCount = 1; const CharacterStore *store = &data->Campaign->Setting.characters; switch (obj->Type) { case OBJECTIVE_KILL: secondaryCount = (int)store->specialIds.size; o->Size.y = TILE_HEIGHT * 2 + 4; break; case OBJECTIVE_COLLECT: o->Size.y = TILE_HEIGHT + 4; break; case OBJECTIVE_DESTROY: o->Size.y = TILE_HEIGHT * 2 + 4; break; case OBJECTIVE_RESCUE: secondaryCount = (int)store->prisonerIds.size; o->Size.y = TILE_HEIGHT * 2 + 4; break; default: continue; } for (int j = 0; j < (int)secondaryCount; j++) { UIObject *o2 = UIObjectCopy(o); CSTRDUP(o2->Tooltip, ObjectiveTypeStr(obj->Type)); o2->IsDynamicData = true; CMALLOC(o2->Data, sizeof(EditorBrushAndCampaign)); ((EditorBrushAndCampaign *)o2->Data)->Brush.Brush = data->Brush.Brush; ((EditorBrushAndCampaign *)o2->Data)->Campaign = data->Campaign; ((EditorBrushAndCampaign *)o2->Data)->Brush.u.ItemIndex = _ca_index; ((EditorBrushAndCampaign *)o2->Data)->Brush.Index2 = j; o2->Pos = pos; UIObjectAddChild(c, o2); pos.x += o->Size.x; } pos.x = 0; pos.y += o->Size.y; CA_FOREACH_END() UIObjectDestroy(o); }