mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-01-16 18:19:55 +00:00
Merge branch 'master' of https://github.com/OpenMW/openmw into return
Conflicts: apps/openmw/mwmechanics/aisequence.cpp apps/openmw/mwmechanics/aiwander.cpp
This commit is contained in:
commit
1fd7a07b5e
43 changed files with 354 additions and 137 deletions
|
@ -333,7 +333,7 @@ int load(Arguments& info)
|
|||
|
||||
// Is the user interested in this record type?
|
||||
bool interested = true;
|
||||
if (info.types.size() > 0)
|
||||
if (!info.types.empty())
|
||||
{
|
||||
std::vector<std::string>::iterator match;
|
||||
match = std::find(info.types.begin(), info.types.end(),
|
||||
|
|
|
@ -124,7 +124,7 @@ void printEffectList(ESM::EffectList effects)
|
|||
{
|
||||
int i = 0;
|
||||
std::vector<ESM::ENAMstruct>::iterator eit;
|
||||
for (eit = effects.mList.begin(); eit != effects.mList.end(); eit++)
|
||||
for (eit = effects.mList.begin(); eit != effects.mList.end(); ++eit)
|
||||
{
|
||||
std::cout << " Effect[" << i << "]: " << magicEffectLabel(eit->mEffectID)
|
||||
<< " (" << eit->mEffectID << ")" << std::endl;
|
||||
|
|
|
@ -214,13 +214,13 @@ QStringList Launcher::GraphicsPage::getAvailableOptions(const QString &key, Ogre
|
|||
uint row = 0;
|
||||
Ogre::ConfigOptionMap options = renderer->getConfigOptions();
|
||||
|
||||
for (Ogre::ConfigOptionMap::iterator i = options.begin (); i != options.end (); i++, row++)
|
||||
for (Ogre::ConfigOptionMap::iterator i = options.begin (); i != options.end (); ++i, ++row)
|
||||
{
|
||||
Ogre::StringVector::iterator opt_it;
|
||||
uint idx = 0;
|
||||
|
||||
for (opt_it = i->second.possibleValues.begin();
|
||||
opt_it != i->second.possibleValues.end(); opt_it++, idx++)
|
||||
opt_it != i->second.possibleValues.end(); ++opt_it, ++idx)
|
||||
{
|
||||
if (strcmp (key.toStdString().c_str(), i->first.c_str()) == 0) {
|
||||
result << ((key == "FSAA") ? QString("MSAA ") : QString("")) + QString::fromStdString((*opt_it).c_str()).simplified();
|
||||
|
|
|
@ -95,6 +95,7 @@ opencs_units (view/settings
|
|||
booleanview
|
||||
textview
|
||||
listview
|
||||
rangeview
|
||||
resizeablestackedwidget
|
||||
)
|
||||
|
||||
|
|
|
@ -12,15 +12,14 @@ CSMSettings::Setting::Setting(SettingType typ, const QString &settingName,
|
|||
{
|
||||
buildDefaultSetting();
|
||||
|
||||
int vType = static_cast <int> (typ);
|
||||
int settingType = static_cast <int> (typ);
|
||||
|
||||
if ((vType % 2) == 0)
|
||||
setProperty (Property_IsMultiValue,
|
||||
QVariant(true).toString());
|
||||
else
|
||||
vType--;
|
||||
//even-numbered setting types are multi-valued
|
||||
if ((settingType % 2) == 0)
|
||||
setProperty (Property_IsMultiValue, QVariant(true).toString());
|
||||
|
||||
setProperty (Property_ViewType, QVariant (vType / 2).toString());
|
||||
//view type is related to setting type by an order of magnitude
|
||||
setProperty (Property_ViewType, QVariant (settingType / 10).toString());
|
||||
setProperty (Property_Page, pageName);
|
||||
setProperty (Property_Name, settingName);
|
||||
setProperty (Property_DeclaredValues, values);
|
||||
|
@ -267,9 +266,9 @@ void CSMSettings::Setting::setProperty (SettingProperty prop,
|
|||
|
||||
QDataStream &operator <<(QDataStream &stream, const CSMSettings::Setting& setting)
|
||||
{
|
||||
stream << setting.properties();
|
||||
// stream << setting.properties();
|
||||
|
||||
stream << setting.proxies();
|
||||
// stream << setting.proxies();
|
||||
return stream;
|
||||
}
|
||||
|
||||
|
|
|
@ -47,14 +47,27 @@ namespace CSMSettings
|
|||
|
||||
enum SettingType
|
||||
{
|
||||
Type_MultiBool = 0,
|
||||
Type_SingleBool = 1,
|
||||
Type_MultiList = 2,
|
||||
Type_SingleList = 3,
|
||||
Type_MultiRange = 4,
|
||||
Type_SingleRange = 5,
|
||||
Type_MultiText = 6,
|
||||
Type_SingleText = 7
|
||||
/*
|
||||
* 0 - 9 - Boolean widgets
|
||||
* 10-19 - List widgets
|
||||
* 21-29 - Range widgets
|
||||
* 31-39 - Text widgets
|
||||
*
|
||||
* Each range corresponds to a View_Type enum by a factor of 10.
|
||||
*
|
||||
* Even-numbered values are single-value widgets
|
||||
* Odd-numbered values are multi-valued widgets
|
||||
*/
|
||||
|
||||
Type_CheckBox = 0,
|
||||
Type_RadioButton = 1,
|
||||
Type_ListView = 10,
|
||||
Type_ComboBox = 11,
|
||||
Type_SpinBox = 21,
|
||||
Type_Slider = 23,
|
||||
Type_Dial = 24,
|
||||
Type_TextArea = 30,
|
||||
Type_LineEdit = 31
|
||||
};
|
||||
|
||||
enum MergeMethod
|
||||
|
|
|
@ -47,8 +47,8 @@ void CSMSettings::UserSettings::buildSettingModelDefaults()
|
|||
{
|
||||
QString section = "Window Size";
|
||||
{
|
||||
Setting *width = createSetting (Type_SingleText, section, "Width");
|
||||
Setting *height = createSetting (Type_SingleText, section, "Height");
|
||||
Setting *width = createSetting (Type_LineEdit, section, "Width");
|
||||
Setting *height = createSetting (Type_LineEdit, section, "Height");
|
||||
|
||||
width->setWidgetWidth (5);
|
||||
height->setWidgetWidth (5);
|
||||
|
@ -65,7 +65,7 @@ void CSMSettings::UserSettings::buildSettingModelDefaults()
|
|||
/*
|
||||
*Create the proxy setting for predefined values
|
||||
*/
|
||||
Setting *preDefined = createSetting (Type_SingleList, section,
|
||||
Setting *preDefined = createSetting (Type_ComboBox, section,
|
||||
"Pre-Defined",
|
||||
QStringList()
|
||||
<< "640 x 480"
|
||||
|
@ -94,11 +94,11 @@ void CSMSettings::UserSettings::buildSettingModelDefaults()
|
|||
QStringList values = QStringList()
|
||||
<< defaultValue << "Icon Only" << "Text Only";
|
||||
|
||||
Setting *rsd = createSetting (Type_SingleBool,
|
||||
Setting *rsd = createSetting (Type_RadioButton,
|
||||
section, "Record Status Display",
|
||||
values);
|
||||
|
||||
Setting *ritd = createSetting (Type_SingleBool,
|
||||
Setting *ritd = createSetting (Type_RadioButton,
|
||||
section, "Referenceable ID Type Display",
|
||||
values);
|
||||
|
||||
|
@ -110,24 +110,24 @@ void CSMSettings::UserSettings::buildSettingModelDefaults()
|
|||
{
|
||||
//create three setting objects, specifying the basic widget type,
|
||||
//the setting view name, the page name, and the default value
|
||||
Setting *masterBoolean = createSetting (Type_SingleBool, section,
|
||||
Setting *masterBoolean = createSetting (Type_RadioButton, section,
|
||||
"Master Proxy",
|
||||
QStringList()
|
||||
<< "Profile One" << "Profile Two"
|
||||
<< "Profile Three" << "Profile Four"
|
||||
);
|
||||
|
||||
Setting *slaveBoolean = createSetting (Type_MultiBool, section,
|
||||
Setting *slaveBoolean = createSetting (Type_CheckBox, section,
|
||||
"Proxy Checkboxes",
|
||||
QStringList() << "One" << "Two"
|
||||
<< "Three" << "Four" << "Five"
|
||||
);
|
||||
|
||||
Setting *slaveSingleText = createSetting (Type_SingleText, section,
|
||||
Setting *slaveSingleText = createSetting (Type_LineEdit, section,
|
||||
"Proxy TextBox 1"
|
||||
);
|
||||
|
||||
Setting *slaveMultiText = createSetting (Type_SingleText, section,
|
||||
Setting *slaveMultiText = createSetting (Type_LineEdit, section,
|
||||
"ProxyTextBox 2"
|
||||
);
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
#ifndef CSVSETTINGS_BOOLEANVIEW_HPP
|
||||
#define CSVSETTINGS_BOOELANVIEW_HPP
|
||||
#define CSVSETTINGS_BOOLEANVIEW_HPP
|
||||
|
||||
#include <QWidget>
|
||||
#include <QAbstractButton>
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
#include "booleanview.hpp"
|
||||
#include "textview.hpp"
|
||||
#include "listview.hpp"
|
||||
#include "rangeview.hpp"
|
||||
|
||||
#include "../../model/settings/usersettings.hpp"
|
||||
#include "../../model/settings/connector.hpp"
|
||||
|
@ -85,4 +86,5 @@ void CSVSettings::Page::buildFactories()
|
|||
mViewFactories[ViewType_Boolean] = new BooleanViewFactory (this);
|
||||
mViewFactories[ViewType_Text] = new TextViewFactory (this);
|
||||
mViewFactories[ViewType_List] = new ListViewFactory (this);
|
||||
mViewFactories[ViewType_Range] = new RangeViewFactory (this);
|
||||
}
|
||||
|
|
94
apps/opencs/view/settings/rangeview.cpp
Normal file
94
apps/opencs/view/settings/rangeview.cpp
Normal file
|
@ -0,0 +1,94 @@
|
|||
#include <QHBoxLayout>
|
||||
#include <QVBoxLayout>
|
||||
|
||||
#include <QCheckBox>
|
||||
#include <QRadioButton>
|
||||
#include <QGroupBox>
|
||||
|
||||
#include <QAbstractButton>
|
||||
|
||||
#include "rangeview.hpp"
|
||||
#include "../../model/settings/setting.hpp"
|
||||
|
||||
|
||||
#include <QDebug>
|
||||
|
||||
CSVSettings::RangeView::RangeView (CSMSettings::Setting *setting,
|
||||
Page *parent)
|
||||
: View (setting, parent)
|
||||
{
|
||||
foreach (const QString &value, setting->declaredValues())
|
||||
{
|
||||
QAbstractButton *button = 0;
|
||||
|
||||
if (isMultiValue())
|
||||
button = new QCheckBox (value, this);
|
||||
else
|
||||
button = new QRadioButton (value, this);
|
||||
|
||||
connect (button, SIGNAL (clicked (bool)),
|
||||
this, SLOT (slotToggled (bool)));
|
||||
|
||||
button->setObjectName (value);
|
||||
|
||||
addWidget (button);
|
||||
|
||||
mButtons[value] = button;
|
||||
}
|
||||
}
|
||||
|
||||
void CSVSettings::RangeView::slotToggled (bool state)
|
||||
{
|
||||
//test only for true to avoid multiple selection updates with radiobuttons
|
||||
if (!isMultiValue() && !state)
|
||||
return;
|
||||
|
||||
QStringList values;
|
||||
|
||||
foreach (QString key, mButtons.keys())
|
||||
{
|
||||
if (mButtons.value(key)->isChecked())
|
||||
values.append (key);
|
||||
}
|
||||
setSelectedValues (values, false);
|
||||
|
||||
View::updateView();
|
||||
}
|
||||
|
||||
void CSVSettings::RangeView::updateView (bool signalUpdate) const
|
||||
{
|
||||
|
||||
QStringList values = selectedValues();
|
||||
|
||||
foreach (const QString &buttonName, mButtons.keys())
|
||||
{
|
||||
QAbstractButton *button = mButtons[buttonName];
|
||||
|
||||
//if the value is not found in the list, the widget is checked false
|
||||
bool buttonValue = values.contains(buttonName);
|
||||
|
||||
//skip if the butotn value will not change
|
||||
if (button->isChecked() == buttonValue)
|
||||
continue;
|
||||
|
||||
//disable autoexclusive if it's enabled and we're setting
|
||||
//the button value to false
|
||||
bool switchExclusive = (!buttonValue && button->autoExclusive());
|
||||
|
||||
if (switchExclusive)
|
||||
button->setAutoExclusive (false);
|
||||
|
||||
button->setChecked (buttonValue);
|
||||
|
||||
if (switchExclusive)
|
||||
button->setAutoExclusive(true);
|
||||
}
|
||||
View::updateView (signalUpdate);
|
||||
}
|
||||
|
||||
CSVSettings::RangeView *CSVSettings::RangeViewFactory::createView
|
||||
(CSMSettings::Setting *setting,
|
||||
Page *parent)
|
||||
{
|
||||
return new RangeView (setting, parent);
|
||||
}
|
44
apps/opencs/view/settings/rangeview.hpp
Normal file
44
apps/opencs/view/settings/rangeview.hpp
Normal file
|
@ -0,0 +1,44 @@
|
|||
#ifndef CSVSETTINGS_RANGEVIEW_HPP
|
||||
#define CSVSETTINGS_RANGEVIEW_HPP
|
||||
|
||||
#include <QWidget>
|
||||
#include <QAbstractButton>
|
||||
|
||||
#include "view.hpp"
|
||||
#include "../../model/settings/support.hpp"
|
||||
|
||||
class QStringListModel;
|
||||
|
||||
namespace CSVSettings
|
||||
{
|
||||
class RangeView : public View
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
QMap <QString, QAbstractButton *> mButtons;
|
||||
|
||||
public:
|
||||
explicit RangeView (CSMSettings::Setting *setting,
|
||||
Page *parent);
|
||||
|
||||
protected:
|
||||
void updateView (bool signalUpdate = true) const;
|
||||
|
||||
private slots:
|
||||
void slotToggled (bool state);
|
||||
};
|
||||
|
||||
class RangeViewFactory : public QObject, public IViewFactory
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit RangeViewFactory (QWidget *parent = 0)
|
||||
: QObject (parent)
|
||||
{}
|
||||
|
||||
RangeView *createView (CSMSettings::Setting *setting,
|
||||
Page *parent);
|
||||
};
|
||||
}
|
||||
#endif // CSVSETTINGS_RANGEVIEW_HPP
|
4
apps/opencs/view/world/datadisplaydelegate.cpp
Executable file → Normal file
4
apps/opencs/view/world/datadisplaydelegate.cpp
Executable file → Normal file
|
@ -25,7 +25,7 @@ CSVWorld::DataDisplayDelegate::DataDisplayDelegate(const ValueList &values,
|
|||
|
||||
void CSVWorld::DataDisplayDelegate::buildPixmaps ()
|
||||
{
|
||||
if (mPixmaps.size() > 0)
|
||||
if (!mPixmaps.empty())
|
||||
mPixmaps.clear();
|
||||
|
||||
IconList::iterator it = mIcons.begin();
|
||||
|
@ -33,7 +33,7 @@ void CSVWorld::DataDisplayDelegate::buildPixmaps ()
|
|||
while (it != mIcons.end())
|
||||
{
|
||||
mPixmaps.push_back (std::make_pair (it->first, it->second.pixmap (mIconSize) ) );
|
||||
it++;
|
||||
++it;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -298,7 +298,7 @@ void CSVWorld::Table::revertRecord()
|
|||
{
|
||||
std::vector<std::string> revertableIds = listRevertableSelectedIds();
|
||||
|
||||
if (revertableIds.size()>0)
|
||||
if (!revertableIds.empty())
|
||||
{
|
||||
if (revertableIds.size()>1)
|
||||
mDocument.getUndoStack().beginMacro (tr ("Revert multiple records"));
|
||||
|
@ -318,7 +318,7 @@ void CSVWorld::Table::deleteRecord()
|
|||
{
|
||||
std::vector<std::string> deletableIds = listDeletableSelectedIds();
|
||||
|
||||
if (deletableIds.size()>0)
|
||||
if (!deletableIds.empty())
|
||||
{
|
||||
if (deletableIds.size()>1)
|
||||
mDocument.getUndoStack().beginMacro (tr ("Delete multiple records"));
|
||||
|
|
|
@ -59,9 +59,6 @@ void OMW::Engine::executeLocalScripts()
|
|||
MWScript::InterpreterContext interpreterContext (
|
||||
&script.second.getRefData().getLocals(), script.second);
|
||||
MWBase::Environment::get().getScriptManager()->run (script.first, interpreterContext);
|
||||
|
||||
if (MWBase::Environment::get().getWorld()->hasCellChanged())
|
||||
break;
|
||||
}
|
||||
|
||||
localScripts.setIgnore (MWWorld::Ptr());
|
||||
|
@ -101,14 +98,9 @@ bool OMW::Engine::frameRenderingQueued (const Ogre::FrameEvent& evt)
|
|||
// global scripts
|
||||
MWBase::Environment::get().getScriptManager()->getGlobalScripts().run();
|
||||
|
||||
bool changed = MWBase::Environment::get().getWorld()->hasCellChanged();
|
||||
|
||||
// local scripts
|
||||
executeLocalScripts(); // This does not handle the case where a global script causes a
|
||||
// cell change, followed by a cell change in a local script during
|
||||
// the same frame.
|
||||
executeLocalScripts();
|
||||
|
||||
if (changed) // keep change flag for another frame, if cell changed happened in local script
|
||||
MWBase::Environment::get().getWorld()->markCellAsUnchanged();
|
||||
|
||||
if (!paused)
|
||||
|
|
|
@ -28,7 +28,7 @@ namespace MWGui
|
|||
{
|
||||
getWidget(mVersionText, "VersionText");
|
||||
std::stringstream sstream;
|
||||
sstream << "OpenMW version: " << OPENMW_VERSION;
|
||||
sstream << "OpenMW Version: " << OPENMW_VERSION;
|
||||
|
||||
// adding info about git hash if available
|
||||
std::string rev = OPENMW_VERSION_COMMITHASH;
|
||||
|
@ -36,7 +36,7 @@ namespace MWGui
|
|||
if (!rev.empty() && !tag.empty())
|
||||
{
|
||||
rev = rev.substr(0,10);
|
||||
sstream << "\nrevision: " << rev;
|
||||
sstream << "\nRevision: " << rev;
|
||||
}
|
||||
|
||||
std::string output = sstream.str();
|
||||
|
|
|
@ -245,7 +245,7 @@ namespace MWGui
|
|||
// were there any items traded at all?
|
||||
std::vector<ItemStack> playerBought = playerItemModel->getItemsBorrowedToUs();
|
||||
std::vector<ItemStack> merchantBought = mTradeModel->getItemsBorrowedToUs();
|
||||
if (!playerBought.size() && !merchantBought.size())
|
||||
if (playerBought.empty() && merchantBought.empty())
|
||||
{
|
||||
// user notification
|
||||
MWBase::Environment::get().getWindowManager()->
|
||||
|
|
|
@ -206,7 +206,7 @@ namespace MWMechanics
|
|||
if (effectIt->mKey.mId == effectId)
|
||||
effectIt = it->second.mEffects.erase(effectIt);
|
||||
else
|
||||
effectIt++;
|
||||
++effectIt;
|
||||
}
|
||||
}
|
||||
mSpellsChanged = true;
|
||||
|
@ -224,7 +224,7 @@ namespace MWMechanics
|
|||
&& it->second.mCasterHandle == actorHandle)
|
||||
effectIt = it->second.mEffects.erase(effectIt);
|
||||
else
|
||||
effectIt++;
|
||||
++effectIt;
|
||||
}
|
||||
}
|
||||
mSpellsChanged = true;
|
||||
|
|
|
@ -879,12 +879,23 @@ namespace MWMechanics
|
|||
iter->second->update(duration);
|
||||
}
|
||||
|
||||
// Kill dead actors
|
||||
// Kill dead actors, update some variables
|
||||
for(PtrControllerMap::iterator iter(mActors.begin());iter != mActors.end();iter++)
|
||||
{
|
||||
const MWWorld::Class &cls = MWWorld::Class::get(iter->first);
|
||||
CreatureStats &stats = cls.getCreatureStats(iter->first);
|
||||
|
||||
//KnockedOutOneFrameLogic
|
||||
//Used for "OnKnockedOut" command
|
||||
//Put here to ensure that it's run for PRECISELY one frame.
|
||||
if(stats.getKnockedDown() && !stats.getKnockedDownOneFrame() && !stats.getKnockedDownOverOneFrame()) { //Start it for one frame if nessesary
|
||||
stats.setKnockedDownOneFrame(true);
|
||||
}
|
||||
else if (stats.getKnockedDownOneFrame() && !stats.getKnockedDownOverOneFrame()) { //Turn off KnockedOutOneframe
|
||||
stats.setKnockedDownOneFrame(false);
|
||||
stats.setKnockedDownOverOneFrame(true);
|
||||
}
|
||||
|
||||
if(!stats.isDead())
|
||||
{
|
||||
if(iter->second->isDead())
|
||||
|
@ -1018,7 +1029,6 @@ namespace MWMechanics
|
|||
{
|
||||
const MWWorld::Class &cls = MWWorld::Class::get(iter->first);
|
||||
CreatureStats &stats = cls.getCreatureStats(iter->first);
|
||||
|
||||
if(!stats.isDead() && stats.getAiSequence().getTypeId() == AiPackage::TypeIdFollow)
|
||||
{
|
||||
MWMechanics::AiFollow* package = static_cast<MWMechanics::AiFollow*>(stats.getAiSequence().getActivePackage());
|
||||
|
@ -1040,7 +1050,6 @@ namespace MWMechanics
|
|||
{
|
||||
const MWWorld::Class &cls = MWWorld::Class::get(*iter);
|
||||
CreatureStats &stats = cls.getCreatureStats(*iter);
|
||||
|
||||
if(!stats.isDead() && stats.getAiSequence().getTypeId() == AiPackage::TypeIdCombat)
|
||||
{
|
||||
MWMechanics::AiCombat* package = static_cast<MWMechanics::AiCombat*>(stats.getAiSequence().getActivePackage());
|
||||
|
|
|
@ -128,7 +128,7 @@ void MWMechanics::AiSequence::stack (const AiPackage& package, const MWWorld::Pt
|
|||
}
|
||||
}
|
||||
|
||||
for(std::list<AiPackage *>::iterator it = mPackages.begin(); it != mPackages.end(); it++)
|
||||
for(std::list<AiPackage *>::iterator it = mPackages.begin(); it != mPackages.end(); ++it)
|
||||
{
|
||||
if(mPackages.front()->getPriority() <= package.getPriority())
|
||||
{
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
#include "aiwander.hpp"
|
||||
|
||||
#include <OgreVector3.h>
|
||||
#include <OgreSceneNode.h>
|
||||
|
||||
#include "../mwbase/world.hpp"
|
||||
#include "../mwbase/environment.hpp"
|
||||
|
@ -213,7 +214,7 @@ namespace MWMechanics
|
|||
// Reduce the turning animation glitch by using a *HUGE* value of
|
||||
// epsilon... TODO: a proper fix might be in either the physics or the
|
||||
// animation subsystem
|
||||
if (zTurn(actor, Ogre::Degree(mTargetAngle), Ogre::Degree(12)))
|
||||
if (zTurn(actor, Ogre::Degree(mTargetAngle), Ogre::Degree(5)))
|
||||
mRotate = false;
|
||||
}
|
||||
|
||||
|
@ -366,18 +367,7 @@ namespace MWMechanics
|
|||
if(mChooseAction)
|
||||
{
|
||||
mPlayedIdle = 0;
|
||||
unsigned short idleRoll = 0;
|
||||
|
||||
for(unsigned int counter = 0; counter < mIdle.size(); counter++)
|
||||
{
|
||||
unsigned short idleChance = mIdleChanceMultiplier * mIdle[counter];
|
||||
unsigned short randSelect = (int)(rand() / ((double)RAND_MAX + 1) * int(100 / mIdleChanceMultiplier));
|
||||
if(randSelect < idleChance && randSelect > idleRoll)
|
||||
{
|
||||
mPlayedIdle = counter+2;
|
||||
idleRoll = randSelect;
|
||||
}
|
||||
}
|
||||
getRandomIdle(); // NOTE: sets mPlayedIdle with a random selection
|
||||
|
||||
if(!mPlayedIdle && mDistance)
|
||||
{
|
||||
|
@ -428,6 +418,8 @@ namespace MWMechanics
|
|||
mMoveNow = false;
|
||||
mWalking = false;
|
||||
mObstacleCheck.clear();
|
||||
mIdleNow = true;
|
||||
getRandomIdle();
|
||||
}
|
||||
|
||||
if(!mRotate)
|
||||
|
@ -435,11 +427,11 @@ namespace MWMechanics
|
|||
Ogre::Vector3 dir = playerPos - actorPos;
|
||||
float length = dir.length();
|
||||
|
||||
// FIXME: horrible hack
|
||||
float faceAngle = Ogre::Radian(Ogre::Math::ACos(dir.y / length) *
|
||||
((Ogre::Math::ASin(dir.x / length).valueRadians()>0)?1.0:-1.0)).valueDegrees();
|
||||
float actorAngle = actor.getRefData().getBaseNode()->getOrientation().getRoll().valueDegrees();
|
||||
// an attempt at reducing the turning animation glitch
|
||||
if(abs(faceAngle) > 10)
|
||||
if(abs(abs(faceAngle) - abs(actorAngle)) >= 5) // TODO: is there a better way?
|
||||
{
|
||||
mTargetAngle = faceAngle;
|
||||
mRotate = true;
|
||||
|
@ -465,7 +457,8 @@ namespace MWMechanics
|
|||
}
|
||||
|
||||
// Check if idle animation finished
|
||||
if(!checkIdle(actor, mPlayedIdle))
|
||||
// FIXME: don't stay forever
|
||||
if(!checkIdle(actor, mPlayedIdle) && playerDistSqr > helloDistance*helloDistance)
|
||||
{
|
||||
mPlayedIdle = 0;
|
||||
mIdleNow = false;
|
||||
|
@ -624,5 +617,21 @@ namespace MWMechanics
|
|||
{
|
||||
mHasReturnPosition = true; mReturnPosition = position;
|
||||
}
|
||||
|
||||
void AiWander::getRandomIdle()
|
||||
{
|
||||
unsigned short idleRoll = 0;
|
||||
|
||||
for(unsigned int counter = 0; counter < mIdle.size(); counter++)
|
||||
{
|
||||
unsigned short idleChance = mIdleChanceMultiplier * mIdle[counter];
|
||||
unsigned short randSelect = (int)(rand() / ((double)RAND_MAX + 1) * int(100 / mIdleChanceMultiplier));
|
||||
if(randSelect < idleChance && randSelect > idleRoll)
|
||||
{
|
||||
mPlayedIdle = counter+2;
|
||||
idleRoll = randSelect;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -33,6 +33,7 @@ namespace MWMechanics
|
|||
void stopWalking(const MWWorld::Ptr& actor);
|
||||
void playIdle(const MWWorld::Ptr& actor, unsigned short idleSelect);
|
||||
bool checkIdle(const MWWorld::Ptr& actor, unsigned short idleSelect);
|
||||
void getRandomIdle();
|
||||
|
||||
int mDistance; // how far the actor can wander from the spawn point
|
||||
int mDuration;
|
||||
|
|
|
@ -17,7 +17,7 @@ namespace MWMechanics
|
|||
mAttacked (false), mHostile (false),
|
||||
mAttackingOrSpell(false),
|
||||
mIsWerewolf(false),
|
||||
mFallHeight(0), mRecalcDynamicStats(false), mKnockdown(false), mHitRecovery(false), mBlock(false),
|
||||
mFallHeight(0), mRecalcDynamicStats(false), mKnockdown(false), mKnockdownOneFrame(false), mKnockdownOverOneFrame(false), mHitRecovery(false), mBlock(false),
|
||||
mMovementFlags(0), mDrawState (DrawState_Nothing), mAttackStrength(0.f)
|
||||
{
|
||||
for (int i=0; i<4; ++i)
|
||||
|
@ -387,6 +387,8 @@ namespace MWMechanics
|
|||
void CreatureStats::setKnockedDown(bool value)
|
||||
{
|
||||
mKnockdown = value;
|
||||
if(!value) //Resets the "OverOneFrame" flag
|
||||
setKnockedDownOverOneFrame(false);
|
||||
}
|
||||
|
||||
bool CreatureStats::getKnockedDown() const
|
||||
|
@ -394,6 +396,23 @@ namespace MWMechanics
|
|||
return mKnockdown;
|
||||
}
|
||||
|
||||
void CreatureStats::setKnockedDownOneFrame(bool value)
|
||||
{
|
||||
mKnockdownOneFrame = value;
|
||||
}
|
||||
|
||||
bool CreatureStats::getKnockedDownOneFrame() const
|
||||
{
|
||||
return mKnockdownOneFrame;
|
||||
}
|
||||
|
||||
void CreatureStats::setKnockedDownOverOneFrame(bool value) {
|
||||
mKnockdownOverOneFrame = value;
|
||||
}
|
||||
bool CreatureStats::getKnockedDownOverOneFrame() const {
|
||||
return mKnockdownOverOneFrame;
|
||||
}
|
||||
|
||||
void CreatureStats::setHitRecovery(bool value)
|
||||
{
|
||||
mHitRecovery = value;
|
||||
|
|
|
@ -41,6 +41,8 @@ namespace MWMechanics
|
|||
bool mHostile;
|
||||
bool mAttackingOrSpell;
|
||||
bool mKnockdown;
|
||||
bool mKnockdownOneFrame;
|
||||
bool mKnockdownOverOneFrame;
|
||||
bool mHitRecovery;
|
||||
bool mBlock;
|
||||
unsigned int mMovementFlags;
|
||||
|
@ -188,7 +190,14 @@ namespace MWMechanics
|
|||
float getEvasion() const;
|
||||
|
||||
void setKnockedDown(bool value);
|
||||
///Returns true for the entire duration of the actor being knocked down
|
||||
bool getKnockedDown() const;
|
||||
void setKnockedDownOneFrame(bool value);
|
||||
///Returns true only for the first frame of the actor being knocked out; used for "onKnockedOut" command
|
||||
bool getKnockedDownOneFrame() const;
|
||||
void setKnockedDownOverOneFrame(bool value);
|
||||
///Returns true for all but the first frame of being knocked out; used to know to not reset mKnockedDownOneFrame
|
||||
bool getKnockedDownOverOneFrame() const;
|
||||
void setHitRecovery(bool value);
|
||||
bool getHitRecovery() const;
|
||||
void setBlock(bool value);
|
||||
|
|
|
@ -860,7 +860,8 @@ namespace MWMechanics
|
|||
// Find an actor who witnessed the crime
|
||||
for (std::vector<MWWorld::Ptr>::iterator it = neighbors.begin(); it != neighbors.end(); ++it)
|
||||
{
|
||||
if (*it == ptr) continue; // not the player
|
||||
if ( *it == ptr
|
||||
|| !it->getClass().isNpc()) continue; // not the player and is an NPC
|
||||
|
||||
// Was the crime seen?
|
||||
if ( ( MWBase::Environment::get().getWorld()->getLOS(ptr, *it) && awarenessCheck(ptr, *it) ) ||
|
||||
|
@ -876,7 +877,8 @@ namespace MWMechanics
|
|||
// Tell everyone, including yourself
|
||||
for (std::vector<MWWorld::Ptr>::iterator it1 = neighbors.begin(); it1 != neighbors.end(); ++it1)
|
||||
{
|
||||
if (*it1 == ptr) continue; // not the player
|
||||
if ( *it == ptr
|
||||
|| !it->getClass().isNpc()) continue; // not the player and is an NPC
|
||||
|
||||
// TODO: Add more messages
|
||||
if (type == OT_Theft)
|
||||
|
|
|
@ -296,7 +296,7 @@ namespace MWMechanics
|
|||
// add this edge to openset, lowest cost goes to the front
|
||||
// TODO: if this causes performance problems a hash table may help
|
||||
std::list<int>::iterator it = openset.begin();
|
||||
for(it = openset.begin(); it!= openset.end(); it++)
|
||||
for(it = openset.begin(); it!= openset.end(); ++it)
|
||||
{
|
||||
if(fScore[*it] > fScore[dest])
|
||||
break;
|
||||
|
|
|
@ -401,10 +401,10 @@ namespace MWMechanics
|
|||
if (!exploded)
|
||||
MWBase::Environment::get().getWorld()->explodeSpell(mHitPosition, mTarget, effects, caster, mId, mSourceName);
|
||||
|
||||
if (reflectedEffects.mList.size())
|
||||
if (!reflectedEffects.mList.empty())
|
||||
inflict(caster, target, reflectedEffects, range, true);
|
||||
|
||||
if (appliedLastingEffects.size())
|
||||
if (!appliedLastingEffects.empty())
|
||||
target.getClass().getCreatureStats(target).getActiveSpells().addSpell(mId, mStack, appliedLastingEffects,
|
||||
mSourceName, caster.getRefData().getHandle());
|
||||
|
||||
|
|
|
@ -129,7 +129,7 @@ namespace MWMechanics
|
|||
if (spell->mData.mType == ESM::Spell::ST_Disease)
|
||||
mSpells.erase(iter++);
|
||||
else
|
||||
iter++;
|
||||
++iter;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -143,7 +143,7 @@ namespace MWMechanics
|
|||
if (spell->mData.mType == ESM::Spell::ST_Blight)
|
||||
mSpells.erase(iter++);
|
||||
else
|
||||
iter++;
|
||||
++iter;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -157,7 +157,7 @@ namespace MWMechanics
|
|||
if (Misc::StringUtils::ciEqual(spell->mId, "corprus"))
|
||||
mSpells.erase(iter++);
|
||||
else
|
||||
iter++;
|
||||
++iter;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -171,7 +171,7 @@ namespace MWMechanics
|
|||
if (spell->mData.mType == ESM::Spell::ST_Curse)
|
||||
mSpells.erase(iter++);
|
||||
else
|
||||
iter++;
|
||||
++iter;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -411,7 +411,7 @@ Ogre::Node *Animation::getNode(const std::string &name)
|
|||
NifOgre::TextKeyMap::const_iterator Animation::findGroupStart(const NifOgre::TextKeyMap &keys, const std::string &groupname)
|
||||
{
|
||||
NifOgre::TextKeyMap::const_iterator iter(keys.begin());
|
||||
for(;iter != keys.end();iter++)
|
||||
for(;iter != keys.end();++iter)
|
||||
{
|
||||
if(iter->second.compare(0, groupname.size(), groupname) == 0 &&
|
||||
iter->second.compare(groupname.size(), 2, ": ") == 0)
|
||||
|
@ -424,7 +424,7 @@ NifOgre::TextKeyMap::const_iterator Animation::findGroupStart(const NifOgre::Tex
|
|||
bool Animation::hasAnimation(const std::string &anim)
|
||||
{
|
||||
AnimSourceList::const_iterator iter(mAnimSources.begin());
|
||||
for(;iter != mAnimSources.end();iter++)
|
||||
for(;iter != mAnimSources.end();++iter)
|
||||
{
|
||||
const NifOgre::TextKeyMap &keys = (*iter)->mTextKeys;
|
||||
if(findGroupStart(keys, anim) != keys.end())
|
||||
|
@ -465,7 +465,7 @@ float Animation::calcAnimVelocity(const NifOgre::TextKeyMap &keys, NifOgre::Node
|
|||
stoptime = keyiter->first;
|
||||
break;
|
||||
}
|
||||
keyiter++;
|
||||
++keyiter;
|
||||
}
|
||||
|
||||
if(stoptime > starttime)
|
||||
|
@ -585,13 +585,13 @@ bool Animation::reset(AnimState &state, const NifOgre::TextKeyMap &keys, const s
|
|||
std::string starttag = groupname+": "+start;
|
||||
NifOgre::TextKeyMap::const_iterator startkey(groupstart);
|
||||
while(startkey != keys.end() && startkey->second != starttag)
|
||||
startkey++;
|
||||
++startkey;
|
||||
if(startkey == keys.end() && start == "loop start")
|
||||
{
|
||||
starttag = groupname+": start";
|
||||
startkey = groupstart;
|
||||
while(startkey != keys.end() && startkey->second != starttag)
|
||||
startkey++;
|
||||
++startkey;
|
||||
}
|
||||
if(startkey == keys.end())
|
||||
return false;
|
||||
|
@ -603,7 +603,7 @@ bool Animation::reset(AnimState &state, const NifOgre::TextKeyMap &keys, const s
|
|||
// The Scrib's idle3 animation has "Idle3: Stop." instead of "Idle3: Stop".
|
||||
// Why, just why? :(
|
||||
&& (stopkey->second.size() < stoptag.size() || stopkey->second.substr(0,stoptag.size()) != stoptag))
|
||||
stopkey++;
|
||||
++stopkey;
|
||||
if(stopkey == keys.end())
|
||||
return false;
|
||||
|
||||
|
@ -627,7 +627,7 @@ bool Animation::reset(AnimState &state, const NifOgre::TextKeyMap &keys, const s
|
|||
state.mLoopStartTime = key->first;
|
||||
else if(key->second == loopstoptag)
|
||||
state.mLoopStopTime = key->first;
|
||||
key++;
|
||||
++key;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -776,7 +776,7 @@ void Animation::play(const std::string &groupname, int priority, int groups, boo
|
|||
|
||||
/* Look in reverse; last-inserted source has priority. */
|
||||
AnimSourceList::reverse_iterator iter(mAnimSources.rbegin());
|
||||
for(;iter != mAnimSources.rend();iter++)
|
||||
for(;iter != mAnimSources.rend();++iter)
|
||||
{
|
||||
const NifOgre::TextKeyMap &textkeys = (*iter)->mTextKeys;
|
||||
AnimState state;
|
||||
|
@ -795,7 +795,7 @@ void Animation::play(const std::string &groupname, int priority, int groups, boo
|
|||
while(textkey != textkeys.end() && textkey->first <= state.mTime)
|
||||
{
|
||||
handleTextKey(state, groupname, textkey);
|
||||
textkey++;
|
||||
++textkey;
|
||||
}
|
||||
|
||||
if(state.mTime >= state.mLoopStopTime && state.mLoopCount > 0)
|
||||
|
@ -810,7 +810,7 @@ void Animation::play(const std::string &groupname, int priority, int groups, boo
|
|||
while(textkey != textkeys.end() && textkey->first <= state.mTime)
|
||||
{
|
||||
handleTextKey(state, groupname, textkey);
|
||||
textkey++;
|
||||
++textkey;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -965,7 +965,7 @@ Ogre::Vector3 Animation::runAnimation(float duration)
|
|||
while(textkey != textkeys.end() && textkey->first <= state.mTime)
|
||||
{
|
||||
handleTextKey(state, stateiter->first, textkey);
|
||||
textkey++;
|
||||
++textkey;
|
||||
}
|
||||
|
||||
if(state.mTime >= state.mLoopStopTime && state.mLoopCount > 0)
|
||||
|
@ -979,7 +979,7 @@ Ogre::Vector3 Animation::runAnimation(float duration)
|
|||
while(textkey != textkeys.end() && textkey->first <= state.mTime)
|
||||
{
|
||||
handleTextKey(state, stateiter->first, textkey);
|
||||
textkey++;
|
||||
++textkey;
|
||||
}
|
||||
|
||||
if(state.mTime >= state.mLoopStopTime)
|
||||
|
|
|
@ -106,7 +106,7 @@ ManualObject *Debugging::createPathgridPoints(const ESM::Pathgrid *pathgrid)
|
|||
uint32 startIndex = 0;
|
||||
for(ESM::Pathgrid::PointList::const_iterator it = pathgrid->mPoints.begin();
|
||||
it != pathgrid->mPoints.end();
|
||||
it++, startIndex += 6)
|
||||
++it, startIndex += 6)
|
||||
{
|
||||
Vector3 pointPos(it->mX, it->mY, it->mZ);
|
||||
|
||||
|
|
|
@ -240,25 +240,25 @@ Ogre::AxisAlignedBox Objects::getDimensions(MWWorld::CellStore* cell)
|
|||
void Objects::enableLights()
|
||||
{
|
||||
PtrAnimationMap::const_iterator it = mObjects.begin();
|
||||
for(;it != mObjects.end();it++)
|
||||
for(;it != mObjects.end();++it)
|
||||
it->second->enableLights(true);
|
||||
}
|
||||
|
||||
void Objects::disableLights()
|
||||
{
|
||||
PtrAnimationMap::const_iterator it = mObjects.begin();
|
||||
for(;it != mObjects.end();it++)
|
||||
for(;it != mObjects.end();++it)
|
||||
it->second->enableLights(false);
|
||||
}
|
||||
|
||||
void Objects::update(float dt, Ogre::Camera* camera)
|
||||
{
|
||||
PtrAnimationMap::const_iterator it = mObjects.begin();
|
||||
for(;it != mObjects.end();it++)
|
||||
for(;it != mObjects.end();++it)
|
||||
it->second->runAnimation(dt);
|
||||
|
||||
it = mObjects.begin();
|
||||
for(;it != mObjects.end();it++)
|
||||
for(;it != mObjects.end();++it)
|
||||
it->second->preRender(camera);
|
||||
|
||||
}
|
||||
|
|
|
@ -388,5 +388,7 @@ op 0x200023c: StopCombat
|
|||
op 0x200023d: StopCombatExplicit
|
||||
op 0x200023e: GetPcInJail
|
||||
op 0x200023f: GetPcTraveling
|
||||
op 0x2000240: onKnockout
|
||||
op 0x2000241: onKnockoutExplicit
|
||||
|
||||
opcodes 0x2000240-0x3ffffff unused
|
||||
opcodes 0x2000242-0x3ffffff unused
|
||||
|
|
|
@ -1060,6 +1060,22 @@ namespace MWScript
|
|||
}
|
||||
};
|
||||
|
||||
template <class R>
|
||||
class OpOnKnockout : public Interpreter::Opcode0
|
||||
{
|
||||
public:
|
||||
|
||||
virtual void execute (Interpreter::Runtime& runtime)
|
||||
{
|
||||
MWWorld::Ptr ptr = R()(runtime);
|
||||
|
||||
Interpreter::Type_Integer value =
|
||||
MWWorld::Class::get (ptr).getCreatureStats (ptr).getKnockedDownOneFrame();
|
||||
|
||||
runtime.push (value);
|
||||
}
|
||||
};
|
||||
|
||||
template <class R>
|
||||
class OpIsWerewolf : public Interpreter::Opcode0
|
||||
{
|
||||
|
@ -1236,6 +1252,8 @@ namespace MWScript
|
|||
|
||||
interpreter.installSegment5 (Compiler::Stats::opcodeOnDeath, new OpOnDeath<ImplicitRef>);
|
||||
interpreter.installSegment5 (Compiler::Stats::opcodeOnDeathExplicit, new OpOnDeath<ExplicitRef>);
|
||||
interpreter.installSegment5 (Compiler::Stats::opcodeOnKnockout, new OpOnKnockout<ImplicitRef>);
|
||||
interpreter.installSegment5 (Compiler::Stats::opcodeOnKnockoutExplicit, new OpOnKnockout<ExplicitRef>);
|
||||
|
||||
interpreter.installSegment5 (Compiler::Stats::opcodeIsWerewolf, new OpIsWerewolf<ImplicitRef>);
|
||||
interpreter.installSegment5 (Compiler::Stats::opcodeIsWerewolfExplicit, new OpIsWerewolf<ExplicitRef>);
|
||||
|
|
|
@ -442,7 +442,7 @@ namespace MWSound
|
|||
{
|
||||
snditer->first->setFadeout(duration);
|
||||
}
|
||||
snditer++;
|
||||
++snditer;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -20,7 +20,7 @@ namespace MWWorld
|
|||
|
||||
//find any NPC that is following the actor and teleport him too
|
||||
std::list<MWWorld::Ptr> followers = MWBase::Environment::get().getMechanicsManager()->getActorsFollowing(actor);
|
||||
for(std::list<MWWorld::Ptr>::iterator it = followers.begin();it != followers.end();it++)
|
||||
for(std::list<MWWorld::Ptr>::iterator it = followers.begin();it != followers.end();++it)
|
||||
{
|
||||
std::cout << "teleporting someone!" << (*it).getCellRef().mRefID;
|
||||
executeImp(*it);
|
||||
|
|
|
@ -433,7 +433,6 @@ namespace MWWorld
|
|||
while(mCell->getNextRef(esm[index], ref, deleted))
|
||||
{
|
||||
// Don't load reference if it was moved to a different cell.
|
||||
std::string lowerCase = Misc::StringUtils::lowerCase(ref.mRefID);
|
||||
ESM::MovedCellRefTracker::const_iterator iter =
|
||||
std::find(mCell->mMovedRefs.begin(), mCell->mMovedRefs.end(), ref.mRefNum);
|
||||
if (iter != mCell->mMovedRefs.end()) {
|
||||
|
|
|
@ -671,7 +671,7 @@ namespace MWWorld
|
|||
void PhysicsSystem::queueObjectMovement(const Ptr &ptr, const Ogre::Vector3 &movement)
|
||||
{
|
||||
PtrVelocityList::iterator iter = mMovementQueue.begin();
|
||||
for(;iter != mMovementQueue.end();iter++)
|
||||
for(;iter != mMovementQueue.end();++iter)
|
||||
{
|
||||
if(iter->first == ptr)
|
||||
{
|
||||
|
@ -692,7 +692,7 @@ namespace MWWorld
|
|||
{
|
||||
const MWBase::World *world = MWBase::Environment::get().getWorld();
|
||||
PtrVelocityList::iterator iter = mMovementQueue.begin();
|
||||
for(;iter != mMovementQueue.end();iter++)
|
||||
for(;iter != mMovementQueue.end();++iter)
|
||||
{
|
||||
float waterlevel = -std::numeric_limits<float>::max();
|
||||
const ESM::Cell *cell = iter->first.getCell()->getCell();
|
||||
|
|
|
@ -151,7 +151,7 @@ namespace MWWorld
|
|||
break;
|
||||
}
|
||||
}
|
||||
if (neighbors.size() == 0)
|
||||
if (neighbors.empty())
|
||||
MWBase::Environment::get().getWindowManager()->setSneakVisibility(true);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -95,7 +95,7 @@ namespace MWWorld
|
|||
bool wasTeleported() const;
|
||||
void setTeleported(bool teleported);
|
||||
|
||||
///Checks all actors to see if anyone has an aipackage against you
|
||||
///Checks all nearby actors to see if anyone has an aipackage against you
|
||||
bool isInCombat();
|
||||
|
||||
void clear();
|
||||
|
|
|
@ -444,6 +444,7 @@ namespace Compiler
|
|||
extensions.registerInstruction ("lowerrank", "", opcodeLowerRank, opcodeLowerRankExplicit);
|
||||
|
||||
extensions.registerFunction ("ondeath", 'l', "", opcodeOnDeath, opcodeOnDeathExplicit);
|
||||
extensions.registerFunction ("onknockout", 'l', "", opcodeOnKnockout, opcodeOnKnockoutExplicit);
|
||||
|
||||
extensions.registerFunction ("iswerewolf", 'l', "", opcodeIsWerewolf, opcodeIsWerewolfExplicit);
|
||||
|
||||
|
|
|
@ -377,6 +377,8 @@ namespace Compiler
|
|||
const int opcodeLowerRankExplicit = 0x20001eb;
|
||||
const int opcodeOnDeath = 0x20001fc;
|
||||
const int opcodeOnDeathExplicit = 0x2000205;
|
||||
const int opcodeOnKnockout = 0x2000240;
|
||||
const int opcodeOnKnockoutExplicit = 0x2000241;
|
||||
|
||||
const int opcodeBecomeWerewolf = 0x2000217;
|
||||
const int opcodeBecomeWerewolfExplicit = 0x2000218;
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
<Widget type="Window" skin="MW_Dialog" layer="Windows" position="0 0 300 130" name="_Main">
|
||||
<Property key="Visible" value="false"/>
|
||||
|
||||
<Widget type="EditBox" skin="MW_TextEditClient" position="8 8 284 400" name="Message" align="Left Top Stretch">
|
||||
<Widget type="EditBox" skin="MW_TextEditClient" position="16 8 268 130" name="Message" align="Center Top">
|
||||
<Property key="FontName" value="Default"/>
|
||||
<Property key="TextAlign" value="Top HCenter"/>
|
||||
<Property key="TextColour" value="0.75 0.6 0.35"/>
|
||||
|
@ -13,18 +13,19 @@
|
|||
<Property key="MultiLine" value="true"/>
|
||||
</Widget>
|
||||
|
||||
<Widget type="HBox" position="0 89 284 24" align="Right Bottom">
|
||||
<Widget type="Widget">
|
||||
<UserString key="HStretch" value="true"/>
|
||||
<Widget type="VBox" position="0 89 292 24" align="Right Bottom">
|
||||
<Widget type="HBox">
|
||||
<Property key="Spacing" value="8"/>
|
||||
|
||||
<Widget type="AutoSizedButton" skin="MW_Button" name="OkButton" align="Right Bottom">
|
||||
<Property key="Caption" value="#{sYes}"/>
|
||||
</Widget>
|
||||
<Widget type="AutoSizedButton" skin="MW_Button" name="CancelButton" align="Right Bottom">
|
||||
<Property key="Caption" value="#{sCancel}"/>
|
||||
</Widget>
|
||||
<Widget type="AutoSizedButton" skin="MW_Button" name="OkButton" align="Right Bottom">
|
||||
<Property key="Caption" value="#{sOk}"/>
|
||||
<Property key="Caption" value="#{sNo}"/>
|
||||
</Widget>
|
||||
</Widget>
|
||||
|
||||
<Widget type="Widget"/>
|
||||
</Widget>
|
||||
</Widget>
|
||||
</MyGUI>
|
||||
|
||||
|
|
|
@ -3,8 +3,8 @@
|
|||
<MyGUI type="Layout">
|
||||
<!-- The entire screen -->
|
||||
<Widget type="Widget" layer="Windows" position="0 0 300 300" name="_Main">
|
||||
<Widget type="TextBox" skin="SandText" position="0 250 300 50" align="Bottom" name="VersionText">
|
||||
<Property key="TextAlign" value="Center"/>
|
||||
<Widget type="TextBox" skin="SandText" position="0 250 280 50" align="Bottom Right" name="VersionText">
|
||||
<Property key="TextAlign" value="Right"/>
|
||||
<Property key="TextShadow" value="true"/>
|
||||
<Property key="TextShadowColour" value="0 0 0"/>
|
||||
</Widget>
|
||||
|
|
Loading…
Reference in a new issue