Files

363 lines
14 KiB
C#
Raw Permalink Normal View History

2026-02-21 16:58:22 -08:00
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NpcQuestProgress {
public HashSet<QuestID> acceptingQuests;
public HashSet<QuestID> inProgressQuests;
public HashSet<QuestID> completedQuests;
public NpcQuestProgress(HashSet<QuestID> acceptingQuests,
HashSet<QuestID> inProgressQuests = null,
HashSet<QuestID> completingQuests = null) {
this.acceptingQuests = acceptingQuests;
this.inProgressQuests = inProgressQuests;
this.completedQuests = completingQuests;
if (this.acceptingQuests == null) this.acceptingQuests = new HashSet<QuestID>();
if (this.inProgressQuests == null) this.inProgressQuests = new HashSet<QuestID>();
if (this.completedQuests == null) this.completedQuests = new HashSet<QuestID>();
}
}
public class NpcState {
public HashSet<DialogueID> completedDialogues = new HashSet<DialogueID>();
public Hashtable npcQuestMap = new Hashtable() {
{NpcID.KARA,
new NpcQuestProgress(
new HashSet<QuestID>() {
QuestID.QUEST_KARA_MAGIC_MUSHROOM,
QuestID.QUEST_KARA_BULKY_MUSHROOM,
QuestID.QUEST_KARA_LITTLE_CRITTERS,
QuestID.QUEST_KARA_BANDITS,
QuestID.QUEST_KARA_PLUCKING_HARPIES,
})
},
{NpcID.ESTER,
new NpcQuestProgress(
new HashSet<QuestID>() {
QuestID.QUEST_ESTER_ALL_ABOUT_STATS,
QuestID.QUEST_ESTER_ALL_ABOUT_EQUIPS,
QuestID.QUEST_ESTER_PREEMPTIVE_STRIKE,
QuestID.QUEST_ESTER_EMPTIVE_STRIKE,
QuestID.QUEST_ESTER_TINY_LEADER,
QuestID.QUEST_ESTER_LITTLE_NIGHTMARE,
QuestID.QUEST_ESTER_THE_JOURNEY_BEGINS,
})
},
{NpcID.LYN,
new NpcQuestProgress(
new HashSet<QuestID>() {
QuestID.QUEST_LYN_GETTING_THE_GOODS,
QuestID.QUEST_LYN_BEAUTIFUL_LANDSCAPES,
})
},
{NpcID.VILLAGER1,
new NpcQuestProgress(
new HashSet<QuestID>() {
})
},
{NpcID.VILLAGER2,
new NpcQuestProgress(
new HashSet<QuestID>() {
})
},
{NpcID.SUE,
new NpcQuestProgress(
new HashSet<QuestID>() {
})
},
{NpcID.VERA,
new NpcQuestProgress(
new HashSet<QuestID>() {
})
},
{NpcID.REI,
new NpcQuestProgress(
new HashSet<QuestID>() {
})
},
{NpcID.ISHRA,
new NpcQuestProgress(
new HashSet<QuestID>() {
})
},
{NpcID.SCOUT1,
new NpcQuestProgress(
new HashSet<QuestID>() {
})
},
{NpcID.SCOUT2,
new NpcQuestProgress(
new HashSet<QuestID>() {
})
},
};
}
public class NpcShop {
public Hashtable items; // Hashtable<ItemData, Cost>
public NpcShop(Hashtable items) {
this.items = items;
}
}
public class NpcCraftingList {
public Hashtable items; // Hashtable<ItemData, Hashtable<ItemID, count>>
public NpcCraftingList(Hashtable items) {
this.items = items;
}
}
public class Npc {
public NpcID npcID;
public string name;
public NpcBehavior behavior;
public NpcShop shop;
public NpcCraftingList craftingList;
public List<QuestID> utilityRequirements;
public Npc(NpcID npcID, string name, NpcBehavior behavior = null, NpcShop shop = null, NpcCraftingList craftingList = null, List<QuestID> utilityRequirements = null) {
this.npcID = npcID;
this.name = name;
this.behavior = behavior;
if (this.behavior != null) {
this.behavior.npcID = this.npcID;
}
this.shop = shop;
this.craftingList = craftingList;
this.utilityRequirements = utilityRequirements;
}
public bool AcceptQuest(QuestID questID) {
if (State.state.quests.AcceptQuest(questID)) {
((NpcQuestProgress)State.state.npcState.npcQuestMap[npcID]).acceptingQuests.Remove(questID);
((NpcQuestProgress)State.state.npcState.npcQuestMap[npcID]).inProgressQuests.Add(questID);
return true;
}
return false;
}
public bool CompleteQuest(QuestID questID) {
if (State.state.quests.CompleteQuest(questID)) {
((NpcQuestProgress)State.state.npcState.npcQuestMap[npcID]).inProgressQuests.Remove(questID);
((NpcQuestProgress)State.state.npcState.npcQuestMap[npcID]).completedQuests.Add(questID);
return true;
}
return false;
}
}
public enum NpcCG {
NONE,
AIRA_POSE1,
AIRA_POSE2,
SUE,
VERA,
LYN,
KARA,
ESTER,
}
public enum NpcID {
NONE,
PLAYER,
// Valley
KARA,
ESTER,
LYN,
CHIEF,
VILLAGER1,
VILLAGER2,
// Dense Forest
SUE,
VERA,
ISHRA,
REI,
SCOUT1,
SCOUT2,
VAMPIRE1,
// Hestus City
ERUN,
REESE
}
public class NpcInfo {
public static Hashtable npcs = new Hashtable() {
{NpcID.PLAYER,
new Npc(NpcID.PLAYER, "Aira")},
// Town
{NpcID.KARA,
new Npc(NpcID.KARA,
"Kara",
new NpcBehavior_Generic(
new Hashtable() {
{ QuestID.QUEST_KARA_MAGIC_MUSHROOM, DialogueID.KARA_ACCEPT_MAGIC_MUSHROOM},
{ QuestID.QUEST_KARA_BULKY_MUSHROOM, DialogueID.KARA_ACCEPT_BULKY_MUSHROOM},
{ QuestID.QUEST_KARA_LITTLE_CRITTERS, DialogueID.KARA_ACCEPT_BULKY_MUSHROOM},
{ QuestID.QUEST_KARA_BANDITS, DialogueID.KARA_ACCEPT_BANDITS},
{ QuestID.QUEST_KARA_PLUCKING_HARPIES, DialogueID.KARA_ACCEPT_PLUCKING_HARPIES},
},
new Hashtable() {
{ QuestID.QUEST_KARA_MAGIC_MUSHROOM, DialogueID.KARA_COMPLETE_MAGIC_MUSHROOM},
{ QuestID.QUEST_KARA_BULKY_MUSHROOM, DialogueID.KARA_COMPLETE_BULKY_MUSHROOM},
{ QuestID.QUEST_KARA_LITTLE_CRITTERS, DialogueID.KARA_COMPLETE_LITTLE_CRITTERS},
{ QuestID.QUEST_KARA_BANDITS, DialogueID.KARA_COMPLETE_BANDITS},
{ QuestID.QUEST_KARA_PLUCKING_HARPIES, DialogueID.KARA_COMPLETE_PLUCKING_HARPIES},
{ QuestID.QUEST_ESTER_THE_JOURNEY_BEGINS, DialogueID.KARA_COMPLETE_THE_JOURNEY_BEGINS},
},
DialogueID.KARA_SHOW_QUESTS,
DialogueID.KARA_CANCEL,
DialogueID.KARA_DEFAULT),
/*shop=*/ null,
new NpcCraftingList(new Hashtable() {
{ Lottery.generateItem(ItemSubType.ARCHER_BOW),
new Hashtable() {
{ ItemSubType.FOX_FUR, 5 },
{ ItemSubType.SQUIRREL_FUR, 5 },
{ ItemSubType.BRANCH, 10 },
{ ItemSubType.HARPY_FEATHER, 10 },
{ ItemSubType.CRAFTING_MATERIAL_1, 15 },
}
},
{ Lottery.generateItem(ItemSubType.ARCHER_BOOTS),
new Hashtable() {
{ ItemSubType.FOX_FUR, 10 },
{ ItemSubType.SQUIRREL_FUR, 8 },
{ ItemSubType.CRAFTING_MATERIAL_1, 5 },
}
},
{ Lottery.generateItem(ItemSubType.ARCHER_TUNIC),
new Hashtable() {
{ ItemSubType.FOX_FUR, 15 },
{ ItemSubType.SQUIRREL_FUR, 15 },
{ ItemSubType.CRAFTING_MATERIAL_1, 10 },
}
},
{ Lottery.generateItem(ItemSubType.BANDIT_BOW),
new Hashtable() {
{ ItemSubType.LARGE_HARPY_FEATHER, 10 },
{ ItemSubType.BREASTPLATE, 15 },
{ ItemSubType.SOFT_FABRIC, 15 },
{ ItemSubType.CRAFTING_MATERIAL_1, 20 },
}
},
{ Lottery.generateItem(ItemSubType.BANDIT_BOOTS),
new Hashtable() {
{ ItemSubType.LARGE_HARPY_FEATHER, 10 },
{ ItemSubType.BREASTPLATE, 10 },
{ ItemSubType.SOFT_FABRIC, 10 },
{ ItemSubType.CRAFTING_MATERIAL_1, 10 },
}
},
{ Lottery.generateItem(ItemSubType.BANDIT_OUTFIT),
new Hashtable() {
{ ItemSubType.FUZZY_SCARF, 10 },
{ ItemSubType.BREASTPLATE, 10 },
{ ItemSubType.SOFT_FABRIC, 10 },
{ ItemSubType.CRAFTING_MATERIAL_1, 15 },
}
},
{ Lottery.generateItem(ItemSubType.ARCHER_GLOVES),
new Hashtable() {
{ ItemSubType.FOX_FUR, 10 },
{ ItemSubType.SQUIRREL_FUR, 10 },
{ ItemSubType.BRANCH, 10 },
{ ItemSubType.BREASTPLATE, 8 },
{ ItemSubType.HARPY_FEATHER, 5 },
{ ItemSubType.LARGE_HARPY_FEATHER, 10 },
{ ItemSubType.CRAFTING_MATERIAL_1, 30 },
}
},
{ Lottery.generateItem(ItemSubType.GODDESS_BOW),
new Hashtable() {
{ ItemSubType.GREEN_MUSHROOM_SAMPLE, 10 },
}
},
}),
/*utilityRequirements=*/new List<QuestID>() { QuestID.QUEST_ESTER_ALL_ABOUT_EQUIPS })
},
{NpcID.ESTER,
new Npc(NpcID.ESTER,
"Ester",
new NpcBehavior_Generic(
new Hashtable() {
{ QuestID.QUEST_ESTER_ALL_ABOUT_STATS, DialogueID.ESTER_ACCEPT_ALL_ABOUT_STATS},
{ QuestID.QUEST_ESTER_ALL_ABOUT_EQUIPS, DialogueID.ESTER_ACCEPT_ALL_ABOUT_EQUIPS},
{ QuestID.QUEST_ESTER_PREEMPTIVE_STRIKE, DialogueID.ESTER_ACCEPT_PREEMPTIVE_STRIKE},
{ QuestID.QUEST_ESTER_EMPTIVE_STRIKE, DialogueID.ESTER_ACCEPT_EMPTIVE_STRIKE},
{ QuestID.QUEST_ESTER_TINY_LEADER, DialogueID.ESTER_ACCEPT_TINY_LEADER},
{ QuestID.QUEST_ESTER_LITTLE_NIGHTMARE, DialogueID.ESTER_ACCEPT_LITTLE_NIGHTMARE},
{ QuestID.QUEST_ESTER_THE_JOURNEY_BEGINS, DialogueID.ESTER_ACCEPT_THE_JOURNEY_BEGINS},
},
new Hashtable() {
{ QuestID.QUEST_ESTER_ALL_ABOUT_STATS, DialogueID.ESTER_COMPLETE_ALL_ABOUT_STATS},
{ QuestID.QUEST_ESTER_ALL_ABOUT_EQUIPS, DialogueID.ESTER_COMPLETE_ALL_ABOUT_EQUIPS},
{ QuestID.QUEST_ESTER_PREEMPTIVE_STRIKE, DialogueID.ESTER_COMPLETE_PREEMPTIVE_STRIKE},
{ QuestID.QUEST_ESTER_EMPTIVE_STRIKE, DialogueID.ESTER_COMPLETE_EMPTIVE_STRIKE},
{ QuestID.QUEST_ESTER_TINY_LEADER, DialogueID.ESTER_COMPLETE_TINY_LEADER},
{ QuestID.QUEST_ESTER_LITTLE_NIGHTMARE, DialogueID.ESTER_COMPLETE_LITTLE_NIGHTMARE},
},
DialogueID.KARA_SHOW_QUESTS,
DialogueID.KARA_CANCEL,
DialogueID.KARA_DEFAULT))
},
{NpcID.LYN,
new Npc(NpcID.LYN,
"Lyn",
new NpcBehavior_Generic(
new Hashtable() {
{ QuestID.QUEST_LYN_GETTING_THE_GOODS, DialogueID.LYN_ACCEPT_GETTING_THE_GOODS},
{ QuestID.QUEST_LYN_BEAUTIFUL_LANDSCAPES, DialogueID.LYN_ACCEPT_BEAUTIFUL_LANDSCAPES},
},
new Hashtable() {
{ QuestID.QUEST_LYN_GETTING_THE_GOODS, DialogueID.LYN_COMPLETE_GETTING_THE_GOODS},
{ QuestID.QUEST_LYN_BEAUTIFUL_LANDSCAPES, DialogueID.LYN_COMPLETE_BEAUTIFUL_LANDSCAPES},
},
DialogueID.KARA_SHOW_QUESTS,
DialogueID.KARA_CANCEL,
DialogueID.KARA_DEFAULT),
new NpcShop(new Hashtable() {
{ Lottery.generateItem(ItemSubType.MUSHROOM_SOUP), 100 },
{ Lottery.generateItem(ItemSubType.TASTY_MUSHROOM_SOUP), 250 },
{ Lottery.generateItem(ItemSubType.BREAD_LOAF), 350 },
{ Lottery.generateItem(ItemSubType.APPLE), 400 },
{ Lottery.generateItem(ItemSubType.SOFT_FABRIC), 300 },
{ Lottery.generateItem(ItemSubType.FUZZY_SCARF), 350 },
{ Lottery.generateItem(ItemSubType.BREASTPLATE), 400 },
{ Lottery.generateItem(ItemSubType.HARPY_FEATHER), 200 },
{ Lottery.generateItem(ItemSubType.LARGE_HARPY_FEATHER), 500 },
}),
/*craftingList=*/null,
/*utilityRequirements=*/new List<QuestID>() { QuestID.QUEST_LYN_GETTING_THE_GOODS })
},
// Dense Forest
{NpcID.SUE,
new Npc(NpcID.SUE, "Sue",
new NpcBehavior_Generic(
new Hashtable(),
new Hashtable(),
DialogueID.ERROR,
DialogueID.ERROR,
DialogueID.ERROR))},
{NpcID.VERA,
new Npc(NpcID.VERA, "Vera",
new NpcBehavior_Generic(
new Hashtable(),
new Hashtable(),
DialogueID.ERROR,
DialogueID.ERROR,
DialogueID.ERROR))},
};
}