mirror of
https://github.com/isledecomp/isle-portable.git
synced 2026-01-10 18:21:14 +00:00
Merge remote-tracking branch 'isle/master'
This commit is contained in:
commit
69b5f17599
@ -230,14 +230,8 @@ class LegoGameState {
|
||||
Act GetCurrentAct() { return m_currentAct; }
|
||||
|
||||
Act GetLoadedAct() { return m_loadedAct; }
|
||||
Area GetPreviousArea() { return m_previousArea; }
|
||||
Area GetUnknown0x42c() { return m_unk0x42c; }
|
||||
|
||||
void SetDirty(MxBool p_isDirty) { m_isDirty = p_isDirty; }
|
||||
void SetPreviousArea(Area p_previousArea) { m_previousArea = p_previousArea; }
|
||||
void SetActorId(MxU8 p_actorId) { m_actorId = p_actorId; }
|
||||
Username* GetPlayersIndex(MxS32 p_index) { return &m_players[p_index]; }
|
||||
MxS16 GetPlayerCount() { return m_playerCount; }
|
||||
LegoBackgroundColor* GetBackgroundColor() { return m_backgroundColor; }
|
||||
|
||||
void SetCurrentAct(Act p_currentAct);
|
||||
@ -263,14 +257,11 @@ class LegoGameState {
|
||||
LegoBackgroundColor* m_tempBackgroundColor; // 0x1c
|
||||
LegoFullScreenMovie* m_fullScreenMovie; // 0x20
|
||||
|
||||
// TODO: Most likely getters/setters are not used according to BETA for the following members:
|
||||
|
||||
public:
|
||||
MxS16 m_currentPlayerId; // 0x24
|
||||
MxS16 m_playerCount; // 0x26
|
||||
Username m_players[9]; // 0x28
|
||||
History m_history; // 0xa6
|
||||
undefined2 m_unk0x41a; // 0x41a
|
||||
JukeboxScript::Script m_jukeboxMusic; // 0x41c
|
||||
MxBool m_isDirty; // 0x420
|
||||
Area m_currentArea; // 0x424
|
||||
|
||||
@ -1644,6 +1644,7 @@ void LegoGameState::SerializeScoreHistory(MxS16 p_flags)
|
||||
}
|
||||
|
||||
// FUNCTION: LEGO1 0x1003cea0
|
||||
// FUNCTION: BETA10 0x10017840
|
||||
void LegoGameState::SetCurrentAct(Act p_currentAct)
|
||||
{
|
||||
m_currentAct = p_currentAct;
|
||||
|
||||
@ -393,7 +393,7 @@ MxResult LegoWorldPresenter::LoadWorldModel(ModelDbModel& p_model, SDL_IOStream*
|
||||
}
|
||||
|
||||
modelPresenter.SetAction(&action);
|
||||
modelPresenter.FUN_1007ff70(chunk, createdEntity, p_model.m_unk0x34, p_world);
|
||||
modelPresenter.FUN_1007ff70(chunk, createdEntity, p_model.m_visible, p_world);
|
||||
delete[] buff;
|
||||
|
||||
return SUCCESS;
|
||||
|
||||
@ -489,7 +489,7 @@ MxResult Act3::Create(MxDSAction& p_dsAction)
|
||||
case LegoGameState::e_act1:
|
||||
case LegoGameState::e_actNotFound:
|
||||
GameState()->StopArea(LegoGameState::e_undefined);
|
||||
if (GameState()->GetPreviousArea() == LegoGameState::e_infomain) {
|
||||
if (GameState()->m_previousArea == LegoGameState::e_infomain) {
|
||||
GameState()->StopArea(LegoGameState::e_isle);
|
||||
}
|
||||
}
|
||||
@ -506,7 +506,7 @@ MxResult Act3::Create(MxDSAction& p_dsAction)
|
||||
|
||||
GameState()->m_currentArea = LegoGameState::e_act3script;
|
||||
GameState()->SetCurrentAct(LegoGameState::e_act3);
|
||||
GameState()->SetDirty(TRUE);
|
||||
GameState()->m_isDirty = TRUE;
|
||||
}
|
||||
|
||||
return result;
|
||||
@ -884,7 +884,7 @@ void Act3::Enable(MxBool p_enable)
|
||||
|
||||
FUN_10015820(FALSE, LegoOmni::c_disableInput | LegoOmni::c_disable3d | LegoOmni::c_clearScreen);
|
||||
PlayMusic(JukeboxScript::c_Act3Music);
|
||||
GameState()->SetDirty(TRUE);
|
||||
GameState()->m_isDirty = TRUE;
|
||||
|
||||
if (m_time > 0) {
|
||||
MxFloat delta = Timer()->GetTime() - m_time - 100.0f;
|
||||
|
||||
@ -219,7 +219,7 @@ MxResult Infocenter::Create(MxDSAction& p_dsAction)
|
||||
|
||||
if (m_infocenterState->m_unk0x74 == 4) {
|
||||
LegoGameState* state = GameState();
|
||||
state->SetPreviousArea(GameState()->GetUnknown0x42c());
|
||||
state->m_previousArea = GameState()->m_unk0x42c;
|
||||
}
|
||||
|
||||
InputManager()->Register(this);
|
||||
@ -1024,13 +1024,13 @@ MxU8 Infocenter::HandleControl(LegoControlManagerNotificationParam& p_param)
|
||||
case InfomainScript::c_BigInfo_Ctl:
|
||||
switch (state->GetCurrentAct()) {
|
||||
case LegoGameState::e_act1:
|
||||
if (state->GetPreviousArea()) {
|
||||
switch (state->GetPreviousArea()) {
|
||||
if (state->m_previousArea) {
|
||||
switch (state->m_previousArea) {
|
||||
case LegoGameState::e_infodoor:
|
||||
case LegoGameState::e_regbook:
|
||||
case LegoGameState::e_infoscor:
|
||||
m_infocenterState->m_unk0x74 = 5;
|
||||
m_destLocation = state->GetPreviousArea();
|
||||
m_destLocation = state->m_previousArea;
|
||||
actionToPlay = (InfomainScript::Script) m_infocenterState->GetNextLeaveDialogue();
|
||||
m_radio.Stop();
|
||||
InputManager()->DisableInputProcessing();
|
||||
@ -1085,7 +1085,7 @@ MxU8 Infocenter::HandleControl(LegoControlManagerNotificationParam& p_param)
|
||||
actionToPlay = GameState()->GetCurrentAct() != LegoGameState::e_act1 ? InfomainScript::c_GoTo_RegBook_Red
|
||||
: InfomainScript::c_GoTo_RegBook;
|
||||
m_radio.Stop();
|
||||
GameState()->m_unk0x42c = GameState()->GetPreviousArea();
|
||||
GameState()->m_unk0x42c = GameState()->m_previousArea;
|
||||
InputManager()->DisableInputProcessing();
|
||||
break;
|
||||
case InfomainScript::c_Mama_Ctl:
|
||||
@ -1394,7 +1394,7 @@ void Infocenter::Reset()
|
||||
AnimationManager()->Reset(FALSE);
|
||||
CharacterManager()->ReleaseAllActors();
|
||||
GameState()->SetCurrentAct(LegoGameState::e_act1);
|
||||
GameState()->SetPreviousArea(LegoGameState::e_undefined);
|
||||
GameState()->m_previousArea = LegoGameState::e_undefined;
|
||||
GameState()->m_unk0x42c = LegoGameState::e_undefined;
|
||||
|
||||
InitializeBitmaps();
|
||||
|
||||
@ -121,7 +121,7 @@ MxResult Isle::Create(MxDSAction& p_dsAction)
|
||||
m_act1state = act1state;
|
||||
|
||||
EnableAnimations(TRUE);
|
||||
GameState()->SetDirty(TRUE);
|
||||
GameState()->m_isDirty = TRUE;
|
||||
}
|
||||
|
||||
return result;
|
||||
|
||||
@ -141,7 +141,7 @@ MxResult LegoAct2::Create(MxDSAction& p_dsAction)
|
||||
case LegoGameState::e_act1:
|
||||
case LegoGameState::e_actNotFound:
|
||||
GameState()->StopArea(LegoGameState::e_undefined);
|
||||
if (GameState()->GetPreviousArea() == LegoGameState::e_infomain) {
|
||||
if (GameState()->m_previousArea == LegoGameState::e_infomain) {
|
||||
GameState()->StopArea(LegoGameState::e_isle);
|
||||
}
|
||||
}
|
||||
@ -149,7 +149,7 @@ MxResult LegoAct2::Create(MxDSAction& p_dsAction)
|
||||
GameState()->m_currentArea = LegoGameState::e_act2main;
|
||||
GameState()->SetCurrentAct(LegoGameState::e_act2);
|
||||
InputManager()->Register(this);
|
||||
GameState()->SetDirty(TRUE);
|
||||
GameState()->m_isDirty = TRUE;
|
||||
}
|
||||
|
||||
return result;
|
||||
@ -536,7 +536,7 @@ void LegoAct2::Enable(MxBool p_enable)
|
||||
|
||||
((IslePathActor*) m_pepper->GetEntity())->VTable0xec(m_unk0x10dc, m_unk0x1124, TRUE);
|
||||
|
||||
if (GameState()->GetPreviousArea() == LegoGameState::e_infomain) {
|
||||
if (GameState()->m_previousArea == LegoGameState::e_infomain) {
|
||||
GameState()->StopArea(LegoGameState::e_infomain);
|
||||
}
|
||||
|
||||
|
||||
@ -52,7 +52,7 @@ MxResult ModelDbModel::Read(SDL_IOStream* p_file)
|
||||
if (SDL_ReadIO(p_file, m_up, 3 * sizeof(float)) != 3 * sizeof(float)) {
|
||||
return FAILURE;
|
||||
}
|
||||
if (SDL_ReadIO(p_file, &m_unk0x34, sizeof(undefined)) != sizeof(undefined)) {
|
||||
if (SDL_ReadIO(p_file, &m_visible, sizeof(MxU8)) != sizeof(MxU8)) {
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
|
||||
@ -102,7 +102,7 @@ struct ModelDbModel {
|
||||
float m_location[3]; // 0x10
|
||||
float m_direction[3]; // 0x1c
|
||||
float m_up[3]; // 0x28
|
||||
undefined m_unk0x34; // 0x34
|
||||
MxU8 m_visible; // 0x34
|
||||
};
|
||||
|
||||
// SIZE 0x18
|
||||
|
||||
@ -867,4 +867,7 @@ inline D3DRMMATERIALMODE Translate(MaterialMode mode)
|
||||
// GLOBAL: LEGO1 0x100dd1e0
|
||||
// IID_IDirect3DRMMeshBuilder
|
||||
|
||||
// GLOBAL: LEGO1 0x100dd1f0
|
||||
// IID_IDirect3DRMMesh
|
||||
|
||||
#endif
|
||||
|
||||
@ -15,6 +15,7 @@ void* MeshBuilderImpl::ImplementationDataPtr()
|
||||
}
|
||||
|
||||
// FUNCTION: LEGO1 0x100a3840
|
||||
// FUNCTION: BETA10 0x1016ca40
|
||||
Mesh* MeshBuilderImpl::CreateMesh(
|
||||
unsigned int faceCount,
|
||||
unsigned int vertexCount,
|
||||
@ -26,6 +27,8 @@ Mesh* MeshBuilderImpl::CreateMesh(
|
||||
ShadingModel shadingModel
|
||||
)
|
||||
{
|
||||
assert(m_data);
|
||||
|
||||
MeshImpl* pMeshImpl = new MeshImpl;
|
||||
if (CreateMeshImpl(
|
||||
pMeshImpl,
|
||||
@ -45,63 +48,67 @@ Mesh* MeshBuilderImpl::CreateMesh(
|
||||
return pMeshImpl;
|
||||
}
|
||||
|
||||
// FUNCTION: BETA10 0x1016fef0
|
||||
inline Result CreateMesh(
|
||||
IDirect3DRMMesh* pD3DRM,
|
||||
unsigned int faceCount,
|
||||
unsigned int vertexCount,
|
||||
float (*pPositions)[3],
|
||||
float (*pNormals)[3],
|
||||
float (*pTextureCoordinates)[2],
|
||||
unsigned int (*pFaceIndices)[3],
|
||||
unsigned int (*pTextureIndices)[3],
|
||||
unsigned int p_numFaces,
|
||||
unsigned int p_numVertices,
|
||||
float (*p_positions)[3],
|
||||
float (*p_normals)[3],
|
||||
float (*p_textureCoordinates)[2],
|
||||
unsigned int (*p_faceIndices)[3],
|
||||
unsigned int (*p_textureIndices)[3],
|
||||
ShadingModel shadingModel,
|
||||
MeshImpl::MeshDataType& rpMesh
|
||||
)
|
||||
{
|
||||
unsigned int* faceIndices = (unsigned int*) pFaceIndices;
|
||||
unsigned short* faceIndices = (unsigned short*) p_faceIndices;
|
||||
D3DRMGROUPINDEX groupIndex = 0;
|
||||
int count = faceCount * 3;
|
||||
int index = 0;
|
||||
int faceCount = p_numFaces * 3;
|
||||
int count = 0;
|
||||
|
||||
unsigned int* fData = new unsigned int[count];
|
||||
unsigned int* fData = new unsigned int[faceCount];
|
||||
|
||||
D3DRMVERTEX* vertices = new D3DRMVERTEX[vertexCount];
|
||||
memset(vertices, 0, sizeof(*vertices) * vertexCount);
|
||||
D3DRMVERTEX* vertices = new D3DRMVERTEX[p_numVertices];
|
||||
memset(vertices, 0, sizeof(*vertices) * p_numVertices);
|
||||
|
||||
rpMesh = new MeshImpl::MeshData;
|
||||
rpMesh->groupMesh = pD3DRM;
|
||||
|
||||
for (int i = 0; i < count; i++) {
|
||||
if ((*((unsigned short*) &faceIndices[i] + 1) >> 0x0f) & 0x01) {
|
||||
unsigned int j = *(unsigned short*) &faceIndices[i];
|
||||
vertices[index].position.x = pPositions[j][0];
|
||||
vertices[index].position.y = pPositions[j][1];
|
||||
vertices[index].position.z = pPositions[j][2];
|
||||
j = *((unsigned short*) &faceIndices[i] + 1) & MAXSHORT;
|
||||
vertices[index].normal.x = pNormals[j][0];
|
||||
vertices[index].normal.y = pNormals[j][1];
|
||||
vertices[index].normal.z = pNormals[j][2];
|
||||
for (int i = 0; i < faceCount; i++) {
|
||||
if (((faceIndices[2 * i + 1]) >> 0x0f) & 0x01) {
|
||||
unsigned int j = 3 * faceIndices[2 * i];
|
||||
vertices[count].position.x = p_positions[j];
|
||||
vertices[count].position.y = p_positions[j + 1];
|
||||
vertices[count].position.z = p_positions[j + 2];
|
||||
|
||||
if (pTextureIndices != NULL && pTextureCoordinates != NULL) {
|
||||
j = ((unsigned int*) pTextureIndices)[i];
|
||||
vertices[index].tu = pTextureCoordinates[j][0];
|
||||
vertices[index].tv = pTextureCoordinates[j][1];
|
||||
int k = 3 * (faceIndices[2 * i + 1] & MAXSHORT);
|
||||
vertices[count].normal.x = p_normals[k];
|
||||
vertices[count].normal.y = p_normals[k + 1];
|
||||
vertices[count].normal.z = p_normals[k + 2];
|
||||
|
||||
if (p_textureIndices != NULL && p_textureCoordinates != NULL) {
|
||||
int kk = 2 * ((unsigned int*) p_textureIndices)[i];
|
||||
vertices[count].tu = p_textureCoordinates[kk];
|
||||
vertices[count].tv = p_textureCoordinates[kk + 1];
|
||||
}
|
||||
|
||||
fData[i] = index;
|
||||
index++;
|
||||
fData[i] = count;
|
||||
count++;
|
||||
}
|
||||
else {
|
||||
fData[i] = *(unsigned short*) &faceIndices[i];
|
||||
fData[i] = faceIndices[2 * i];
|
||||
}
|
||||
}
|
||||
|
||||
assert(count == (int) p_numVertices);
|
||||
|
||||
Result result;
|
||||
result = ResultVal(pD3DRM->AddGroup(vertexCount, faceCount, 3, fData, &groupIndex));
|
||||
result = ResultVal(pD3DRM->AddGroup(p_numVertices, p_numFaces, 3, fData, &groupIndex));
|
||||
|
||||
if (Succeeded(result)) {
|
||||
rpMesh->groupIndex = groupIndex;
|
||||
result = ResultVal(pD3DRM->SetVertices(groupIndex, 0, vertexCount, vertices));
|
||||
result = ResultVal(pD3DRM->SetVertices(groupIndex, 0, p_numVertices, vertices));
|
||||
}
|
||||
|
||||
if (!Succeeded(result)) {
|
||||
@ -112,6 +119,7 @@ inline Result CreateMesh(
|
||||
}
|
||||
else {
|
||||
result = MeshSetTextureMappingMode(rpMesh, PerspectiveCorrect);
|
||||
assert(Succeeded(result));
|
||||
}
|
||||
|
||||
if (fData != NULL) {
|
||||
@ -125,6 +133,7 @@ inline Result CreateMesh(
|
||||
return result;
|
||||
}
|
||||
|
||||
// FUNCTION: BETA10 0x1016fe40
|
||||
inline Result MeshBuilderImpl::CreateMeshImpl(
|
||||
MeshImpl* pMeshImpl,
|
||||
unsigned int faceCount,
|
||||
@ -137,13 +146,16 @@ inline Result MeshBuilderImpl::CreateMeshImpl(
|
||||
ShadingModel shadingModel
|
||||
)
|
||||
{
|
||||
assert(m_data);
|
||||
assert(!pMeshImpl->ImplementationData());
|
||||
|
||||
return ::CreateMesh(
|
||||
m_data,
|
||||
faceCount,
|
||||
vertexCount,
|
||||
pPositions,
|
||||
pNormals,
|
||||
pTextureCoordinates,
|
||||
reinterpret_cast<float*>(pPositions),
|
||||
reinterpret_cast<float*>(pNormals),
|
||||
reinterpret_cast<float*>(pTextureCoordinates),
|
||||
pFaceIndices,
|
||||
pTextureIndices,
|
||||
shadingModel,
|
||||
|
||||
165
LICENSE
Normal file
165
LICENSE
Normal file
@ -0,0 +1,165 @@
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
|
||||
This version of the GNU Lesser General Public License incorporates
|
||||
the terms and conditions of version 3 of the GNU General Public
|
||||
License, supplemented by the additional permissions listed below.
|
||||
|
||||
0. Additional Definitions.
|
||||
|
||||
As used herein, "this License" refers to version 3 of the GNU Lesser
|
||||
General Public License, and the "GNU GPL" refers to version 3 of the GNU
|
||||
General Public License.
|
||||
|
||||
"The Library" refers to a covered work governed by this License,
|
||||
other than an Application or a Combined Work as defined below.
|
||||
|
||||
An "Application" is any work that makes use of an interface provided
|
||||
by the Library, but which is not otherwise based on the Library.
|
||||
Defining a subclass of a class defined by the Library is deemed a mode
|
||||
of using an interface provided by the Library.
|
||||
|
||||
A "Combined Work" is a work produced by combining or linking an
|
||||
Application with the Library. The particular version of the Library
|
||||
with which the Combined Work was made is also called the "Linked
|
||||
Version".
|
||||
|
||||
The "Minimal Corresponding Source" for a Combined Work means the
|
||||
Corresponding Source for the Combined Work, excluding any source code
|
||||
for portions of the Combined Work that, considered in isolation, are
|
||||
based on the Application, and not on the Linked Version.
|
||||
|
||||
The "Corresponding Application Code" for a Combined Work means the
|
||||
object code and/or source code for the Application, including any data
|
||||
and utility programs needed for reproducing the Combined Work from the
|
||||
Application, but excluding the System Libraries of the Combined Work.
|
||||
|
||||
1. Exception to Section 3 of the GNU GPL.
|
||||
|
||||
You may convey a covered work under sections 3 and 4 of this License
|
||||
without being bound by section 3 of the GNU GPL.
|
||||
|
||||
2. Conveying Modified Versions.
|
||||
|
||||
If you modify a copy of the Library, and, in your modifications, a
|
||||
facility refers to a function or data to be supplied by an Application
|
||||
that uses the facility (other than as an argument passed when the
|
||||
facility is invoked), then you may convey a copy of the modified
|
||||
version:
|
||||
|
||||
a) under this License, provided that you make a good faith effort to
|
||||
ensure that, in the event an Application does not supply the
|
||||
function or data, the facility still operates, and performs
|
||||
whatever part of its purpose remains meaningful, or
|
||||
|
||||
b) under the GNU GPL, with none of the additional permissions of
|
||||
this License applicable to that copy.
|
||||
|
||||
3. Object Code Incorporating Material from Library Header Files.
|
||||
|
||||
The object code form of an Application may incorporate material from
|
||||
a header file that is part of the Library. You may convey such object
|
||||
code under terms of your choice, provided that, if the incorporated
|
||||
material is not limited to numerical parameters, data structure
|
||||
layouts and accessors, or small macros, inline functions and templates
|
||||
(ten or fewer lines in length), you do both of the following:
|
||||
|
||||
a) Give prominent notice with each copy of the object code that the
|
||||
Library is used in it and that the Library and its use are
|
||||
covered by this License.
|
||||
|
||||
b) Accompany the object code with a copy of the GNU GPL and this license
|
||||
document.
|
||||
|
||||
4. Combined Works.
|
||||
|
||||
You may convey a Combined Work under terms of your choice that,
|
||||
taken together, effectively do not restrict modification of the
|
||||
portions of the Library contained in the Combined Work and reverse
|
||||
engineering for debugging such modifications, if you also do each of
|
||||
the following:
|
||||
|
||||
a) Give prominent notice with each copy of the Combined Work that
|
||||
the Library is used in it and that the Library and its use are
|
||||
covered by this License.
|
||||
|
||||
b) Accompany the Combined Work with a copy of the GNU GPL and this license
|
||||
document.
|
||||
|
||||
c) For a Combined Work that displays copyright notices during
|
||||
execution, include the copyright notice for the Library among
|
||||
these notices, as well as a reference directing the user to the
|
||||
copies of the GNU GPL and this license document.
|
||||
|
||||
d) Do one of the following:
|
||||
|
||||
0) Convey the Minimal Corresponding Source under the terms of this
|
||||
License, and the Corresponding Application Code in a form
|
||||
suitable for, and under terms that permit, the user to
|
||||
recombine or relink the Application with a modified version of
|
||||
the Linked Version to produce a modified Combined Work, in the
|
||||
manner specified by section 6 of the GNU GPL for conveying
|
||||
Corresponding Source.
|
||||
|
||||
1) Use a suitable shared library mechanism for linking with the
|
||||
Library. A suitable mechanism is one that (a) uses at run time
|
||||
a copy of the Library already present on the user's computer
|
||||
system, and (b) will operate properly with a modified version
|
||||
of the Library that is interface-compatible with the Linked
|
||||
Version.
|
||||
|
||||
e) Provide Installation Information, but only if you would otherwise
|
||||
be required to provide such information under section 6 of the
|
||||
GNU GPL, and only to the extent that such information is
|
||||
necessary to install and execute a modified version of the
|
||||
Combined Work produced by recombining or relinking the
|
||||
Application with a modified version of the Linked Version. (If
|
||||
you use option 4d0, the Installation Information must accompany
|
||||
the Minimal Corresponding Source and Corresponding Application
|
||||
Code. If you use option 4d1, you must provide the Installation
|
||||
Information in the manner specified by section 6 of the GNU GPL
|
||||
for conveying Corresponding Source.)
|
||||
|
||||
5. Combined Libraries.
|
||||
|
||||
You may place library facilities that are a work based on the
|
||||
Library side by side in a single library together with other library
|
||||
facilities that are not Applications and are not covered by this
|
||||
License, and convey such a combined library under terms of your
|
||||
choice, if you do both of the following:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work based
|
||||
on the Library, uncombined with any other library facilities,
|
||||
conveyed under the terms of this License.
|
||||
|
||||
b) Give prominent notice with the combined library that part of it
|
||||
is a work based on the Library, and explaining where to find the
|
||||
accompanying uncombined form of the same work.
|
||||
|
||||
6. Revised Versions of the GNU Lesser General Public License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions
|
||||
of the GNU Lesser General Public License from time to time. Such new
|
||||
versions will be similar in spirit to the present version, but may
|
||||
differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Library as you received it specifies that a certain numbered version
|
||||
of the GNU Lesser General Public License "or any later version"
|
||||
applies to it, you have the option of following the terms and
|
||||
conditions either of that published version or of any later version
|
||||
published by the Free Software Foundation. If the Library as you
|
||||
received it does not specify a version number of the GNU Lesser
|
||||
General Public License, you may choose any version of the GNU Lesser
|
||||
General Public License ever published by the Free Software Foundation.
|
||||
|
||||
If the Library as you received it specifies that a proxy can decide
|
||||
whether future versions of the GNU Lesser General Public License shall
|
||||
apply, that proxy's public statement of acceptance of any version is
|
||||
permanent authorization for you to choose that version for the
|
||||
Library.
|
||||
Loading…
Reference in New Issue
Block a user