C4PropList *C4Def::GetActionByName(C4String *actname) { assert(actname); // If we get the null string or ActIdle by name, return NULL action if (!actname || actname == &Strings.P[P_Idle]) return NULL; // otherwise, query actmap C4Value ActMap; GetProperty(P_ActMap, &ActMap); if (!ActMap.getPropList()) return NULL; C4Value Action; ActMap.getPropList()->GetPropertyByS(actname, &Action); if (!Action.getPropList()) return NULL; return Action.getPropList(); }
C4ConsoleQtLocalizeStringDlg::C4ConsoleQtLocalizeStringDlg(class QMainWindow *parent_window, const C4Value &translations) : QDialog(parent_window, Qt::WindowSystemMenuHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint) , translations(translations) { ui.setupUi(this); // Add language editors int32_t lang_index = 0; C4LanguageInfo *lang_info; while (lang_info = ::Languages.GetInfo(lang_index++)) { AddEditor(lang_info->Code, lang_info->Name); } // Fill in values C4PropList *translations_proplist = translations.getPropList(); assert(translations_proplist); for (C4String *lang_str : translations_proplist->GetSortedLocalProperties(false)) { if (lang_str->GetData().getLength() == 2) { C4Value text_val; if (translations_proplist->GetPropertyByS(lang_str, &text_val)) { C4String *text = text_val.getStr(); if (text) { QLineEdit *editor = GetEditorByLanguage(lang_str->GetCStr()); if (!editor) { // Unknown language. Just add an editor without language name. editor = AddEditor(lang_str->GetCStr(), nullptr); } editor->setText(QString(text->GetCStr())); } } } } // Size adjustSize(); setMinimumSize(size()); // Focus on first empty editor if (edited_languages.size()) { edited_languages.front().value_editor->setFocus(); // fallback to first editor for (const auto & langs : edited_languages) { if (!langs.value_editor->text().length()) { langs.value_editor->setFocus(); break; } } } }
void C4PropList::SetPropertyByS(C4String * k, const C4Value & to) { assert(!constant); if (k == &Strings.P[P_Prototype]) { C4PropList * newpt = to.getPropList(); for(C4PropList * it = newpt; it; it = it->GetPrototype()) if(it == this) throw C4AulExecError("Trying to create cyclic prototype structure"); prototype.SetPropList(newpt); } else if (Properties.Has(k)) { Properties.Get(k).Value = to; } else { Properties.Add(C4Property(k, to)); } }
C4MapScriptAlgoModifier::C4MapScriptAlgoModifier(const C4PropList *props, int32_t min_ops, int32_t max_ops) { // Evaluate "Op" property of all algos that take another algo or layer as an operand // Op may be a proplist or an array of proplists C4Value vops; int32_t n; C4ValueArray temp_ops; props->GetProperty(P_Op, &vops); C4ValueArray *ops = vops.getArray(); if (!ops) { C4PropList *op = vops.getPropList(); if (op) { temp_ops.SetItem(0, vops); ops = &temp_ops; n = 1; } } else { n = ops->GetSize(); } if (!ops || n<min_ops || (max_ops && n>max_ops)) throw C4AulExecError(FormatString("C4MapScriptAlgo: Expected between %d and %d operands in property \"Op\".", (int)min_ops, (int)max_ops).getData()); operands.resize(n); try { // can easily crash this by building a recursive prop list // unfortunately, protecting against that is not trivial for (int32_t i=0; i<n; ++i) { C4MapScriptAlgo *new_algo = FnParAlgo(ops->GetItem(i).getPropList()); if (!new_algo) throw C4AulExecError(FormatString("C4MapScriptAlgo: Operand %d in property \"Op\" not valid.", (int)i).getData()); operands[i] = new_algo; } } catch (...) { Clear(); throw; } }
void C4GraphicsOverlay::UpdateFacet() { // special: Nothing to update for object and pSourceGfx may be NULL // If there will ever be something to init here, UpdateFacet() will also need to be called when objects have been loaded if (eMode == MODE_Object) return; // otherwise, source graphics must be specified if (!pSourceGfx) return; C4Def *pDef = pSourceGfx->pDef; assert(pDef); fZoomToShape = false; // Clear old mesh instance, if any delete pMeshInstance; pMeshInstance = NULL; // update by mode switch (eMode) { case MODE_None: break; case MODE_Base: // def base graphics if (pSourceGfx->Type == C4DefGraphics::TYPE_Bitmap) fctBlit.Set(pSourceGfx->GetBitmap(), 0, 0, pDef->Shape.Wdt, pDef->Shape.Hgt, pDef->Shape.x+pDef->Shape.Wdt/2, pDef->Shape.y+pDef->Shape.Hgt/2); else if (pSourceGfx->Type == C4DefGraphics::TYPE_Mesh) pMeshInstance = new StdMeshInstance(*pSourceGfx->Mesh, 1.0f); break; case MODE_Action: // graphics of specified action { // Clear old facet fctBlit.Default(); // Ensure there is actually an action set if (!Action[0]) return; C4Value v; pDef->GetProperty(P_ActMap, &v); C4PropList *actmap = v.getPropList(); if (!actmap) return; actmap->GetPropertyByS(::Strings.RegString(Action), &v); C4PropList *action = v.getPropList(); if (!action) return; if (pSourceGfx->Type == C4DefGraphics::TYPE_Bitmap) { fctBlit.Set(pSourceGfx->GetBitmap(), action->GetPropertyInt(P_X), action->GetPropertyInt(P_Y), action->GetPropertyInt(P_Wdt), action->GetPropertyInt(P_Hgt)); // FIXME: fctBlit.TargetX has to be set here } else if (pSourceGfx->Type == C4DefGraphics::TYPE_Mesh) { C4String* AnimationName = action->GetPropertyStr(P_Animation); if (!AnimationName) return; pMeshInstance = new StdMeshInstance(*pSourceGfx->Mesh, 1.0f); const StdMeshAnimation* Animation = pSourceGfx->Mesh->GetSkeleton().GetAnimationByName(AnimationName->GetData()); if (!Animation) return; pMeshInstance->PlayAnimation(*Animation, 0, NULL, new C4ValueProviderRef<int32_t>(iPhase, ftofix(Animation->Length / action->GetPropertyInt(P_Length))), new C4ValueProviderConst(itofix(1)), true); } break; } case MODE_ObjectPicture: // ingame picture of object // calculated at runtime break; case MODE_IngamePicture: case MODE_Picture: // def picture fZoomToShape = true; // drawn at runtime break; case MODE_ExtraGraphics: // like ColorByOwner-sfc // calculated at runtime break; case MODE_Rank: // drawn at runtime break; case MODE_Object: // TODO break; } }