-
-
Notifications
You must be signed in to change notification settings - Fork 62
Expand file tree
/
Copy path_dynamic.dm
More file actions
161 lines (140 loc) · 5.4 KB
/
Copy path_dynamic.dm
File metadata and controls
161 lines (140 loc) · 5.4 KB
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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
/datum/mission/ruin
value = 1500
duration = null
desc = "Find my pages. (Please report if you cannot locate pages)"
location_specific = TRUE
blackbox_prefix = "ruin_"
/// Which landmark we will search for in spawned_mission_pois of the planet
var/setpiece_poi = /obj/effect/landmark/mission_poi/main
/// Item that will be spawned at the setpiece_poi
var/obj/setpiece_item
/// Specific item uses an exact item, if false it will allow type or any subtype
var/specific_item = TRUE
/// The item that you can turn in to complete the mission. If specific_item is false it uses the type of the item.
var/atom/movable/required_item
var/dibs_string
/datum/mission/ruin/generate_mission_details()
. = ..()
setpiece_item = pick(setpiece_item)
/datum/mission/ruin/mission_regexs(mission_string)
mission_string = ..()
if(ispath(setpiece_item))
var/atom/target = setpiece_item
mission_string = replacetext(mission_string, "%MISSION_REQUIRED", "[target::name]")
return mission_string
/datum/mission/ruin/spawn_mission_details(datum/overmap/dynamic/planet)
if(isnull(mission_index))
stack_trace("[src] does not have a mission index!")
for(var/datum/weakref/poi_ref in planet.spawned_mission_pois)
var/obj/effect/landmark/mission_poi/mission_poi = poi_ref.resolve()
use_poi(mission_poi, planet)
if(QDELETED(mission_poi))
planet.spawned_mission_pois -= poi_ref
spawn_custom_details(planet)
/datum/mission/ruin/proc/use_poi(obj/effect/landmark/mission_poi/mission_poi, datum/overmap/dynamic/planet)
if(mission_poi.use_count <= 0)
qdel(mission_poi)
return
if(isnull(mission_poi.mission_index) || (mission_index != mission_poi.mission_index))
return
var/main = FALSE
if(istype(mission_poi, /obj/effect/landmark/mission_poi/main))
main = TRUE
if(required_item)
return
if(main)
if(istype(mission_poi, setpiece_poi))
//Spawns the item or gets it via use_poi then sets it as bound so the mission fails if its deleted
spawn_main_piece(mission_poi, planet)
else
var/atom/poi_result = mission_poi.use_poi(FALSE, src)
if(isatom(poi_result))
poi_result.AddComponent(/datum/component/mission_important, MISSION_IMPORTANCE_RELEVENT, src)
/datum/mission/ruin/on_planet_load(datum/overmap/dynamic/planet)
. = ..()
if(!length(bound_atoms))
if(specific_item)
stack_trace("Somehow [src] ran on_planet_load and has no bound atoms still, this likely means its failed to find any valid pois to spawn? Contact Fallcon.")
/datum/mission/ruin/proc/spawn_main_piece(obj/effect/landmark/mission_poi/mission_poi, datum/overmap/dynamic/planet)
required_item = mission_poi.use_poi(setpiece_item, src)
if(isatom(required_item))
set_bound(required_item, null, TRUE, TRUE)
else
stack_trace("[src] did not generate a required item.")
qdel(src)
/// For handling logic outside of main piece thats too complex for the basic reiteration or you want to not require indexs to match.
/datum/mission/ruin/proc/spawn_custom_details(datum/overmap/dynamic/planet)
return
/datum/mission/ruin/remove_bound(atom/movable/bound)
if(bound == required_item)
required_item = null
return ..()
/datum/mission/ruin/can_turn_in(atom/movable/item_to_check)
// PENTEST FIX - START - If specific_item is TRUE, only accept the exact item instance
if(specific_item)
if(istype(required_item) && item_to_check == required_item)
return TRUE
// If specific_item is TRUE but required_item doesn't exist, no item can be turned in
return FALSE
// If specific_item is FALSE, accept any item of the matching type
if(istype(item_to_check, setpiece_item))
// If the setpiece item is a mob type, only accept dead mobs
if(isliving(item_to_check))
var/mob/living/living_check = item_to_check
if(living_check.stat != DEAD)
return FALSE
return TRUE
else if(istype(required_item) && istype(item_to_check, required_item.type))
// If the required item is a mob type, only accept dead mobs
if(isliving(item_to_check))
var/mob/living/living_check = item_to_check
if(living_check.stat != DEAD)
return FALSE
return TRUE
return FALSE
// PENTEST FIX - END
/datum/mission/ruin/get_tgui_info(list/items_on_pad = list())
. = ..()
var/time_remaining = max(dur_timer ? timeleft(dur_timer) : duration, 0)
var/act_str = get_act_string()
var/can_turn_in = FALSE
var/list/acceptable_items = list()
for(var/atom/movable/item_on_pad in items_on_pad)
if(can_turn_in(item_on_pad))
acceptable_items += list(item_on_pad.name)
can_turn_in = TRUE
break
var/location_x
var/location_y
var/location_name
if(mission_location)
location_x = mission_location.x
location_y = mission_location.y
location_name = mission_location.name
. += list(
"ref" = REF(src),
"name" = src.name,
"author" = src.author,
"desc" = src.desc,
"reward" = src.reward_flavortext(),
"faction" = SSfactions.faction_name(src.faction),
"location" = "X[location_x]/Y[location_y]: [location_name]",
"x" = location_x,
"y" = location_y,
"timeIssued" = time2text(station_time() - time_issued, "mm"),
"duration" = src.duration,
"remaining" = time_remaining,
"timeStr" = time2text(time_remaining, "mm:ss"),
"progressStr" = get_progress_string(),
"actStr" = act_str,
"canTurnIn" = can_turn_in,
"validItems" = acceptable_items,
"claim" = dibs_string
)
/datum/mission/ruin/proc/get_act_string()
return "Turn in"
/datum/mission/ruin/vv_edit_var(var_name, var_value)
if(var_name == NAMEOF(src, required_item))
remove_bound(required_item)
set_bound(var_value)
return ..()