-
-
Notifications
You must be signed in to change notification settings - Fork 444
/
Copy pathmodule_picker.dm
130 lines (114 loc) · 3.79 KB
/
module_picker.dm
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
/// The datum and interface for the malf unlock menu, which lets them choose actions to unlock.
/datum/module_picker
var/name = "Malfunction Modules Menu"
var/selected_cat
var/compact_mode = FALSE
var/processing_time = 50
var/list/possible_modules
/datum/module_picker/New()
possible_modules = get_malf_modules()
/// Removes all malfunction-related abilities from the target AI.
/datum/module_picker/proc/remove_malf_verbs(mob/living/silicon/ai/AI)
for(var/datum/AI_Module/AM in possible_modules)
for(var/datum/action/A in AI.actions)
if(istype(A, initial(AM.power_type)))
qdel(A)
/proc/cmp_malfmodules_priority(datum/AI_Module/A, datum/AI_Module/B)
return B.cost - A.cost
/proc/get_malf_modules()
var/list/filtered_modules = list()
for(var/path in GLOB.malf_modules)
var/datum/AI_Module/AM = new path
if((AM.power_type == /datum/action/innate/ai) && !AM.upgrade)
continue
if(!filtered_modules[AM.category])
filtered_modules[AM.category] = list()
filtered_modules[AM.category][AM] = AM
for(var/category in filtered_modules)
filtered_modules[category] = sortTim(filtered_modules[category], /proc/cmp_malfmodules_priority)
return filtered_modules
/datum/module_picker/ui_state(mob/user)
return GLOB.always_state
/datum/module_picker/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "MalfunctionModulePicker", name)
ui.open()
/datum/module_picker/ui_data(mob/user)
var/list/data = list()
data["processingTime"] = processing_time
data["compactMode"] = compact_mode
return data
/datum/module_picker/ui_static_data(mob/user)
var/list/data = list()
data["categories"] = list()
for(var/category in possible_modules)
var/list/cat = list(
"name" = category,
"items" = (category == selected_cat ? list() : null))
for(var/module in possible_modules[category])
var/datum/AI_Module/AM = possible_modules[category][module]
cat["items"] += list(list(
"name" = AM.name,
"cost" = AM.cost,
"desc" = AM.description,
))
data["categories"] += list(cat)
return data
/datum/module_picker/ui_act(action, list/params)
if(..())
return
if(!isAI(usr))
return
switch(action)
if("buy")
var/item_name = params["name"]
var/list/buyable_items = list()
for(var/category in possible_modules)
buyable_items += possible_modules[category]
for(var/key in buyable_items)
var/datum/AI_Module/AM = buyable_items[key]
if(AM.name == item_name)
purchase_module(usr, AM)
return TRUE
if("select")
selected_cat = params["category"]
return TRUE
if("compact_toggle")
compact_mode = !compact_mode
return TRUE
/datum/module_picker/proc/purchase_module(mob/living/silicon/ai/AI, datum/AI_Module/AM)
if(!istype(AM))
return
if(!AI || AI.stat == DEAD)
return
if(AM.cost > processing_time)
return
var/datum/action/innate/ai/action = locate(AM.power_type) in AI.actions
// Give the power and take away the money.
if(AM.upgrade) //upgrade and upgrade() are separate, be careful!
AM.upgrade(AI)
possible_modules[AM.category] -= AM
if(AM.unlock_text)
to_chat(AI, AM.unlock_text)
if(AM.unlock_sound)
AI.playsound_local(AI, AM.unlock_sound, 50, 0)
update_static_data(AI)
else
if(AM.power_type)
if(!action) //Unlocking for the first time
var/datum/action/AC = new AM.power_type
AC.Grant(AI)
AI.current_modules += new AM.type
if(AM.one_purchase)
possible_modules[AM.category] -= AM
update_static_data(AI)
if(AM.unlock_text)
to_chat(AI, AM.unlock_text)
if(AM.unlock_sound)
AI.playsound_local(AI, AM.unlock_sound, 50, 0)
else //Adding uses to an existing module
action.uses += initial(action.uses)
action.desc = "[initial(action.desc)] It has [action.uses] use\s remaining."
action.build_all_button_icons()
processing_time -= AM.cost