2023-02-28 19:52:28 +00:00
|
|
|
|
// This program and the accompanying materials are made available under the terms of the
|
|
|
|
|
// Eclipse Public License v2.0 which accompanies this distribution, and is available at
|
|
|
|
|
// https://www.eclipse.org/legal/epl-v20.html
|
|
|
|
|
//
|
|
|
|
|
// SPDX-License-Identifier: EPL-2.0
|
|
|
|
|
|
|
|
|
|
using System;
|
2022-11-23 22:24:56 +00:00
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
|
|
|
|
namespace Ficedula.FF7 {
|
|
|
|
|
|
|
|
|
|
public enum AccessoryEffect {
|
|
|
|
|
None = 0xff,
|
|
|
|
|
Haste = 0,
|
|
|
|
|
Berserk = 1,
|
|
|
|
|
Curse = 2,
|
|
|
|
|
Reflect = 3,
|
|
|
|
|
IncreaseSteal = 4,
|
|
|
|
|
IncreaseManipulate = 5,
|
|
|
|
|
Barriers = 6,
|
|
|
|
|
//TODO- Cat's Bell? How is that indicated?
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public class Accessory : EquipItem {
|
|
|
|
|
public EquipElement ElementEffect { get; set; }
|
|
|
|
|
public Elements Elements { get; set; }
|
|
|
|
|
public AccessoryEffect AccessoryEffect { get; set; }
|
|
|
|
|
public Statuses ProtectStatuses { get; set; }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public class AccessoryCollection {
|
|
|
|
|
private List<Accessory> _accessories = new();
|
|
|
|
|
|
|
|
|
|
public IReadOnlyList<Accessory> Accessories => _accessories.AsReadOnly();
|
|
|
|
|
|
|
|
|
|
public AccessoryCollection(Kernel kernel) {
|
|
|
|
|
var descriptions = new KernelText(kernel.Sections.ElementAt(14));
|
|
|
|
|
var names = new KernelText(kernel.Sections.ElementAt(22));
|
|
|
|
|
|
|
|
|
|
var data = new MemoryStream(kernel.Sections.ElementAt(7));
|
|
|
|
|
|
|
|
|
|
int index = 0;
|
|
|
|
|
while (data.Position < data.Length) {
|
|
|
|
|
Accessory accessory = new Accessory {
|
|
|
|
|
Name = names.Get(index),
|
|
|
|
|
Description = descriptions.Get(index),
|
2022-11-26 15:15:59 +00:00
|
|
|
|
ID = index,
|
2022-11-23 22:24:56 +00:00
|
|
|
|
};
|
|
|
|
|
index++;
|
|
|
|
|
|
|
|
|
|
ushort stats = data.ReadU16(), values = data.ReadU16();
|
|
|
|
|
foreach(int _ in Enumerable.Range(0, 2)) {
|
|
|
|
|
switch (stats & 0xff) {
|
|
|
|
|
case 0:
|
|
|
|
|
accessory.StrBonus = values & 0xff;
|
|
|
|
|
break;
|
|
|
|
|
case 1:
|
|
|
|
|
accessory.VitBonus = values & 0xff;
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
accessory.MagBonus = values & 0xff;
|
|
|
|
|
break;
|
|
|
|
|
case 3:
|
|
|
|
|
accessory.SprBonus = values & 0xff;
|
|
|
|
|
break;
|
|
|
|
|
case 4:
|
|
|
|
|
accessory.DexBonus = values & 0xff;
|
|
|
|
|
break;
|
|
|
|
|
case 5:
|
|
|
|
|
accessory.LckBonus = values & 0xff;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
stats >>= 8;
|
|
|
|
|
values >>= 8;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
accessory.ElementEffect = (EquipElement)data.ReadU8();
|
|
|
|
|
accessory.AccessoryEffect = (AccessoryEffect)data.ReadU8();
|
|
|
|
|
accessory.Elements = (Elements)data.ReadU16();
|
|
|
|
|
accessory.ProtectStatuses = (Statuses)data.ReadU32();
|
|
|
|
|
accessory.EquippableOn = data.ReadU16();
|
|
|
|
|
accessory.Restrictions = (EquipRestrictions)(~data.ReadU16() & 0x7);
|
|
|
|
|
|
|
|
|
|
_accessories.Add(accessory);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|