mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2025-12-25 17:42:26 +00:00
git-svn-id: http://tgstation13.googlecode.com/svn/trunk@260 316c924e-a436-60f5-8080-3fe189b3f50e
2054 lines
54 KiB
Plaintext
2054 lines
54 KiB
Plaintext
/mob/proc/Cell()
|
|
set category = "Admin"
|
|
set hidden = 1
|
|
|
|
if(!loc) return 0
|
|
|
|
var/datum/gas_mixture/environment = loc.return_air()
|
|
|
|
var/t = "\blue Coordinates: [x],[y] \n"
|
|
t+= "\red Temperature: [environment.temperature] \n"
|
|
t+= "\blue Nitrogen: [environment.nitrogen] \n"
|
|
t+= "\blue Oxygen: [environment.oxygen] \n"
|
|
t+= "\blue Plasma : [environment.toxins] \n"
|
|
t+= "\blue Carbon Dioxide: [environment.carbon_dioxide] \n"
|
|
for(var/datum/gas/trace_gas in environment.trace_gases)
|
|
usr << "\blue [trace_gas.type]: [trace_gas.moles] \n"
|
|
|
|
usr.show_message(t, 1)
|
|
|
|
// fun if you want to typecast humans/monkeys/etc without writing long path-filled lines.
|
|
/proc/ishuman(A)
|
|
if(A && istype(A, /mob/living/carbon/human))
|
|
return 1
|
|
return 0
|
|
|
|
/proc/isalien(A)
|
|
if(A && istype(A, /mob/living/carbon/alien))
|
|
return 1
|
|
return 0
|
|
|
|
/proc/ismonkey(A)
|
|
if(A && istype(A, /mob/living/carbon/monkey))
|
|
return 1
|
|
return 0
|
|
|
|
/proc/isrobot(A)
|
|
if(A && istype(A, /mob/living/silicon/robot))
|
|
return 1
|
|
return 0
|
|
|
|
/proc/ishivebot(A)
|
|
if(A && istype(A, /mob/living/silicon/hivebot))
|
|
return 1
|
|
return 0
|
|
|
|
/proc/isAI(A)
|
|
if(A && istype(A, /mob/living/silicon/ai))
|
|
return 1
|
|
return 0
|
|
|
|
/proc/iscarbon(A)
|
|
if(A && istype(A, /mob/living/carbon))
|
|
return 1
|
|
return 0
|
|
|
|
/proc/issilicon(A)
|
|
if(A && istype(A, /mob/living/silicon))
|
|
return 1
|
|
return 0
|
|
|
|
/proc/hsl2rgb(h, s, l)
|
|
return
|
|
|
|
/proc/ran_zone(zone, probability)
|
|
|
|
if (probability == null)
|
|
probability = 90
|
|
if (probability == 100)
|
|
return zone
|
|
switch(zone)
|
|
if("chest")
|
|
if (prob(probability))
|
|
return "chest"
|
|
else
|
|
var/t = rand(1, 15)
|
|
if (t < 3)
|
|
return "head"
|
|
else if (t < 6)
|
|
return "l_arm"
|
|
else if (t < 9)
|
|
return "r_arm"
|
|
else if (t < 13)
|
|
return "groin"
|
|
else if (t < 14)
|
|
return "l_hand"
|
|
else if (t < 15)
|
|
return "r_hand"
|
|
else
|
|
return "chest"
|
|
|
|
if("groin")
|
|
if (prob(probability * 0.9))
|
|
return "groin"
|
|
else
|
|
var/t = rand(1, 8)
|
|
if (t < 4)
|
|
return "chest"
|
|
else if (t < 5)
|
|
return "r_leg"
|
|
else if (t < 6)
|
|
return "l_leg"
|
|
else if (t < 7)
|
|
return "l_hand"
|
|
else if (t < 8)
|
|
return "r_hand"
|
|
else
|
|
return "groin"
|
|
if("head")
|
|
if (prob(probability * 0.75))
|
|
return "head"
|
|
else
|
|
if (prob(60))
|
|
return "chest"
|
|
else
|
|
return "head"
|
|
if("l_arm")
|
|
if (prob(probability * 0.75))
|
|
return "l_arm"
|
|
else
|
|
if (prob(60))
|
|
return "chest"
|
|
else
|
|
return "l_arm"
|
|
if("r_arm")
|
|
if (prob(probability * 0.75))
|
|
return "r_arm"
|
|
else
|
|
if (prob(60))
|
|
return "chest"
|
|
else
|
|
return "r_arm"
|
|
if("r_leg")
|
|
if (prob(probability * 0.75))
|
|
return "r_leg"
|
|
else
|
|
if (prob(60))
|
|
return "groin"
|
|
else
|
|
return "r_leg"
|
|
if("l_leg")
|
|
if (prob(probability * 0.75))
|
|
return "l_leg"
|
|
else
|
|
if (prob(60))
|
|
return "groin"
|
|
else
|
|
return "l_leg"
|
|
if("l_hand")
|
|
if (prob(probability * 0.5))
|
|
return "l_hand"
|
|
else
|
|
var/t = rand(1, 8)
|
|
if (t < 2)
|
|
return "l_arm"
|
|
else if (t < 3)
|
|
return "chest"
|
|
else if (t < 4)
|
|
return "groin"
|
|
else if (t < 6)
|
|
return "l_leg"
|
|
else
|
|
return "l_hand"
|
|
|
|
if("r_hand")
|
|
if (prob(probability * 0.5))
|
|
return "r_hand"
|
|
else
|
|
var/t = rand(1, 8)
|
|
if (t < 2)
|
|
return "r_arm"
|
|
else if (t < 3)
|
|
return "chest"
|
|
else if (t < 4)
|
|
return "groin"
|
|
else if (t < 6)
|
|
return "r_leg"
|
|
else
|
|
return "r_hand"
|
|
|
|
if("l_foot")
|
|
if (prob(probability * 0.25))
|
|
return "l_foot"
|
|
else
|
|
var/t = rand(1, 5)
|
|
if (t < 2)
|
|
return "l_leg"
|
|
else
|
|
if (t < 3)
|
|
return "r_foot"
|
|
else
|
|
return "l_foot"
|
|
if("r_foot")
|
|
if (prob(probability * 0.25))
|
|
return "r_foot"
|
|
else
|
|
var/t = rand(1, 5)
|
|
if (t < 2)
|
|
return "r_leg"
|
|
else
|
|
if (t < 3)
|
|
return "l_foot"
|
|
else
|
|
return "r_foot"
|
|
else
|
|
return
|
|
|
|
/proc/stars(n, pr)
|
|
|
|
if (pr == null)
|
|
pr = 25
|
|
if (pr <= 0)
|
|
return null
|
|
else
|
|
if (pr >= 100)
|
|
return n
|
|
var/te = n
|
|
var/t = ""
|
|
n = length(n)
|
|
var/p = null
|
|
p = 1
|
|
while(p <= n)
|
|
if ((copytext(te, p, p + 1) == " " || prob(pr)))
|
|
t = text("[][]", t, copytext(te, p, p + 1))
|
|
else
|
|
t = text("[]*", t)
|
|
p++
|
|
return t
|
|
|
|
/proc/stutter(n)
|
|
var/te = html_decode(n)
|
|
var/t = ""
|
|
n = length(n)
|
|
var/p = null
|
|
p = 1
|
|
while(p <= n)
|
|
var/n_letter = copytext(te, p, p + 1)
|
|
if (prob(80))
|
|
if (prob(10))
|
|
n_letter = text("[n_letter][n_letter][n_letter][n_letter]")
|
|
else
|
|
if (prob(20))
|
|
n_letter = text("[n_letter][n_letter][n_letter]")
|
|
else
|
|
if (prob(5))
|
|
n_letter = null
|
|
else
|
|
n_letter = text("[n_letter][n_letter]")
|
|
t = text("[t][n_letter]")
|
|
p++
|
|
return copytext(sanitize(t),1,MAX_MESSAGE_LEN)
|
|
|
|
/proc/shake_camera(mob/M, duration, strength=1)
|
|
if(!M || !M.client || M.shakecamera)
|
|
return
|
|
spawn(1)
|
|
var/oldeye=M.client.eye
|
|
var/x
|
|
M.shakecamera = 1
|
|
for(x=0; x<duration, x++)
|
|
M.client.eye = locate(dd_range(1,M.loc.x+rand(-strength,strength),world.maxx),dd_range(1,M.loc.y+rand(-strength,strength),world.maxy),M.loc.z)
|
|
sleep(1)
|
|
M.shakecamera = 0
|
|
M.client.eye=oldeye
|
|
|
|
/proc/findname(msg)
|
|
for(var/mob/M in world)
|
|
if (M.real_name == text("[msg]"))
|
|
return 1
|
|
return 0
|
|
|
|
/obj/proc/alter_health()
|
|
return 1
|
|
|
|
/atom/proc/relaymove()
|
|
return
|
|
|
|
/obj/proc/hide(h)
|
|
return
|
|
|
|
/obj/item/weapon/grab/proc/throw()
|
|
if(src.affecting)
|
|
var/grabee = src.affecting
|
|
spawn(0)
|
|
del(src)
|
|
return grabee
|
|
return null
|
|
|
|
/obj/item/weapon/grab/proc/synch()
|
|
if (src.assailant.r_hand == src)
|
|
src.hud1.screen_loc = ui_rhand
|
|
else
|
|
src.hud1.screen_loc = ui_lhand
|
|
return
|
|
|
|
/obj/item/weapon/grab/process()
|
|
if(!src.assailant || !src.affecting)
|
|
del(src)
|
|
return
|
|
if ((!( isturf(src.assailant.loc) ) || (!( isturf(src.affecting.loc) ) || (src.assailant.loc != src.affecting.loc && get_dist(src.assailant, src.affecting) > 1))))
|
|
//SN src = null
|
|
del(src)
|
|
return
|
|
if (src.assailant.client)
|
|
src.assailant.client.screen -= src.hud1
|
|
src.assailant.client.screen += src.hud1
|
|
if (src.assailant.pulling == src.affecting)
|
|
src.assailant.pulling = null
|
|
if (src.state <= 2)
|
|
src.allow_upgrade = 1
|
|
if ((src.assailant.l_hand && src.assailant.l_hand != src && istype(src.assailant.l_hand, /obj/item/weapon/grab)))
|
|
var/obj/item/weapon/grab/G = src.assailant.l_hand
|
|
if (G.affecting != src.affecting)
|
|
src.allow_upgrade = 0
|
|
if ((src.assailant.r_hand && src.assailant.r_hand != src && istype(src.assailant.r_hand, /obj/item/weapon/grab)))
|
|
var/obj/item/weapon/grab/G = src.assailant.r_hand
|
|
if (G.affecting != src.affecting)
|
|
src.allow_upgrade = 0
|
|
if (src.state == 2)
|
|
var/h = src.affecting.hand
|
|
src.affecting.hand = 0
|
|
src.affecting.drop_item()
|
|
src.affecting.hand = 1
|
|
src.affecting.drop_item()
|
|
src.affecting.hand = h
|
|
for(var/obj/item/weapon/grab/G in src.affecting.grabbed_by)
|
|
if (G.state == 2)
|
|
src.allow_upgrade = 0
|
|
//Foreach goto(341)
|
|
if (src.allow_upgrade)
|
|
src.hud1.icon_state = "reinforce"
|
|
else
|
|
src.hud1.icon_state = "!reinforce"
|
|
else
|
|
if (!( src.affecting.buckled ))
|
|
src.affecting.loc = src.assailant.loc
|
|
if ((src.killing && src.state == 3))
|
|
src.affecting.stunned = max(5, src.affecting.stunned)
|
|
src.affecting.paralysis = max(3, src.affecting.paralysis)
|
|
src.affecting.losebreath = min(src.affecting.losebreath + 2, 3)
|
|
return
|
|
|
|
/obj/item/weapon/grab/proc/s_click(obj/screen/S as obj)
|
|
if (src.assailant.next_move > world.time)
|
|
return
|
|
if ((!( src.assailant.canmove ) || src.assailant.lying))
|
|
//SN src = null
|
|
del(src)
|
|
return
|
|
switch(S.id)
|
|
if(1.0)
|
|
if (src.state >= 3)
|
|
if (!( src.killing ))
|
|
for(var/mob/O in viewers(src.assailant, null))
|
|
O.show_message(text("\red [] has temporarily tightened his grip on []!", src.assailant, src.affecting), 1)
|
|
//Foreach goto(97)
|
|
src.assailant.next_move = world.time + 10
|
|
src.affecting.stunned = max(2, src.affecting.stunned)
|
|
src.affecting.paralysis = max(1, src.affecting.paralysis)
|
|
src.affecting.losebreath = min(src.affecting.losebreath + 1, 3)
|
|
src.last_suffocate = world.time
|
|
flick("disarm/killf", S)
|
|
else
|
|
return
|
|
|
|
/obj/item/weapon/grab/proc/s_dbclick(obj/screen/S as obj)
|
|
//if ((src.assailant.next_move > world.time && !( src.last_suffocate < world.time + 2 )))
|
|
// return
|
|
if ((!( src.assailant.canmove ) || src.assailant.lying))
|
|
del(src)
|
|
return
|
|
switch(S.id)
|
|
if(1.0)
|
|
if (src.state < 2)
|
|
if (!( src.allow_upgrade ))
|
|
return
|
|
if (prob(75))
|
|
for(var/mob/O in viewers(src.assailant, null))
|
|
O.show_message(text("\red [] has grabbed [] aggressively (now hands)!", src.assailant, src.affecting), 1)
|
|
src.state = 2
|
|
src.icon_state = "grabbed1"
|
|
else
|
|
for(var/mob/O in viewers(src.assailant, null))
|
|
O.show_message(text("\red [] has failed to grab [] aggressively!", src.assailant, src.affecting), 1)
|
|
del(src)
|
|
return
|
|
else
|
|
if (src.state < 3)
|
|
if(istype(src.affecting, /mob/living/carbon/human))
|
|
var/mob/living/carbon/human/H = src.affecting
|
|
if(H.mutations & 32)
|
|
src.assailant << "\blue You can't strangle [src.affecting] through all that fat!"
|
|
return
|
|
|
|
/*
|
|
//we should be able to strangle the Captain if he is wearing a hat
|
|
for(var/obj/item/clothing/C in list(H.head, H.wear_suit, H.wear_mask, H.w_uniform))
|
|
if(C.body_parts_covered & HEAD)
|
|
src.assailant << "\blue You have to take off [src.affecting]'s [C.name] first!"
|
|
return
|
|
|
|
if(istype(H.wear_suit, /obj/item/clothing/suit/space) || istype(H.wear_suit, /obj/item/clothing/suit/armor) || istype(H.wear_suit, /obj/item/clothing/suit/bio_suit) || istype(H.wear_suit, /obj/item/clothing/suit/swat_suit))
|
|
src.assailant << "\blue You can't strangle [src.affecting] through their suit collar!"
|
|
return
|
|
*/
|
|
for(var/mob/O in viewers(src.assailant, null))
|
|
O.show_message(text("\red [] has reinforced his grip on [] (now neck)!", src.assailant, src.affecting), 1)
|
|
|
|
src.state = 3
|
|
src.icon_state = "grabbed+1"
|
|
if (!( src.affecting.buckled ))
|
|
src.affecting.loc = src.assailant.loc
|
|
src.hud1.icon_state = "disarm/kill"
|
|
src.hud1.name = "disarm/kill"
|
|
else
|
|
if (src.state >= 3)
|
|
src.killing = !( src.killing )
|
|
if (src.killing)
|
|
for(var/mob/O in viewers(src.assailant, null))
|
|
O.show_message(text("\red [] has tightened his grip on []'s neck!", src.assailant, src.affecting), 1)
|
|
src.assailant.next_move = world.time + 10
|
|
src.affecting.stunned = max(2, src.affecting.stunned)
|
|
src.affecting.paralysis = max(1, src.affecting.paralysis)
|
|
src.affecting.losebreath += 1
|
|
src.hud1.icon_state = "disarm/kill1"
|
|
else
|
|
src.hud1.icon_state = "disarm/kill"
|
|
for(var/mob/O in viewers(src.assailant, null))
|
|
O.show_message(text("\red [] has loosened the grip on []'s neck!", src.assailant, src.affecting), 1)
|
|
else
|
|
return
|
|
|
|
/obj/item/weapon/grab/New()
|
|
..()
|
|
src.hud1 = new /obj/screen/grab( src )
|
|
src.hud1.icon_state = "reinforce"
|
|
src.hud1.name = "Reinforce Grab"
|
|
src.hud1.id = 1
|
|
src.hud1.master = src
|
|
return
|
|
|
|
/obj/item/weapon/grab/attack(mob/M as mob, mob/user as mob)
|
|
if (M == src.affecting)
|
|
if (src.state < 3)
|
|
s_dbclick(src.hud1)
|
|
else
|
|
s_click(src.hud1)
|
|
return
|
|
if(M == src.assailant && src.state >= 2)
|
|
if( ( ishuman(user) && (user.mutations & 32) && ismonkey(src.affecting) ) || ( isalien(user) && iscarbon(src.affecting) ) )
|
|
var/mob/living/carbon/attacker = user
|
|
for(var/mob/N in viewers(user, null))
|
|
if(N.client)
|
|
N.show_message(text("\red <B>[user] is attempting to devour [src.affecting]!</B>"), 1)
|
|
if(!do_mob(user, src.affecting)) return
|
|
for(var/mob/N in viewers(user, null))
|
|
if(N.client)
|
|
N.show_message(text("\red <B>[user] devours [src.affecting]!</B>"), 1)
|
|
src.affecting.loc = user
|
|
attacker.stomach_contents.Add(src.affecting)
|
|
del(src)
|
|
|
|
/obj/item/weapon/grab/dropped()
|
|
del(src)
|
|
return
|
|
|
|
/obj/item/weapon/grab/Del()
|
|
del(src.hud1)
|
|
..()
|
|
return
|
|
|
|
/obj/screen/zone_sel/MouseDown(location, control,params) //(location, icon_x, icon_y)
|
|
// Changes because of 4.0
|
|
|
|
|
|
var/list/PL = params2list(params)
|
|
var/icon_x = text2num(PL["icon-x"])
|
|
var/icon_y = text2num(PL["icon-y"])
|
|
|
|
if (icon_y < 2)
|
|
return
|
|
else if (icon_y < 5)
|
|
if ((icon_x > 9 && icon_x < 23))
|
|
if (icon_x < 16)
|
|
src.selecting = "r_foot"
|
|
else
|
|
src.selecting = "l_foot"
|
|
else if (icon_y < 11)
|
|
if ((icon_x > 11 && icon_x < 21))
|
|
if (icon_x < 16)
|
|
src.selecting = "r_leg"
|
|
else
|
|
src.selecting = "l_leg"
|
|
else if (icon_y < 12)
|
|
if ((icon_x > 11 && icon_x < 21))
|
|
if (icon_x < 14)
|
|
src.selecting = "r_leg"
|
|
else if (icon_x < 19)
|
|
src.selecting = "groin"
|
|
else
|
|
src.selecting = "l_leg"
|
|
else
|
|
return
|
|
else if (icon_y < 13)
|
|
if ((icon_x > 7 && icon_x < 25))
|
|
if (icon_x < 12)
|
|
src.selecting = "r_hand"
|
|
else if (icon_x < 13)
|
|
src.selecting = "r_leg"
|
|
else if (icon_x < 20)
|
|
src.selecting = "groin"
|
|
else if (icon_x < 21)
|
|
src.selecting = "l_leg"
|
|
else
|
|
src.selecting = "l_hand"
|
|
else
|
|
return
|
|
else if (icon_y < 14)
|
|
if ((icon_x > 7 && icon_x < 25))
|
|
if (icon_x < 12)
|
|
src.selecting = "r_hand"
|
|
else if (icon_x < 21)
|
|
src.selecting = "groin"
|
|
else
|
|
src.selecting = "l_hand"
|
|
else
|
|
return
|
|
else if (icon_y < 16)
|
|
if ((icon_x > 7 && icon_x < 25))
|
|
if (icon_x < 13)
|
|
src.selecting = "r_hand"
|
|
else if (icon_x < 20)
|
|
src.selecting = "chest"
|
|
else
|
|
src.selecting = "l_hand"
|
|
else
|
|
return
|
|
else if (icon_y < 23)
|
|
if ((icon_x > 7 && icon_x < 25))
|
|
if (icon_x < 12)
|
|
src.selecting = "r_arm"
|
|
else if (icon_x < 21)
|
|
src.selecting = "chest"
|
|
else
|
|
src.selecting = "l_arm"
|
|
else
|
|
return
|
|
else if (icon_y < 24)
|
|
if ((icon_x > 11 && icon_x < 21))
|
|
src.selecting = "chest"
|
|
else
|
|
return
|
|
else if (icon_y < 25)
|
|
if ((icon_x > 11 && icon_x < 21))
|
|
if (icon_x < 16)
|
|
src.selecting = "head"
|
|
else if (icon_x < 17)
|
|
src.selecting = "mouth"
|
|
else
|
|
src.selecting = "head"
|
|
else
|
|
return
|
|
else if (icon_y < 26)
|
|
if ((icon_x > 11 && icon_x < 21))
|
|
if (icon_x < 15)
|
|
src.selecting = "head"
|
|
else if (icon_x < 18)
|
|
src.selecting = "mouth"
|
|
else
|
|
src.selecting = "head"
|
|
else
|
|
return
|
|
else if (icon_y < 27)
|
|
if ((icon_x > 11 && icon_x < 21))
|
|
if (icon_x < 15)
|
|
src.selecting = "head"
|
|
else if (icon_x < 16)
|
|
src.selecting = "eyes"
|
|
else if (icon_x < 17)
|
|
src.selecting = "mouth"
|
|
else if (icon_x < 18)
|
|
src.selecting = "eyes"
|
|
else
|
|
src.selecting = "head"
|
|
else
|
|
return
|
|
else if (icon_y < 28)
|
|
if ((icon_x > 11 && icon_x < 21))
|
|
if (icon_x < 14)
|
|
src.selecting = "head"
|
|
else if (icon_x < 19)
|
|
src.selecting = "eyes"
|
|
else
|
|
src.selecting = "head"
|
|
else
|
|
return
|
|
else if (icon_y < 29)
|
|
if ((icon_x > 11 && icon_x < 21))
|
|
if (icon_x < 15)
|
|
src.selecting = "head"
|
|
else if (icon_x < 16)
|
|
src.selecting = "eyes"
|
|
else if (icon_x < 17)
|
|
src.selecting = "head"
|
|
else if (icon_x < 18)
|
|
src.selecting = "eyes"
|
|
else
|
|
src.selecting = "head"
|
|
else
|
|
return
|
|
else if (icon_y < 31)
|
|
if ((icon_x > 11 && icon_x < 21))
|
|
src.selecting = "head"
|
|
else
|
|
return
|
|
else
|
|
return
|
|
|
|
overlays = null
|
|
overlays += image("icon" = 'zone_sel.dmi', "icon_state" = text("[]", selecting))
|
|
|
|
return
|
|
|
|
/obj/screen/grab/Click()
|
|
src.master:s_click(src)
|
|
return
|
|
|
|
/obj/screen/grab/DblClick()
|
|
src.master:s_dbclick(src)
|
|
return
|
|
|
|
/obj/screen/grab/attack_hand()
|
|
return
|
|
|
|
/obj/screen/grab/attackby()
|
|
return
|
|
|
|
/obj/screen/Click(location, control, params)
|
|
|
|
var/list/pa = params2list(params)
|
|
|
|
switch(src.name)
|
|
if("map")
|
|
|
|
usr.clearmap()
|
|
if("maprefresh")
|
|
var/obj/machinery/computer/security/seccomp = usr.machine
|
|
|
|
if(seccomp!=null)
|
|
seccomp.drawmap(usr)
|
|
else
|
|
usr.clearmap()
|
|
|
|
if("other")
|
|
if (usr.hud_used.show_otherinventory)
|
|
usr.hud_used.show_otherinventory = 0
|
|
usr.client.screen -= usr.hud_used.other
|
|
else
|
|
usr.hud_used.show_otherinventory = 1
|
|
usr.client.screen += usr.hud_used.other
|
|
|
|
usr.hud_used.other_update()
|
|
|
|
|
|
if("act_intent")
|
|
if(pa.Find("left"))
|
|
switch(usr.a_intent)
|
|
if("help")
|
|
usr.a_intent = "disarm"
|
|
usr.hud_used.action_intent.icon_state = "disarm"
|
|
if("disarm")
|
|
usr.a_intent = "hurt"
|
|
usr.hud_used.action_intent.icon_state = "harm"
|
|
if("hurt")
|
|
usr.a_intent = "grab"
|
|
usr.hud_used.action_intent.icon_state = "grab"
|
|
if("grab")
|
|
usr.a_intent = "help"
|
|
usr.hud_used.action_intent.icon_state = "help"
|
|
else
|
|
switch(usr.a_intent)
|
|
if("help")
|
|
usr.a_intent = "grab"
|
|
usr.hud_used.action_intent.icon_state = "grab"
|
|
if("disarm")
|
|
usr.a_intent = "help"
|
|
usr.hud_used.action_intent.icon_state = "help"
|
|
if("hurt")
|
|
usr.a_intent = "disarm"
|
|
usr.hud_used.action_intent.icon_state = "disarm"
|
|
if("grab")
|
|
usr.a_intent = "hurt"
|
|
usr.hud_used.action_intent.icon_state = "harm"
|
|
|
|
if("arrowleft")
|
|
switch(usr.a_intent)
|
|
if("help")
|
|
if(issilicon(usr))
|
|
usr.a_intent = "hurt"
|
|
usr.hud_used.action_intent.icon_state = "harm"
|
|
else
|
|
usr.a_intent = "grab"
|
|
usr.hud_used.action_intent.icon_state = "grab"
|
|
|
|
if("disarm")
|
|
usr.a_intent = "help"
|
|
usr.hud_used.action_intent.icon_state = "help"
|
|
|
|
if("hurt")
|
|
if(issilicon(usr))
|
|
usr.a_intent = "help"
|
|
usr.hud_used.action_intent.icon_state = "help"
|
|
else
|
|
usr.a_intent = "disarm"
|
|
usr.hud_used.action_intent.icon_state = "disarm"
|
|
|
|
if("grab")
|
|
usr.a_intent = "hurt"
|
|
usr.hud_used.action_intent.icon_state = "harm"
|
|
|
|
if("arrowright")
|
|
switch(usr.a_intent)
|
|
if("help")
|
|
if(issilicon(usr))
|
|
usr.a_intent = "hurt"
|
|
usr.hud_used.action_intent.icon_state = "harm"
|
|
else
|
|
usr.a_intent = "disarm"
|
|
usr.hud_used.action_intent.icon_state = "disarm"
|
|
|
|
if("disarm")
|
|
usr.a_intent = "hurt"
|
|
usr.hud_used.action_intent.icon_state = "harm"
|
|
|
|
if("hurt")
|
|
if(issilicon(usr))
|
|
usr.a_intent = "help"
|
|
usr.hud_used.action_intent.icon_state = "help"
|
|
else
|
|
usr.a_intent = "grab"
|
|
usr.hud_used.action_intent.icon_state = "grab"
|
|
|
|
if("grab")
|
|
usr.a_intent = "help"
|
|
usr.hud_used.action_intent.icon_state = "help"
|
|
|
|
if("mov_intent")
|
|
switch(usr.m_intent)
|
|
if("run")
|
|
usr.m_intent = "walk"
|
|
usr.hud_used.move_intent.icon_state = "walking"
|
|
if("walk")
|
|
usr.m_intent = "run"
|
|
usr.hud_used.move_intent.icon_state = "running"
|
|
|
|
if("intent")
|
|
if (!( usr.intent ))
|
|
switch(usr.a_intent)
|
|
if("help")
|
|
usr.intent = "13,15"
|
|
if("disarm")
|
|
usr.intent = "14,15"
|
|
if("hurt")
|
|
usr.intent = "15,15"
|
|
if("grab")
|
|
usr.intent = "12,15"
|
|
else
|
|
usr.intent = null
|
|
if("m_intent")
|
|
if (!( usr.m_int ))
|
|
switch(usr.m_intent)
|
|
if("run")
|
|
usr.m_int = "13,14"
|
|
if("walk")
|
|
usr.m_int = "14,14"
|
|
if("face")
|
|
usr.m_int = "15,14"
|
|
else
|
|
usr.m_int = null
|
|
if("walk")
|
|
usr.m_intent = "walk"
|
|
usr.m_int = "14,14"
|
|
if("face")
|
|
usr.m_intent = "face"
|
|
usr.m_int = "15,14"
|
|
if("run")
|
|
usr.m_intent = "run"
|
|
usr.m_int = "13,14"
|
|
if("hurt")
|
|
usr.a_intent = "hurt"
|
|
usr.intent = "15,15"
|
|
if("grab")
|
|
usr.a_intent = "grab"
|
|
usr.intent = "12,15"
|
|
if("disarm")
|
|
if (istype(usr, /mob/living/carbon/human))
|
|
var/mob/M = usr
|
|
M.a_intent = "disarm"
|
|
M.intent = "14,15"
|
|
if("help")
|
|
usr.a_intent = "help"
|
|
usr.intent = "13,15"
|
|
if("Reset Machine")
|
|
usr.machine = null
|
|
if("internal")
|
|
if ((!( usr.stat ) && usr.canmove && !( usr.restrained() )))
|
|
usr.internal = null
|
|
if("pull")
|
|
usr.pulling = null
|
|
if("sleep")
|
|
usr.sleeping = !( usr.sleeping )
|
|
if("rest")
|
|
usr.resting = !( usr.resting )
|
|
if("throw")
|
|
if (!usr.stat && isturf(usr.loc) && !usr.restrained())
|
|
usr:toggle_throw_mode()
|
|
if("drop")
|
|
usr.drop_item_v()
|
|
if("swap")
|
|
usr:swap_hand()
|
|
if("hand")
|
|
usr:swap_hand()
|
|
if("resist")
|
|
if (usr.next_move < world.time)
|
|
return
|
|
usr.next_move = world.time + 20
|
|
if ((!( usr.stat ) && usr.canmove && !( usr.restrained() )))
|
|
for(var/obj/O in usr.requests)
|
|
del(O)
|
|
for(var/obj/item/weapon/grab/G in usr.grabbed_by)
|
|
if (G.state == 1)
|
|
del(G)
|
|
else
|
|
if (G.state == 2)
|
|
if (prob(25))
|
|
for(var/mob/O in viewers(usr, null))
|
|
O.show_message(text("\red [] has broken free of []'s grip!", usr, G.assailant), 1)
|
|
del(G)
|
|
else
|
|
if (G.state == 3)
|
|
if (prob(5))
|
|
for(var/mob/O in viewers(usr, null))
|
|
O.show_message(text("\red [] has broken free of []'s headlock!", usr, G.assailant), 1)
|
|
del(G)
|
|
for(var/mob/O in viewers(usr, null))
|
|
O.show_message(text("\red <B>[] resists!</B>", usr), 1)
|
|
|
|
if(usr:handcuffed && usr:canmove && (usr.last_special <= world.time))
|
|
usr.next_move = world.time + 100
|
|
usr.last_special = world.time + 100
|
|
usr << "\red You attempt to remove your handcuffs. (This will take around 2 minutes and you need to stand still)"
|
|
for(var/mob/O in viewers(usr))
|
|
O.show_message(text("\red <B>[] attempts to remove the handcuffs!</B>", usr), 1)
|
|
spawn(0)
|
|
if(do_after(usr, 1200))
|
|
if(!usr:handcuffed) return
|
|
for(var/mob/O in viewers(usr))
|
|
O.show_message(text("\red <B>[] manages to remove the handcuffs!</B>", usr), 1)
|
|
usr << "\blue You successfully remove your handcuffs."
|
|
usr:handcuffed:loc = usr:loc
|
|
usr:handcuffed = null
|
|
if("module")
|
|
if(istype(usr, /mob/living/silicon/robot)||istype(usr, /mob/living/silicon/hivebot))
|
|
if(usr:module)
|
|
return
|
|
usr:pick_module()
|
|
|
|
if("radio")
|
|
if(istype(usr, /mob/living/silicon/robot)||istype(usr, /mob/living/silicon/hivebot))
|
|
usr:radio_menu()
|
|
if("panel")
|
|
if(istype(usr, /mob/living/silicon/robot)||istype(usr, /mob/living/silicon/hivebot))
|
|
usr:installed_modules()
|
|
|
|
if("store")
|
|
if(istype(usr, /mob/living/silicon/robot)||istype(usr, /mob/living/silicon/hivebot))
|
|
usr:uneq_active()
|
|
|
|
if("module1")
|
|
if(usr:module_state_1)
|
|
if(usr:module_active != usr:module_state_1)
|
|
usr:inv1.icon_state = "inv1 +a"
|
|
usr:inv2.icon_state = "inv2"
|
|
usr:inv3.icon_state = "inv3"
|
|
usr:module_active = usr:module_state_1
|
|
else
|
|
usr:inv1.icon_state = "inv1"
|
|
usr:module_active = null
|
|
|
|
if("module2")
|
|
if(usr:module_state_2)
|
|
if(usr:module_active != usr:module_state_2)
|
|
usr:inv1.icon_state = "inv1"
|
|
usr:inv2.icon_state = "inv2 +a"
|
|
usr:inv3.icon_state = "inv3"
|
|
usr:module_active = usr:module_state_2
|
|
else
|
|
usr:inv2.icon_state = "inv2"
|
|
usr:module_active = null
|
|
|
|
if("module3")
|
|
if(usr:module_state_3)
|
|
if(usr:module_active != usr:module_state_3)
|
|
usr:inv1.icon_state = "inv1"
|
|
usr:inv2.icon_state = "inv2"
|
|
usr:inv3.icon_state = "inv3 +a"
|
|
usr:module_active = usr:module_state_3
|
|
else
|
|
usr:inv3.icon_state = "inv3"
|
|
usr:module_active = null
|
|
|
|
else
|
|
src.DblClick()
|
|
return
|
|
|
|
/obj/screen/attack_hand(mob/user as mob, using)
|
|
user.db_click(src.name, using)
|
|
return
|
|
|
|
/obj/screen/attack_paw(mob/user as mob, using)
|
|
user.db_click(src.name, using)
|
|
return
|
|
|
|
/obj/equip_e/proc/process()
|
|
return
|
|
|
|
/obj/equip_e/proc/done()
|
|
return
|
|
|
|
/obj/equip_e/New()
|
|
if (!ticker)
|
|
del(src)
|
|
return
|
|
spawn(100)
|
|
del(src)
|
|
return
|
|
..()
|
|
return
|
|
|
|
/mob/living/carbon/human/Topic(href, href_list)
|
|
if (href_list["mach_close"])
|
|
var/t1 = text("window=[]", href_list["mach_close"])
|
|
src.machine = null
|
|
src << browse(null, t1)
|
|
if ((href_list["item"] && !( usr.stat ) && usr.canmove && !( usr.restrained() ) && in_range(src, usr) && ticker)) //if game hasn't started, can't make an equip_e
|
|
var/obj/equip_e/human/O = new /obj/equip_e/human( )
|
|
O.source = usr
|
|
O.target = src
|
|
O.item = usr.equipped()
|
|
O.s_loc = usr.loc
|
|
O.t_loc = src.loc
|
|
O.place = href_list["item"]
|
|
src.requests += O
|
|
spawn( 0 )
|
|
O.process()
|
|
return
|
|
..()
|
|
return
|
|
|
|
/mob/proc/show_message(msg, type, alt, alt_type)
|
|
if(!src.client) return
|
|
if (type)
|
|
if ((type & 1 && (src.sdisabilities & 1 || (src.blinded || src.paralysis))))
|
|
if (!( alt ))
|
|
return
|
|
else
|
|
msg = alt
|
|
type = alt_type
|
|
if ((type & 2 && (src.sdisabilities & 4 || src.ear_deaf)))
|
|
if (!( alt ))
|
|
return
|
|
else
|
|
msg = alt
|
|
type = alt_type
|
|
if ((type & 1 && src.sdisabilities & 1))
|
|
return
|
|
// Added voice muffling for Issue 41.
|
|
if (src.stat == 1 || src.sleeping > 0)
|
|
src << "<I>... You can almost hear someone talking ...</I>"
|
|
else
|
|
src << msg
|
|
return
|
|
|
|
// Show a message to all mobs in sight of this one
|
|
// This would be for visible actions by the src mob
|
|
// message is the message output to anyone who can see e.g. "[src] does something!"
|
|
// self_message (optional) is what the src mob sees e.g. "You do something!"
|
|
// blind_message (optional) is what blind people will hear e.g. "You hear something!"
|
|
|
|
/mob/visible_message(var/message, var/self_message, var/blind_message)
|
|
for(var/mob/M in viewers(src))
|
|
var/msg = message
|
|
if(self_message && M==src)
|
|
msg = self_message
|
|
M.show_message( msg, 1, blind_message, 2)
|
|
|
|
// Show a message to all mobs in sight of this atom
|
|
// Use for objects performing visible actions
|
|
// message is output to anyone who can see, e.g. "The [src] does something!"
|
|
// blind_message (optional) is what blind people will hear e.g. "You hear something!"
|
|
/atom/proc/visible_message(var/message, var/blind_message)
|
|
for(var/mob/M in viewers(src))
|
|
M.show_message( message, 1, blind_message, 2)
|
|
|
|
|
|
/mob/proc/findname(msg)
|
|
for(var/mob/M in world)
|
|
if (M.real_name == text("[]", msg))
|
|
return M
|
|
return 0
|
|
|
|
/mob/proc/movement_delay()
|
|
return 0
|
|
|
|
/mob/proc/Life()
|
|
return
|
|
|
|
/mob/proc/update_clothing()
|
|
return
|
|
|
|
/mob/proc/death(gibbed)
|
|
src.timeofdeath = world.time
|
|
return ..(gibbed)
|
|
|
|
/mob/proc/restrained()
|
|
if (src.handcuffed)
|
|
return 1
|
|
return
|
|
|
|
/mob/proc/db_click(text, t1)
|
|
var/obj/item/weapon/W = src.equipped()
|
|
switch(text)
|
|
if("mask")
|
|
if (src.wear_mask)
|
|
return
|
|
if (!( istype(W, /obj/item/clothing/mask) ))
|
|
return
|
|
src.u_equip(W)
|
|
src.wear_mask = W
|
|
W.equipped(src, text)
|
|
if("back")
|
|
if ((src.back || !( istype(W, /obj/item/weapon) )))
|
|
return
|
|
if (!( W.flags & 1 ))
|
|
return
|
|
src.u_equip(W)
|
|
src.back = W
|
|
W.equipped(src, text)
|
|
else
|
|
return
|
|
|
|
|
|
/mob/living/carbon/proc/swap_hand()
|
|
src.hand = !( src.hand )
|
|
if (!( src.hand ))
|
|
src.hands.dir = NORTH
|
|
else
|
|
src.hands.dir = SOUTH
|
|
return
|
|
|
|
/mob/proc/drop_item_v()
|
|
if (src.stat == 0)
|
|
drop_item()
|
|
return
|
|
|
|
/mob/proc/drop_from_slot(var/obj/item/item)
|
|
if(!item)
|
|
return
|
|
if(!(item in src.contents))
|
|
return
|
|
u_equip(item)
|
|
if (src.client)
|
|
src.client.screen -= item
|
|
if (item)
|
|
item.loc = src.loc
|
|
item.dropped(src)
|
|
if (item)
|
|
item.layer = initial(item.layer)
|
|
var/turf/T = get_turf(src.loc)
|
|
T.Entered(item)
|
|
return
|
|
|
|
/mob/proc/drop_item()
|
|
var/obj/item/W = src.equipped()
|
|
if (W)
|
|
u_equip(W)
|
|
if (src.client)
|
|
src.client.screen -= W
|
|
if (W)
|
|
W.loc = src.loc
|
|
W.dropped(src)
|
|
if (W)
|
|
W.layer = initial(W.layer)
|
|
var/turf/T = get_turf(src.loc)
|
|
if (T)
|
|
T.Entered(W)
|
|
return
|
|
|
|
/mob/proc/reset_view(atom/A)
|
|
if (src.client)
|
|
if (istype(A, /atom/movable))
|
|
src.client.perspective = EYE_PERSPECTIVE
|
|
src.client.eye = A
|
|
else
|
|
if (isturf(src.loc))
|
|
src.client.eye = src.client.mob
|
|
src.client.perspective = MOB_PERSPECTIVE
|
|
else
|
|
src.client.perspective = EYE_PERSPECTIVE
|
|
src.client.eye = src.loc
|
|
return
|
|
|
|
/mob/proc/equipped()
|
|
if(issilicon(src))
|
|
if(ishivebot(src)||isrobot(src))
|
|
if(src:module_active)
|
|
return src:module_active
|
|
else
|
|
if (src.hand)
|
|
return src.l_hand
|
|
else
|
|
return src.r_hand
|
|
return
|
|
|
|
/mob/proc/show_inv(mob/user as mob)
|
|
user.machine = src
|
|
var/dat = text("<TT>\n<B><FONT size=3>[]</FONT></B><BR>\n\t<B>Head(Mask):</B> <A href='?src=\ref[];item=mask'>[]</A><BR>\n\t<B>Left Hand:</B> <A href='?src=\ref[];item=l_hand'>[]</A><BR>\n\t<B>Right Hand:</B> <A href='?src=\ref[];item=r_hand'>[]</A><BR>\n\t<B>Back:</B> <A href='?src=\ref[];item=back'>[]</A><BR>\n\t[]<BR>\n\t[]<BR>\n\t[]<BR>\n\t<A href='?src=\ref[];item=pockets'>Empty Pockets</A><BR>\n<A href='?src=\ref[];mach_close=mob[]'>Close</A><BR>\n</TT>", src.name, src, (src.wear_mask ? text("[]", src.wear_mask) : "Nothing"), src, (src.l_hand ? text("[]", src.l_hand) : "Nothing"), src, (src.r_hand ? text("[]", src.r_hand) : "Nothing"), src, (src.back ? text("[]", src.back) : "Nothing"), ((istype(src.wear_mask, /obj/item/clothing/mask) && istype(src.back, /obj/item/weapon/tank) && !( src.internal )) ? text(" <A href='?src=\ref[];item=internal'>Set Internal</A>", src) : ""), (src.internal ? text("<A href='?src=\ref[];item=internal'>Remove Internal</A>", src) : ""), (src.handcuffed ? text("<A href='?src=\ref[];item=handcuff'>Handcuffed</A>", src) : text("<A href='?src=\ref[];item=handcuff'>Not Handcuffed</A>", src)), src, user, src.name)
|
|
user << browse(dat, text("window=mob[];size=325x500", src.name))
|
|
onclose(user, "mob[src.name]")
|
|
return
|
|
|
|
/mob/proc/u_equip(W as obj)
|
|
if (W == src.r_hand)
|
|
src.r_hand = null
|
|
else if (W == src.l_hand)
|
|
src.l_hand = null
|
|
else if (W == src.handcuffed)
|
|
src.handcuffed = null
|
|
else if (W == src.back)
|
|
src.back = null
|
|
else if (W == src.wear_mask)
|
|
src.wear_mask = null
|
|
|
|
update_clothing()
|
|
|
|
/mob/proc/ret_grab(obj/list_container/mobl/L as obj, flag)
|
|
if ((!( istype(src.l_hand, /obj/item/weapon/grab) ) && !( istype(src.r_hand, /obj/item/weapon/grab) )))
|
|
if (!( L ))
|
|
return null
|
|
else
|
|
return L.container
|
|
else
|
|
if (!( L ))
|
|
L = new /obj/list_container/mobl( null )
|
|
L.container += src
|
|
L.master = src
|
|
if (istype(src.l_hand, /obj/item/weapon/grab))
|
|
var/obj/item/weapon/grab/G = src.l_hand
|
|
if (!( L.container.Find(G.affecting) ))
|
|
L.container += G.affecting
|
|
G.affecting.ret_grab(L, 1)
|
|
if (istype(src.r_hand, /obj/item/weapon/grab))
|
|
var/obj/item/weapon/grab/G = src.r_hand
|
|
if (!( L.container.Find(G.affecting) ))
|
|
L.container += G.affecting
|
|
G.affecting.ret_grab(L, 1)
|
|
if (!( flag ))
|
|
if (L.master == src)
|
|
var/list/temp = list( )
|
|
temp += L.container
|
|
//L = null
|
|
del(L)
|
|
return temp
|
|
else
|
|
return L.container
|
|
return
|
|
|
|
/mob/verb/mode()
|
|
set name = "Equipment Mode"
|
|
|
|
set src = usr
|
|
|
|
var/obj/item/W = src.equipped()
|
|
if (W)
|
|
W.attack_self(src)
|
|
return
|
|
|
|
/*
|
|
/mob/verb/dump_source()
|
|
|
|
var/master = "<PRE>"
|
|
for(var/t in typesof(/area))
|
|
master += text("[]\n", t)
|
|
//Foreach goto(26)
|
|
src << browse(master)
|
|
return
|
|
*/
|
|
|
|
/mob/verb/memory()
|
|
set name = "Notes"
|
|
if(mind)
|
|
mind.show_memory(src)
|
|
else
|
|
src << "The game appears to have misplaced your mind datum, so we can't show you your notes."
|
|
|
|
/mob/verb/add_memory(msg as message)
|
|
set name = "Add Note"
|
|
|
|
msg = copytext(msg, 1, MAX_MESSAGE_LEN)
|
|
msg = sanitize(msg)
|
|
|
|
mind.store_memory(msg)
|
|
|
|
/mob/proc/store_memory(msg as message, popup, sane = 1)
|
|
msg = copytext(msg, 1, MAX_MESSAGE_LEN)
|
|
|
|
if (sane)
|
|
msg = sanitize(msg)
|
|
|
|
if (length(src.memory) == 0)
|
|
src.memory += msg
|
|
else
|
|
src.memory += "<BR>[msg]"
|
|
|
|
if (popup)
|
|
src.memory()
|
|
|
|
/mob/verb/help()
|
|
set name = "Help"
|
|
src << browse('help.html', "window=help")
|
|
return
|
|
|
|
/mob/verb/abandon_mob()
|
|
set name = "Respawn"
|
|
|
|
if (!( abandon_allowed ))
|
|
return
|
|
if ((src.stat != 2 || !( ticker )))
|
|
usr << "\blue <B>You must be dead to use this!</B>"
|
|
return
|
|
|
|
log_game("[usr.name]/[usr.key] used abandon mob.")
|
|
|
|
usr << "\blue <B>Please roleplay correctly!</B>"
|
|
|
|
if(!src.client)
|
|
log_game("[usr.key] AM failed due to disconnect.")
|
|
return
|
|
for(var/obj/screen/t in usr.client.screen)
|
|
if (t.loc == null)
|
|
//t = null
|
|
del(t)
|
|
if(!src.client)
|
|
log_game("[usr.key] AM failed due to disconnect.")
|
|
return
|
|
|
|
var/mob/new_player/M = new /mob/new_player()
|
|
if(!src.client)
|
|
log_game("[usr.key] AM failed due to disconnect.")
|
|
del(M)
|
|
return
|
|
|
|
|
|
|
|
if(src.client && src.client.holder && (src.client.holder.state == 2))
|
|
src.client.admin_play()
|
|
return
|
|
|
|
M.key = src.client.key
|
|
M.Login()
|
|
return
|
|
|
|
/mob/verb/cmd_rules()
|
|
set name = "Rules"
|
|
src << browse(rules, "window=rules;size=480x320")
|
|
|
|
/mob/verb/changes()
|
|
set name = "Changelog"
|
|
if (src.client)
|
|
src << browse_rsc('postcardsmall.jpg')
|
|
src << browse_rsc('somerights20.png')
|
|
src << browse_rsc('88x31.png')
|
|
src << browse('changelog.html', "window=changes;size=400x650")
|
|
src.client.changes = 1
|
|
|
|
/mob/verb/succumb()
|
|
set hidden = 1
|
|
|
|
if ((src.health < 0 && src.health > -95.0))
|
|
src.oxyloss += src.health + 200
|
|
src.health = 100 - src.oxyloss - src.toxloss - src.fireloss - src.bruteloss
|
|
src << "\blue You have given up life and succumbed to death."
|
|
|
|
/mob/verb/observe()
|
|
set name = "Observe"
|
|
var/is_admin = 0
|
|
|
|
if (src.client.holder && src.client.holder.level >= 1 && ( src.client.holder.state == 2 || src.client.holder.level > 3 ))
|
|
is_admin = 1
|
|
else if (istype(src, /mob/new_player) || src.stat != 2)
|
|
usr << "\blue You must be observing to use this!"
|
|
return
|
|
|
|
if (is_admin && src.stat == 2)
|
|
is_admin = 0
|
|
|
|
var/list/names = list()
|
|
var/list/namecounts = list()
|
|
var/list/creatures = list()
|
|
|
|
for (var/obj/item/weapon/disk/nuclear/D in world)
|
|
var/name = "Nuclear Disk"
|
|
if (name in names)
|
|
namecounts[name]++
|
|
name = "[name] ([namecounts[name]])"
|
|
else
|
|
names.Add(name)
|
|
namecounts[name] = 1
|
|
creatures[name] = D
|
|
|
|
for (var/obj/machinery/bot/B in world)
|
|
var/name = "BOT: [B.name]"
|
|
if (name in names)
|
|
namecounts[name]++
|
|
name = "[name] ([namecounts[name]])"
|
|
else
|
|
names.Add(name)
|
|
namecounts[name] = 1
|
|
creatures[name] = B
|
|
/*
|
|
for (var/mob/living/silicon/decoy/D in world)
|
|
var/name = "[D.name]"
|
|
if (name in names)
|
|
namecounts[name]++
|
|
name = "[name] ([namecounts[name]])"
|
|
else
|
|
names.Add(name)
|
|
namecounts[name] = 1
|
|
creatures[name] = D
|
|
*/
|
|
|
|
|
|
|
|
//THIS IS HOW YOU ADD OBJECTS TO BE OBSERVED
|
|
|
|
creatures += getmobs()
|
|
//THIS IS THE MOBS PART: LOOK IN HELPERS.DM
|
|
|
|
src.client.perspective = EYE_PERSPECTIVE
|
|
|
|
var/eye_name = null
|
|
|
|
if (is_admin)
|
|
eye_name = input("Please, select a player!", "Admin Observe", null, null) as null|anything in creatures
|
|
else
|
|
eye_name = input("Please, select a player!", "Observe", null, null) as null|anything in creatures
|
|
|
|
if (!eye_name)
|
|
return
|
|
|
|
var/mob/eye = creatures[eye_name]
|
|
if (is_admin)
|
|
if (eye)
|
|
src.reset_view(eye)
|
|
client.adminobs = 1
|
|
if(eye == src.client.mob)
|
|
client.adminobs = 0
|
|
else
|
|
src.reset_view(null)
|
|
client.adminobs = 0
|
|
else
|
|
if(ticker)
|
|
// world << "there's a ticker"
|
|
if(ticker.mode.name == "AI malfunction")
|
|
// world << "ticker says its malf"
|
|
var/datum/game_mode/malfunction/malf = ticker.mode
|
|
for (var/datum/mind/B in malf.malf_ai)
|
|
// world << "comparing [B.current] to [eye]"
|
|
if (B.current == eye)
|
|
for (var/mob/living/silicon/decoy/D in world)
|
|
if (eye)
|
|
eye = D
|
|
if (eye)
|
|
src.client.eye = eye
|
|
else
|
|
src.client.eye = src.client.mob
|
|
|
|
/mob/verb/cancel_camera()
|
|
set name = "Cancel Camera View"
|
|
src.reset_view(null)
|
|
src.machine = null
|
|
if(istype(src, /mob/living))
|
|
if(src:cameraFollow)
|
|
src:cameraFollow = null
|
|
|
|
/mob/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
|
if(air_group || (height==0)) return 1
|
|
|
|
if(ismob(mover))
|
|
var/mob/moving_mob = mover
|
|
if ((src.other_mobs && moving_mob.other_mobs))
|
|
return 1
|
|
return (!mover.density || !src.density || src.lying)
|
|
else
|
|
return (!mover.density || !src.density || src.lying)
|
|
return
|
|
|
|
/mob/dead/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
|
return 1
|
|
|
|
/mob/Topic(href, href_list)
|
|
if(href_list["mach_close"])
|
|
var/t1 = text("window=[href_list["mach_close"]]")
|
|
src.machine = null
|
|
src << browse(null, t1)
|
|
|
|
if(href_list["priv_msg"])
|
|
var/mob/M = locate(href_list["priv_msg"])
|
|
if(M)
|
|
if(src.muted)
|
|
src << "You are muted have a nice day"
|
|
return
|
|
if (!( ismob(M) ))
|
|
return
|
|
var/t = input("Message:", text("Private message to [M.key]")) as text
|
|
if (!( t ))
|
|
return
|
|
if (usr.client && usr.client.holder)
|
|
M << "\red Admin PM from-<b>[key_name(usr, M, 0)]</b>: [t]"
|
|
usr << "\blue Admin PM to-<b>[key_name(M, usr, 1)]</b>: [t]"
|
|
else
|
|
if (M)
|
|
if (M.client && M.client.holder)
|
|
M << "\blue Reply PM from-<b>[key_name(usr, M, 1)]</b>: [t]"
|
|
else
|
|
M << "\red Reply PM from-<b>[key_name(usr, M, 0)]</b>: [t]"
|
|
usr << "\blue Reply PM to-<b>[key_name(M, usr, 0)]</b>: [t]"
|
|
|
|
log_admin("PM: [key_name(usr)]->[key_name(M)] : [t]")
|
|
|
|
//we don't use message_admins here because the sender/receiver might get it too
|
|
for (var/mob/K in world)
|
|
if(K && usr)
|
|
if(K.client && K.client.holder && K.key != usr.key && K.key != M.key)
|
|
K << "<b><font color='blue'>PM: [key_name(usr, K)]->[key_name(M, K)]:</b> \blue [t]</font>"
|
|
..()
|
|
return
|
|
|
|
/mob/proc/get_damage()
|
|
return src.health
|
|
|
|
/mob/MouseDrop(mob/M as mob)
|
|
..()
|
|
if(M != usr) return
|
|
if(usr == src) return
|
|
if(get_dist(usr,src) > 1) return
|
|
if(istype(M,/mob/living/silicon/ai)) return
|
|
if(LinkBlocked(usr.loc,src.loc)) return
|
|
src.show_inv(usr)
|
|
|
|
/mob/bullet_act(flag)
|
|
if (flag == PROJECTILE_BULLET)
|
|
if (istype(src, /mob/living/carbon/human))
|
|
var/mob/living/carbon/human/H = src
|
|
var/dam_zone = pick("chest", "chest", "chest", "groin", "head")
|
|
if (H.organs[text("[]", dam_zone)])
|
|
var/datum/organ/external/affecting = H.organs[text("[]", dam_zone)]
|
|
if (affecting.take_damage(51, 0))
|
|
H.UpdateDamageIcon()
|
|
else
|
|
H.UpdateDamage()
|
|
else
|
|
src.bruteloss += 51
|
|
src.updatehealth()
|
|
if (prob(80) && src.weakened <= 2)
|
|
src.weakened = 2
|
|
else if (flag == PROJECTILE_TASER)
|
|
if (prob(75) && src.stunned <= 10)
|
|
src.stunned = 10
|
|
else
|
|
src.weakened = 10
|
|
else if(flag == PROJECTILE_LASER)
|
|
if (istype(src, /mob/living/carbon/human))
|
|
var/mob/living/carbon/human/H = src
|
|
var/dam_zone = pick("chest", "chest", "chest", "groin", "head")
|
|
if (H.organs[text("[]", dam_zone)])
|
|
var/datum/organ/external/affecting = H.organs[text("[]", dam_zone)]
|
|
if (affecting.take_damage(20, 0))
|
|
H.UpdateDamageIcon()
|
|
else
|
|
H.UpdateDamage()
|
|
else
|
|
src.bruteloss += 20
|
|
src.updatehealth()
|
|
if (prob(25) && src.stunned <= 2)
|
|
src.stunned = 2
|
|
else if(flag == PROJECTILE_PULSE)
|
|
if (istype(src, /mob/living/carbon/human))
|
|
var/mob/living/carbon/human/H = src
|
|
var/dam_zone = pick("chest", "chest", "chest", "groin", "head")
|
|
if (H.organs[text("[]", dam_zone)])
|
|
var/datum/organ/external/affecting = H.organs[text("[]", dam_zone)]
|
|
if (affecting.take_damage(40, 0))
|
|
H.UpdateDamageIcon()
|
|
else
|
|
H.UpdateDamage()
|
|
else
|
|
src.bruteloss += 40
|
|
src.updatehealth()
|
|
if (prob(50))
|
|
src.stunned = min(src.stunned, 5)
|
|
else if(flag == PROJECTILE_BOLT)
|
|
src.toxloss += 3
|
|
src.radiation += 100
|
|
src.updatehealth()
|
|
src.stuttering += 5
|
|
src.drowsyness += 5
|
|
if (prob(10))
|
|
src.weakened = min(src.weakened, 2)
|
|
return
|
|
|
|
|
|
/atom/movable/Move(NewLoc, direct)
|
|
if (direct & direct - 1)
|
|
if (direct & 1)
|
|
if (direct & 4)
|
|
if (step(src, NORTH))
|
|
step(src, EAST)
|
|
else
|
|
if (step(src, EAST))
|
|
step(src, NORTH)
|
|
else
|
|
if (direct & 8)
|
|
if (step(src, NORTH))
|
|
step(src, WEST)
|
|
else
|
|
if (step(src, WEST))
|
|
step(src, NORTH)
|
|
else
|
|
if (direct & 2)
|
|
if (direct & 4)
|
|
if (step(src, SOUTH))
|
|
step(src, EAST)
|
|
else
|
|
if (step(src, EAST))
|
|
step(src, SOUTH)
|
|
else
|
|
if (direct & 8)
|
|
if (step(src, SOUTH))
|
|
step(src, WEST)
|
|
else
|
|
if (step(src, WEST))
|
|
step(src, SOUTH)
|
|
else
|
|
. = ..()
|
|
return
|
|
|
|
/atom/movable/verb/pull()
|
|
set src in oview(1)
|
|
|
|
if (!( usr ))
|
|
return
|
|
if (!( src.anchored ))
|
|
usr.pulling = src
|
|
return
|
|
|
|
/atom/verb/examine()
|
|
set src in oview(12) //make it work from farther away
|
|
|
|
if (!( usr ))
|
|
return
|
|
usr << "This is \an [src.name]."
|
|
usr << src.desc
|
|
// *****RM
|
|
//usr << "[src.name]: Dn:[density] dir:[dir] cont:[contents] icon:[icon] is:[icon_state] loc:[loc]"
|
|
return
|
|
|
|
/client/North()
|
|
..()
|
|
|
|
/client/South()
|
|
..()
|
|
|
|
/client/West()
|
|
..()
|
|
|
|
/client/East()
|
|
..()
|
|
|
|
/client/Northeast()
|
|
if(istype(src.mob, /mob/living/carbon))
|
|
src.mob:swap_hand()
|
|
return
|
|
|
|
/client/Southeast()
|
|
var/obj/item/weapon/W = src.mob.equipped()
|
|
if (W)
|
|
W.attack_self(src.mob)
|
|
return
|
|
|
|
/client/Northwest()
|
|
src.mob.drop_item_v()
|
|
return
|
|
|
|
/client/Center()
|
|
if (isobj(src.mob.loc))
|
|
var/obj/O = src.mob.loc
|
|
if (src.mob.canmove)
|
|
return O.relaymove(src.mob, 16)
|
|
return
|
|
|
|
/client/Move(n, direct)
|
|
if(src.mob.control_object) // Hacking in something to control objects -- TLE
|
|
src.mob.control_object.Move(get_step(src.mob.control_object, direct),direct)
|
|
if(istype(src.mob, /mob/dead/observer))
|
|
return src.mob.Move(n,direct)
|
|
if (src.moving)
|
|
return 0
|
|
if (world.time < src.move_delay)
|
|
return
|
|
if (!( src.mob ))
|
|
return
|
|
if (src.mob.stat == 2)
|
|
return
|
|
if (src.mob.incorporeal_move)
|
|
src.mob.dir = direct
|
|
src.mob.loc = get_step(src.mob, direct)
|
|
//return src.mob.Move(get_step(src.mob,direct))
|
|
return
|
|
if(istype(src.mob, /mob/living/silicon/ai))
|
|
return AIMove(n,direct,src.mob)
|
|
if(istype(src.mob, /mob/living/silicon/hive_mainframe))
|
|
return MainframeMove(n,direct,src.mob)
|
|
if (src.mob.monkeyizing)
|
|
return
|
|
|
|
var/is_monkey = istype(src.mob, /mob/living/carbon/monkey)
|
|
if (locate(/obj/item/weapon/grab, locate(/obj/item/weapon/grab, src.mob.grabbed_by.len)))
|
|
var/list/grabbing = list( )
|
|
if (istype(src.mob.l_hand, /obj/item/weapon/grab))
|
|
var/obj/item/weapon/grab/G = src.mob.l_hand
|
|
grabbing += G.affecting
|
|
if (istype(src.mob.r_hand, /obj/item/weapon/grab))
|
|
var/obj/item/weapon/grab/G = src.mob.r_hand
|
|
grabbing += G.affecting
|
|
for(var/obj/item/weapon/grab/G in src.mob.grabbed_by)
|
|
if (G.state == 1)
|
|
if (!( grabbing.Find(G.assailant) ))
|
|
del(G)
|
|
else
|
|
if (G.state == 2)
|
|
src.move_delay = world.time + 10
|
|
if ((prob(25) && (!( is_monkey ) || prob(25))))
|
|
mob.visible_message("\red [mob] has broken free of [G.assailant]'s grip!")
|
|
del(G)
|
|
else
|
|
return
|
|
else
|
|
if (G.state == 3)
|
|
src.move_delay = world.time + 10
|
|
if ((prob(5) && !( is_monkey ) || prob(25)))
|
|
mob.visible_message("\red [mob] has broken free of [G.assailant]'s headlock!")
|
|
del(G)
|
|
else
|
|
return
|
|
if (src.mob.canmove)
|
|
|
|
if(src.mob.m_intent == "face")
|
|
src.mob.dir = direct
|
|
|
|
var/j_pack = 0
|
|
if ((istype(src.mob.loc, /turf/space)))
|
|
if (!( src.mob.restrained() ))
|
|
if (!( (locate(/obj/grille) in oview(1, src.mob)) || (locate(/turf/simulated) in oview(1, src.mob)) || (locate(/obj/lattice) in oview(1, src.mob)) ))
|
|
if (istype(src.mob.back, /obj/item/weapon/tank/jetpack))
|
|
var/obj/item/weapon/tank/jetpack/J = src.mob.back
|
|
j_pack = J.allow_thrust(0.01, src.mob)
|
|
if(j_pack)
|
|
src.mob.inertia_dir = 0
|
|
if (!( j_pack ))
|
|
return 0
|
|
else
|
|
return 0
|
|
else
|
|
return 0
|
|
|
|
|
|
if (isturf(src.mob.loc))
|
|
src.move_delay = world.time
|
|
if ((j_pack && j_pack < 1))
|
|
src.move_delay += 5
|
|
switch(src.mob.m_intent)
|
|
if("run")
|
|
if (src.mob.drowsyness > 0)
|
|
src.move_delay += 6
|
|
src.move_delay += 1
|
|
if("face")
|
|
src.mob.dir = direct
|
|
return
|
|
if("walk")
|
|
src.move_delay += 7
|
|
|
|
|
|
src.move_delay += src.mob.movement_delay()
|
|
|
|
if (src.mob.restrained())
|
|
for(var/mob/M in range(src.mob, 1))
|
|
if (((M.pulling == src.mob && (!( M.restrained() ) && M.stat == 0)) || locate(/obj/item/weapon/grab, src.mob.grabbed_by.len)))
|
|
src << "\blue You're restrained! You can't move!"
|
|
return 0
|
|
src.moving = 1
|
|
if (locate(/obj/item/weapon/grab, src.mob))
|
|
src.move_delay = max(src.move_delay, world.time + 7)
|
|
var/list/L = src.mob.ret_grab()
|
|
if (istype(L, /list))
|
|
if (L.len == 2)
|
|
L -= src.mob
|
|
var/mob/M = L[1]
|
|
if ((get_dist(src.mob, M) <= 1 || M.loc == src.mob.loc))
|
|
var/turf/T = src.mob.loc
|
|
. = ..()
|
|
if (isturf(M.loc))
|
|
var/diag = get_dir(src.mob, M)
|
|
if ((diag - 1) & diag)
|
|
else
|
|
diag = null
|
|
if ((get_dist(src.mob, M) > 1 || diag))
|
|
step(M, get_dir(M.loc, T))
|
|
else
|
|
for(var/mob/M in L)
|
|
M.other_mobs = 1
|
|
if (src.mob != M)
|
|
M.animate_movement = 3
|
|
for(var/mob/M in L)
|
|
spawn( 0 )
|
|
step(M, direct)
|
|
return
|
|
spawn( 1 )
|
|
M.other_mobs = null
|
|
M.animate_movement = 2
|
|
return
|
|
else
|
|
if(src.mob.confused)
|
|
step(src.mob, pick(cardinal))
|
|
else
|
|
. = ..()
|
|
src.moving = null
|
|
return .
|
|
else
|
|
if (isobj(src.mob.loc) || ismob(src.mob.loc))
|
|
var/atom/O = src.mob.loc
|
|
if (src.mob.canmove)
|
|
return O.relaymove(src.mob, direct)
|
|
else
|
|
return
|
|
return
|
|
|
|
/client/New()
|
|
if(findtextEx(src.key, "Telnet @"))
|
|
src << "Sorry, this game does not support Telnet."
|
|
del(src)
|
|
var/isbanned = CheckBan(src)
|
|
if (isbanned)
|
|
log_access("Failed Login: [src] - Banned")
|
|
message_admins("\blue Failed Login: [src] - Banned")
|
|
alert(src,"You have been banned.\nReason : [isbanned]","Ban","Ok")
|
|
del(src)
|
|
|
|
|
|
if (((world.address == src.address || !(src.address)) && !(host)))
|
|
host = src.key
|
|
world.update_status()
|
|
|
|
..()
|
|
|
|
if (join_motd)
|
|
src << "<div class=\"motd\">[join_motd]</div>"
|
|
|
|
src.authorize()
|
|
//src.goonauth() -- Skie, commented out because not goons anymore.
|
|
///src.beta_tester_auth()
|
|
|
|
src.update_world()
|
|
|
|
//new admin bit - Nannek
|
|
|
|
if (admins.Find(src.ckey))
|
|
src.holder = new /obj/admins(src)
|
|
src.holder.rank = admins[src.ckey]
|
|
update_admins(admins[src.ckey])
|
|
|
|
if (ticker && ticker.mode && ticker.mode.name =="sandbox" && src.authenticated)
|
|
mob.CanBuild()
|
|
if(src.holder && (src.holder.level >= 3))
|
|
src.verbs += /mob/proc/Delete
|
|
|
|
/client/Del()
|
|
spawn(0)
|
|
if(src.holder)
|
|
del(src.holder)
|
|
return ..()
|
|
|
|
/mob/proc/can_use_hands()
|
|
if(src.handcuffed)
|
|
return 0
|
|
if(src.buckled && istype(src.buckled, /obj/stool/bed)) // buckling does not restrict hands
|
|
return 0
|
|
return ..()
|
|
|
|
/mob/proc/is_active()
|
|
return (0 >= usr.stat)
|
|
|
|
/mob/proc/see(message)
|
|
if(!src.is_active())
|
|
return 0
|
|
src << message
|
|
return 1
|
|
|
|
/mob/proc/show_viewers(message)
|
|
for(var/mob/M in viewers())
|
|
M.see(message)
|
|
|
|
/mob/proc/updatehealth()
|
|
if (src.nodamage == 0)
|
|
src.health = 100 - src.oxyloss - src.toxloss - src.fireloss - src.bruteloss
|
|
else
|
|
src.health = 100
|
|
src.stat = 0
|
|
|
|
//sort of a legacy burn method for /electrocute, /shock, and the e_chair
|
|
/mob/proc/burn_skin(burn_amount)
|
|
if(istype(src, /mob/living/carbon/human) && (!src.mutations & 2))
|
|
var/mob/living/carbon/human/H = src //make this damage method divide the damage to be done among all the body parts, then burn each body part for that much damage. will have better effect then just randomly picking a body part
|
|
var/divided_damage = (burn_amount)/(H.organs.len)
|
|
var/datum/organ/external/affecting = null
|
|
var/extradam = 0 //added to when organ is at max dam
|
|
for(var/A in H.organs)
|
|
if(!H.organs[A]) continue
|
|
affecting = H.organs[A]
|
|
if(!istype(affecting, /datum/organ/external)) continue
|
|
if(affecting.take_damage(0, divided_damage+extradam))
|
|
extradam = 0
|
|
else
|
|
extradam += divided_damage
|
|
H.UpdateDamageIcon()
|
|
H.updatehealth()
|
|
return 1
|
|
else if(istype(src, /mob/living/carbon/monkey) && (!src.mutations & 2))
|
|
var/mob/living/carbon/monkey/M = src
|
|
M.fireloss += burn_amount
|
|
M.updatehealth()
|
|
return 1
|
|
else if(istype(src, /mob/living/silicon/ai))
|
|
return 0
|
|
|
|
/mob/proc/adjustBodyTemp(actual, desired, incrementboost)
|
|
var/temperature = actual
|
|
var/difference = abs(actual-desired) //get difference
|
|
var/increments = difference/10 //find how many increments apart they are
|
|
var/change = increments*incrementboost // Get the amount to change by (x per increment)
|
|
|
|
// Too cold
|
|
if(actual < desired)
|
|
temperature += change
|
|
if(actual > desired)
|
|
temperature = desired
|
|
// Too hot
|
|
if(actual > desired)
|
|
temperature -= change
|
|
if(actual < desired)
|
|
temperature = desired
|
|
// if(istype(src, /mob/living/carbon/human))
|
|
// world << "[src] ~ [src.bodytemperature] ~ [temperature]"
|
|
return temperature
|
|
|
|
/mob/proc/gib(give_medal)
|
|
if (istype(src, /mob/dead/observer))
|
|
var/virus = src.virus
|
|
gibs(src.loc, virus)
|
|
return
|
|
src.death(1)
|
|
var/atom/movable/overlay/animation = null
|
|
src.monkeyizing = 1
|
|
src.canmove = 0
|
|
src.icon = null
|
|
src.invisibility = 101
|
|
if(ishuman(src))
|
|
animation = new(src.loc)
|
|
animation.icon_state = "blank"
|
|
animation.icon = 'mob.dmi'
|
|
animation.master = src
|
|
flick("gibbed", animation)
|
|
|
|
if (src.client)
|
|
var/mob/dead/observer/newmob
|
|
|
|
newmob = new/mob/dead/observer(src)
|
|
src:client:mob = newmob
|
|
if (src.mind)
|
|
src.mind.transfer_to(newmob)
|
|
|
|
var/virus = src.virus
|
|
if (istype(src, /mob/living/silicon))
|
|
robogibs(src.loc, virus)
|
|
else
|
|
gibs(src.loc, virus)
|
|
|
|
else if (!src.client)
|
|
var/virus = src.virus
|
|
if (istype(src, /mob/living/silicon))
|
|
robogibs(src.loc, virus)
|
|
else
|
|
gibs(src.loc, virus)
|
|
|
|
sleep(15)
|
|
del(src)
|
|
|
|
/mob/proc/get_contents()
|
|
var/list/L = list()
|
|
L += src.contents
|
|
for(var/obj/item/weapon/storage/S in src.contents)
|
|
L += S.return_inv()
|
|
for(var/obj/item/weapon/gift/G in src.contents)
|
|
L += G.gift
|
|
if (istype(G.gift, /obj/item/weapon/storage))
|
|
L += G.gift:return_inv()
|
|
return L
|
|
|
|
/mob/proc/check_contents_for(A)
|
|
var/list/L = list()
|
|
L += src.contents
|
|
for(var/obj/item/weapon/storage/S in src.contents)
|
|
L += S.return_inv()
|
|
for(var/obj/item/weapon/gift/G in src.contents)
|
|
L += G.gift
|
|
if (istype(G.gift, /obj/item/weapon/storage))
|
|
L += G.gift:return_inv()
|
|
|
|
for(var/obj/B in L)
|
|
if(B.type == A)
|
|
return 1
|
|
return 0
|
|
|
|
|
|
// adds a dizziness amount to a mob
|
|
// use this rather than directly changing var/dizziness
|
|
// since this ensures that the dizzy_process proc is started
|
|
// currently only humans get dizzy
|
|
|
|
// value of dizziness ranges from 0 to 1000
|
|
// below 100 is not dizzy
|
|
|
|
/mob/proc/make_dizzy(var/amount)
|
|
if(!istype(src, /mob/living/carbon/human)) // for the moment, only humans get dizzy
|
|
return
|
|
|
|
dizziness = min(1000, dizziness + amount) // store what will be new value
|
|
// clamped to max 1000
|
|
if(dizziness > 100 && !is_dizzy)
|
|
spawn(0)
|
|
dizzy_process()
|
|
|
|
|
|
// dizzy process - wiggles the client's pixel offset over time
|
|
// spawned from make_dizzy(), will terminate automatically when dizziness gets <100
|
|
// note dizziness decrements automatically in the mob's Life() proc.
|
|
/mob/proc/dizzy_process()
|
|
is_dizzy = 1
|
|
while(dizziness > 100)
|
|
if(client)
|
|
var/amplitude = dizziness*(sin(dizziness * 0.044 * world.time) + 1) / 70
|
|
client.pixel_x = amplitude * sin(0.008 * dizziness * world.time)
|
|
client.pixel_y = amplitude * cos(0.008 * dizziness * world.time)
|
|
|
|
sleep(1)
|
|
//endwhile - reset the pixel offsets to zero
|
|
is_dizzy = 0
|
|
if(client)
|
|
client.pixel_x = 0
|
|
client.pixel_y = 0
|
|
|
|
// jitteriness - copy+paste of dizziness
|
|
|
|
/mob/proc/make_jittery(var/amount)
|
|
if(!istype(src, /mob/living/carbon/human)) // for the moment, only humans get dizzy
|
|
return
|
|
|
|
jitteriness = min(1000, jitteriness + amount) // store what will be new value
|
|
// clamped to max 1000
|
|
if(jitteriness > 100 && !is_jittery)
|
|
spawn(0)
|
|
jittery_process()
|
|
|
|
|
|
// dizzy process - wiggles the client's pixel offset over time
|
|
// spawned from make_dizzy(), will terminate automatically when dizziness gets <100
|
|
// note dizziness decrements automatically in the mob's Life() proc.
|
|
/mob/proc/jittery_process()
|
|
var/old_x = pixel_x
|
|
var/old_y = pixel_y
|
|
is_jittery = 1
|
|
while(jitteriness > 100)
|
|
// var/amplitude = jitteriness*(sin(jitteriness * 0.044 * world.time) + 1) / 70
|
|
// pixel_x = amplitude * sin(0.008 * jitteriness * world.time)
|
|
// pixel_y = amplitude * cos(0.008 * jitteriness * world.time)
|
|
|
|
var/amplitude = min(4, jitteriness / 100)
|
|
pixel_x = rand(-amplitude, amplitude)
|
|
pixel_y = rand(-amplitude/3, amplitude/3)
|
|
|
|
sleep(1)
|
|
//endwhile - reset the pixel offsets to zero
|
|
is_jittery = 0
|
|
pixel_x = old_x
|
|
pixel_y = old_y
|
|
|
|
/mob/Stat()
|
|
..()
|
|
|
|
statpanel("Status")
|
|
|
|
if (src.client && src.client.holder)
|
|
stat(null, "([x], [y], [z])")
|
|
stat(null, "CPU: [world.cpu]")
|
|
|
|
/client/proc/station_explosion_cinematic()
|
|
if(src.mob)
|
|
var/mob/M = src.mob
|
|
M.loc = null // HACK, but whatever, this works
|
|
|
|
var/obj/screen/boom = M.hud_used.station_explosion
|
|
if (M.client)
|
|
M.client.screen += boom
|
|
if(ticker)
|
|
switch(ticker.mode.name)
|
|
if("nuclear emergency")
|
|
flick("start_nuke", boom)
|
|
if("AI malfunction")
|
|
flick("start_malf", boom)
|
|
else
|
|
boom.icon_state = "start"
|
|
sleep(40)
|
|
M << sound('explosionfar.ogg')
|
|
boom.icon_state = "end"
|
|
flick("explode", boom)
|
|
sleep(40)
|
|
if(ticker)
|
|
switch(ticker.mode.name)
|
|
if("nuclear emergency")
|
|
boom.icon_state = "loss_nuke"
|
|
if("AI malfunction")
|
|
boom.icon_state = "loss_malf"
|
|
else
|
|
boom.icon_state = "loss_general"
|