mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-01-16 19:19:56 +00:00
Added the rest of the game objects (objects found in cells) as Monster
scripts. No functionality yet, just data storage. git-svn-id: https://openmw.svn.sourceforge.net/svnroot/openmw/trunk@73 ea6a568a-9f4f-0410-981a-c910a81bb256
This commit is contained in:
parent
76295fbd45
commit
6a7401e133
27 changed files with 482 additions and 100 deletions
|
@ -176,9 +176,6 @@ template LoadTT(T)
|
|||
|
||||
static if(is(typeof(data.enchant)==int))
|
||||
proto.setInt("enchant", data.enchant);
|
||||
|
||||
static if(is(typeof(data.health)==int))
|
||||
proto.setInt("health", data.health);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -142,6 +142,8 @@ struct Armor
|
|||
|
||||
proto.setInt("type", data.type);
|
||||
proto.setInt("armor", data.armor);
|
||||
|
||||
proto.setInt("health", data.health);
|
||||
}}
|
||||
}
|
||||
ListID!(Armor) armors;
|
||||
|
|
|
@ -78,8 +78,7 @@ struct Creature
|
|||
|
||||
Flags flags;
|
||||
|
||||
LoadState state;
|
||||
char[] id, name;
|
||||
mixin LoadT;
|
||||
|
||||
MeshIndex model;
|
||||
|
||||
|
@ -121,6 +120,36 @@ struct Creature
|
|||
//*
|
||||
skipRecord();
|
||||
//*/
|
||||
|
||||
makeProto();
|
||||
|
||||
proto.setInt("level", data.level);
|
||||
proto.setInt("gold", data.gold);
|
||||
|
||||
proto.setInt("baseStrength", data.strength);
|
||||
proto.setInt("baseIntelligence", data.intelligence);
|
||||
proto.setInt("baseWillpower", data.willpower);
|
||||
proto.setInt("baseAgility", data.agility);
|
||||
proto.setInt("baseSpeed", data.speed);
|
||||
proto.setInt("baseEndurance", data.endurance);
|
||||
proto.setInt("basePersonality", data.personality);
|
||||
proto.setInt("baseLuck", data.luck);
|
||||
|
||||
proto.setInt("baseMaxHealth", data.health);
|
||||
proto.setInt("baseMaxMana", data.mana);
|
||||
proto.setInt("baseMaxFatigue", data.fatigue);
|
||||
|
||||
proto.setInt("combat", data.combat);
|
||||
proto.setInt("magic", data.magic);
|
||||
proto.setInt("stealth", data.stealth);
|
||||
proto.setInt("soul", data.soul);
|
||||
|
||||
proto.setInt("attackMin1", data.attack[0]);
|
||||
proto.setInt("attackMax1", data.attack[1]);
|
||||
proto.setInt("attackMin2", data.attack[2]);
|
||||
proto.setInt("attackMax2", data.attack[3]);
|
||||
proto.setInt("attackMin3", data.attack[4]);
|
||||
proto.setInt("attackMax3", data.attack[5]);
|
||||
}}
|
||||
|
||||
}
|
||||
|
|
|
@ -28,6 +28,11 @@ import esm.imports;
|
|||
* Game setting
|
||||
*/
|
||||
|
||||
// TODO: It's likely that we don't need this struct any longer, given
|
||||
// that game settings are now stored in Monster code. We will still
|
||||
// use the loading code and the dirty value cleaning code of course,
|
||||
// but there's no longer any need to store it in a separate lookup
|
||||
// list, since Monster variables can be looked up just as fast.
|
||||
struct GameSetting
|
||||
{
|
||||
LoadState state;
|
||||
|
@ -79,10 +84,12 @@ struct GameSetting
|
|||
// really shouldn't have to. In this file we choose instead to
|
||||
// reject all the corrupt values at load time.
|
||||
|
||||
// Checks if the current game setting is one of the "dirty" ones as
|
||||
// described above. TODO: I have not checked this against other
|
||||
// sources yet, do that later. Currently recognizes 22 values for
|
||||
// tribunal and 50 for bloodmoon.
|
||||
// These functions checks if the current game setting is one of the
|
||||
// "dirty" ones as described above. TODO: I have not checked this
|
||||
// against other sources yet, do that later. Currently recognizes 22
|
||||
// values for tribunal and 50 for bloodmoon. Legitimate GMSTs in
|
||||
// mods (setting values other than the default "dirty" ones) are not
|
||||
// affected and will work correctly.
|
||||
|
||||
// Checks for dirty tribunal values. These will be ignored if found
|
||||
// in any file except when they are found in "Tribunal.esm".
|
||||
|
|
|
@ -43,9 +43,8 @@ struct Ingredient
|
|||
|
||||
IRDTstruct data;
|
||||
|
||||
LoadState state;
|
||||
mixin LoadT;
|
||||
|
||||
char[] id, name;
|
||||
MeshIndex model;
|
||||
IconIndex icon;
|
||||
Script *script;
|
||||
|
@ -58,6 +57,8 @@ struct Ingredient
|
|||
|
||||
script = getHNOPtr!(Script)("SCRI", scripts);
|
||||
icon = getOIcon();
|
||||
|
||||
makeProto();
|
||||
}}
|
||||
}
|
||||
ListID!(Ingredient) ingreds;
|
||||
|
|
|
@ -27,40 +27,16 @@ import esm.loadcrea;
|
|||
|
||||
import util.random;
|
||||
|
||||
/* Outdated comments:
|
||||
*
|
||||
/*
|
||||
* Leveled lists. Since these have identical layout, I only bothered
|
||||
* to implement it once.
|
||||
*
|
||||
* We should later implement the ability to merge leveled lists from
|
||||
* several files.
|
||||
*
|
||||
* The Item indices can point to several different lists (potions,
|
||||
* weapons, armor, etc.) and this is a problem also for npcs,
|
||||
* containers and cells. Deal with it in a uniform way. In fact, we
|
||||
* won't have to make any difference between the creature and item
|
||||
* lists.
|
||||
*
|
||||
* EDIT 2007.08.18: Looks like DMD is exploding from template forward
|
||||
* references again. It works for very small cases, so I assume it
|
||||
* should be legal in our case also, and that this is a BUG. I have
|
||||
* cut it down and am going to report it. Moving ListItem out of the
|
||||
* struct helped, but I get the same problem in other places, where it
|
||||
* is not possible to fix. I should probably cut down the other case
|
||||
* as well...
|
||||
*
|
||||
* EDIT 2007.09.09: In Monster we managed to cut down template
|
||||
* forwarding with LinkedList by making the list use Value pointers
|
||||
* instead of Node pointers. If I do the same for HashTable and move
|
||||
* the value to the top, I JUST might be able to work around this DMD
|
||||
* bug.
|
||||
*
|
||||
* UPDATE: Well, it works now, but only if you compile with DMD using
|
||||
* the all-files-on-one-line approach. It will not work with DSSS
|
||||
* until these bugs are gone.
|
||||
*/
|
||||
|
||||
// Moved here for template bug reasons...
|
||||
// Moved here for template / DMD bug reasons...
|
||||
struct _ListItem
|
||||
{
|
||||
Item item; // Definded in records.d
|
||||
|
|
|
@ -45,9 +45,8 @@ struct Tool
|
|||
|
||||
Data data;
|
||||
|
||||
LoadState state;
|
||||
mixin LoadT;
|
||||
|
||||
char[] name, id;
|
||||
MeshIndex model;
|
||||
IconIndex icon;
|
||||
Script* script;
|
||||
|
@ -57,13 +56,22 @@ struct Tool
|
|||
model = getMesh();
|
||||
name = getHNString("FNAM");
|
||||
|
||||
if(isNextSub("LKDT") || isNextSub("PBDT"))
|
||||
readHExact(&data, data.sizeof);
|
||||
else
|
||||
{
|
||||
getSubNameIs("RIDT");
|
||||
readHExact(&data, data.sizeof);
|
||||
char[] type;
|
||||
bool isRep = false;
|
||||
|
||||
if(isNextSub("LKDT")) type = "Lockpick";
|
||||
else if(isNextSub("PBDT")) type = "Probe";
|
||||
else
|
||||
{
|
||||
getSubNameIs("RIDT");
|
||||
type = "RepairItem";
|
||||
isRep = true;
|
||||
}
|
||||
|
||||
readHExact(&data, data.sizeof);
|
||||
|
||||
if(isRep)
|
||||
{
|
||||
// Swap t.data.quality and t.data.uses (sigh)
|
||||
float tmp = *(cast(float*)&data.uses);
|
||||
data.uses = *(cast(int*)&data.quality);
|
||||
|
@ -72,6 +80,11 @@ struct Tool
|
|||
|
||||
script = getHNOPtr!(Script)("SCRI", scripts);
|
||||
icon = getOIcon();
|
||||
|
||||
|
||||
makeProto(type);
|
||||
proto.setFloat("quality", data.quality);
|
||||
proto.setInt("uses", data.uses);
|
||||
}}
|
||||
}
|
||||
ListID!(Tool) lockpicks, probes, repairs;
|
||||
|
|
|
@ -43,9 +43,7 @@ struct Misc
|
|||
}
|
||||
MCDTstruct data;
|
||||
|
||||
char[] id, name;
|
||||
|
||||
LoadState state;
|
||||
mixin LoadT;
|
||||
|
||||
MeshIndex model;
|
||||
IconIndex icon;
|
||||
|
@ -57,7 +55,10 @@ struct Misc
|
|||
name = getHNOString("FNAM");
|
||||
readHNExact(&data, data.sizeof, "MCDT");
|
||||
script = getHNOPtr!(Script)("SCRI", scripts);
|
||||
icon = getOIcon();;
|
||||
icon = getOIcon();
|
||||
|
||||
makeProto();
|
||||
proto.setInt("isKey", data.isKey);
|
||||
}}
|
||||
}
|
||||
ListID!(Misc) miscItems;
|
||||
|
|
|
@ -79,7 +79,6 @@ struct NPC
|
|||
byte strength, intelligence, willpower, agility,
|
||||
speed, endurance, personality, luck;
|
||||
byte skills[27];
|
||||
//byte reputation; // Total confusion!
|
||||
short health, mana, fatigue;
|
||||
byte disposition;
|
||||
byte reputation; // Was "factionID", but that makes no sense.
|
||||
|
@ -121,9 +120,7 @@ struct NPC
|
|||
AIDTstruct AI;
|
||||
bool hasAI;
|
||||
|
||||
LoadState state;
|
||||
|
||||
char[] name, id;
|
||||
mixin LoadT;
|
||||
|
||||
MeshIndex model;
|
||||
Race* race;
|
||||
|
@ -166,6 +163,41 @@ struct NPC
|
|||
else hasAI = false;
|
||||
|
||||
skipRecord();
|
||||
|
||||
makeProto("Person");
|
||||
|
||||
// Clean this up a little later, eg. no point in storing the
|
||||
// structs outside the function any longer. Same goes for most of
|
||||
// the load*.d structures.
|
||||
if(npdt52.gold == -10)
|
||||
{
|
||||
proto.setInt("level", npdt12.level);
|
||||
proto.setInt("gold", npdt12.gold);
|
||||
|
||||
proto.setInt("disposition", npdt12.disposition);
|
||||
proto.setInt("reputation", npdt12.reputation);
|
||||
proto.setInt("rank", npdt12.rank);
|
||||
|
||||
// TODO: Autocalculate the rest?
|
||||
}
|
||||
else
|
||||
{
|
||||
proto.setInt("level", npdt52.level);
|
||||
proto.setInt("gold", npdt52.gold);
|
||||
|
||||
proto.setInt("baseStrength", npdt52.strength);
|
||||
proto.setInt("baseIntelligence", npdt52.intelligence);
|
||||
proto.setInt("baseWillpower", npdt52.willpower);
|
||||
proto.setInt("baseAgility", npdt52.agility);
|
||||
proto.setInt("baseSpeed", npdt52.speed);
|
||||
proto.setInt("baseEndurance", npdt52.endurance);
|
||||
proto.setInt("basePersonality", npdt52.personality);
|
||||
proto.setInt("baseLuck", npdt52.luck);
|
||||
|
||||
proto.setInt("baseMaxHealth", npdt52.health);
|
||||
proto.setInt("baseMaxMana", npdt52.mana);
|
||||
proto.setInt("baseMaxFatigue", npdt52.fatigue);
|
||||
}
|
||||
}}
|
||||
}
|
||||
ListID!(NPC) npcs;
|
||||
|
|
|
@ -49,7 +49,7 @@ struct Skill
|
|||
|
||||
SKDTstruct data;
|
||||
|
||||
char[] description; // Description
|
||||
char[] description;
|
||||
|
||||
void load()
|
||||
{
|
||||
|
|
|
@ -39,14 +39,15 @@ import esm.imports;
|
|||
|
||||
struct Static
|
||||
{
|
||||
char[] id;
|
||||
LoadState state;
|
||||
mixin LoadT;
|
||||
|
||||
MeshIndex model;
|
||||
|
||||
void load()
|
||||
{
|
||||
model = esFile.getMesh();
|
||||
|
||||
makeProto();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -91,6 +91,8 @@ struct Weapon
|
|||
|
||||
proto.setFloat("speed", data.speed);
|
||||
proto.setFloat("reach", data.reach);
|
||||
|
||||
proto.setInt("health", data.health);
|
||||
}}
|
||||
}
|
||||
ListID!(Weapon) weapons;
|
||||
|
|
|
@ -480,7 +480,7 @@ final class PackageScope : Scope
|
|||
|
||||
// Find a class given its name. The class must be parsed or a file
|
||||
// must exist which can be parsed, otherwise the function
|
||||
// fails. createScope is also called on the class before it'xs
|
||||
// fails. createScope is also called on the class before it is
|
||||
// returned.
|
||||
MonsterClass findClass(Token t) { return findClass(t.str, t.loc); }
|
||||
MonsterClass findClass(char[] name, Floc loc = Floc.init)
|
||||
|
|
|
@ -507,13 +507,23 @@ final class MonsterClass
|
|||
|
||||
assert(otree.length > 0);
|
||||
|
||||
// Create one buffer big enough for all the data segments here,
|
||||
// and let getObject slice it. TODO: This can be optimized even
|
||||
// further, by using a freelist or other preallocation, and by
|
||||
// precalculating the result and the slicing. Not important at
|
||||
// the moment.
|
||||
int[] totalData = new int[totalDataSize];
|
||||
|
||||
// Fill the list with objects, and assign the thread.
|
||||
foreach(i, ref obj; otree)
|
||||
{
|
||||
obj = tree[i].getObject();
|
||||
obj = tree[i].getObject(totalData);
|
||||
obj.thread = trd;
|
||||
}
|
||||
|
||||
// Make sure we used the entire buffer
|
||||
assert(totalData.length == 0);
|
||||
|
||||
// Pick out the top object
|
||||
MonsterObject* top = otree[$-1];
|
||||
|
||||
|
@ -549,16 +559,23 @@ final class MonsterClass
|
|||
// Create a new thread
|
||||
CodeThread *trd = threads.getNew();
|
||||
|
||||
// Create one buffer big enough for all the data segments here,
|
||||
// and let getClone slice it.
|
||||
int[] totalData = new int[totalDataSize];
|
||||
|
||||
// Loop through the objects in the source tree, and clone each
|
||||
// of them
|
||||
MonsterObject* otree[] = source.tree.dup;
|
||||
foreach(i, ref obj; otree)
|
||||
{
|
||||
obj = obj.cls.getClone(obj);
|
||||
obj = obj.cls.getClone(obj, totalData);
|
||||
obj.tree = otree[0..i+1];
|
||||
obj.thread = trd;
|
||||
}
|
||||
|
||||
// Make sure we used the entire buffer
|
||||
assert(totalData.length == 0);
|
||||
|
||||
// Pick out the top object
|
||||
MonsterObject* top = otree[$-1];
|
||||
assert(top !is null);
|
||||
|
@ -697,6 +714,12 @@ final class MonsterClass
|
|||
uint sdSize; // Number of ints reserved for the static data, that
|
||||
// have not yet been used.
|
||||
|
||||
// Size of the data segment
|
||||
uint dataSize;
|
||||
|
||||
// Total for this class + all base classes.
|
||||
uint totalDataSize;
|
||||
|
||||
// Direct parents of this class
|
||||
MonsterClass parents[];
|
||||
Token parentNames[];
|
||||
|
@ -732,7 +755,8 @@ final class MonsterClass
|
|||
int[] getDataSegment()
|
||||
{
|
||||
assert(sc !is null && sc.isClass(), "Class does not have a class scope");
|
||||
int[] data = new int[sc.getDataSize];
|
||||
assert(dataSize == sc.getDataSize);
|
||||
int[] data = new int[dataSize];
|
||||
int totSize = 0;
|
||||
|
||||
foreach(VarDeclStatement vds; vardecs)
|
||||
|
@ -767,7 +791,7 @@ final class MonsterClass
|
|||
}
|
||||
|
||||
// Get an object from this class (but do not assign a thread to it)
|
||||
MonsterObject *getObject()
|
||||
MonsterObject *getObject(ref int[] dataBuf)
|
||||
{
|
||||
requireCompile();
|
||||
|
||||
|
@ -787,8 +811,12 @@ final class MonsterClass
|
|||
// to see what sizes are actually used. The entire structure can
|
||||
// reside inside it's own region.
|
||||
|
||||
// Copy the data segment
|
||||
obj.data = data.dup;
|
||||
// Copy the data segment into the buffer
|
||||
assert(data.length == dataSize);
|
||||
assert(dataBuf.length >= dataSize);
|
||||
obj.data = dataBuf[0..dataSize];
|
||||
obj.data[] = data[];
|
||||
dataBuf = dataBuf[dataSize..$];
|
||||
|
||||
// Point to the static data segment
|
||||
obj.sdata = sdata;
|
||||
|
@ -811,7 +839,7 @@ final class MonsterClass
|
|||
}
|
||||
|
||||
// Clone an existing object
|
||||
MonsterObject *getClone(MonsterObject *source)
|
||||
MonsterObject *getClone(MonsterObject *source, ref int[] dataBuf)
|
||||
{
|
||||
assert(source !is null);
|
||||
assert(source.cls is this);
|
||||
|
@ -825,9 +853,13 @@ final class MonsterClass
|
|||
// Set the class
|
||||
obj.cls = this;
|
||||
|
||||
// TODO: Fix memory management here too.
|
||||
// Copy the data segment from the source
|
||||
obj.data = source.data.dup;
|
||||
assert(data.length == dataSize);
|
||||
assert(dataBuf.length >= dataSize);
|
||||
assert(dataSize == source.data.length);
|
||||
obj.data = dataBuf[0..dataSize];
|
||||
obj.data[] = source.data[];
|
||||
dataBuf = dataBuf[dataSize..$];
|
||||
|
||||
// Point to the static data segment
|
||||
obj.sdata = sdata;
|
||||
|
@ -1079,7 +1111,8 @@ final class MonsterClass
|
|||
parents.length = parentNames.length;
|
||||
foreach(int i, pName; parentNames)
|
||||
{
|
||||
// Find the class
|
||||
// Find the class. findClass guarantees that the returned
|
||||
// class is scoped.
|
||||
MonsterClass mc = global.findClass(pName);
|
||||
|
||||
assert(mc !is null);
|
||||
|
@ -1162,6 +1195,16 @@ final class MonsterClass
|
|||
foreach(st; statedecs)
|
||||
states[st.st.index] = st.st;
|
||||
|
||||
// Set the data segment size and the total data size for all
|
||||
// base classes.
|
||||
dataSize = sc.getDataSize();
|
||||
|
||||
totalDataSize = 0;
|
||||
foreach(t; tree)
|
||||
totalDataSize += t.dataSize;
|
||||
|
||||
assert(totalDataSize >= dataSize);
|
||||
|
||||
flags.unset(CFlags.InScope);
|
||||
}
|
||||
|
||||
|
|
40
mscripts/gameobjects/actor.mn
Normal file
40
mscripts/gameobjects/actor.mn
Normal file
|
@ -0,0 +1,40 @@
|
|||
/*
|
||||
OpenMW - The completely unofficial reimplementation of Morrowind
|
||||
Copyright (C) 2008 Nicolay Korslund
|
||||
Email: < korslund@gmail.com >
|
||||
WWW: http://openmw.snaptoad.com/
|
||||
|
||||
This file (actor.mn) is part of the OpenMW package.
|
||||
|
||||
OpenMW is distributed as free software: you can redistribute it
|
||||
and/or modify it under the terms of the GNU General Public License
|
||||
version 3, as published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
version 3 along with this program. If not, see
|
||||
http://www.gnu.org/licenses/ .
|
||||
|
||||
*/
|
||||
|
||||
// Actors are a common base class for creatures, NPCs and the player.
|
||||
class Actor : GameObject;
|
||||
|
||||
// The actor's level
|
||||
int level;
|
||||
|
||||
// Stats. These are the base values, before any positive or negative
|
||||
// effects are applied.
|
||||
int
|
||||
baseStrength, baseIntelligence, baseWillpower, baseAgility,
|
||||
baseSpeed, baseEndurance, basePersonality, baseLuck;
|
||||
|
||||
// Maximum health values, before any effects are applied.
|
||||
int baseMaxHealth, baseMaxMana, baseMaxFatigue;
|
||||
|
||||
// Amount of gold this actor is carrying
|
||||
int gold;
|
36
mscripts/gameobjects/creature.mn
Normal file
36
mscripts/gameobjects/creature.mn
Normal file
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
OpenMW - The completely unofficial reimplementation of Morrowind
|
||||
Copyright (C) 2008 Nicolay Korslund
|
||||
Email: < korslund@gmail.com >
|
||||
WWW: http://openmw.snaptoad.com/
|
||||
|
||||
This file (creature.mn) is part of the OpenMW package.
|
||||
|
||||
OpenMW is distributed as free software: you can redistribute it
|
||||
and/or modify it under the terms of the GNU General Public License
|
||||
version 3, as published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
version 3 along with this program. If not, see
|
||||
http://www.gnu.org/licenses/ .
|
||||
|
||||
*/
|
||||
|
||||
class Creature : Actor;
|
||||
|
||||
// Soul gem value
|
||||
int soul;
|
||||
|
||||
// Not sure how to use these
|
||||
int combat, magic, stealth;
|
||||
|
||||
// Attack values for various types of attack
|
||||
int
|
||||
attackMin1, attackMax1,
|
||||
attackMin2, attackMax2,
|
||||
attackMin3, attackMax3;
|
|
@ -38,7 +38,7 @@ bool isPlaced;
|
|||
float x, y, z;
|
||||
float r1, r2, r3;
|
||||
|
||||
float scale;
|
||||
float scale = 1.0;
|
||||
|
||||
char[] name, id;
|
||||
|
||||
|
@ -52,7 +52,7 @@ char[] owner;
|
|||
char[] global;
|
||||
|
||||
// Reference to a soul trapped creature?
|
||||
char[] soul;
|
||||
char[] soulID;
|
||||
|
||||
// Faction owner? Rank?
|
||||
char[] cnam;
|
||||
|
|
27
mscripts/gameobjects/ingredient.mn
Normal file
27
mscripts/gameobjects/ingredient.mn
Normal file
|
@ -0,0 +1,27 @@
|
|||
/*
|
||||
OpenMW - The completely unofficial reimplementation of Morrowind
|
||||
Copyright (C) 2008 Nicolay Korslund
|
||||
Email: < korslund@gmail.com >
|
||||
WWW: http://openmw.snaptoad.com/
|
||||
|
||||
This file (ingredient.mn) is part of the OpenMW package.
|
||||
|
||||
OpenMW is distributed as free software: you can redistribute it
|
||||
and/or modify it under the terms of the GNU General Public License
|
||||
version 3, as published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
version 3 along with this program. If not, see
|
||||
http://www.gnu.org/licenses/ .
|
||||
|
||||
*/
|
||||
|
||||
// Alchemy ingredients
|
||||
class Ingredient : InventoryItem;
|
||||
|
||||
// more to come here...
|
24
mscripts/gameobjects/lockpick.mn
Normal file
24
mscripts/gameobjects/lockpick.mn
Normal file
|
@ -0,0 +1,24 @@
|
|||
/*
|
||||
OpenMW - The completely unofficial reimplementation of Morrowind
|
||||
Copyright (C) 2008 Nicolay Korslund
|
||||
Email: < korslund@gmail.com >
|
||||
WWW: http://openmw.snaptoad.com/
|
||||
|
||||
This file (lockpick.mn) is part of the OpenMW package.
|
||||
|
||||
OpenMW is distributed as free software: you can redistribute it
|
||||
and/or modify it under the terms of the GNU General Public License
|
||||
version 3, as published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
version 3 along with this program. If not, see
|
||||
http://www.gnu.org/licenses/ .
|
||||
|
||||
*/
|
||||
|
||||
class Lockpick : Tool;
|
30
mscripts/gameobjects/misc.mn
Normal file
30
mscripts/gameobjects/misc.mn
Normal file
|
@ -0,0 +1,30 @@
|
|||
/*
|
||||
OpenMW - The completely unofficial reimplementation of Morrowind
|
||||
Copyright (C) 2008 Nicolay Korslund
|
||||
Email: < korslund@gmail.com >
|
||||
WWW: http://openmw.snaptoad.com/
|
||||
|
||||
This file (misc.mn) is part of the OpenMW package.
|
||||
|
||||
OpenMW is distributed as free software: you can redistribute it
|
||||
and/or modify it under the terms of the GNU General Public License
|
||||
version 3, as published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
version 3 along with this program. If not, see
|
||||
http://www.gnu.org/licenses/ .
|
||||
|
||||
*/
|
||||
|
||||
// Misc inventory items, like bottles, pots, pillows, keys etc. They
|
||||
// are mostly useless (except keys), but may be bought and sold.
|
||||
class Misc : InventoryItem;
|
||||
|
||||
// Not quite sure what the significance of this is. It is set to
|
||||
// non-zero for some keys, but not for all.
|
||||
int isKey;
|
26
mscripts/gameobjects/person.mn
Normal file
26
mscripts/gameobjects/person.mn
Normal file
|
@ -0,0 +1,26 @@
|
|||
/*
|
||||
OpenMW - The completely unofficial reimplementation of Morrowind
|
||||
Copyright (C) 2008 Nicolay Korslund
|
||||
Email: < korslund@gmail.com >
|
||||
WWW: http://openmw.snaptoad.com/
|
||||
|
||||
This file (person.mn) is part of the OpenMW package.
|
||||
|
||||
OpenMW is distributed as free software: you can redistribute it
|
||||
and/or modify it under the terms of the GNU General Public License
|
||||
version 3, as published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
version 3 along with this program. If not, see
|
||||
http://www.gnu.org/licenses/ .
|
||||
|
||||
*/
|
||||
|
||||
class Person : Actor;
|
||||
|
||||
int disposition, reputation, rank;
|
25
mscripts/gameobjects/probe.mn
Normal file
25
mscripts/gameobjects/probe.mn
Normal file
|
@ -0,0 +1,25 @@
|
|||
/*
|
||||
OpenMW - The completely unofficial reimplementation of Morrowind
|
||||
Copyright (C) 2008 Nicolay Korslund
|
||||
Email: < korslund@gmail.com >
|
||||
WWW: http://openmw.snaptoad.com/
|
||||
|
||||
This file (probe.mn) is part of the OpenMW package.
|
||||
|
||||
OpenMW is distributed as free software: you can redistribute it
|
||||
and/or modify it under the terms of the GNU General Public License
|
||||
version 3, as published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
version 3 along with this program. If not, see
|
||||
http://www.gnu.org/licenses/ .
|
||||
|
||||
*/
|
||||
|
||||
// Probes - tools used for disarming traps
|
||||
class Probe : Tool;
|
25
mscripts/gameobjects/repairitem.mn
Normal file
25
mscripts/gameobjects/repairitem.mn
Normal file
|
@ -0,0 +1,25 @@
|
|||
/*
|
||||
OpenMW - The completely unofficial reimplementation of Morrowind
|
||||
Copyright (C) 2008 Nicolay Korslund
|
||||
Email: < korslund@gmail.com >
|
||||
WWW: http://openmw.snaptoad.com/
|
||||
|
||||
This file (repairitem.mn) is part of the OpenMW package.
|
||||
|
||||
OpenMW is distributed as free software: you can redistribute it
|
||||
and/or modify it under the terms of the GNU General Public License
|
||||
version 3, as published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
version 3 along with this program. If not, see
|
||||
http://www.gnu.org/licenses/ .
|
||||
|
||||
*/
|
||||
|
||||
// Hammers etc. used to repair weapons and armor
|
||||
class RepairItem : Tool;
|
25
mscripts/gameobjects/static.mn
Normal file
25
mscripts/gameobjects/static.mn
Normal file
|
@ -0,0 +1,25 @@
|
|||
/*
|
||||
OpenMW - The completely unofficial reimplementation of Morrowind
|
||||
Copyright (C) 2008 Nicolay Korslund
|
||||
Email: < korslund@gmail.com >
|
||||
WWW: http://openmw.snaptoad.com/
|
||||
|
||||
This file (static.mn) is part of the OpenMW package.
|
||||
|
||||
OpenMW is distributed as free software: you can redistribute it
|
||||
and/or modify it under the terms of the GNU General Public License
|
||||
version 3, as published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
version 3 along with this program. If not, see
|
||||
http://www.gnu.org/licenses/ .
|
||||
|
||||
*/
|
||||
|
||||
// Static meshes - walls, buildings, rocks, etc.
|
||||
class Static : GameObject;
|
28
mscripts/gameobjects/tool.mn
Normal file
28
mscripts/gameobjects/tool.mn
Normal file
|
@ -0,0 +1,28 @@
|
|||
/*
|
||||
OpenMW - The completely unofficial reimplementation of Morrowind
|
||||
Copyright (C) 2008 Nicolay Korslund
|
||||
Email: < korslund@gmail.com >
|
||||
WWW: http://openmw.snaptoad.com/
|
||||
|
||||
This file (tool.mn) is part of the OpenMW package.
|
||||
|
||||
OpenMW is distributed as free software: you can redistribute it
|
||||
and/or modify it under the terms of the GNU General Public License
|
||||
version 3, as published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
version 3 along with this program. If not, see
|
||||
http://www.gnu.org/licenses/ .
|
||||
|
||||
*/
|
||||
|
||||
// Common base class for probes, lock picks and repair hammers.
|
||||
class Tool : InventoryItem;
|
||||
|
||||
float quality;
|
||||
int uses;
|
2
openmw.d
2
openmw.d
|
@ -42,6 +42,7 @@ import core.memory;
|
|||
import core.config;
|
||||
|
||||
import monster.util.string;
|
||||
import monster.vm.mobject;
|
||||
import mscripts.object;
|
||||
|
||||
import sound.audio;
|
||||
|
@ -416,4 +417,5 @@ void main(char[][] args)
|
|||
// Write some memory statistics
|
||||
poolSize();
|
||||
writefln(esmRegion);
|
||||
writefln("Total objects: ", getTotalObjects);
|
||||
}
|
||||
|
|
|
@ -140,9 +140,6 @@ class CellData
|
|||
{
|
||||
reg = r;
|
||||
killCell(); // Make sure all data is initialized.
|
||||
|
||||
// Set up the Monster classes if it's not done already
|
||||
setup();
|
||||
}
|
||||
|
||||
// Kills all data and initialize the object for reuse.
|
||||
|
@ -259,16 +256,6 @@ class CellData
|
|||
|
||||
private:
|
||||
|
||||
static
|
||||
MonsterClass gameObjC;
|
||||
|
||||
void setup()
|
||||
{
|
||||
if(gameObjC !is null) return;
|
||||
|
||||
gameObjC = MonsterClass.find("GameObject");
|
||||
}
|
||||
|
||||
void loadReferences()
|
||||
{
|
||||
with(esFile)
|
||||
|
@ -308,7 +295,7 @@ class CellData
|
|||
{
|
||||
LiveStatic ls;
|
||||
ls.m = s;
|
||||
ls.obj = gameObjC.createObject;
|
||||
ls.obj = s.proto.clone();
|
||||
mo = ls.obj;
|
||||
statics.insert(ls);
|
||||
stat = true;
|
||||
|
@ -318,7 +305,7 @@ class CellData
|
|||
{
|
||||
LiveMisc ls;
|
||||
ls.m = m;
|
||||
ls.obj = gameObjC.createObject;
|
||||
ls.obj = m.proto.clone();
|
||||
mo = ls.obj;
|
||||
miscItems.insert(ls);
|
||||
}
|
||||
|
@ -360,7 +347,7 @@ class CellData
|
|||
{
|
||||
LiveActivator ls;
|
||||
ls.m = a;
|
||||
ls.obj = gameObjC.createObject;
|
||||
ls.obj = a.proto.clone();
|
||||
mo = ls.obj;
|
||||
activators.insert(ls);
|
||||
activator = true;
|
||||
|
@ -370,7 +357,7 @@ class CellData
|
|||
{
|
||||
LiveNPC ls;
|
||||
ls.m = n;
|
||||
ls.obj = gameObjC.createObject;
|
||||
ls.obj = n.proto.clone();
|
||||
mo = ls.obj;
|
||||
npcs.insert(ls);
|
||||
}
|
||||
|
@ -378,7 +365,7 @@ class CellData
|
|||
{
|
||||
LivePotion ls;
|
||||
ls.m = p;
|
||||
ls.obj = gameObjC.createObject;
|
||||
ls.obj = p.proto.clone();
|
||||
mo = ls.obj;
|
||||
potions.insert(ls);
|
||||
}
|
||||
|
@ -386,7 +373,7 @@ class CellData
|
|||
{
|
||||
LiveApparatus ls;
|
||||
ls.m = m;
|
||||
ls.obj = gameObjC.createObject;
|
||||
ls.obj = m.proto.clone();
|
||||
mo = ls.obj;
|
||||
appas.insert(ls);
|
||||
}
|
||||
|
@ -394,7 +381,7 @@ class CellData
|
|||
{
|
||||
LiveIngredient ls;
|
||||
ls.m = m;
|
||||
ls.obj = gameObjC.createObject;
|
||||
ls.obj = m.proto.clone();
|
||||
mo = ls.obj;
|
||||
ingredients.insert(ls);
|
||||
}
|
||||
|
@ -402,7 +389,7 @@ class CellData
|
|||
{
|
||||
LiveArmor ls;
|
||||
ls.m = m;
|
||||
ls.obj = gameObjC.createObject;
|
||||
ls.obj = m.proto.clone();
|
||||
mo = ls.obj;
|
||||
armors.insert(ls);
|
||||
}
|
||||
|
@ -418,7 +405,7 @@ class CellData
|
|||
{
|
||||
LiveBook ls;
|
||||
ls.m = m;
|
||||
ls.obj = gameObjC.createObject;
|
||||
ls.obj = m.proto.clone();
|
||||
mo = ls.obj;
|
||||
books.insert(ls);
|
||||
}
|
||||
|
@ -426,7 +413,7 @@ class CellData
|
|||
{
|
||||
LiveClothing ls;
|
||||
ls.m = m;
|
||||
ls.obj = gameObjC.createObject;
|
||||
ls.obj = m.proto.clone();
|
||||
mo = ls.obj;
|
||||
clothes.insert(ls);
|
||||
}
|
||||
|
@ -434,7 +421,7 @@ class CellData
|
|||
{
|
||||
LiveTool ls;
|
||||
ls.m = m;
|
||||
ls.obj = gameObjC.createObject;
|
||||
ls.obj = m.proto.clone();
|
||||
mo = ls.obj;
|
||||
tools.insert(ls);
|
||||
}
|
||||
|
@ -442,7 +429,7 @@ class CellData
|
|||
{
|
||||
LiveTool ls;
|
||||
ls.m = m;
|
||||
ls.obj = gameObjC.createObject;
|
||||
ls.obj = m.proto.clone();
|
||||
mo = ls.obj;
|
||||
tools.insert(ls);
|
||||
}
|
||||
|
@ -450,7 +437,7 @@ class CellData
|
|||
{
|
||||
LiveTool ls;
|
||||
ls.m = m;
|
||||
ls.obj = gameObjC.createObject;
|
||||
ls.obj = m.proto.clone();
|
||||
mo = ls.obj;
|
||||
tools.insert(ls);
|
||||
}
|
||||
|
@ -458,7 +445,7 @@ class CellData
|
|||
{
|
||||
LiveCreature ls;
|
||||
ls.m = c;
|
||||
ls.obj = gameObjC.createObject;
|
||||
ls.obj = c.proto.clone();
|
||||
mo = ls.obj;
|
||||
creatures.insert(ls);
|
||||
}
|
||||
|
@ -469,7 +456,9 @@ class CellData
|
|||
ls.m = l.instCreature(playerData.level);
|
||||
if(ls.m != null)
|
||||
{
|
||||
ls.obj = gameObjC.createObject; mo = ls.obj;
|
||||
// Note that this clones a creature object, not a
|
||||
// leveled list object.
|
||||
ls.obj = ls.m.proto.clone(); mo = ls.obj;
|
||||
creatures.insert(ls);
|
||||
}
|
||||
}
|
||||
|
@ -480,8 +469,9 @@ class CellData
|
|||
|
||||
with(*mo)
|
||||
{
|
||||
// Scale
|
||||
setFloat("scale", getHNOFloat("XSCL", 1.0));
|
||||
// Scale. Multiply with the existing scale value.
|
||||
float scale = getFloat("scale");
|
||||
setFloat("scale", scale*getHNOFloat("XSCL", 1.0));
|
||||
|
||||
// Statics only need the position data. Skip the
|
||||
// unneeded calls to isNextSub() as an optimization.
|
||||
|
@ -495,7 +485,7 @@ class CellData
|
|||
setString8("global", getHNOString("BNAM"));
|
||||
|
||||
// ID of creature trapped in a soul gem (?)
|
||||
setString8("soul", getHNOString("XSOL"));
|
||||
setString8("soulID", getHNOString("XSOL"));
|
||||
|
||||
// ?? CNAM has a faction name, might be for
|
||||
// objects/beds etc belonging to a faction.
|
||||
|
|
Loading…
Reference in a new issue