aboutsummaryrefslogtreecommitdiff
path: root/src/objects.cc
diff options
context:
space:
mode:
authorfusion32 <marcopuzziello@gmail.com>2025-05-24 20:57:24 -0300
committerfusion32 <marcopuzziello@gmail.com>2025-05-24 20:57:24 -0300
commit3f557369c7bbd08fdf2e6dbd9271873b20a9a144 (patch)
tree28bb9b4ad9c0324036d753eea772855a180c37f3 /src/objects.cc
parentb7432b4e74284138f1740f4577b9cb32e1f120d0 (diff)
downloadgame-3f557369c7bbd08fdf2e6dbd9271873b20a9a144.tar.gz
game-3f557369c7bbd08fdf2e6dbd9271873b20a9a144.zip
halfway of `map.cc` and start of `objects.cc`
Diffstat (limited to 'src/objects.cc')
-rw-r--r--src/objects.cc196
1 files changed, 196 insertions, 0 deletions
diff --git a/src/objects.cc b/src/objects.cc
new file mode 100644
index 0000000..0119088
--- /dev/null
+++ b/src/objects.cc
@@ -0,0 +1,196 @@
+#include "objects.hh"
+
+static vector<TObjectType> ObjectTypes(0, 5000, 1000);
+static ObjectType SpecialObjects[49];
+
+static FLAG TypeAttributeFlags[62] = {
+ BANK, // WAYPOINTS
+ CONTAINER, // CAPACITY
+ CHANGEUSE, // CHANGETARGET
+ KEYDOOR, // KEYDOORTARGET
+ NAMEDOOR, // NAMEDOORTARGET
+ LEVELDOOR, // LEVELDOORTARGET
+ QUESTDOOR, // QUESTDOORTARGET
+ FOOD, // NUTRITION
+ INFORMATION, // INFORMATIONTYPE
+ TEXT, // FONTSIZE
+ WRITE, // MAXLENGTH
+ WRITEONCE, // MAXLENGTHONCE
+ LIQUIDSOURCE, // SOURCELIQUIDTYPE
+ TELEPORTABSOLUTE, // ABSTELEPORTEFFECT
+ TELEPORTRELATIVE, // RELTELEPORTDISPLACEMENT
+ TELEPORTRELATIVE, // RELTELEPORTEFFECT
+ AVOID, // AVOIDDAMAGETYPES
+ RESTRICTLEVEL, // MINIMUMLEVEL
+ RESTRICTPROFESSION, // PROFESSIONS
+ TAKE, // WEIGHT
+ ROTATE, // ROTATETARGET
+ DESTROY, // DESTROYTARGET
+ CLOTHES, // BODYPOSITION
+ SKILLBOOST, // SKILLNUMBER
+ SKILLBOOST, // SKILLMODIFICATION
+ PROTECTION, // PROTECTIONDAMAGETYPES
+ PROTECTION, // DAMAGEREDUCTION
+ LIGHT, // BRIGHTNESS
+ LIGHT, // LIGHTCOLOR
+ CORPSE, // CORPSETYPE
+ EXPIRE, // TOTALEXPIRETIME
+ EXPIRE, // EXPIRETARGET
+ WEAROUT, // TOTALUSES
+ WEAROUT, // WEAROUTTARGET
+ WEAPON, // WEAPONTYPE
+ WEAPON, // WEAPONATTACKVALUE
+ WEAPON, // WEAPONDEFENDVALUE
+ SHIELD, // SHIELDDEFENDVALUE
+ BOW, // BOWRANGE
+ BOW, // BOWAMMOTYPE
+ THROW, // THROWRANGE
+ THROW, // THROWATTACKVALUE
+ THROW, // THROWDEFENDVALUE
+ THROW, // THROWMISSILE
+ THROW, // THROWSPECIALEFFECT
+ THROW, // THROWEFFECTSTRENGTH
+ THROW, // THROWFRAGILITY
+ WAND, // WANDRANGE
+ WAND, // WANDMANACONSUMPTION
+ WAND, // WANDATTACKSTRENGTH
+ WAND, // WANDATTACKVARIATION
+ WAND, // WANDDAMAGETYPE
+ WAND, // WANDMISSILE
+ AMMO, // AMMOTYPE
+ AMMO, // AMMOATTACKVALUE
+ AMMO, // AMMOMISSILE
+ AMMO, // AMMOSPECIALEFFECT
+ AMMO, // AMMOEFFECTSTRENGTH
+ ARMOR, // ARMORVALUE
+ HEIGHT, // ELEVATION
+ DISGUISE, // DISGUISETARGET
+ BANK, // MEANING
+};
+
+static FLAG InstanceAttributeFlags[18] = {
+ CONTAINER // CONTENT
+ CHEST // CHESTQUESTNUMBER
+ CUMULATIVE // AMOUNT
+ KEY // KEYNUMBER
+ KEYDOOR // KEYHOLENUMBER
+ LEVELDOOR // DOORLEVEL
+ QUESTDOOR // DOORQUESTNUMBER
+ QUESTDOOR // DOORQUESTVALUE
+ RUNE // CHARGES
+ TEXT // TEXTSTRING
+ TEXT // EDITOR
+ LIQUIDCONTAINER // CONTAINERLIQUIDTYPE
+ LIQUIDPOOL // POOLLIQUIDTYPE
+ TELEPORTABSOLUTE // ABSTELEPORTDESTINATION
+ MAGICFIELD // RESPONSIBLE
+ EXPIRE // REMAININGEXPIRETIME
+ EXPIRESTOP // SAVEDEXPIRETIME
+ WEAROUT // REMAININGUSES
+};
+
+static const char InstanceAttributeNames[18][30] = {
+ "Content", // CONTENT
+ "ChestQuestNumber", // CHESTQUESTNUMBER
+ "Amount", // AMOUNT
+ "KeyNumber", // KEYNUMBER
+ "KeyholeNumber", // KEYHOLENUMBER
+ "Level", // DOORLEVEL
+ "DoorQuestNumber", // DOORQUESTNUMBER
+ "DoorQuestValue", // DOORQUESTVALUE
+ "Charges", // CHARGES
+ "String", // TEXTSTRING
+ "Editor", // EDITOR
+ "ContainerLiquidType", // CONTAINERLIQUIDTYPE
+ "PoolLiquidType", // POOLLIQUIDTYPE
+ "AbsTeleportDestination", // ABSTELEPORTDESTINATION
+ "Responsible", // RESPONSIBLE
+ "RemainingExpireTime", // REMAININGEXPIRETIME
+ "SavedExpireTime", // SAVEDEXPIRETIME
+ "RemainingUses", // REMAININGUSES
+};
+
+// ObjectType
+// =============================================================================
+void ObjectType::setTypeID(int TypeID){
+ if(TypeID < ObjectTypes.min || ObjectTypes.max < TypeID){
+ error("ObjectType::setTypeID: Ungültiger Typ %d.\n", TypeID);
+ TypeID = 0;
+ }
+
+ this->TypeID = TypeID;
+}
+
+bool ObjectType::getFlag(FLAG Flag){
+ TObjectType *Type = ObjectTypes.at(this->TypeID);
+ int FlagIndex = (int)(Flag / 8);
+ uint8 FlagMask = (uint8)(1 << (Flag % 8));
+ return (Type->Flags[FlagIndex] & FlagMask) != 0;
+}
+
+uint32 ObjectType::getAttribute(TYPEATTRIBUTE Attribute){
+ if(!this->getFlag(TypeAttributeFlags[Attribute])){
+ error("ObjectType::getAttribute: Typ %d hat kein Flag %d für Attribut %d.\n",
+ this->TypeID, TypeAttributeFlags[Attribute], Attribute);
+ return 0;
+ }
+
+ TObjectType *Type = ObjectTypes.at(this->TypeID);
+ return Type->Attributes[Attribute];
+}
+
+int ObjectType::getAttributeOffset(INSTANCEATTRIBUTE Attribute){
+ if(!this->getFlag(InstanceAttributeFlags[Attribute])){
+ if(Attribute != CONTENT || !this->getFlag(CHEST)){
+ return -1;
+ }
+ }
+
+ TObjectType *Type = ObjectTypes.at(this->TypeID);
+ return Type->AttributeOffsets[Attribute];
+}
+
+const char *ObjectType::getName(int Count){
+ if(this->TypeID == 99){
+ error("ObjectType::getName: Der Kreaturtyp hat keinen Namen.\n");
+ return NULL;
+ }
+
+ // TODO(fusion): This is yet another rabbit hole. I'm not sure why we have
+ // the object name copied to the stack when `Plural` returns its own static
+ // buffer.
+#if 0
+ char ObjectName[50];
+ TObjectType *Type = ObjectTypes.at(this->TypeID);
+ if(Type->Name != NULL){
+ strcpy(ObjectName, Type->Name);
+ }else{
+ ObjectName[0] = 0;
+ }
+ return Plural(ObjectName, Count);
+#endif
+
+ return "Unnamed";
+}
+
+const char *ObjectType::getDescription(void){
+ TObjectType *Type = ObjectTypes.at(this->TypeID);
+ return Type->Description;
+}
+
+// Object Type Related Functions
+// =============================================================================
+int GetInstanceAttributeByName(const char *Name){
+ int Result = -1;
+ for(int i = 0; i < NARRAY(InstanceAttributeNames); i += 1){
+ if(stricmp(InstanceAttributeNames[i], Name) == 0){
+ Result = i;
+ break;
+ }
+ }
+ return Result;
+}
+
+bool ObjectTypeExists(int TypeID){
+ return ObjectTypes.min <= TypeID && TypeID <= ObjectTypes.max;
+}