forked from DarkLotus/MythikAchievmentSystem
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathAcheivmentSystem.cs
147 lines (125 loc) · 6.25 KB
/
AcheivmentSystem.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#define STOREONITEM
using Server;
using System;
using System.Collections.Generic;
using Server.Mobiles;
using Server.Items;
using Server.Commands;
using Server.Misc;
#if STOREONITEM
#else
using Scripts.Mythik.Mobiles;
#endif
using Scripts.Mythik.Systems.Achievements.Gumps;
namespace Scripts.Mythik.Systems.Achievements
{
//TODO
//subcategories X
//page limit?
// Achievement prereq achieve before showing X
//TODO Skill gain achieves needs event
//TODO ITEM crafted event sink
//
public class AchievmentSystem
{
public class AchievementCategory
{
public int ID { get; set; }
public int Parent { get; set; }
public string Name;
public AchievementCategory(int id, int parent, string v3)
{
ID = id;
Parent = parent;
Name = v3;
}
}
public static List<Achievement> Achievements = new List<Achievement>();
public static List<AchievementCategory> Categories = new List<AchievementCategory>();
public static void Initialize()
{
Categories.Add(new AchievementCategory(1, 0, "Exploration"));
Categories.Add(new AchievementCategory(2, 1, "Towns"));
Categories.Add(new AchievementCategory(3, 1, "Dungeons"));
Categories.Add(new AchievementCategory(4, 0, "Crafting"));
Categories.Add(new AchievementCategory(5, 0, "Resource Gathering"));
Categories.Add(new AchievementCategory(6, 0, "Hunting"));
Categories.Add(new AchievementCategory(7, 0, "Character Development"));
Categories.Add(new AchievementCategory(8, 0, "Other"));
Achievements.Add(new DiscoveryAchievement(0, 2, 0x96E, false, null, "Minoc!", "Discover Minoc Township", 5, "Minoc"));
Achievements.Add(new DiscoveryAchievement(1, 2, 0x96E, false, null, "Yew!", "Discover the Yew Township", 5, "Yew"));
Achievements.Add(new DiscoveryAchievement(2, 2, 0x96E, false, null, "Trinsic!", "Discover the Trinsic Township", 5, "Trinsic"));
Achievements.Add(new DiscoveryAchievement(3, 2, 0x96E, false, null, "Cove!", "Discover the Cove Township", 5, "Cove"));
Achievements.Add(new DiscoveryAchievement(4, 3, 0x96E, false, null, "Wrong!", "Discover the dungeon of Wrong", 5, "Wrong"));
Achievements.Add(new DiscoveryAchievement(5, 3, 0x96E, false, null, "Shame!", "Discover the dungeon of Shame", 5, "Shame"));
var achieve = new HarvestAchievement(100, 5, 0, false, null, 500, "500 Iron Ore", "Mine 500 Iron Ore", 5, typeof(IronOre), typeof(AncientSmithyHammer));
Achievements.Add(achieve);
Achievements.Add(new HarvestAchievement(100, 5, 0, false, achieve, 500, "50000 Iron Ore", "Mine 500 Iron Ore", 5, typeof(IronOre), typeof(AncientSmithyHammer)));
Achievements.Add(new HunterAchievement(300, 6, 0x25D1, false, null, 5, "Dog Slayer", "Slay 5 Dogs", 5, typeof(Dog)));
Achievements.Add(new HunterAchievement(301, 6, 0x25D1, false, null, 50, "Dragon Slayer", "Slay 50 Dragon", 5, typeof(Dragon)));
CommandSystem.Register("feats", AccessLevel.Player, new CommandEventHandler(OpenGump));
}
private static void OpenGump(CommandEventArgs e)
{
var player = e.Mobile as PlayerMobile;
if(player != null)
{
#if STOREONITEM
if (!AchievementSystemMemoryStone.GetInstance().Achievements.ContainsKey(player.Serial))
AchievementSystemMemoryStone.GetInstance().Achievements.Add(player.Serial, new Dictionary<int, AchieveData>());
var achieves = AchievementSystemMemoryStone.GetInstance().Achievements[player.Serial];
var total = AchievementSystemMemoryStone.GetInstance().PointsTotals[player.Serial];
#else
var achieves = (player as MythikPlayerMobile).Achievements;
var total = (player as MythikPlayerMobile).AchievementPointsTotal;
#endif
e.Mobile.SendGump(new AchievementGump(achieves, total));
}
}
internal static void SetAchievementStatus(PlayerMobile player, Achievement ach, int progress)
{
#if STOREONITEM
if (!AchievementSystemMemoryStone.GetInstance().Achievements.ContainsKey(player.Serial))
AchievementSystemMemoryStone.GetInstance().Achievements.Add(player.Serial, new Dictionary<int, AchieveData>());
var achieves = AchievementSystemMemoryStone.GetInstance().Achievements[player.Serial];
#else
var achieves = (player as MythikPlayerMobile).Achievements;
#endif
if (achieves.ContainsKey(ach.ID))
{
if (achieves[ach.ID].Progress >= ach.CompletionTotal)
return;
achieves[ach.ID].Progress += progress;
}
else
{
achieves.Add(ach.ID, new AchieveData() { Progress = progress });
}
if (achieves[ach.ID].Progress >= ach.CompletionTotal)
{
player.SendGump(new AchievementObtainedGump(ach),false);
achieves[ach.ID].CompletedOn = DateTime.Now;
#if STOREONITEM
if (!AchievementSystemMemoryStone.GetInstance().PointsTotals.ContainsKey(player.Serial))
AchievementSystemMemoryStone.GetInstance().PointsTotals.Add(player.Serial, 0);
AchievementSystemMemoryStone.GetInstance().PointsTotals[player.Serial] += ach.RewardPoints;
#else
(player as MythikPlayerMobile).AchievementPointsTotal += ach.RewardPoints;
#endif
if (ach.RewardItems != null && ach.RewardItems.Length > 0)
{
try
{
player.SendAsciiMessage("You have recieved an award for completing this achievment!");
var item = (Item)Activator.CreateInstance(ach.RewardItems[0]);
if (!WeightOverloading.IsOverloaded(player))
player.Backpack.DropItem(item);
else
player.BankBox.DropItem(item);
}
catch { }
}
}
}
}
}