forked from Drymouth-Gulch/Drymouth-Gulch
-
Notifications
You must be signed in to change notification settings - Fork 0
/
_interaction.dm
145 lines (122 loc) · 4.47 KB
/
_interaction.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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/**********************************
*******Interactions code by HONKERTRON feat TestUnit********
**Contains a lot ammount of ERP and MEHANOYEBLYA**
**CREDIT TO ATMTA STATION FOR MOST OF THIS CODE, I ONLY MADE IT WORK IN /vg/ - Matt
** Rewritten 30/08/16 by Zuhayr, sry if I removed anything important.
***********************************/
// Rectum? Damn near killed 'em.
var/list/interactions
/proc/make_interactions(var/interaction)
if(!interactions)
interactions = list()
for(var/itype in typesof(/datum/interaction)-/datum/interaction)
var/datum/interaction/I = new itype()
interactions[I.command] = I
/mob/proc/list_interaction_attributes()
var/dat = ""
if(has_hands())
dat += "...have hands."
if(has_mouth())
if(dat != "")
dat += "<br>"
dat += "...have a mouth, which is [mouth_is_free() ? "uncovered" : "covered"]."
return dat
/datum/interaction
var/command = "interact"
var/description = "Interact with them."
var/simple_message
var/simple_style = "notice"
var/write_log_user
var/write_log_target
var/interaction_sound
var/interaction_sound_age_pitch
var/max_distance = 1
var/require_user_mouth
var/require_user_hands
var/require_target_mouth
var/require_target_hands
var/needs_physical_contact
/datum/interaction/proc/evaluate_user(var/mob/user, var/silent=1)
if(require_user_mouth)
if(!user.has_mouth())
if(!silent) user << "<span class = 'warning'>You don't have a mouth.</span>"
return 0
if(!user.mouth_is_free())
if(!silent) user << "<span class = 'warning'>Your mouth is covered.</span>"
return 0
if(require_user_hands && !user.has_hands())
if(!silent) user << "<span class = 'warning'>You don't have hands.</span>"
return 0
return 1
/datum/interaction/proc/evaluate_target(var/mob/user, var/mob/target, var/silent=1)
if(require_target_mouth)
if(!target.has_mouth())
if(!silent) user << "<span class = 'warning'>They don't have a mouth.</span>"
return 0
if(!target.mouth_is_free())
if(!silent) user << "<span class = 'warning'>Their mouth is covered.</span>"
return 0
if(require_target_hands && !target.has_hands())
if(!silent) user << "<span class = 'warning'>They don't have hands.</span>"
return 0
return 1
/datum/interaction/proc/get_action_link_for(var/mob/user, var/mob/target)
return "<a href='?src=\ref[src];action=1;action_user=\ref[user];action_target=\ref[target]'>[description]</a><br>"
/datum/interaction/Topic(href, href_list)
if(..())
return 1
if(href_list["action"])
do_action(locate(href_list["action_user"]), locate(href_list["action_target"]))
return 1
return 0
/datum/interaction/proc/do_action(var/mob/user, var/mob/target)
if(get_dist(user, target) > max_distance)
user << "<span class='warning'>They are too far away.</span>"
return
if(needs_physical_contact && !(user.Adjacent(target) && target.Adjacent(user)))
user << "<span class='warning'>You cannot get to them.</span>"
return
if(!evaluate_user(user, silent=0))
return
if(!evaluate_target(user, target, silent=0))
return
display_interaction(user, target)
post_interaction(user, target)
if(write_log_user)
user.attack_log += text("\[[time_stamp()]\] <font color='red'>[write_log_user] [target.name] ([target.ckey])</font>")
if(write_log_target)
target.attack_log += text("\[[time_stamp()]\] <font color='orange'>[write_log_target] [user.name] ([user.ckey])</font>")
/datum/interaction/proc/display_interaction(var/mob/user, var/mob/target)
if(simple_message)
var/use_message = replacetext(simple_message, "USER", "\the [user]")
use_message = replacetext(use_message, "TARGET", "\the [target]")
user.visible_message("<span class='[simple_style]'>[capitalize(use_message)]</span>")
/datum/interaction/proc/post_interaction(var/mob/user, var/mob/target)
if(interaction_sound)
if(interaction_sound_age_pitch)
playsound(get_turf(user), interaction_sound, 50, 1, -1)//, pitch = user.get_age_pitch())
else
playsound(get_turf(user), interaction_sound, 50, 1, -1)
return
/*
/atom/movable/attack_hand(mob/living/user)
. = ..()
if(can_buckle && buckled_mob)
if(user_unbuckle_mob(user))
return 1
/atom/movable/MouseDrop_T(mob/living/M, mob/living/user)
. = ..()
if(can_buckle && istype(M) && !buckled_mob)
if(user_buckle_mob(M, user))
return 1
/atom/movable/attack_hand(mob/living/user)
. = ..()
if(can_buckle && buckled_mob)
if(user_unbuckle_mob(user))
return 1
/atom/movable/MouseDrop_T(mob/living/M, mob/living/user)
. = ..()
if(can_buckle && istype(M) && !buckled_mob)
if(user_buckle_mob(M, user))
return 1
*/